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