ref: 75f3f5776117fba81f4234c80cf990e0add66a7c
parent: 204dfd8a3284aa805d716adf50766607cd8bbd33
author: halfwit <michaelmisch1985@gmail.com>
date: Fri Oct 13 04:21:02 PDT 2023
Update to use recordseparator and chunk instead of a parse
--- a/aux/svcfs.c
+++ b/aux/svcfs.c
@@ -24,11 +24,13 @@
Nsvcs = 512,
MAXDESC = 256,
MAXADDR = 128,
+ RS = 0x1e,
};
enum {
Sok,
Sdown,
+ Sreg,
Smax,
};
@@ -65,6 +67,7 @@
char *status[Smax] = {
[Sok] = "ok",
[Sdown] = "down",
+ [Sreg] = "registered",
};
Fid *fids;
@@ -304,6 +307,8 @@
f->busy = 0;
if(f->svc != nil && --f->svc->ref == 0 && f->svc->removed) {
free(f->svc->name);
+ free(f->svc->description);
+ free(f->svc->addr);
free(f->svc);
}
f->svc = nil;
@@ -448,6 +453,8 @@
case Qaddr:
if(n > Namelen)
return "address too big!";
+ if(data[n-1] = '\n')
+ n--;
memmove(f->svc->addr, data, n);
f->svc->addr[n] = '\0';
thdr.count = n;
@@ -455,6 +462,8 @@
case Qdesc:
if(n > Namelen)
return "description too long";
+ if(data[n-1] = '\n')
+ n--;
memmove(f->svc->description, data, n);
f->svc->description[n] = '\0';
thdr.count = n;
@@ -591,7 +600,7 @@
/* Make a buffer large enough to hold each line */
buf = emalloc(ns * entrylen);
- memset(buf, '·', entrylen);
+ memset(buf, RS, entrylen);
p = buf;
for(i = 0; i < Nsvcs; i++)
for(svc = services[i]; svc !=nil; svc = svc->link){
@@ -625,7 +634,7 @@
memmove(buf, svc, Namelen);
if(buf[Namelen-1] != 0){
- fprint(2, "keyfs: %d: no termination: %W\n", nu, buf);
+ fprint(2, "svcfs: %d: no termination\n", nu);
return -1;
}
@@ -634,18 +643,19 @@
n = chartorune(&r, buf+i);
if(r == Runeerror){
rv = -1;
- } else if(isascii(r) && iscntrl(r) || r == ' ' || r == '/'){
- rv = -1;
- } else if(r == '·') /* Scrub our spacer out */
+ } else if(r == RS) { /* Scrub our spacer out */
buf[i] = 0;
+ } else if(isascii(r) && iscntrl(r) || r == ' ' || r == '/')
+ rv = -1;
+
}
if(i == 0){
- fprint(2, "keyfs: %d: nil name\n", nu);
+ fprint(2, "svcfs: %d: nil name\n", nu);
return -1;
}
if(rv == -1)
- fprint(2, "keyfs: %d: bad syntax: %W\n", nu, buf);
+ fprint(2, "svcfs: %d: bad syntax\n", nu);
return rv;
}
@@ -654,21 +664,21 @@
{
int i, n;
Rune r;
- char buf[len+1];
+ char *buf;
+ buf = emalloc(len);
memset(buf, 0, sizeof buf);
memmove(buf, ep, len);
for(i = 0; buf[i]; i += n){
n = chartorune(&r, buf+i);
- if(r == Runeerror){
- return 'error';
- }
- if(r == '·')
+ if(r == Runeerror)
+ return "error";
+ if(r == RS)
buf[i] = 0;
}
if(i == 0){
- return "No description provided";
+ return "empty";
}
return buf;
}
@@ -678,7 +688,6 @@
{
int fd, i, n, ns, entrylen;
uchar *buf, *ep;
- char *name;
Service *svc;
Dir *d;
@@ -702,7 +711,6 @@
return 0;
}
ep = buf;
- free(buf);
entrylen = Namelen + MAXDESC + MAXADDR;
n = n / entrylen;
ns = 0;
@@ -710,8 +718,8 @@
svc = findsvc((char *)ep);
if(svc == nil)
svc = installsvc((char *)ep);
- svc->description = scrub(ep + Namelen, MAXDESC);
- svc->addr = scrub(ep + Namelen + MAXDESC, MAXADDR);
+ svc->addr = scrub(ep + Namelen, MAXADDR);
+ svc->description = scrub(ep + Namelen + MAXADDR, MAXDESC);
ns++;
}
free(buf);
@@ -729,11 +737,11 @@
h = hash(name);
svc = emalloc(sizeof *svc);
svc->name = estrdup(name);
- svc->description = estrdup("none");
+ svc->description = estrdup("No description provided");
svc->addr = estrdup("none");
svc->removed = 0;
svc->ref = 0;
- svc->status = Sok;
+ svc->status = Sreg;
svc->uniq = uniq++;
svc->link = services[h];
services[h] = svc;