plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

main.c (2079B)


      1 #include "a.h"
      2 
      3 char *keypattern = "";
      4 char *sessid;
      5 Json *userinfo;
      6 int printerrors;
      7 
      8 void
      9 usage(void)
     10 {
     11 	fprint(2, "usage: smugfs [-k keypattern] [-m mtpt] [-s srv]\n");
     12 	threadexitsall("usage");
     13 }
     14 
     15 void
     16 smuglogin(void)
     17 {
     18 	Json *v;
     19 	char *s;
     20 	UserPasswd *up;
     21 
     22 	printerrors = 1;
     23 	up = auth_getuserpasswd(auth_getkey,
     24 		"proto=pass role=client server=smugmug.com "
     25 		"user? !password? %s", keypattern);
     26 	if(up == nil)
     27 		sysfatal("cannot get username/password: %r");
     28 
     29 	v = ncsmug("smugmug.login.withPassword",
     30 		"EmailAddress", up->user,
     31 		"Password", up->passwd,
     32 		nil);
     33 	if(v == nil)
     34 		sysfatal("login failed: %r");
     35 
     36 	memset(up->user, 'X', strlen(up->user));
     37 	memset(up->passwd, 'X', strlen(up->passwd));
     38 	free(up);
     39 
     40 	sessid = jstring(jwalk(v, "Login/Session/id"));
     41 	if(sessid == nil)
     42 		sysfatal("no session id");
     43 	sessid = estrdup(sessid);
     44 	s = jstring(jwalk(v, "Login/User/NickName"));
     45 	if(s == nil)
     46 		sysfatal("no nick name");
     47 	if(nickindex(s) != 0)
     48 		sysfatal("bad nick name");
     49 	userinfo = jincref(jwalk(v, "Login"));
     50 	jclose(v);
     51 	printerrors = 0;
     52 }
     53 
     54 int
     55 threadmaybackground(void)
     56 {
     57 	return 1;
     58 }
     59 
     60 void
     61 threadmain(int argc, char **argv)
     62 {
     63 	char *mtpt, *name;
     64 
     65 	mtpt = nil;
     66 	name = nil;
     67 	ARGBEGIN{
     68 	case 'D':
     69 		chatty9p++;
     70 		break;
     71 	case 'F':
     72 		chattyfuse++;
     73 		break;
     74 	case 'H':
     75 		chattyhttp++;
     76 		break;
     77 	case 'm':
     78 		mtpt = EARGF(usage());
     79 		break;
     80 	case 's':
     81 		name = EARGF(usage());
     82 		break;
     83 	case 'k':
     84 		keypattern = EARGF(usage());
     85 		break;
     86 	default:
     87 		usage();
     88 	}ARGEND
     89 
     90 	if(argc != 0)
     91 		usage();
     92 
     93 	if(name == nil && mtpt == nil)
     94 		mtpt = "/n/smug";
     95 
     96 	/*
     97 	 * Check twice -- if there is an exited smugfs instance
     98 	 * mounted there, the first access will fail but unmount it.
     99 	 */
    100 	if(mtpt && access(mtpt, AEXIST) < 0 && access(mtpt, AEXIST) < 0)
    101 		sysfatal("mountpoint %s does not exist", mtpt);
    102 
    103 	fmtinstall('H', encodefmt);
    104 	fmtinstall('[', encodefmt);  // base-64
    105 	fmtinstall('J', jsonfmt);
    106 	fmtinstall('M', dirmodefmt);
    107 	fmtinstall('T', timefmt);
    108 	fmtinstall('U', urlencodefmt);
    109 
    110 	xinit();
    111 	smuglogin();
    112 	threadpostmountsrv(&xsrv, name, mtpt, 0);
    113 	threadexits(nil);
    114 }