add initial lemmyfs
This commit is contained in:
		
							parent
							
								
									6d39d462dc
								
							
						
					
					
						commit
						6d23d628dd
					
				|  | @ -0,0 +1,245 @@ | ||||||
|  | #include <u.h> | ||||||
|  | #include <libc.h> | ||||||
|  | #include <fcall.h> | ||||||
|  | #include <thread.h> | ||||||
|  | #include <9p.h> | ||||||
|  | #include <json.h> | ||||||
|  | 
 | ||||||
|  | typedef struct LemmyFile LemmyFile; | ||||||
|  | 
 | ||||||
|  | struct LemmyFile  | ||||||
|  | { | ||||||
|  | 	char *name; | ||||||
|  | 	char * (*fsread)(Req*); | ||||||
|  | 	int mode; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | void fsopen(Req *r); | ||||||
|  | void fswrite(Req *r); | ||||||
|  | void fsread(Req *r); | ||||||
|  | void fsend(Srv *s); | ||||||
|  | char* getcommunityfunc(Req*); | ||||||
|  | char* gettimefunc(Req*); | ||||||
|  | 
 | ||||||
|  | LemmyFile files[] =  | ||||||
|  | { | ||||||
|  | 	{"getcommunity", getcommunityfunc, 0444}, | ||||||
|  | 	{"gettime", gettimefunc, 0444}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Srv s =  | ||||||
|  | { | ||||||
|  | 	.open = fsopen, | ||||||
|  | 	.read = fsread, | ||||||
|  | 	.write = fswrite, | ||||||
|  | 	.end = fsend, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | File *root; | ||||||
|  | File *lemmydir; | ||||||
|  | char *endpoint; | ||||||
|  | 
 | ||||||
|  | char* | ||||||
|  | webfs(char *cmd, char *post) | ||||||
|  | { | ||||||
|  | 	int conn, ctlfd, fd, hd, n; | ||||||
|  | 	char buf[256], *mtpt; | ||||||
|  | 
 | ||||||
|  | 	mtpt = "/mnt/web"; | ||||||
|  | 
 | ||||||
|  | 	snprint(buf, sizeof buf, "%s/clone", mtpt); | ||||||
|  | 	if((ctlfd = open(buf, ORDWR)) < 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("couldn't open %s: %r", buf); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if((n = read(ctlfd, buf, sizeof buf)) < 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("reading i32: %r"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(n == 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("short read on i32"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buf[n] = '\0'; | ||||||
|  | 	conn = atoi(buf); | ||||||
|  | 
 | ||||||
|  | 	if(fprint(ctlfd, "url %s%s", endpoint, cmd) <= 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("get ctl write: %r"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(post) | ||||||
|  | 	{ | ||||||
|  | 		snprint(buf, sizeof buf, "%s/%d/postbody", mtpt, conn); | ||||||
|  | 		if((fd = open(buf, OWRITE)) < 0) | ||||||
|  | 		{ | ||||||
|  | 			sysfatal("open %s: %r", buf); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(write(fd, post, strlen(post)) < 0) | ||||||
|  | 		{ | ||||||
|  | 			sysfatal("post write failed: %r"); | ||||||
|  | 		} | ||||||
|  | 		close(fd); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	snprint(buf, sizeof buf, "%s/%d/body", mtpt, conn); | ||||||
|  | 	if((fd = open(buf, OREAD)) < 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("open %s: %r", buf); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	snprint(buf, sizeof buf, "%s/%d/contentlength", mtpt, conn); | ||||||
|  | 	if ((hd = open(buf, OREAD)) < 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("open header %s %r", buf); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if((n = read(hd, buf, sizeof buf)) < 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("reading i32: %r"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(n == 0) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("short read on i32"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	buf[n] = '\0'; | ||||||
|  | 	int s = atoi(buf); | ||||||
|  | 	close(hd); | ||||||
|  | 
 | ||||||
|  | 	char* json_string = (char*)calloc(s, sizeof(char)); | ||||||
|  | 	readn(fd, json_string, s*sizeof(char)); | ||||||
|  | 	return json_string; | ||||||
|  | 
 | ||||||
|  | 	/*
 | ||||||
|  | 	JSON* j = jsonparse(json_string); | ||||||
|  | 	if (j == nil) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("error jsonparse %s: %r", json_string); | ||||||
|  | 	}		 | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		print("%J\n", j); | ||||||
|  | 		jsonfree(j); | ||||||
|  | 	} | ||||||
|  | 	*/ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | fsend(Srv *) | ||||||
|  | { | ||||||
|  | 	postnote(PNGROUP, getpid(), "shutdown"); | ||||||
|  | 	threadexitsall(nil); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | fsopen(Req *r) | ||||||
|  | { | ||||||
|  | 	respond(r, nil); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | fsread(Req *r) | ||||||
|  | { | ||||||
|  | 	LemmyFile *f; | ||||||
|  | 	r->ofcall.count = 0; | ||||||
|  | 	f = r->fid->file->aux; | ||||||
|  | 	respond(r, f->fsread(r)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | fswrite(Req *r) | ||||||
|  | { | ||||||
|  | 	/* not implemented yet */ | ||||||
|  | 	respond(r, nil); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | fsinit(void) | ||||||
|  | { | ||||||
|  | 	char *user; | ||||||
|  | 	int i; | ||||||
|  | 
 | ||||||
|  | 	user = getuser(); | ||||||
|  | 	s.tree = alloctree(user, user, 0555, nil); | ||||||
|  | 	if (s.tree == nil) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("alloctree failed"); | ||||||
|  | 	} | ||||||
|  | 	root = s.tree->root; | ||||||
|  | 
 | ||||||
|  | 	if ((lemmydir = createfile(root, "lemmy", user, DMDIR|0555, nil)) == nil) | ||||||
|  | 	{ | ||||||
|  | 		sysfatal("lemmy root file failed"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < nelem(files); i++) | ||||||
|  | 	{ | ||||||
|  | 		if (createfile(lemmydir, files[i].name, user, files[i].mode, files + i) == nil) | ||||||
|  | 		{ | ||||||
|  | 			sysfatal("%s file failed", files[i].name); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			print("created %s\n", files[i].name); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | usage(void) | ||||||
|  | { | ||||||
|  | 	fprint(2, "usage: %s [-n filename] [-m mountpoint] [-e lemmy endpoint]\n", argv0); | ||||||
|  | 	exits("usage"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | threadmain(int argc, char **argv) | ||||||
|  | { | ||||||
|  | 	char *srvname = "lemmyfs"; | ||||||
|  | 	char *mntpt = "/n"; | ||||||
|  | 
 | ||||||
|  | 	ARGBEGIN { | ||||||
|  | 		case 'n': | ||||||
|  | 			srvname = EARGF(usage()); | ||||||
|  | 			break; | ||||||
|  | 		case 'm': | ||||||
|  | 			mntpt = EARGF(usage()); | ||||||
|  | 			break; | ||||||
|  | 		case 'e': | ||||||
|  | 			endpoint = EARGF(usage()); | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			usage(); | ||||||
|  | 	} ARGEND | ||||||
|  | 
 | ||||||
|  | 	JSONfmtinstall(); | ||||||
|  | 
 | ||||||
|  | 	fsinit(); | ||||||
|  | 	threadpostmountsrv(&s, srvname, mntpt, MBEFORE); | ||||||
|  | 	threadexits(nil); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char* | ||||||
|  | getcommunityfunc(Req *r) | ||||||
|  | { | ||||||
|  | 	char *response; | ||||||
|  | 	response = webfs("/community/list", nil); | ||||||
|  | 	readstr(r, response); | ||||||
|  | 	free(response); | ||||||
|  | 	return nil; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char* | ||||||
|  | gettimefunc(Req *r) | ||||||
|  | { | ||||||
|  | 	char buf[128]; | ||||||
|  | 	snprint(buf, sizeof buf, "%ld\n", time(0)); | ||||||
|  | 	readstr(r, buf); | ||||||
|  | 	return nil; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue