add initial lemmyfs

This commit is contained in:
zongor 2023-12-11 17:19:12 -05:00
parent 6d39d462dc
commit 6d23d628dd
2 changed files with 256 additions and 0 deletions

245
lemmyfs.c Normal file
View File

@ -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;
}

11
mkfile Normal file
View File

@ -0,0 +1,11 @@
</$objtype/mkfile
TARG=lemmyfs
OFILES=\
lemmyfs.$O\
HFILES=\
BIN=/usr/$user/bin/$objtype
</sys/src/cmd/mkone