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 }