commit b589fce2fbf05ae18a6f015240f87ce2a163521f from: rsc date: Fri Feb 11 16:58:23 2005 UTC hard code list of plan 9 services in case they are not in /etc/services commit - 26a5fd572556f6d875c18fff8e83ed5eed6cf8fa commit + b589fce2fbf05ae18a6f015240f87ce2a163521f blob - abd8241bba7972c4ed3b34cb962613447f66a860 blob + c464e9ff94c7ba8749ee4b432197678e8421c686 --- src/lib9/_p9dialparse.c +++ src/lib9/_p9dialparse.c @@ -10,6 +10,24 @@ static char *nets[] = { "tcp", "udp", nil }; #define CLASS(p) ((*(uchar*)(p))>>6) +static struct { + char *net; + char *service; + int port; +} porttbl[] = { + "tcp", "9fs", 564, + "tcp", "whoami", 565, + "tcp", "guard", 566, + "tcp", "ticket", 567, + "tcp", "exportfs", 17007, + "tcp", "rexexec", 17009, + "tcp", "ncpu", 17010, + "tcp", "cpu", 17013, + "tcp", "venti", 17034, + "tcp", "wiki", 17035, + "tcp", "secstore", 5356, +}; + static int parseip(char *host, u32int *pip) { @@ -103,7 +121,7 @@ p9dialparse(char *addr, char **pnet, char **punix, u32 if(strcmp(net, "unix") == 0) goto Unix; - if(strcmp(net, "tcp")!=0 && strcmp(net, "udp")!=0){ + if(strcmp(net, "tcp")!=0 && strcmp(net, "udp")!=0 && strcmp(net, "net") != 0){ werrstr("bad network %s!%s!%s", net, host, port); return -1; } @@ -129,7 +147,19 @@ p9dialparse(char *addr, char **pnet, char **punix, u32 return 0; } } - werrstr("unknown service %s", port); + } + + for(i=0; is_port); return 0; } - werrstr("unknown service %s", port); + werrstr("unknown service %s!*!%s", net, port); return -1; } blob - c8f6605a6dc6d8d52f40d6a9f7765ee070a2fa74 blob + c608f9052673ee1c31803db5908c1b192d51df66 --- src/lib9/create.c +++ src/lib9/create.c @@ -43,6 +43,10 @@ p9create(char *path, int mode, ulong perm) umode |= O_EXCL; mode &= ~OEXCL; } + if(mode&OAPPEND){ + umode |= O_APPEND; + mode &= ~OAPPEND; + } if(mode){ werrstr("unsupported mode in create"); goto out; blob - 592316fe7db49a1445e66472a547e79df7448c3a blob + 88a5ecc4c5ebc137ec7fd8f1743069261826dbe4 --- src/lib9/fcallfmt.c +++ src/lib9/fcallfmt.c @@ -216,15 +216,26 @@ dumpsome(char *ans, char *e, char *buf, long count) if(count > DUMPL) count = DUMPL; for(i=0; i127) + if((buf[i]!=0 && buf[i]<32) || (uchar)buf[i]>127) printable = 0; p = ans; *p++ = '\''; if(printable){ - if(count > e-p-2) - count = e-p-2; - memmove(p, buf, count); - p += count; + if(2*count > e-p-2) + count = (e-p-2)/2; + for(i=0; i e-p-2) count = (e-p-2)/2; @@ -237,5 +248,6 @@ dumpsome(char *ans, char *e, char *buf, long count) } *p++ = '\''; *p = 0; + assert(p < e); return p - ans; } blob - 3ed220ab4d53b063b1defe27b6ea4f8a1a2ac883 blob + d118c47b8fcb8365f6024c17ebf4fec2b16ab0d3 --- src/lib9/mkfile +++ src/lib9/mkfile @@ -117,6 +117,7 @@ LIB9OFILES=\ nan.$O\ needsrcquote.$O\ needstack.$O\ + netcrypt.$O\ netmkaddr.$O\ notify.$O\ nrand.$O\ @@ -130,6 +131,7 @@ LIB9OFILES=\ quote.$O\ rand.$O\ read9pmsg.$O\ + readcons.$O\ readn.$O\ rfork.$O\ searchpath.$O\ @@ -139,6 +141,7 @@ LIB9OFILES=\ strdup.$O\ strecpy.$O\ sysfatal.$O\ + syslog.$O\ sysname.$O\ time.$O\ tokenize.$O\ blob - /dev/null blob + 08fa6761ca1f3ee5125c0a0527ee588575607f8b (mode 644) --- /dev/null +++ src/lib9/netcrypt.c @@ -0,0 +1,18 @@ +#include +#include +#include + +int +netcrypt(void *key, void *chal) +{ + uchar buf[8], *p; + + strncpy((char*)buf, chal, 7); + buf[7] = '\0'; + for(p = buf; *p && *p != '\n'; p++) + ; + *p = '\0'; + encrypt(key, buf, 8); + sprint(chal, "%.2ux%.2ux%.2ux%.2ux", buf[0], buf[1], buf[2], buf[3]); + return 1; +} blob - e76aabe3181ca3dd4bf776e24cd7fbb5e6738e9a blob + c4d3692991f2f29d833aea4590fa2414fe14fc5f --- src/lib9/open.c +++ src/lib9/open.c @@ -32,6 +32,10 @@ p9open(char *name, int mode) umode |= O_NONBLOCK; mode ^= ONONBLOCK; } + if(mode&OAPPEND){ + umode |= O_APPEND; + mode ^= OAPPEND; + } if(mode){ werrstr("mode 0x%x not supported", mode); return -1; blob - /dev/null blob + 8de44b8f95321d02fcd77ac7bf2ad2eb8322c8e3 (mode 644) --- /dev/null +++ src/lib9/readcons.c @@ -0,0 +1,102 @@ +#include +#define NOPLAN9DEFINES +#include +#include +#include + +static int +rawx(int fd, int echoing) +{ + int was; + static struct termios ttmode; + + if(echoing == -1) + return -1; + + if(tcgetattr(fd, &ttmode) < 0) + return -1; + was = (ttmode.c_lflag&(ECHO|ICANON)); + ttmode.c_lflag &= ~(ECHO|ICANON); + ttmode.c_lflag |= echoing; + if(tcsetattr(fd, TCSANOW, &ttmode) < 0) + return -1; + return was; +} + +char* +readcons(char *prompt, char *def, int secret) +{ + int fd, n, raw; + char line[10]; + char *s, *t; + int l; + + if((fd = open("/dev/tty", ORDWR)) < 0) + return nil; + + raw = -1; + if(secret){ + raw = rawx(fd, 0); + if(raw == -1) + return nil; + } + + if(def) + fprint(fd, "%s[%s]: ", prompt, def); + else + fprint(fd, "%s: ", prompt); + + s = strdup(""); + if(s == nil) + return nil; + + for(;;){ + n = read(fd, line, 1); + if(n < 0){ + Error: + if(secret){ + rawx(fd, raw); + write(fd, "\n", 1); + } + close(fd); + free(s); + return nil; + } + if(n > 0 && line[0] == 0x7F) + goto Error; + if(n == 0 || line[0] == 0x04 || line[0] == '\n' || line[0] == '\r'){ + if(secret){ + rawx(fd, raw); + write(fd, "\n", 1); + } + close(fd); + if(*s == 0 && def){ + free(s); + s = strdup(def); + } + return s; + } + if(line[0] == '\b'){ + if(strlen(s) > 0) + s[strlen(s)-1] = 0; + }else if(line[0] == 0x15){ /* ^U: line kill */ + if(def != nil) + fprint(fd, "\n%s[%s]: ", prompt, def); + else + fprint(fd, "\n%s: ", prompt); + s[0] = 0; + }else{ + l = strlen(s); + t = malloc(l+2); + if(t) + memmove(t, s, l); + memset(s, 'X', l); + free(s); + if(t == nil) + return nil; + t[l] = line[0]; + t[l+1] = 0; + s = t; + } + } +} blob - /dev/null blob + 8bb602eb45a78c85d4e8e5fb48d4ad5257ff7980 (mode 644) --- /dev/null +++ src/lib9/syslog.c @@ -0,0 +1,119 @@ +#include +#include + +static struct +{ + int fd; + int consfd; + char *name; + Dir *d; + Dir *consd; + Lock lk; +} sl = +{ + -1, -1, +}; + +static void +_syslogopen(void) +{ + char buf[1024], *p; + + if(sl.fd >= 0) + close(sl.fd); + snprint(buf, sizeof(buf), "#9/log/%s", sl.name); + p = unsharp(buf); + sl.fd = open(p, OWRITE|OCEXEC|OAPPEND); + free(p); +} + +/* + * Print + * sysname: time: mesg + * on /sys/log/logname. + * If cons or log file can't be opened, print on the system console, too. + */ +void +syslog(int cons, char *logname, char *fmt, ...) +{ + char buf[1024]; + char *ctim, *p; + va_list arg; + int n; + Dir *d; + char err[ERRMAX]; + + err[0] = '\0'; + errstr(err, sizeof err); + lock(&sl.lk); + + /* + * paranoia makes us stat to make sure a fork+close + * hasn't broken our fd's + */ + d = dirfstat(sl.fd); + if(sl.fd < 0 + || sl.name == nil + || strcmp(sl.name, logname)!=0 + || sl.d == nil + || d == nil + || d->dev != sl.d->dev + || d->type != sl.d->type + || d->qid.path != sl.d->qid.path){ + free(sl.name); + sl.name = strdup(logname); + if(sl.name == nil) + cons = 1; + else{ + _syslogopen(); + if(sl.fd < 0) + cons = 1; + free(sl.d); + sl.d = d; + d = nil; /* don't free it */ + } + } + free(d); + if(cons){ + d = dirfstat(sl.consfd); + if(sl.consfd < 0 + || d == nil + || sl.consd == nil + || d->dev != sl.consd->dev + || d->type != sl.consd->type + || d->qid.path != sl.consd->qid.path){ + sl.consfd = open("/dev/tty", OWRITE|OCEXEC); + free(sl.consd); + sl.consd = d; + d = nil; /* don't free it */ + } + free(d); + } + + if(fmt == nil){ + unlock(&sl.lk); + return; + } + + ctim = ctime(time(0)); + werrstr(err); + p = buf + snprint(buf, sizeof(buf)-1, "%s ", sysname()); + strncpy(p, ctim+4, 15); + p += 15; + *p++ = ' '; + va_start(arg, fmt); + p = vseprint(p, buf+sizeof(buf)-1, fmt, arg); + va_end(arg); + *p++ = '\n'; + n = p - buf; + + if(sl.fd >= 0){ + seek(sl.fd, 0, 2); + write(sl.fd, buf, n); + } + + if(cons && sl.consfd >=0) + write(sl.consfd, buf, n); + + unlock(&sl.lk); +}