ref: f87c5f7f43ce3ab4e160b9985b30eb548ee75646
parent: 25ad126d8cae11133d119f015ebe41e46d70f5b6
author: Jacob Moody <moody@posixcafe.org>
date: Fri May 20 02:58:13 EDT 2022
aux/listen: remove Service struct An announcing process already knows what port it announced on, we don't need to derive it from every connection.
--- a/sys/src/cmd/aux/listen.c
+++ b/sys/src/cmd/aux/listen.c
@@ -2,14 +2,9 @@
#include <libc.h>
#include <auth.h>
-#define NAMELEN 64 /* reasonable upper limit for name elements */
-
-typedef struct Service Service;
-struct Service
-{
- char serv[NAMELEN]; /* name of the service */
- char remote[3*NAMELEN]; /* address of remote system */
- char prog[5*NAMELEN+1]; /* program to execute */
+enum{
+ Maxpath = 1024,
+ Maxserv = 64,
};
typedef struct Announce Announce;
@@ -24,9 +19,7 @@
int readstr(char*, char*, char*, int);
void dolisten(char*, int, char*, char*, long*);
-void newcall(int, char*, Service*);
-int findserv(char*, Service*, char*);
-int getserv(char*, Service*);
+void newcall(int, char*, char*, char*);
void error(char*);
void scandir(char*);
void becomenone(void);
@@ -42,7 +35,6 @@
char *protodir;
char *addr;
Announce *announcements;
-#define SEC 1000
char *namespace;
@@ -56,7 +48,6 @@
void
main(int argc, char *argv[])
{
- Service *s;
char *trustdir;
char *servdir;
@@ -102,9 +93,9 @@
if(!servdir && !trustdir)
servdir = "/bin/service";
- if(servdir && strlen(servdir) + NAMELEN >= sizeof(s->prog))
+ if(servdir && strlen(servdir) + Maxserv >= Maxpath)
error("service directory too long");
- if(trustdir && strlen(trustdir) + NAMELEN >= sizeof(s->prog))
+ if(trustdir && strlen(trustdir) + Maxserv >= Maxpath)
error("trusted service directory too long");
switch(argc){
@@ -186,8 +177,7 @@
sleep((pid*10)%200);
- /* copy to stack */
- strncpy(ds, a->a, sizeof(ds));
+ snprint(ds, sizeof ds, "%s!%s!%s", protodir, addr, a->a);
whined = a->whined;
/* a process per service */
@@ -211,7 +201,7 @@
else
exits("ctl");
}
- dolisten(dir, ctl, srvdir, ds, &childs);
+ dolisten(dir, ctl, srvdir, a->a, &childs);
close(ctl);
}
default:
@@ -290,7 +280,6 @@
Announce *a, **l;
int fd, i, n, nlen;
char *nm;
- char ds[128];
Dir *db;
for(a = announcements; a != nil; a = a->next)
@@ -310,8 +299,7 @@
continue;
if(strncmp(nm, proto, nlen) != 0)
continue;
- snprint(ds, sizeof ds, "%s!%s!%s", protodir, addr, nm + nlen);
- addannounce(ds);
+ addannounce(nm + nlen);
}
free(db);
}
@@ -341,14 +329,16 @@
}
void
-dolisten(char *dir, int ctl, char *srvdir, char *dialstr, long *pchilds)
+dolisten(char *dir, int ctl, char *srvdir, char *port, long *pchilds)
{
- Service s;
char ndir[40], wbuf[64];
+ char prog[Maxpath], serv[Maxserv];
int nctl, data, wfd, nowait;
- procsetname("%s %s", dir, dialstr);
-
+ procsetname("%s %s!%s!%s", dir, proto, addr, port);
+ snprint(serv, sizeof serv, "%s%s", proto, port);
+ snprint(prog, sizeof prog, "%s/%s", srvdir, serv);
+
wfd = -1;
nowait = RFNOWAIT;
if(pchilds && maxprocs > 0){
@@ -413,17 +403,6 @@
close(nctl);
continue;
case 0:
- /*
- * see if we know the service requested
- */
- memset(&s, 0, sizeof s);
- if(!findserv(ndir, &s, srvdir)){
- if(!quiet)
- syslog(1, listenlog, "%s: unknown service '%s' from '%s': %r",
- proto, s.serv, s.remote);
- reject(nctl, ndir, "connection refused");
- exits(0);
- }
data = accept(nctl, ndir);
if(data < 0){
syslog(1, listenlog, "can't open %s/data: %r", ndir);
@@ -434,7 +413,7 @@
close(nctl);
if(wfd >= 0)
close(wfd);
- newcall(data, ndir, &s);
+ newcall(data, ndir, prog, serv);
exits(0);
default:
close(nctl);
@@ -447,61 +426,19 @@
}
}
-/*
- * look in the service directory for the service.
- * if the shell script or program is zero-length, ignore it,
- * thus providing a way to disable a service with a bind.
- */
-int
-findserv(char *dir, Service *s, char *srvdir)
-{
- int rv;
- Dir *d;
-
- if(!getserv(dir, s))
- return 0;
- snprint(s->prog, sizeof s->prog, "%s/%s", srvdir, s->serv);
- d = dirstat(s->prog);
- rv = d && d->length > 0; /* ignore unless it's non-empty */
- free(d);
- return rv;
-}
-
-/*
- * get the service name out of the local address
- */
-int
-getserv(char *dir, Service *s)
-{
- char addr[128], *serv, *p;
- long n;
-
- readstr(dir, "remote", s->remote, sizeof(s->remote)-1);
- if(p = utfrune(s->remote, '\n'))
- *p = '\0';
- if(p = utfrune(s->remote, '!'))
- *p = '\0';
-
- n = readstr(dir, "local", addr, sizeof(addr)-1);
- if(n <= 0)
- return 0;
- if(p = utfrune(addr, '\n'))
- *p = '\0';
- serv = utfrune(addr, '!');
- if(!serv)
- return 0;
-
- snprint(s->serv, sizeof s->serv, "%s%s", proto, serv+1);
- return 1;
-}
-
void
-newcall(int fd, char *dir, Service *s)
+newcall(int fd, char *dir, char *prog, char *serv)
{
- char data[4*NAMELEN];
+ char data[Maxpath];
+ char remote[128];
+ char *p;
- if(!quiet)
- syslog(0, listenlog, "%s call for %s on chan %s (%s)", proto, s->serv, dir, s->remote);
+ if(!quiet){
+ readstr(dir, "remote", remote, sizeof remote);
+ if(p = utfrune(remote, '!'))
+ *p = '\0';
+ syslog(0, listenlog, "%s call for %s on chan %s (%s)", proto, serv, dir, remote);
+ }
snprint(data, sizeof data, "%s/data", dir);
bind(data, "/dev/cons", MREPL);
@@ -515,8 +452,8 @@
*/
for(fd=3; fd<20; fd++)
close(fd);
- execl(s->prog, s->prog, s->serv, proto, dir, nil);
- error(s->prog);
+ execl(prog, prog, serv, proto, dir, nil);
+ error(prog);
}
void
@@ -533,7 +470,7 @@
readstr(char *dir, char *info, char *s, int len)
{
int n, fd;
- char buf[3*NAMELEN+4];
+ char buf[Maxpath];
snprint(buf, sizeof buf, "%s/%s", dir, info);
fd = open(buf, OREAD);