aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/smugfs/main.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-08-03 07:42:27 -0700
committerRuss Cox <rsc@swtch.com>2008-08-03 07:42:27 -0700
commit18824b586835525594cde126fbc90b8281d5af8b (patch)
treee8b69c05eda4543b6d2f3d30777abe6109b48b7f /src/cmd/smugfs/main.c
parent3d36f4437348227c5bad62587dc12b5fd4a3e95e (diff)
downloadplan9port-18824b586835525594cde126fbc90b8281d5af8b.tar.gz
plan9port-18824b586835525594cde126fbc90b8281d5af8b.tar.bz2
plan9port-18824b586835525594cde126fbc90b8281d5af8b.zip
smugfs(4): new program
Diffstat (limited to 'src/cmd/smugfs/main.c')
-rw-r--r--src/cmd/smugfs/main.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/cmd/smugfs/main.c b/src/cmd/smugfs/main.c
new file mode 100644
index 00000000..6be0ca42
--- /dev/null
+++ b/src/cmd/smugfs/main.c
@@ -0,0 +1,108 @@
+#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);
+}