|  | #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); | 
|  | } |