diff options
author | Sigrid Solveig Haflínudóttir <sigrid@ftrv.se> | 2022-08-01 21:46:39 +0000 |
---|---|---|
committer | Sigrid Solveig Haflínudóttir <sigrid@ftrv.se> | 2022-08-01 21:46:39 +0000 |
commit | b4b4b6cd631e4627f8e581d20fc70d5d13f4de18 (patch) | |
tree | c135e0c46562a17383da03e831c29f434a15cba5 /sys/src/cmd/hjfs | |
parent | 70cc0a7b44ad70929a00565b03327296d2e64c52 (diff) |
hjfs: do not truncate lines on /adm/users write
Diffstat (limited to 'sys/src/cmd/hjfs')
-rw-r--r-- | sys/src/cmd/hjfs/auth.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/sys/src/cmd/hjfs/auth.c b/sys/src/cmd/hjfs/auth.c index ece37c6b6..12785079d 100644 --- a/sys/src/cmd/hjfs/auth.c +++ b/sys/src/cmd/hjfs/auth.c @@ -1,5 +1,6 @@ #include <u.h> #include <libc.h> +#include <bio.h> #include <thread.h> #include "dat.h" #include "fns.h" @@ -184,14 +185,23 @@ err: return -1; } +static int +Bchanwrite(Biobufhdr *b, void *p, long n) +{ + Dir d; + if(chanstat(b->aux, &d) < 0) + return -1; + return chanwrite(b->aux, p, n, d.length); +} + int userssave(Fs *fs, Chan *ch) { User *u, *v; int nu, i; - char buf[512], ubuf[USERLEN], *p, *e; - uvlong off; - + char ubuf[USERLEN], *uname; + Biobuf buf; + rlock(&fs->udatal); u = fs->udata; if(u == nil){ @@ -199,31 +209,30 @@ userssave(Fs *fs, Chan *ch) nu = nelem(udef); }else nu = fs->nudata; - off = 0; + + Binit(&buf, 2, OWRITE); + if(ch != nil) + Biofn(&buf, Bchanwrite); + buf.aux = ch; + for(v = u; v < u + nu; v++){ - p = buf; - e = buf + sizeof(buf); - p = seprint(p, e, "%d:%s:", v->uid, v->name); - if(v->lead != NOUID) - p = strecpy(p, e, uid2name(fs, v->lead, ubuf)); - if(p < e) - *p++ = ':'; + uname = v->lead == NOUID ? "" : uid2name(fs, v->lead, ubuf); + if(Bprint(&buf, "%d:%s:%s:", v->uid, v->name, uname) < 0) + goto err; for(i = 0; i < v->nmemb; i++){ if(v->memb[i] == NOUID) continue; - if(p < e && i > 0) - *p++ = ','; - p = strecpy(p, e, uid2name(fs, v->memb[i], ubuf)); + uname = uid2name(fs, v->memb[i], ubuf); + if(Bprint(&buf, "%s%s", i < 1 ? "" : ",", uname) < 0) + goto err; } - *p++ = '\n'; - if(ch == nil) - write(2, buf, p - buf); - else if(chanwrite(ch, buf, p - buf, off) < p - buf) + if(Bputc(&buf, '\n') < 0) goto err; - off += p - buf; } - runlock(&fs->udatal); - return 0; + if(Bterm(&buf) == 0){ + runlock(&fs->udatal); + return 0; + } err: runlock(&fs->udatal); return -1; |