ref: d8b55de29e54dbae7ab2fabfb47ae1b1f1404809
parent: 0d7c6fae35a1fe99a0b74fbbdf18942f68e20f81
author: halfwit <michaelmisch1985@gmail.com>
date: Sun Oct 22 11:39:10 PDT 2023
Add in authdom to tuple, small bugfixes
--- 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/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);
}
-