shithub: svcfs

Download patch

ref: a9ca97f3154d7cf8951a4e80940e623952722a1a
parent: f7ca9ea5d0072096857c116b42c77036344677a4
author: halfwit <michaelmisch1985@gmail.com>
date: Sat Jun 15 11:59:13 EDT 2024

Delete fs.c.bak

--- a/fs.c.bak
+++ /dev/null
@@ -1,567 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <ctype.h>
-#include <fcall.h>
-#include <thread.h>
-#include <9p.h>
-
-#include "alt.h"
-
-// TODO: Start turning off output if we aren't connected to anything
-
-enum {
-	Qroot,
-		Qclone,
-		Qclients,
-			Qctl,
-			Qtitle,
-			Qstatus,
-			Qfeed,
-			Qaside,
-			Qnotify,
-			Qtabs,
-			Qinput,
-		Qservices,
-			Qsclone,
-			Qservice,
-				Qsctl,
-				Qsinput,
-		Qmax,
-};
-
-static char *nametab[] = {
-	"/",
-		"clone",
-		nil,
-			"ctl",
-			"title",
-			"status",
-			"feed",
-			"aside",
-			"notify",
-			"tabs",
-			"input",
-		"services",
-			"clone",
-			nil,
-				"ctl",
-				"input",
-		nil,
-};
-
-typedef struct Altfid Altfid;
-struct Altfid
-{
-	int	level;
-	Client	*client;
-	Service	*service;
-	int	fd;
-	vlong	foffset;
-};
-
-static char *whitespace = "\t\r\n";
-
-void*
-emalloc(int n)
-{
-	void *v;
-	v = emalloc9p(n);
-	setmalloctag(v, getcallerpc(&n));
-	memset(v, 0, n);
-	return v;
-}
-
-char*
-estrdup(char *s)
-{
-	s = estrdup9p(s);
-	setmalloctag(s, getcallerpc(&s));
-	return s;
-}
-
-static void*
-wfaux(Altfid *f)
-{
-	if(f->level < Qclients)
-		return nil;
-	else if(f->level < Qservices)
-		return f->client;
-	return f->service;
-}
-
-static void
-fsmkqid(Qid *q, int level, void *aux)
-{
-
-	q->type = 0;
-	q->vers = 0;
-	switch(level){
-	case Qroot:
-	case Qclients:
-	case Qservices:
-	case Qservice:
-		q->type = QTDIR;
-	default:
-		q->path = (level<<24) | (((uintptr)aux ^ time0) & 0x00ffffff);
-	}
-}
-
-static void
-fsmkdir(Dir *d, int level, void *aux)
-{
-	Service *sv;
-	char buf[1024];
-
-	memset(d, 0, sizeof(*d));
-	fsmkqid(&d->qid, level, aux);
-	d->mode = 0444;
-	d->atime = d->mtime = time0;
-	d->uid = estrdup(user);
-	d->gid = estrdup(user);
-	d->muid = estrdup(user);
-	if(d->qid.type & QTDIR)
-		d->mode |= DMDIR | 0111;
-	switch(level){
-	case Qclients:
-		snprint(buf, sizeof(buf), "%d", CLIENTID(aux));
-		d->name = estrdup(buf);
-		break;
-	case Qservice:
-		sv = (Service*)aux;
-		d->name = sv->name;
-		break;
-	case Qctl:
-	case Qsctl:
-	case Qclone:
-	case Qsclone:
-		d->mode = 0666;
-		if(0){
-	case Qinput:
-		d->mode = 0222;
-		}
-	default:
-		d->name = estrdup(nametab[level]);
-	}
-}
-
-static void
-fsattach(Req *r)
-{
-	Altfid *f;
-
-	if(r->ifcall.aname && r->ifcall.aname[0]){
-		respond(r, "invalid attach specifier");
-		return;
-	}
-	f = emalloc(sizeof(*f));
-	f->level = Qroot;
-	fsmkqid(&r->fid->qid, f->level, wfaux(f));
-	r->ofcall.qid = r->fid->qid;
-	r->fid->aux = f;
-	respond(r, nil);
-}
-
-static void
-fsstat(Req *r)
-{
-	Altfid *f;
-
-	f = r->fid->aux;
-	fsmkdir(&r->d, f->level, wfaux(f));
-	respond(r, nil);
-}
-
-static char*
-fswalk1(Fid *fid, char *name, Qid *qid)
-{
-	Altfid *f;
-	int i, j;
-	i = 0;
-
-	if(!(fid->qid.type&QTDIR))
-		return "walk in non-directory";
-
-	f = fid->aux;
-	if(strcmp(name, "..")==0){
-		switch(f->level){
-		case Qroot:
-			break;
-		case Qclients:
-			freeclient(f->client);
-			f->client = nil;
-			break;
-		case Qservices:
-			f->level = Qroot;
-			break;
-		default:
-			if(f->level > Qservices)
-				f->level = Qservices;
-			else
-				f->level = Qclients;
-		}
-	} else if(strcmp(name, "services")==0){
-		i = Qservices;
-		goto Out;
-	} else {
-		if(nservice){
-			for(j=0; j < nservice; j++){
-				if(strcmp(name, service[j].name) == 0){
-					f->service = &service[j];
-					i = Qservice;
-					break;
-				}
-			}
-		} else {
-			for(i = f->level+1; i < nelem(nametab); i++){
-				if(nametab[i]){
-					if(strcmp(name, nametab[i]) == 0)
-						goto Out;
-					// anything else?
-				}
-				if(i == Qclients){
-					j = atoi(name);
-					if(j >= 0 && j < nclient){
-						f->client = &client[j];
-						incref(f->client);
-						goto Out;
-					}
-				}
-			}
-		}
-Out:
-		if(i >= nelem(nametab))
-			return "directory entry not found";
-		f->level = i;
-	}
-	fsmkqid(qid, f->level, wfaux(f));
-	fid->qid = *qid;
-	return nil;
-}
-
-static char*
-fsclone(Fid *oldfid, Fid *newfid)
-{
-	Altfid *f, *o;
-	o = oldfid->aux;
-	if(o == nil)
-		return "bad fid";
-	f = emalloc(sizeof(*f));
-	memmove(f, o, sizeof(*f));
-	if(f->client)
-		incref(f->client);
-	newfid->aux = f;
-	return nil;
-}
-
-static void
-fsopen(Req *r)
-{
-	Altfid *f;
-	Client *cl;
-	Service *svc;
-	char buf[256];
-
-	// Switch and create on clones, etc
-	f = r->fid->aux;
-	cl = f->client;
-	svc = f->service;
-	USED(svc);
-	switch(f->level){
-	case Qclone:
-		if((cl = newclient()) == nil){
-			respond(r, "no more clients");
-			return;
-		}
-		f->level = Qctl;
-		f->client = cl;
-		fsmkqid(&r->fid->qid, f->level, wfaux(f));
-		r->ofcall.qid = r->fid->qid;
-		break;
-	case Qsclone:
-		if((svc = newservice()) == nil){
-			respond(r, "no more services");
-		}
-		f->level = Qsctl;
-		f->service = svc;
-		fsmkqid(&r->fid->qid, f->level, wfaux(f));
-		r->ofcall.qid = r->fid->qid;
-		break;
-	case Qfeed:
-		if(cl->current){
-			snprint(buf, sizeof(buf), "%s/%s", logdir, cl->current->feed);
-			print("%s\n", buf);
-			f->fd = open(buf, 0644);
-			f->foffset = 0;
-		}
-	}
-	respond(r, nil);
-}
-
-static int
-rootgen(int i, Dir *d, void *)
-{
-	i += Qroot+1;
-	if(i < Qclients){
-		fsmkdir(d, i, 0);
-		return 0;
-	}
-	i -= Qclients;
-	if(i < nclient){
-		fsmkdir(d, Qclients, &client[i]);
-		return 0;
-	}
-	// Final entry is just our services dir
-	if(i == nclient){
-		fsmkdir(d, Qservices, 0);
-		return 0;
-	}
-	return -1;
-}
-
-static int
-servicesgen(int i, Dir *d, void *)
-{
-	i += Qservices + 1;
-	if(i < Qservice){
-		fsmkdir(d, i, 0);
-		return 0;
-	}
-	i -= Qservices + 2;
-	if(i < nservice){
-		fsmkdir(d, Qservice, &service[i]);
-		return 0;
-	}
-	return -1;
-}
-
-static int
-clientgen(int i, Dir *d, void *aux)
-{
-	// TODO: Mask the unusable files if we have no current buffer
-	i += Qclients+1;
-	if(i > Qinput)
-		return -1;
-	fsmkdir(d, i, aux);
-	return 0;
-}
-
-static int
-servicegen(int i, Dir *d, void *aux)
-{
-	i += Qservice+1;
-print("%d %d\n", i, Qmax);
-	if(i >= Qmax)
-		return -1;
-	fsmkdir(d, i, aux);
-	return 0;
-}
-
-static void
-fsread(Req *r)
-{
-	char buf[1024];
-	Altfid *f;
-	Client *cl;
-	Service *svc;
-
-	f = r->fid->aux;
-	cl = f->client;
-	svc = f->service;
-	
-	if(f->level > Qctl && f->level < Qservices && !cl->current){
-		respond(r, "no current buffer selected");
-		return;
-	}
-
-	switch(f->level){
-	case Qroot:
-print("Root\n");
-		dirread9p(r, rootgen, nil);
-		respond(r, nil);
-		return;
-	case Qclients:
-print("Clients\n");
-		dirread9p(r, clientgen, nil);
-		respond(r, nil);
-		return;
-	case Qservices:
-print("Services\n");
-		dirread9p(r, servicesgen, nil);
-		respond(r, nil);
-		return;
-	case Qservice:
-print("Service\n");
-		dirread9p(r, servicegen, nil);
-		respond(r, nil);
-		return;
-	case Qtitle:
-		snprint(buf, sizeof(buf), "%s\n", cl->current->title);
-	String:
-		readstr(r, buf);
-		respond(r, nil);
-		return;
-	case Qctl: 
-		snprint(buf, sizeof(buf), "%d\n", CLIENTID(f->client));
-		goto String;
-	case Qstatus:
-		snprint(buf, sizeof(buf), "%s\n", cl->current->status);
-		goto String;
-	case Qaside:
-		snprint(buf, sizeof(buf), "%s\n", cl->current->aside);
-		goto String;
-	case Qsctl:
-		snprint(buf, sizeof(buf), "%s\n", svc->name);
-		goto String;
-	case Qfeed:
-		pread(f->fd, buf, sizeof(buf), f->foffset);
-		goto String;
-	case Qsinput:
-		// forward any pending input from client
-		// TODO: Channel for input?
-		break;
-	case Qnotify:
-		// TODO: notify fmt %N, install at start
-		//snprint(buf, sizeof(buf), "%N\n", svc->notify);
-		break;
-	case Qtabs:
-		// TODO: tabs fmt %T, install at start
-		//snprint(buf, sizeof(buf), "%T\n", svc);
-		goto String;
-		
-	}
-	respond(r, "not implemented");
-}
-
-static void
-fswrite(Req *r)
-{
-	int n;
-	Altfid *f;
-	char *s, *t;
-
-	f = r->fid->aux;
-	switch(f->level){
-	case Qsctl:
-	case Qctl:
-		n = r->ofcall.count = r->ifcall.count;
-		s = emalloc(n+1);
-		memmove(s, r->ifcall.data, n);
-		while(n > 0 && strchr("\r\n", s[n-1]))
-			n--;
-		s[n] = 0;
-		// TODO: We don't use any of this in any meaningful way, remove t from calls
-		t = s;
-		while(*t && strchr(whitespace, *t)==0)
-			t++;
-		while(*t && strchr(whitespace, *t))
-			*t++ = 0;
-		if(f->level == Qctl)
-			t = clientctl(f->client, s, t);
-		else
-			t = servicectl(f->service, s, t);
-		free(s);
-		respond(r, t);
-		return;
-	case Qinput:
-		// TODO: User wrote a string to us, forward to server (cb?)
-		//f->svc->callback(r->ifcall.data, r->ifcall.count);
-		return;
-	}
-	respond(r, "not implemented");
-}
-
-static void
-fsflush(Req *r)
-{
-	respond(r, nil);
-}
-
-static void
-fsdestroyfid(Fid *fid)
-{
-	Altfid *f;
-
-	if(f = fid->aux){
-		fid->aux = nil;
-		if(f->client)
-			freeclient(f->client);
-		// TODO: uncomment so services hold open an FD to show their livelihood
-		//if(f->service)
-		//	freeservice(f->service);
-		free(f);
-	}	
-}
-
-static void
-fsstart(Srv*)
-{
-	/* Overwrite if we have one, force a reconnect of everything */
-	if(mtpt != nil)
-		unmount(nil, mtpt);
-}
-
-static void
-fsend(Srv*)
-{
-	postnote(PNGROUP, getpid(), "shutdown");
-	exits(nil);
-}
-
-Srv fs = 
-{
-	.start=fsstart,
-	.attach=fsattach,
-	.stat=fsstat,
-	.walk1=fswalk1,
-	.clone=fsclone,
-	.open=fsopen,
-	.read=fsread,
-	.write=fswrite,
-	.flush=fsflush,
-	.destroyfid=fsdestroyfid,
-	.end=fsend,
-};
-
-void
-usage(void)
-{
-	fprint(2, "usage: %s [-Dd] [-m mtpt] [-s service] [-l logdir]\n", argv0);
-	exits("usage");
-}
-
-void
-main(int argc, char *argv[])
-{
-	// We could use quotefmtinstall here
-	// add in tabs at very least
-	user = getuser();
-	mtpt = "/mnt/alt";
-	logdir = "/tmp/alt";
-	time0 = time(0);
-
-	ARGBEGIN {
-	case 'D': 
-		chatty9p++;
-		break;
-	case 'm':
-		mtpt = EARGF(usage());
-		break;
-	case 's':
-		srvpt = EARGF(usage());
-		break;
-	case 'l':
-		logdir = EARGF(usage());
-		break;
-	case 'd':
-		debug++;
-		break;
-	default:
-		usage();
-	} ARGEND;
-
-	argv0 = "alt/fs";
-
-	create(logdir, OREAD, DMDIR | 0755);
-	postmountsrv(&fs, srvpt, mtpt, MCREATE);
-	exits(nil); 
-}
--