aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/smugfs/main.c
blob: e1c2745f6549ad4038c27a13c3976f5689e1c12c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "a.h"

char *keypattern = "";
char *sessid;
Json *userinfo;
int printerrors;

void
usage(void)
{
	fprint(2, "usage: smugfs [-k keypattern] [-m mtpt] [-s srv]\n");
	threadexitsall("usage");
}

void
smuglogin(void)
{
	Json *v;
	char *s;
	UserPasswd *up;

	printerrors = 1;
	up = auth_getuserpasswd(auth_getkey,
		"proto=pass role=client server=smugmug.com "
		"user? !password? %s", keypattern);
	if(up == nil)
		sysfatal("cannot get username/password: %r");

	v = ncsmug("smugmug.login.withPassword",
		"EmailAddress", up->user,
		"Password", up->passwd,
		nil);
	if(v == nil)
		sysfatal("login failed: %r");

	memset(up->user, 'X', strlen(up->user));
	memset(up->passwd, 'X', strlen(up->passwd));
	free(up);

	sessid = jstring(jwalk(v, "Login/Session/id"));
	if(sessid == nil)
		sysfatal("no session id");
	sessid = estrdup(sessid);
	s = jstring(jwalk(v, "Login/User/NickName"));
	if(s == nil)
		sysfatal("no nick name");
	if(nickindex(s) != 0)
		sysfatal("bad nick name");
	userinfo = jincref(jwalk(v, "Login"));
	jclose(v);
	printerrors = 0;
}

void
threadmain(int argc, char **argv)
{
	char *mtpt, *name;

	mtpt = nil;
	name = nil;
	ARGBEGIN{
	case 'D':
		chatty9p++;
		break;
	case 'F':
		chattyfuse++;
		break;
	case 'H':
		chattyhttp++;
		break;
	case 'm':
		mtpt = EARGF(usage());
		break;
	case 's':
		name = EARGF(usage());
		break;
	case 'k':
		keypattern = EARGF(usage());
		break;
	default:
		usage();
	}ARGEND

	if(argc != 0)
		usage();

	if(name == nil && mtpt == nil)
		mtpt = "/n/smug";

	/*
	 * Check twice -- if there is an exited smugfs instance
	 * mounted there, the first access will fail but unmount it.
	 */
	if(mtpt && access(mtpt, AEXIST) < 0 && access(mtpt, AEXIST) < 0)
		sysfatal("mountpoint %s does not exist", mtpt);

	fmtinstall('H', encodefmt);
	fmtinstall('[', encodefmt);  // base-64
	fmtinstall('J', jsonfmt);
	fmtinstall('M', dirmodefmt);
	fmtinstall('T', timefmt);
	fmtinstall('U', urlencodefmt);

	xinit();
	smuglogin();
	threadpostmountsrv(&xsrv, name, mtpt, 0);
	threadexits(nil);
}