hlfw.ca

registry

Download patch

ref: 4d109988ae6b45a44d7f4f774dc1f5b22132dfdb
parent: 75f3f5776117fba81f4234c80cf990e0add66a7c
author: halfwit <michaelmisch1985@gmail.com>
date: Fri Oct 13 07:11:10 PDT 2023

Initial, working svcfs

--- a/aux/svcfs.c
+++ b/aux/svcfs.c
@@ -48,7 +48,7 @@
 	char	*addr;
 	char	removed;
 	int	ref;
-	ulong	uptime;
+	vlong	uptime;
 	ulong	uniq;
 	uchar	persist;
 	uchar	status;
@@ -87,6 +87,7 @@
 void		writeservices(void);
 void	error(char*);
 int		dostat(Service*, ulong, void*, int);
+void	watch(void);
 void	io(int, int);
 Qid		mkqid(Service*, ulong);
 ulong	hash(char*);
@@ -127,7 +128,7 @@
 main(int argc, char *argv[])
 {
 	char *mntpt;
-	int p[2];
+	int p[2], pid;
 
 	mntpt = "/mnt/services";
 	ARGBEGIN{
@@ -153,11 +154,17 @@
 		error("Can't make pipe: %r");
 
 	readservices();
+	if((pid = rfork(RFPROC|RFMEM)) == 0) {
+		watch();
+		exits(0);
+	}
 
-	switch(rfork(RFPROC|RFNAMEG|RFNOTEG|RFNOWAIT|RFENVG|RFFDG)){
+	switch(rfork(RFPROC|RFNAMEG|RFNOTEG|RFNOWAIT|RFENVG|RFFDG|RFMEM)){
 	case 0:
 		close(p[0]);
 		io(p[1], p[1]);
+		postnote(PNPROC, 1, "shutdown");
+		postnote(PNPROC, pid, "shutdown");
 		exits(0);
 	case -1:
 		error("fork");
@@ -427,7 +434,7 @@
 		sprint(data, "%s\n", f->svc->addr);
 		goto Readstr;
 	case Quptime:
-		sprint(data, "%lud\n", f->svc->uptime);
+		sprint(data, "%lld\n", f->svc->uptime);
 		goto Readstr;
 	case Qdesc:
 		sprint(data, "%s\n", f->svc->description);
@@ -647,7 +654,6 @@
 			buf[i] = 0;
 		} else if(isascii(r) && iscntrl(r) || r == ' ' || r == '/')
 			rv = -1;
-
 	}
 
 	if(i == 0){
@@ -827,7 +833,8 @@
 	return f;
 }
 
-void io(int in, int out)
+void
+io(int in, int out)
 {
 	char *err;
 	int n;
@@ -855,6 +862,62 @@
 	}
 }
 
+int
+alive(Service *svc)
+{
+	int fd;
+
+	if(strncmp(svc->addr, "none", 4) == 0)
+		return 2;
+	fd = dial(svc->addr, nil, nil, nil);
+	if(fd < 0){
+		if(svc->status == Sreg)
+			return 2;
+		return -1;
+	}
+	close(fd);
+	if(svc->status == Sok)
+		return 1;
+	return 0;
+}
+
+void
+watch(void)
+{
+	/* Status, uptime */
+	Service *svc;
+	int i;
+	int seconds;
+	vlong start;
+
+	seconds = 30;
+	for(;;) {
+		start = nsec();
+		for(i = 0; i < seconds; i++)
+			sleep(1000);
+		for(i = 0; i < Nsvcs; i++)
+			for(svc = services[i]; svc !=nil; svc = svc->link)
+				switch(alive(svc)){
+				case -1: 
+					/* Offline */
+					svc->status = Sdown;
+					break;
+				case 0:
+					/* Coming online */
+					svc->status = Sok;
+					svc->uptime = 0;
+					break;
+				case 1:
+					svc->status = Sok;
+					svc->uptime += ((nsec() - start) / 1000000000LL);
+					break;
+				default:
+					/* Still in setup */
+					break;
+				}
+	}
+}
+
 void *
 emalloc(ulong n)
 {
@@ -886,3 +949,4 @@
 	fprint(2, "svcfs: %s\n", s);
 	exits(s);
 }
+
--- a/svc/add
+++ b/svc/add
@@ -1,2 +1,41 @@
 #!/bin/rc
 
+argv0=$0
+
+fn usage {
+	echo 'Usage:' $argv0 ' [-s svcfs] svcname addr [attr value]'
+	exits 'usage';
+}
+
+svcfs=()
+desc=()
+auth=()
+
+if(~ $1 "-s"){
+	shift
+	svcfs=$1
+	shift
+}
+
+svcname=$1; shift
+addr=$1; shift
+
+~ $svcname "" && usage
+~ $addr "" && usage
+
+while(! ~ $#* 0){
+	switch($1){
+	case "description":
+		$desc=$2
+		shift
+	case "auth":
+		$auth=$2
+		shift
+	}
+	shift
+}
+
+if(! ~ $#* 0)
+	usage
+
+# Now connect to the svcfs. Create out file, then set the address, description, and apparently the auth server