hlfw.ca

registry

Download patch

ref: 5adb5ae62a01b7af1d0190acd33d387c3e33b46c
parent: bc71c98fcf64345b38e7e342b9efe66b97ebaa25
parent: e287b1d9edab1e96f4d22f06ddd52f714046fbd6
author: halfwit <michaelmisch1985@gmail.com>
date: Sun Oct 22 11:41:11 PDT 2023

Merge pull request #11 from halfwit/rework

More rework

--- a/libservice/service.h
+++ b/libservice/service.h
@@ -4,18 +4,20 @@
 typedef struct Service Service;
 
 enum {
-    NAMELEN = 28,
-    NSVCS = 256,
-    MAXDESC = 256,
-    MAXADDR = 128,
+	NAMELEN = 28,
+	NSVCS = 256,
+	MAXDESC = 256,
+	MAXADDR = 128,
+	MAXAUTH = 128,
 	RS = 0x1e,
 };
 
 enum {
-	Sok = 1,
-	Sdown = 2,
-	Sreg =3 ,
-	Smax =4,
+	Sok,
+	Sdown,
+	Sreg,
+	Spersist,
+	Smax,
 };
 
 struct Service {
@@ -22,6 +24,7 @@
 	char name[NAMELEN];
 	char description[MAXDESC];
 	char address[MAXADDR];
+	char authdom[MAXAUTH];
 	uchar status;
 	vlong uptime;
 	Service *next; /* Used for queries */
--- a/libservice/svcquery.c
+++ b/libservice/svcquery.c
@@ -23,7 +23,7 @@
 addService(Dir d)
 {
 	Service *svc;
-	char *desc, *addr, *stat, *up;
+	char *desc, *addr, *auth, *stat, *up;
 
 	svc = malloc(sizeof *svc);
 	memmove(svc->name, d.name, NAMELEN);
@@ -30,6 +30,8 @@
 	svc->name[strlen(d.name)] = '\0';
 	desc = readFile(d.name, "description", MAXDESC);
 	memmove(svc->description, desc, strlen(desc));
+	auth = readFile(d.name, "authdom", MAXAUTH);
+	memmove(svc->authdom, auth, strlen(auth));
 	addr = readFile(d.name, "address", MAXADDR);
 	memmove(svc->address, addr, strlen(addr));
 	svc->status = Sreg;
--- a/monitor.c
+++ b/monitor.c
@@ -97,6 +97,7 @@
 			case Sdown:
 				remove(srv);
 				break;
+			case Spersist:
 			case Sreg:
 				// No-op
 				break;
@@ -113,8 +114,11 @@
 	int f, fd;
 	char *dest;
 
-	/* TODO: stat first and bail before we double dial/create */
-
+	/* stat first and bail before we double dial/create */
+	if((f = open(srv, OREAD)) >= 0){
+		close(f);
+		return;
+	}
 	/* Dial */
 	dest = netmkaddr(s->address, 0, "9fs");
 	fd = dial(dest, 0, 0, 0);
--- a/publish.c
+++ b/publish.c
@@ -5,7 +5,7 @@
 static void
 usage(void)
 {
-	fprint(2, "usage: %s [-s svcfs] [-d authdom] svcname addr [attr value]\n", argv0);
+	fprint(2, "usage: %s [-s svcfs] [-d authdom] [-p] svcname addr [attr value]\n", argv0);
 	exits("usage");
 }
 
@@ -13,10 +13,11 @@
 main(int argc, char *argv[])
 {
 	char *svcfs, *authdom, ap[NAMELEN];
-    	int i, fd, sfd;
+    	int i, fd, sfd, persist;
 
 	svcfs = nil;
 	authdom = nil;
+	persist = 0;
 	ARGBEGIN{
 	case 's':
 		svcfs = EARGF(usage());
@@ -24,6 +25,9 @@
     	case 'a':
         	authdom = EARGF(usage());
 		break;
+	case 'p':
+		persist++;
+		break;
 	default:
 		usage();
 		break;
@@ -59,6 +63,13 @@
 		goto Error;
 	if(write(fd, argv[1], strlen(argv[1])) < 0)
 		goto Error;
+	if(persist == 1){
+		/* Touch persist */
+		sprint(ap, "/mnt/services/%s/persist", argv[0]);
+		if((fd = create(ap, OWRITE, 0660)) < 0)
+			goto Error;
+		close(fd);
+	}
 	/* Description, authdom */
 	if(argc == 2){
 		unmount("", "/mnt/services");
@@ -72,13 +83,15 @@
 				goto Error;
 			if(write(fd, argv[i+1], strlen(argv[i+1])) < 0)
 				goto Error;
-		} /*else if(strcmp(argv[i], "authdom") == 0){
+			close(fd);
+		} else if (strcmp(argv[i], "authdom") == 0){
 			sprint(ap, "/mnt/services/%s/authdom", argv[0]);
 			if((fd = open(ap, OWRITE|OTRUNC)) < 0)
 				goto Error;
-			if(write(fd, argv[i+1], MAXADDR) <= 0)
+			if(write(fd, argv[i+1], strlen(argv[i+1])) <= 0)
 				goto Error;
-			}*/
+			close(fd);
+		}
 		i++;
 	}
 	unmount("", "/mnt/services");
--- a/query.c
+++ b/query.c
@@ -16,7 +16,7 @@
 
 	svcs = svcquery(fd, query, argv, argc);
 	for(s = svcs; s; s = s->next){
-		print("service=%s address=%s\n", s->name, s->address);
+		print("service=%s address=%s authdom=%s\n", s->name, s->address, s->authdom);
 		switch(s->status){
 		case Sok:
 			print("\tstatus=ok\n");
--- a/svcfs.c
+++ b/svcfs.c
@@ -14,6 +14,8 @@
 	Qstatus,
 	Quptime,
 	Qdesc,
+	Qauth,
+	Qpersist,
 	Qmax,
 };
 
@@ -31,7 +33,6 @@
 	int	ref;
 	vlong	uptime;
 	ulong	uniq;
-	uchar	persist;
 	Entry *link;
 };
 
@@ -41,6 +42,8 @@
 	[Qaddr]		"address",
 	[Qstatus]	"status",
 	[Quptime]	"uptime",
+	[Qauth]		"authdom",
+	[Qpersist]	"persist",
 	[Qdesc]		"description",
 };
 
@@ -47,6 +50,7 @@
 char *status[Smax] = {
 	[Sok] 	= "ok",
 	[Sdown]	= "down",
+	[Spersist] = "persist",
 	[Sreg] = "registered",
 };
 
@@ -53,14 +57,14 @@
 Fid *fids;
 Entry *services[NSVCS];
 char	*svcfile;
-int		readonly;
+int	readonly;
 ulong	uniq;
 Fcall   rhdr, thdr;
 uchar	mdata[8192 + IOHDRSZ];
-int		messagesize = sizeof mdata;
+int	messagesize = sizeof mdata;
 
-Entry *findsvc(char*);
-Entry *installsvc(char*);
+Entry	*findsvc(char*);
+Entry	*installsvc(char*);
 void	insertsvc(Entry*);
 int	removesvc(Entry*);
 int	readservices(void);
@@ -324,10 +328,19 @@
 		return "create of unused fid";
 	if(readonly)
 		return "mounted readonly";
-	if(f->svc != nil)
-		return "permission denied";
 	name = rhdr.name;
 	perm = rhdr.perm;
+	if(f->svc != nil)
+		return "permission denied";
+	/* Allow creation of persist file */
+	if(strcmp(name, "persist") == 0){
+		f->svc->svc->status = Spersist;
+		f->qtype = Qpersist;
+		thdr.qid = mkqid(f->svc, f->qtype);
+		thdr.iounit = messagesize - IOHDRSZ;
+		writeservices();
+		return 0;
+	}
 	if(!(perm & DMDIR))
 		return "permission denied";
 	if(strcmp(name, "") == 0)
@@ -335,7 +348,7 @@
 	if(strlen(name) >= NAMELEN)
 		return "file name too long";
 	if(findsvc(name) != nil)
-		return "svc already exists";
+		return "Service already exists";
 	f->svc = installsvc(name);
 	f->svc->ref++;
 	f->qtype = Qsvc;
@@ -380,6 +393,8 @@
 		max -= Qsvc + 1;
 		j = 0;
 		for(i = 0; i < max; j += m, i++){
+			if(i + Qsvc + 1 == Qpersist)
+				continue;
 			m = dostat(f->svc, i + Qsvc + 1, data, n);
 			if( m <= BIT16SZ)
 				break;
@@ -410,6 +425,9 @@
 	case Qaddr:
 		sprint(data, "%s\n", f->svc->svc->address);
 		goto Readstr;
+	case Qauth:
+		sprint(data, "%s\n", f->svc->svc->authdom);
+		goto Readstr;
 	case Quptime:
 		sprint(data, "%lld\n", f->svc->svc->uptime);
 		goto Readstr;
@@ -435,18 +453,27 @@
 	data = rhdr.data;
 	switch(f->qtype) {
 	case Qaddr:
-		if(n > NAMELEN)
+		if(n > MAXADDR)
 			return "address too big!";
-		if(data[n-1] = '\n')
+		if(data[n-1] == '\n')
 			n--;
 		memmove(f->svc->svc->address, data, n);
 		f->svc->svc->address[n] = '\0';
 		thdr.count = n;
 		break;
+	case Qauth:
+		if(n > MAXAUTH)
+			return "address too big!";
+		if(data[n-1] == '\n')
+			n--;
+		memmove(f->svc->svc->authdom, data, n);
+		f->svc->svc->authdom[n] = '\0';
+		thdr.count = n;
+		break;
 	case Qdesc:
 		if(n > MAXDESC)
 			return "description too long";
-		if(data[n-1] = '\n')
+		if(data[n-1] == '\n')
 			n--;
 		memmove(f->svc->svc->description, data, n);
 		f->svc->svc->description[n] = '\0';
@@ -456,6 +483,7 @@
 	case Qsvc:
 	case Quptime:
 	case Qstatus:
+	case Qpersist:
 	default:
 		return "permission denied";
 	}
@@ -504,7 +532,7 @@
 	int n;
 	char buf[1024];
 
-	if(!f->busy || f->qtype != Qsvc)
+	if(!f->busy || f->qtype != Qsvc || f->qtype != Qpersist)
 		return "permission denied";
 	if(readonly)
 		return "mounted read-only";
@@ -516,10 +544,10 @@
 	if(n == 0 || n > NAMELEN)
 		return "bad service name";
 	if(findsvc(d.name))
-		return "service already exists";
+		return "Service already exists";
 	if(!removesvc(f->svc))
 		return "service already removed";
-	free(f->svc->svc->name);
+	memset(f->svc->svc->name, 0, NAMELEN);
 	memmove(f->svc->svc->name, d.name, NAMELEN);
 	insertsvc(f->svc);
 	writeservices();
@@ -551,7 +579,7 @@
 		d.name = e->svc->name;
 	else
 		d.name = qinfo[qtype];
-	d.uid = d.gid = d.muid = "none"; // Maybe reggie or so
+	d.uid = d.gid = d.muid = "none";
 	d.qid = mkqid(e, qtype);
 	if(d.qid.type & QTDIR)
 		d.mode = 0777|DMDIR;
@@ -575,8 +603,8 @@
 		fprint(2, "attempted to write services to disk in a readonly system\n");
 		return;
 	}
-	
-	entrylen = NAMELEN + MAXADDR + MAXDESC;
+
+	entrylen = NAMELEN + MAXADDR + MAXAUTH + MAXDESC;
 	/* Count our services */
 	for(i = 0; i < NSVCS; i++)
 		for(e = services[i]; e != nil; e = e->link)
@@ -592,6 +620,8 @@
 			p += NAMELEN;
 			strncpy((char *)p, e->svc->address, MAXADDR);
 			p += MAXADDR;
+			strncpy((char *)p, e->svc->authdom, MAXAUTH);
+			p += MAXAUTH;
 			strncpy((char *)p, e->svc->description, MAXDESC);
 			p += MAXDESC;
 		}
@@ -694,7 +724,7 @@
 		return 0;
 	}
 	ep = buf;
-	entrylen = NAMELEN + MAXDESC + MAXADDR;
+	entrylen = NAMELEN + MAXDESC + MAXADDR + MAXAUTH;
 	n = n / entrylen;
 	ns = 0;
 	for(i = 0; i < n; ep += entrylen, i++){
@@ -701,8 +731,9 @@
 		svc = findsvc((char *)ep);
 		if(svc == nil)
 			svc = installsvc((char *)ep);
-		memmove(svc->svc->address, scrub(ep + NAMELEN, MAXADDR), MAXADDR);
-		memmove(svc->svc->description, scrub(ep + NAMELEN + MAXADDR, MAXDESC), MAXDESC);
+		memmove(svc->svc->address, scrub(ep+NAMELEN, MAXADDR), MAXADDR);
+		memmove(svc->svc->authdom, scrub(ep+NAMELEN+MAXADDR, MAXAUTH), MAXAUTH);
+		memmove(svc->svc->description, scrub(ep+NAMELEN+MAXADDR+MAXAUTH, MAXDESC), MAXDESC);
 		ns++;
 	}
 	free(buf);
@@ -723,7 +754,8 @@
 	svc = emalloc(sizeof *svc);
 	memmove(svc->name, name, NAMELEN);
 	memmove(svc->description, "No description provided", MAXDESC);
-	memmove(svc->address, "none", 4);
+	memmove(svc->authdom, "9front", MAXAUTH);
+	memmove(svc->address, "none", MAXADDR);
 	svc->status = Sreg;
 	e->removed = 0;
 	e->ref = 0;
@@ -847,6 +879,8 @@
 {
 	int fd;
 
+	if(svc->svc->status == Spersist)
+		return 2;
 	if(strcmp(svc->svc->address, "none") == 0)
 		return 2;
 	fd = dial(svc->svc->address, nil, nil, nil);
@@ -892,7 +926,7 @@
 					svc->svc->uptime += ((nsec() - start) / 1000000000LL);
 					break;
 				default:
-					/* Still in setup */
+					/* Still in setup or is persist, do not overwrite */
 					break;
 				}
 			}
@@ -930,4 +964,3 @@
 	fprint(2, "svcfs: %s\n", s);
 	exits(s);
 }
-