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