From b589fce2fbf05ae18a6f015240f87ce2a163521f Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 11 Feb 2005 16:58:23 +0000 Subject: hard code list of plan 9 services in case they are not in /etc/services --- src/lib9/_p9dialparse.c | 36 +++++++++++++-- src/lib9/create.c | 4 ++ src/lib9/fcallfmt.c | 22 +++++++-- src/lib9/mkfile | 3 ++ src/lib9/netcrypt.c | 18 ++++++++ src/lib9/open.c | 4 ++ src/lib9/readcons.c | 102 +++++++++++++++++++++++++++++++++++++++++ src/lib9/syslog.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 300 insertions(+), 8 deletions(-) create mode 100644 src/lib9/netcrypt.c create mode 100644 src/lib9/readcons.c create mode 100644 src/lib9/syslog.c (limited to 'src/lib9') diff --git a/src/lib9/_p9dialparse.c b/src/lib9/_p9dialparse.c index abd8241b..c464e9ff 100644 --- a/src/lib9/_p9dialparse.c +++ b/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, u32int *phost, int *pport) 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, u32int *phost, int *pport) 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; } diff --git a/src/lib9/create.c b/src/lib9/create.c index c8f6605a..c608f905 100644 --- a/src/lib9/create.c +++ b/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; diff --git a/src/lib9/fcallfmt.c b/src/lib9/fcallfmt.c index 592316fe..88a5ecc4 100644 --- a/src/lib9/fcallfmt.c +++ b/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; } diff --git a/src/lib9/mkfile b/src/lib9/mkfile index 3ed220ab..d118c47b 100644 --- a/src/lib9/mkfile +++ b/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\ diff --git a/src/lib9/netcrypt.c b/src/lib9/netcrypt.c new file mode 100644 index 00000000..08fa6761 --- /dev/null +++ b/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; +} diff --git a/src/lib9/open.c b/src/lib9/open.c index e76aabe3..c4d36929 100644 --- a/src/lib9/open.c +++ b/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; diff --git a/src/lib9/readcons.c b/src/lib9/readcons.c new file mode 100644 index 00000000..8de44b8f --- /dev/null +++ b/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; + } + } +} diff --git a/src/lib9/syslog.c b/src/lib9/syslog.c new file mode 100644 index 00000000..8bb602eb --- /dev/null +++ b/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); +} -- cgit v1.2.3