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