I've added a tag with the program's name to each fprint(2, ...) in /sys/src/cmd/auth that wasn't obviously debugging output or part of a protocol ('!' seems to be magic at the start of some messages). In some cases, I switched to using sysfatal(). It all compiles and I'm about to install it and reboot the world. Reference: /n/sources/patch/applied/auth-stderr-tags Date: Sat Feb 18 05:38:47 CET 2006 --- /sys/src/cmd/auth/convkeys.c Sat Feb 18 05:22:51 2006 +++ /sys/src/cmd/auth/convkeys.c Sat Feb 18 05:22:48 2006 @@ -74,7 +74,7 @@ fd = open("/dev/random", OREAD); if(fd < 0){ - fprint(2, "can't open /dev/random, using rand()\n"); + fprint(2, "convkeys: can't open /dev/random, using rand()\n"); srand(time(0)); for(i = 0; i < len; i++) p[i] = rand(); @@ -118,7 +118,8 @@ len -= KEYDBOFF; if(len % KEYDBLEN){ - fprint(2, "file odd length; not converting %d bytes\n", len % KEYDBLEN); + fprint(2, "convkeys: file odd length; not converting %d bytes\n", + len % KEYDBLEN); len -= len % KEYDBLEN; } len += KEYDBOFF; --- /sys/src/cmd/auth/convkeys2.c Sat Feb 18 05:23:05 2006 +++ /sys/src/cmd/auth/convkeys2.c Sat Feb 18 05:23:02 2006 @@ -88,7 +88,8 @@ int i, off, noff; if(len % OKEYDBLEN) - fprint(2, "file odd length; not converting %d bytes\n", len % KEYDBLEN); + fprint(2, "convkeys2: file odd length; not converting %d bytes\n", + len % KEYDBLEN); len /= OKEYDBLEN; for(i = 0; i < len; i ++){ off = i*OKEYDBLEN; @@ -108,7 +109,7 @@ void usage(void) { - fprint(2, "usage: convkeys keyfile\n"); + fprint(2, "usage: convkeys2 keyfile\n"); exits("usage"); } @@ -119,7 +120,7 @@ fd = open("/dev/random", OREAD); if(fd < 0){ - fprint(2, "can't open /dev/random, using rand()\n"); + fprint(2, "convkeys2: can't open /dev/random, using rand()\n"); srand(time(0)); for(i = 0; i < len; i++) p[i] = rand(); --- /sys/src/cmd/auth/cron.c Sat Feb 18 05:23:21 2006 +++ /sys/src/cmd/auth/cron.c Sat Feb 18 05:23:18 2006 @@ -140,20 +140,16 @@ user = getuser(); sprint(file, "/cron/%s", user); fd = create(file, OREAD, 0755|DMDIR); - if(fd < 0){ - fprint(2, "couldn't create %s: %r\n", file); - exits("create"); - } + if(fd < 0) + sysfatal("couldn't create %s: %r", file); nulldir(&d); d.gid = user; dirfwstat(fd, &d); close(fd); sprint(file, "/cron/%s/cron", user); fd = create(file, OREAD, 0644); - if(fd < 0){ - fprint(2, "couldn't create %s: %r\n", file); - exits("create"); - } + if(fd < 0) + sysfatal("couldn't create %s: %r", file); nulldir(&d); d.gid = user; dirfwstat(fd, &d); --- /sys/src/cmd/auth/debug.c Sat Feb 18 05:23:38 2006 +++ /sys/src/cmd/auth/debug.c Sat Feb 18 05:23:36 2006 @@ -103,7 +103,7 @@ b = Bopen("/mnt/factotum/ctl", OREAD); if(b == nil){ - fprint(2, "cannot open /mnt/factotum/ctl"); + fprint(2, "debug: cannot open /mnt/factotum/ctl\n"); return; } found = 0; --- /sys/src/cmd/auth/factotum/fs.c Sat Feb 18 05:23:59 2006 +++ /sys/src/cmd/auth/factotum/fs.c Sat Feb 18 05:23:55 2006 @@ -161,7 +161,7 @@ rerrstr(err, sizeof err); if(strcmp(err, "cancel") == 0) break; - fprint(2, "secstorefetch: %r\n"); + fprint(2, "factotum: secstorefetch: %r\n"); fprint(2, "Enter an empty password to quit.\n"); free(secstorepw); secstorepw = nil; /* just try nvram pw once */ @@ -170,7 +170,7 @@ /* rerrstr(err, sizeof err); if(*err) - fprint(2, "havesecstore: %r\n"); + fprint(2, "factotum: havesecstore: %r\n"); */ } } --- /sys/src/cmd/auth/factotum/secstore.c Sat Feb 18 05:24:22 2006 +++ /sys/src/cmd/auth/factotum/secstore.c Sat Feb 18 05:24:18 2006 @@ -363,7 +363,7 @@ *q++ = '\0'; n++; if(ctlwrite(p, 0) < 0) - fprint(2, "secstore(%s) line %d: %r\n", gf, n); + fprint(2, "factotum: secstore(%s) line %d: %r\n", gf, n); p = q; } free(buf); @@ -497,7 +497,7 @@ // recv g**y, S, check hash1(g**xy) if(readstr(conn, mess) < 0){ - fprint(2, "error: %s\n", mess); + fprint(2, "factotum: error: %s\n", mess); writerr(conn, "couldn't read g**y"); goto done; } --- /sys/src/cmd/auth/factotum/util.c Sat Feb 18 05:24:49 2006 +++ /sys/src/cmd/auth/factotum/util.c Sat Feb 18 05:24:44 2006 @@ -948,7 +948,8 @@ fd = open("#c/hostowner", OWRITE); if(fd >= 0){ if(fprint(fd, "%s", owner) < 0) - fprint(2, "setting #c/hostowner to %q: %r\n", owner); + fprint(2, "factotum: setting #c/hostowner to %q: %r\n", + owner); close(fd); } } --- /sys/src/cmd/auth/keyfs.c Sat Feb 18 05:25:46 2006 +++ /sys/src/cmd/auth/keyfs.c Sat Feb 18 05:25:41 2006 @@ -679,7 +679,7 @@ fd = open("/dev/random", OREAD); if(fd < 0){ - fprint(2, "can't open /dev/random, using rand()\n"); + fprint(2, "keyfs: can't open /dev/random, using rand()\n"); srand(time(0)); for(i = 0; i < len; i++) p[i] = rand(); --- /sys/src/cmd/auth/login.c Sat Feb 18 05:26:17 2006 +++ /sys/src/cmd/auth/login.c Sat Feb 18 05:26:15 2006 @@ -15,7 +15,7 @@ if(raw){ ctl = open("/dev/consctl", OWRITE); if(ctl < 0){ - fprint(2, "couldn't set raw mode"); + fprint(2, "login: couldn't set raw mode"); exits("readln"); } write(ctl, "rawon", 5); @@ -29,7 +29,7 @@ close(ctl); close(fdin); close(fdout); - fprint(2, "can't read cons"); + fprint(2, "login: can't read cons"); exits("readln"); } if(*p == 0x7f) @@ -162,7 +162,7 @@ service = getenv("service"); if(strcmp(service, "cpu") == 0) - fprint(2, "warning: running on a cpu server!\n"); + fprint(2, "login: warning: running on a cpu server!\n"); if(argc != 1){ fprint(2, "usage: login username\n"); exits("usage"); --- /sys/src/cmd/auth/passwd.c Sat Feb 18 05:26:52 2006 +++ /sys/src/cmd/auth/passwd.c Sat Feb 18 05:26:49 2006 @@ -130,7 +130,7 @@ error("AS protocol botch: %r"); if(asrdresp(fd, buf, 0) == 0) break; - fprint(2, "refused: %r\n"); + fprint(2, "passwd: refused: %r\n"); } close(fd); --- /sys/src/cmd/auth/printnetkey.c Sat Feb 18 05:27:27 2006 +++ /sys/src/cmd/auth/printnetkey.c Sat Feb 18 05:27:25 2006 @@ -26,10 +26,6 @@ u = argv[0]; fmtinstall('K', keyfmt); - if(argc != 1){ - fprint(2, "usage: printnetkey user\n"); - exits("usage"); - } if(memchr(u, '\0', ANAMELEN) == 0) error("bad user name"); key = findkey(NETKEYDB, u, keybuf); --- /sys/src/cmd/auth/rsa2any.c Sat Feb 18 05:28:07 2006 +++ /sys/src/cmd/auth/rsa2any.c Sat Feb 18 05:28:05 2006 @@ -70,11 +70,11 @@ return nil; } if((p = _strfindattr(a, "size")) == nil) - fprint(2, "warning: missing size; will add\n"); + fprint(2, "rsa2any: warning: missing size; will add\n"); else if((sz = strtol(p, &p, 10)) == 0 || *p != 0) - fprint(2, "warning: bad size; will correct\n"); + fprint(2, "rsa2any: warning: bad size; will correct\n"); else if(sz != mpsignif(key->pub.n)) - fprint(2, "warning: wrong size (got %d, expected %d); will correct\n", + fprint(2, "rsa2any: warning: wrong size (got %d, expected %d); will correct\n", sz, mpsignif(key->pub.n)); if(!needprivate) goto call; @@ -103,32 +103,32 @@ return nil; } if((p = _strfindattr(a, "!kp")) == nil){ - fprint(2, "warning: no !kp\n"); + fprint(2, "rsa2any: warning: no !kp\n"); regen = 1; goto regen; } if((key->kp = strtomp(p, &p, 16, nil)) == nil || *p != 0){ - fprint(2, "warning: bad !kp\n"); + fprint(2, "rsa2any: warning: bad !kp\n"); regen = 1; goto regen; } if((p = _strfindattr(a, "!kq")) == nil){ - fprint(2, "warning: no !kq\n"); + fprint(2, "rsa2any: warning: no !kq\n"); regen = 1; goto regen; } if((key->kq = strtomp(p, &p, 16, nil)) == nil || *p != 0){ - fprint(2, "warning: bad !kq\n"); + fprint(2, "rsa2any: warning: bad !kq\n"); regen = 1; goto regen; } if((p = _strfindattr(a, "!c2")) == nil){ - fprint(2, "warning: no !c2\n"); + fprint(2, "rsa2any: warning: no !c2\n"); regen = 1; goto regen; } if((key->c2 = strtomp(p, &p, 16, nil)) == nil || *p != 0){ - fprint(2, "warning: bad !c2\n"); + fprint(2, "rsa2any: warning: bad !c2\n"); regen = 1; goto regen; } --- /sys/src/cmd/auth/secstore/aescbc.c Sat Feb 18 05:28:49 2006 +++ /sys/src/cmd/auth/secstore/aescbc.c Sat Feb 18 05:28:46 2006 @@ -22,23 +22,15 @@ void safewrite(uchar *buf, int n) { - int i = Bwrite(&bout, buf, n); - - if(i == n) - return; - fprint(2, "write error\n"); - exits("write error"); + if(Bwrite(&bout, buf, n) != n) + sysfatal("write error"); } void saferead(uchar *buf, int n) { - int i = Bread(&bin, buf, n); - - if(i == n) - return; - fprint(2, "read error\n"); - exits("read error"); + if(Bread(&bin, buf, n) != n) + sysfatal("read error"); } int @@ -93,10 +85,8 @@ memset(pass, 0, n); free(pass); } - if(n <= 0){ - fprint(2,"no key\n"); - exits("key"); - } + if(n <= 0) + sysfatal("no key"); dstate = sha1((uchar*)"aescbc file", 11, nil, nil); sha1(buf, n, key2, dstate); memcpy(key, key2, 16); @@ -112,10 +102,8 @@ dstate = hmac_sha1(buf+AESbsize, AESbsize, key2, MD5dlen, 0, 0); while(1){ n = Bread(&bin, buf, BUF); - if(n < 0){ - fprint(2,"read error\n"); - exits("read error"); - } + if(n < 0) + sysfatal("read error"); aesCBCencrypt(buf, n, &aes); safewrite(buf, n); dstate = hmac_sha1(buf, n, key2, MD5dlen, 0, dstate); @@ -139,10 +127,8 @@ memmove(buf, buf+n, SHA1dlen); /* these bytes are not yet decrypted */ } hmac_sha1(0, 0, key2, MD5dlen, buf+SHA1dlen, dstate); - if(memcmp(buf, buf+SHA1dlen, SHA1dlen) != 0){ - fprint(2,"decrypted file failed to authenticate\n"); - exits("decrypted file failed to authenticate"); - } + if(memcmp(buf, buf+SHA1dlen, SHA1dlen) != 0) + sysfatal("decrypted file failed to authenticate"); }else{ /* compatibility with past mistake */ // if file was encrypted with bad aescbc use this: // memset(key, 0, AESmaxkey); @@ -155,10 +141,8 @@ safewrite(buf, n); memmove(buf, buf+n, CHK); } - if(memcmp(buf, "XXXXXXXXXXXXXXXX", CHK) != 0){ - fprint(2,"decrypted file failed to authenticate\n"); - exits("decrypted file failed to authenticate"); - } + if(memcmp(buf, "XXXXXXXXXXXXXXXX", CHK) != 0) + sysfatal("decrypted file failed to authenticate"); } } exits(""); --- /sys/src/cmd/auth/secstore/pak.c Sat Feb 18 05:29:33 2006 +++ /sys/src/cmd/auth/secstore/pak.c Sat Feb 18 05:29:30 2006 @@ -124,7 +124,7 @@ hexHi = PAK_Hi(C, pass, H, Hi); if(verbose) - fprint(2,"%s\n", feedback[H->p[0]&0x7]); // provide a clue to catch typos + fprint(2, "%s\n", feedback[H->p[0]&0x7]); // provide a clue to catch typos // random 1<=x<=q-1; send C, m=g**x H x = mprand(240, genrandom, nil); @@ -142,7 +142,7 @@ // recv g**y, S, check hash1(g**xy) if(readstr(conn, mess) < 0){ - fprint(2, "error: %s\n", mess); + fprint(2, "%s: error: %s\n", argv0, mess); writerr(conn, "couldn't read g**y"); goto done; } @@ -240,7 +240,7 @@ // parse first message into C, m eol = strchr(mess, '\n'); if(strncmp("C=", mess, 2) != 0 || !eol){ - fprint(2,"mess[1]=%s\n", mess); + fprint(2, "%s: mess[1]=%s\n", argv0, mess); writerr(conn, "PAK version mismatch"); goto done; } --- /sys/src/cmd/auth/secstore/secstore.c Sat Feb 18 05:30:21 2006 +++ /sys/src/cmd/auth/secstore/secstore.c Sat Feb 18 05:30:18 2006 @@ -35,7 +35,7 @@ DigestState *sha; if(strchr(gf, '/')){ - fprint(2, "simple filenames, not paths like %s\n", gf); + fprint(2, "secstore: simple filenames, not paths like %s\n", gf); return -1; } memset(&aes, 0, sizeof aes); @@ -47,18 +47,18 @@ s[0] = '\0'; bufw = bufe = nil; if(readstr(conn, s) < 0){ - fprint(2, "remote: %s\n", s); + fprint(2, "secstore: remote: %s\n", s); return -1; } len = atoi(s); if(len == -1){ - fprint(2, "remote file %s does not exist\n", gf); + fprint(2, "secstore: remote file %s does not exist\n", gf); return -1; }else if(len == -3){ - fprint(2, "implausible filesize for %s\n", gf); + fprint(2, "secstore: implausible filesize for %s\n", gf); return -1; }else if(len < 0){ - fprint(2, "GET refused for %s\n", gf); + fprint(2, "secstore: GET refused for %s\n", gf); return -1; } if(buf != nil){ @@ -73,7 +73,7 @@ *buflen = len; for(i=0; i < len; i += n){ if((n = conn->read(conn, (uchar*)s, Maxmsg)) <= 0){ - fprint(2, "empty file chunk\n"); + fprint(2, "secstore: empty file chunk\n"); return -1; } if(buf == nil) @@ -87,21 +87,22 @@ /* conn is already encrypted against wiretappers, but gf is also encrypted against server breakin. */ if(buf == nil && (fd =create(gf, OWRITE, 0600)) < 0){ - fprint(2, "can't open %s: %r\n", gf); + fprint(2, "secstore: can't open %s: %r\n", gf); return -1; } ibr = ibw = ib; for(nr=0; nr < len;){ if((n = conn->read(conn, ibw, Maxmsg)) <= 0){ - fprint(2, "empty file chunk n=%d nr=%d len=%d: %r\n", n, nr, len); + fprint(2, "secstore: empty file chunk n=%d nr=%d len=%d: %r\n", + n, nr, len); return -1; } nr += n; ibw += n; if(!aes.setup){ /* first time, read 16 byte IV */ if(n < AESbsize){ - fprint(2, "no IV in file\n"); + fprint(2, "secstore: no IV in file\n"); return -1; } sha = sha1((uchar*)"aescbc file", 11, nil, nil); @@ -117,7 +118,7 @@ if(buf == nil){ nw = write(fd, ibr, n); if(nw != n){ - fprint(2, "write error on %s", gf); + fprint(2, "secstore: write error on %s", gf); return -1; } }else{ @@ -135,8 +136,8 @@ close(fd); n = ibw-ibr; if((n != CHK) || (memcmp(ib, "XXXXXXXXXXXXXXXX", CHK) != 0)){ - fprint(2,"decrypted file failed to authenticate!\n"); - return -1; + fprint(2, "secstore: decrypted file failed to authenticate!\n"); + return -1; } return 0; } @@ -167,7 +168,7 @@ if(buf == nil){ /* get file size */ if((fd = open(pf, OREAD)) < 0){ - fprint(2, "can't open %s: %r\n", pf); + fprint(2, "secstore: can't open %s: %r\n", pf); return -1; } len = seek(fd, 0, 2); @@ -176,7 +177,8 @@ fd = -1; } if(len > MAXFILESIZE){ - fprint(2, "implausible filesize %ld for %s\n", len, pf); + fprint(2, "secstore: implausible filesize %ld for %s\n", + len, pf); return -1; } @@ -192,7 +194,8 @@ if(buf == nil){ n = read(fd, b+ivo, Maxmsg-ivo); if(n < 0){ - fprint(2, "read error on %s: %r\n", pf); + fprint(2, "secstore: read error on %s: %r\n", + pf); return -1; } }else{ @@ -220,7 +223,7 @@ if(buf == nil) close(fd); - fprint(2, "saved %ld bytes\n", len); + fprint(2, "secstore: saved %ld bytes\n", len); return 0; } @@ -231,7 +234,7 @@ char buf[Maxmsg]; if(strchr(rf, '/')){ - fprint(2, "simple filenames, not paths like %s\n", rf); + fprint(2, "secstore: simple filenames, not paths like %s\n", rf); return -1; } @@ -326,11 +329,11 @@ snprint(prompt, sizeof(prompt), "retype password: "); passck = getpassm(prompt); if(passck == nil){ - fprint(2, "getpassm failed\n"); + fprint(2, "secstore: getpassm failed\n"); goto Out; } if(strcmp(passck, newpass) != 0){ - fprint(2, "passwords didn't match\n"); + fprint(2, "secstore: passwords didn't match\n"); goto Out; } @@ -342,7 +345,7 @@ mpfree(Hi); if(getfile(c->conn, ".", (uchar **) &list, &len, nil, 0) < 0){ - fprint(2, "directory listing failed.\n"); + fprint(2, "secstore: directory listing failed.\n"); goto Out; } @@ -351,13 +354,13 @@ *next = '\0'; if(tokenize(cur, f, nelem(f))< 1) break; - fprint(2, "reencrypting '%s'\n", f[0]); + fprint(2, "secstore: reencrypting '%s'\n", f[0]); if(getfile(c->conn, f[0], &memfile, &len, (uchar*)c->pass, c->passlen) < 0){ - fprint(2, "getfile of '%s' failed\n", f[0]); + fprint(2, "secstore: getfile of '%s' failed\n", f[0]); continue; } if(putfile(c->conn, f[0], memfile, len, (uchar*)newpass, newpasslen) < 0) - fprint(2, "putfile of '%s' failed\n", f[0]); + fprint(2, "secstore: putfile of '%s' failed\n", f[0]); free(memfile); } free(list); @@ -380,10 +383,8 @@ int fd, n, ntry = 0; char *S, *PINSTA = nil, *nl, s[Maxmsg+1], *pass; - if(dest == nil){ - fprint(2, "tried to login with nil dest\n"); - exits("nil dest"); - } + if(dest == nil) + sysfatal("tried to login with nil dest"); c = emalloc(sizeof(*c)); if(pass_nvram){ if(readnvram(&nvr, 0) < 0) @@ -409,7 +410,7 @@ if(verbose) fprint(2, "dialing %s\n", dest); if((fd = dial(dest, nil, nil, nil)) < 0){ - fprint(2, "can't dial %s\n", dest); + fprint(2, "secstore: can't dial %s\n", dest); free(c); return nil; } @@ -421,7 +422,7 @@ if(!pass_stdin && !pass_nvram){ pass = getpassm("secstore password: "); if(strlen(pass) >= sizeof c->pass){ - fprint(2, "password too long, skipping secstore login\n"); + fprint(2, "secstore: password too long, skipping secstore login\n"); exits("password too long"); } strcpy(c->pass, pass); @@ -429,7 +430,7 @@ free(pass); } if(c->pass[0]==0){ - fprint(2, "null password, skipping secstore login\n"); + fprint(2, "secstore: null password, skipping secstore login\n"); exits("no password"); } if(PAKclient(c->conn, id, c->pass, &S) >= 0) @@ -548,7 +549,7 @@ usage(); if(chpass && (ngfile || npfile || nrfile)){ - fprint(2, "Get, put, and remove invalid with password change.\n"); + fprint(2, "secstore: Get, put, and remove invalid with password change.\n"); exits("usage"); } @@ -560,19 +561,14 @@ snprint(tcpserve, rc, "tcp!%s!5356", serve); c = login(user, tcpserve, pass_stdin, pass_nvram); free(tcpserve); - if(c == nil){ - fprint(2, "secstore authentication failed\n"); - exits("secstore authentication failed"); - } + if(c == nil) + sysfatal("secstore authentication failed"); if(chpass) rc = chpasswd(c, user); else rc = cmd(c, gfile, Gflag, pfile, rfile); - if(rc < 0){ - fprint(2, "secstore cmd failed\n"); - exits("secstore cmd failed"); - } + if(rc < 0) + sysfatal("secstore cmd failed"); exits(""); return 0; } - --- /sys/src/cmd/auth/secstore/secstored.c Sat Feb 18 05:31:10 2006 +++ /sys/src/cmd/auth/secstore/secstored.c Sat Feb 18 05:31:07 2006 @@ -208,7 +208,7 @@ return strdup("?!?"); n = read(fd, ap, sizeof ap); if(n <= 0 || n == sizeof ap){ - fprint(2, "error %d reading %s: %r\n", n, rp); + fprint(2, "secstored: error %d reading %s: %r\n", n, rp); return strdup("?!?"); } close(fd); @@ -234,7 +234,7 @@ if((conn = newSConn(fd)) == nil) return -1; if(readstr(conn, msg) < 0){ - fprint(2, "remote: %s: %r\n", msg); + fprint(2, "secstored: remote: %s: %r\n", msg); writerr(conn, "can't read your first message"); goto Out; } --- /sys/src/cmd/auth/secstore/secuser.c Sat Feb 18 05:32:00 2006 +++ /sys/src/cmd/auth/secstore/secuser.c Sat Feb 18 05:31:58 2006 @@ -20,7 +20,7 @@ fprint(2,"first time setup for secstore: create %s %lo\n", f, perm); fd = create(f, OREAD, perm); if(fd < 0){ - fprint(2, "unable to create %s\n", f); + fprint(2, "secuser: unable to create %s\n", f); exits("secstored directories"); } close(fd); --- /sys/src/cmd/auth/secstore/util.c Sat Feb 18 05:32:53 2006 +++ /sys/src/cmd/auth/secstore/util.c Sat Feb 18 05:32:51 2006 @@ -40,15 +40,11 @@ if(cons == 0){ // first time cons = open("/dev/cons", ORDWR); - if(cons < 0){ - fprint(2, "couldn't open cons\n"); - exits("no cons"); - } + if(cons < 0) + sysfatal("couldn't open cons"); consctl = open("/dev/consctl", OWRITE); - if(consctl < 0){ - fprint(2, "couldn't set raw mode\n"); - exits("no consctl"); - } + if(consctl < 0) + sysfatal("couldn't set raw mode via consctl"); } fprint(consctl, "rawon"); fprint(cons, "%s", prompt); --- /sys/src/cmd/auth/uniq.c Sat Feb 18 05:33:48 2006 +++ /sys/src/cmd/auth/uniq.c Sat Feb 18 05:33:46 2006 @@ -58,7 +58,7 @@ w = malloc(sizeof(Who)); if(w == 0){ - fprint(2, "out of memory\n"); + fprint(2, "auth/uniq: out of memory\n"); exits(0); } memset(w, 0, sizeof(Who)); --- /sys/src/cmd/auth/warning.c Sat Feb 18 05:34:49 2006 +++ /sys/src/cmd/auth/warning.c Sat Feb 18 05:34:46 2006 @@ -266,8 +266,7 @@ execl("/bin/upas/send", "send", "-r", rcvr, nil); /* just in case */ - fprint(2, "warning can't exec send: %r\n"); - exits("exec send"); + sysfatal("can't exec send: %r"); return 0; /* for compiler */ }