hlfw.ca

registry

Download patch

ref: 9219ba76e68805b7cf2c79ffdc44e4e9b9a45c6e
parent: bbf775bb70004f56a036c4989c9d7eadefc57abf
parent: 8b62d5ea86a77e4f7d4102a2ea95297cc9f85d76
author: halfwit <michaelmisch1985@gmail.com>
date: Mon Oct 23 08:59:58 PDT 2023

Merge pull request #14 from halfwit/rework

Fixes for monitor

--- a/libservice/svcquery.c
+++ b/libservice/svcquery.c
@@ -2,21 +2,21 @@
 #include <libc.h>
 #include "service.h"
 
-char *
-readFile(char *dir, char *name, int len)
+int
+readFile(char *dir, char *name, char *buf, int len)
 {
 	int fd, n;
-	char buf[MAXDESC+1], path[NAMELEN+25];
+	char path[NAMELEN+25];
 
 	sprint(path, "/mnt/services/%s/%s", dir, name);
 	if((fd = open(path, OREAD)) < 0)
-		return nil;
+		return -1;
 	n = readn(fd, buf, len);
 	if(buf[n-1] == '\n' || buf[n-1] == RS)
-		buf[n-1] = '\0';
+		n--;
 	buf[n] = '\0';
 	close(fd);
-	return buf;
+	return n;
 }
 
 Service *
@@ -23,26 +23,27 @@
 addService(Dir d)
 {
 	Service *svc;
-	char *desc, *addr, *auth, *stat, *up;
+	char data[MAXDESC]; 
+	int n;
 
 	svc = malloc(sizeof *svc);
+	memset(svc, '\0', sizeof(svc));
 	memmove(svc->name, d.name, NAMELEN);
-	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));
+	memset(data, '\0', MAXDESC);
+	n = readFile(d.name, "description", data, MAXDESC);
+	memmove(svc->description, data, n);
+	n = readFile(d.name, "authdom", data, MAXAUTH);
+	memmove(svc->authdom, data, n);
+	n = readFile(d.name, "address", data, MAXADDR);
+	memmove(svc->address, data, n);
 	svc->status = Sreg;
-	stat = readFile(d.name, "status", 12);
-	if(strncmp(stat, "ok", 2) == 0)
+	readFile(d.name, "status", data, 12);
+	if(strncmp(data, "ok", 2) == 0)
 		svc->status = Sok;
-	if(strncmp(stat, "down", 4) == 0)
+	if(strncmp(data, "down", 4) == 0)
 		svc->status = Sdown;
-	up = readFile(d.name, "uptime", 64); /* Way huge */
-	svc->uptime = strtoll(up, nil, 10);
-
+	readFile(d.name, "uptime", data, 64); /* Way huge */
+	svc->uptime = strtoll(data, nil, 10);
 	return svc;
 }
 
@@ -72,8 +73,7 @@
 {
 	Service *svc, *bsvc;
 	Dir *d;
-	int dfd, i, n;
-
+	int dfd, i, n;	
 	bsvc = nil;
 
 	/* Build out a tuple based on our search values */
@@ -82,6 +82,7 @@
 	if(mount(fd, -1, "/mnt/services", MREPL, "") < 0)
 		return nil;
 	dfd = open("/mnt/services", OREAD);
+	d = nil;
 	while((n = dirread(dfd, &d)) > 0){
 		for(i=0; i < n; i++){
 			if(argc == 2 && filter(d[i], argv[0], argv[1]) < 0)
@@ -94,6 +95,7 @@
 		}
 		free(d);	
 	}
+	close(dfd);
 	unmount(0, "/mnt/services");
 	return bsvc;
 }
--- a/monitor.c
+++ b/monitor.c
@@ -2,8 +2,9 @@
 #include <libc.h>
 #include "service.h"
 
-void monitor(char *,int, int, int);
+void monitor(char*, char*, int, int);
 void publish(Service *, char *);
+void check(int, int);
 
 static void
 usage(void)
@@ -17,11 +18,11 @@
 {
 	char *svcfs;
 	char *authdom;
-	int style, fd, pollrate;
+	int style, pollrate;
 
 	svcfs = nil;
-	authdom = nil;
 	style = 1;
+	authdom = "9front";
 	pollrate = 30;
 
 	ARGBEGIN{
@@ -44,66 +45,74 @@
 
 	if(argc > 0)
 		usage();
-	if((fd = svcdial(svcfs, authdom)) < 0){
-		fprint(2, "Unable to dial svcfs: %r\n");
-		exits("error");
-	}
 
-	if(authdom != nil){
-		monitor(authdom, fd, style, pollrate);
-		exits(0);
-	}
-	monitor("9front", fd, style, pollrate);
+	monitor(svcfs, authdom, style, pollrate);
 	exits(0);
 
 }
 
 char *
-clean(char *addr)
+addr2hostname(char *addr)
 {
-	char *c;
 	if(strncmp(addr, "tcp!", 4) == 0)
-		addr += 4;
-	c = strchr(addr, '!');
-	if(c != nil)
-		*c='\0';
-	return addr ;
+		return addr+4;
+	return addr;
 }
 
 void
-monitor(char *authdom, int fd, int style, int rate)
+check(int fd, int style)
 {
-	Service *svc, *s;
 	char srv[MAXADDR];
-	int i;
+	char *host;
+	Service *svc, *s;
+	print("Checking for /srv updates\n");
+	svc = svcquery(fd, ".", nil, 0);
+	if(svc == nil){
+		fprint(2, "Error parsing service entries\n");
+		return;
+	}
 
+	for(s = svc; s; s = s->next){
+		host = addr2hostname(s->address);
+		switch(style){
+		case 1:
+			sprint(srv, "/srv/%s.%s.%s", s->name, host, s->authdom);
+			break;
+		case 2:
+			sprint(srv, "/srv/%s.%s.%s", s->authdom, host, s->name);
+			break;
+		}
+		switch(s->status){
+		case Sok:
+			publish(s, srv);
+			break;
+		case Sdown:
+			remove(srv);
+			break;
+		case Spersist:
+		case Sreg:
+		default:
+			//
+			break;
+		}
+	}
+	svcfree(svc);
+}
+
+void
+monitor(char *svcfs, char *authdom, int style, int rate)
+{
+	int i, fd;
+
 	for(;;){
+		if((fd = svcdial(svcfs, authdom)) < 0){
+			fprint(2, "Unable to dial svcfs: %r\n");
+			exits("error");
+		}
 		for(i=0; i < rate; i++)
 			sleep(1000);
-		svc = svcquery(fd, ".", nil, 0);
-		for(s = svc; s; s = s->next){
-			switch(style){
-			case 1:
-				sprint(srv, "/srv/%s.%s.%s", s->name, clean(s->address), authdom);
-				break;
-			case 2:
-				sprint(srv, "/srv/%s.%s.%s", authdom, clean(s->address), s->name);
-				break;
-			}
-			switch(s->status){
-			case Sok:
-				publish(s, srv);
-				break;
-			case Sdown:
-				remove(srv);
-				break;
-			case Spersist:
-			case Sreg:
-				// No-op
-				break;
-			}
-		}
-		svcfree(svc);
+		check(fd, style);
+		close(fd);
 	}
 }
 
@@ -112,23 +121,29 @@
 {
 	char buf[128];
 	int f, fd;
-	char *dest;
 
 	/* stat first and bail before we double dial/create */
-	if((f = open(srv, OREAD)) >= 0){
+	if((f = open(srv, OREAD)) > 0){
 		close(f);
 		return;
 	}
 	/* Dial */
-	dest = netmkaddr(s->address, 0, "9fs");
-	fd = dial(dest, 0, 0, 0);
+	fd = dial(s->address, 0, 0, 0);
 	if(fd < 0)
-		return;
+		goto Error;
 	f = create(srv, OWRITE, 0666);
 	if(f < 0)
-		return;
+		goto Error;
 	/* Publish fd from dial */
 	sprint(buf, "%d", fd);
 	write(f, buf, strlen(buf));
+	print("publish %s\n", srv);
 	close(f);
+	return;
+Error:
+	close(f);
+	if(fd >= 0)
+		close(fd);
+	fprint(2, "Unable to publish service: %r\n");
+	
 }