dial.c, which needed netlog.c, so netlog too.
authorRonald G. Minnich <rminnich@google.com>
Fri, 17 Jan 2014 21:16:56 +0000 (13:16 -0800)
committerRonald G. Minnich <rminnich@google.com>
Fri, 17 Jan 2014 21:17:44 +0000 (13:17 -0800)
Netlog may be very handy at some point anyway; A file
interface you can read log info on.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/include/ip.h
kern/include/ns.h
kern/include/string.h
kern/src/net/Kbuild
kern/src/net/dial.c
kern/src/net/netlog.c
kern/src/string.c

index dede04f..83fe892 100644 (file)
@@ -326,7 +326,7 @@ struct Fs
        struct route    *v6root[1<<Lroot];      /* v6 routing forest */
        struct route    *queue;                 /* used as temp when reinjecting routes */
 
-       //Netlog        *alog;
+       struct Netlog   *alog;
        struct Ifclog   *ilog;
 
        char    ndb[1024];              /* an ndb entry for this interface */
@@ -846,10 +846,4 @@ extern int ReTransTimer;
 
 int kdial(char *dest, char *local, char *dir, int *cfdp);
 
-#define netlog(f, mask, ...)\
-{\
-       printk("netlog: f %p, mask %d: ", f, mask);\
-       _warn(__FILE__, __LINE__, __VA_ARGS__);\
-}
-
 #endif /* ROS_KERN_IP_H */
index 1b13ee2..a230e2d 100644 (file)
@@ -723,7 +723,6 @@ void                iallocsummary(void);
 void           ilock(spinlock_t*);
 int            iprint( char *unused_char_p_t, ...);
 void           isdir(struct chan*);
-int            iseve(void);
 int            islo(void);
 void           iunlock(spinlock_t*);
 void           ixsummary(void);
@@ -1007,4 +1006,9 @@ int sysdirfwstat(int fd, struct dir *dir);
 long sysdirread(int fd, struct dir **d);
 int sysiounit(int fd);
 
+static inline int iseve(void)
+{
+       return 1;
+}
+
 #endif /* ROS_KERN_NS_H */
index ee2807c..8788e29 100644 (file)
@@ -19,6 +19,7 @@ size_t        strlcpy(STRBUF(size-1) dst, const STRING src, size_t size);
 int    strcmp(const STRING s1, const STRING s2);
 int    strncmp(const STRING s1, const STRING s2, size_t size);
 STRING strchr(const STRING s, char c);
+STRING strrchr(const STRING s, char c);
 STRING strfind(const STRING s, char c);
 
 void * (DMEMSET(1, 2, 3) memset)(void* p, int what, size_t sz);
index e38004a..0925eb6 100644 (file)
@@ -1,6 +1,7 @@
 obj-y                                          += arp.o
 #obj-y                                         += compress.o
 obj-y                                          += devip.o
+obj-y                                          += dial.o
 obj-y                                          += ethermedium.o
 obj-y                                          += icmp.o
 obj-y                                          += icmp6.o
@@ -13,6 +14,7 @@ obj-y                                         += ipifc.o
 obj-y                                          += loopbackmedium.o
 obj-y                                          += netaux.o
 obj-y                                          += netdevmedium.o
+obj-y                                          += netlog.o
 obj-y                                          += nullmedium.o
 obj-y                                          += plan9.o
 obj-y                                          += ptclbsum.o
index a9a723d..691a906 100644 (file)
@@ -15,7 +15,7 @@
 
 typedef struct DS DS;
 
-static int     call( char *cp, char*cp, DS*DS);
+static int     call( char *cp, char*cp1, DS*DS);
 static int     csdial(DS*DS);
 static void    _dial_string_parse( char *cp, DS*DS);
 static int     nettrans( char *cp, char*cp1, int na, char*cp2, int i);
@@ -23,7 +23,6 @@ static int    nettrans( char *cp, char*cp1, int na, char*cp2, int i);
 enum
 {
        Maxstring=      128,
-       Maxpath=        100
 };
 
 struct DS
@@ -37,6 +36,12 @@ struct DS
        int     *cfdp;
 };
 
+/* only used here for now. */
+static void kerrstr(void *err, int len)
+{
+       strncpy(err, current_errstr(), len);
+}
+
 /*
  *  the dialstring is of the form '[/net/]proto!dest'
  */
@@ -61,9 +66,8 @@ kdial(char *dest, char *local, char *dir, int *cfdp)
                return rv;
 
        err[0] = 0;
-       kerrstr(err, sizeof err);
+       strncpy(err, current_errstr(), sizeof err);
        if(strstr(err, "refused") != 0){
-               kerrstr(err, sizeof err);
                return rv;
        }
 
@@ -102,11 +106,11 @@ csdial(DS *ds)
        /*
         *  ask connection server to translate
         */
-       sprint(buf, "%s!%s", ds->proto, ds->rem);
-       if(kwrite(fd, buf, strlen(buf)) < 0){
+       snprintf(buf, sizeof(buf), "%s!%s", ds->proto, ds->rem);
+       if(syswrite(fd, buf, strlen(buf)) < 0){
                kerrstr(err, sizeof err);
                sysclose(fd);
-               kwerrstr("%s (%s)", err, buf);
+               set_errstr("%s (%s)", err, buf);
                return -1;
        }
 
@@ -117,7 +121,7 @@ csdial(DS *ds)
        *besterr = 0;
        strncpy(err,  Egreg, sizeof(err));
        rv = -1;
-       kseek(fd, 0, 0);
+       sysseek(fd, 0, 0);
        while((n = sysread(fd, buf, sizeof(buf) - 1)) > 0){
                buf[n] = 0;
                p = strchr(buf, ' ');
@@ -150,7 +154,7 @@ call(char *clone, char *dest, DS *ds)
        cfd = sysopen(clone, ORDWR);
        if(cfd < 0){
                kerrstr(err, sizeof err);
-               kwerrstr("%s (%s)", err, clone);
+               set_errstr("%s (%s)", err, clone);
                return -1;
        }
 
@@ -159,13 +163,13 @@ call(char *clone, char *dest, DS *ds)
        if(n < 0){
                kerrstr(err, sizeof err);
                sysclose(cfd);
-               kwerrstr("read %s: %s", clone, err);
+               set_errstr("read %s: %s", clone, err);
                return -1;
        }
        name[n] = 0;
        for(p = name; *p == ' '; p++)
                ;
-       sprint(name, "%ld", strtoul(p, 0, 0));
+       snprintf(name, sizeof(name), "%ld", strtoul(p, 0, 0));
        p = strrchr(clone, '/');
        *p = 0;
        if(ds->dir)
@@ -177,11 +181,11 @@ call(char *clone, char *dest, DS *ds)
                snprintf(name, sizeof(name), "connect %s %s", dest, ds->local);
        else
                snprintf(name, sizeof(name), "connect %s", dest);
-       if(kwrite(cfd, name, strlen(name)) < 0){
+       if(syswrite(cfd, name, strlen(name)) < 0){
                err[0] = 0;
                kerrstr(err, sizeof err);
                sysclose(cfd);
-               kwerrstr("%s (%s)", err, name);
+               set_errstr("%s (%s)", err, name);
                return -1;
        }
 
@@ -190,7 +194,7 @@ call(char *clone, char *dest, DS *ds)
        if(fd < 0){
                err[0] = 0;
                kerrstr(err, sizeof err);
-               kwerrstr("%s (%s)", err, data);
+               set_errstr("%s (%s)", err, data);
                sysclose(cfd);
                return -1;
        }
@@ -265,7 +269,7 @@ kannounce(char *addr, char *dir)
        /*
         *  find out which line we have
         */
-       n = sprint(buf, "%.*s/", sizeof buf, netdir);
+       n = snprintf(buf, sizeof(buf), "%.*s/", sizeof buf, netdir);
        m = sysread(ctl, &buf[n], sizeof(buf)-n-1);
        if(m <= 0){
                sysclose(ctl);
@@ -277,7 +281,7 @@ kannounce(char *addr, char *dir)
         *  make the call
         */
        n = snprintf(buf2, sizeof buf2, "announce %s", naddr);
-       if(kwrite(ctl, buf2, n)!=n){
+       if(syswrite(ctl, buf2, n)!=n){
                sysclose(ctl);
                return -1;
        }
@@ -372,7 +376,7 @@ nettrans(char *addr, char *naddr, int na, char *file, int nf)
         */
        p = strchr(addr, '!');
        if(p == 0){
-               kwerrstr("bad dial string: %s", addr);
+               set_errstr("bad dial string: %s", addr);
                return -1;
        }
        if(*addr != '/'){
@@ -382,7 +386,7 @@ nettrans(char *addr, char *naddr, int na, char *file, int nf)
                        ;
                i = p2 - addr;
                if(i == 0 || i >= sizeof(netdir)){
-                       kwerrstr("bad dial string: %s", addr);
+                       set_errstr("bad dial string: %s", addr);
                        return -1;
                }
                strncpy(netdir, addr, i);
@@ -393,15 +397,15 @@ nettrans(char *addr, char *naddr, int na, char *file, int nf)
        /*
         *  ask the connection server
         */
-       sprint(buf, "%s/cs", netdir);
+       snprintf(buf, sizeof(buf), "%s/cs", netdir);
        fd = sysopen(buf, ORDWR);
        if(fd < 0)
                return identtrans(netdir, addr, naddr, na, file, nf);
-       if(kwrite(fd, addr, strlen(addr)) < 0){
+       if(syswrite(fd, addr, strlen(addr)) < 0){
                sysclose(fd);
                return -1;
        }
-       kseek(fd, 0, 0);
+       sysseek(fd, 0, 0);
        n = sysread(fd, buf, sizeof(buf)-1);
        sysclose(fd);
        if(n <= 0)
index 083825d..6126de9 100644 (file)
@@ -1,10 +1,17 @@
-#include       "u.h"
-#include       "../port/lib.h"
-#include       "mem.h"
-#include       "dat.h"
-#include       "fns.h"
-#include       "../port/error.h"
-#include       "../ip/ip.h"
+// INFERNO
+#include <vfs.h>
+#include <kfs.h>
+#include <slab.h>
+#include <kmalloc.h>
+#include <kref.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <error.h>
+#include <cpio.h>
+#include <pmap.h>
+#include <smp.h>
+#include <ip.h>
 
 enum {
        Nlog            = 4*1024,
@@ -14,7 +21,7 @@ enum {
  *  action log
  */
 struct Netlog {
-       Lock;
+       spinlock_t lock;
        int     opens;
        char*   buf;
        char    *end;
@@ -22,11 +29,11 @@ struct Netlog {
        int     len;
 
        int     logmask;                        /* mask of things to debug */
-       uchar   iponly[IPaddrlen];              /* ip address to print debugging for */
+       uint8_t iponly[IPaddrlen];              /* ip address to print debugging for */
        int     iponlyset;
 
-       QLock;
-       Rendez;
+       qlock_t qlock;
+       struct rendez r;
 };
 
 typedef struct Netlogflag {
@@ -51,7 +58,7 @@ static Netlogflag flags[] =
        { "udpmsg",     Logudp|Logudpmsg, },
        { "ipmsg",      Logip|Logipmsg, },
        { "esp",        Logesp, },
-       { nil,          0, },
+       { NULL,         0, },
 };
 
 char Ebadnetctl[] = "too few arguments for netlog control message";
@@ -64,76 +71,79 @@ enum
 };
 
 static
-Cmdtab routecmd[] = {
-       CMset,          "set",          0,
-       CMclear,        "clear",        0,
-       CMonly,         "only",         0,
+struct cmdtab routecmd[] = {
+       {CMset,         "set",          0},
+       {CMclear,       "clear",        0},
+       {CMonly,                "only",         0},
 };
 
 void
-netloginit(Fs *f)
+netloginit(struct Fs *f)
 {
-       f->alog = smalloc(sizeof(Netlog));
+       f->alog = kzmalloc(sizeof(struct Netlog), 0);
 }
 
 void
-netlogopen(Fs *f)
+netlogopen(struct Fs *f)
 {
-       lock(f->alog);
+       ERRSTACK(2);
+       spin_lock(&f->alog->lock);
        if(waserror()){
-               unlock(f->alog);
+               spin_unlock(&f->alog->lock);
                nexterror();
        }
        if(f->alog->opens == 0){
-               if(f->alog->buf == nil)
-                       f->alog->buf = malloc(Nlog);
+               if(f->alog->buf == NULL)
+                       f->alog->buf = kzmalloc(Nlog, 0);
                f->alog->rptr = f->alog->buf;
                f->alog->end = f->alog->buf + Nlog;
        }
        f->alog->opens++;
-       unlock(f->alog);
+       spin_unlock(&f->alog->lock);
        poperror();
 }
 
 void
-netlogclose(Fs *f)
+netlogclose(struct Fs *f)
 {
-       lock(f->alog);
+       ERRSTACK(2);
+       spin_lock(&f->alog->lock);
        if(waserror()){
-               unlock(f->alog);
+               spin_unlock(&f->alog->lock);
                nexterror();
        }
        f->alog->opens--;
        if(f->alog->opens == 0){
-               free(f->alog->buf);
-               f->alog->buf = nil;
+               kfree(f->alog->buf);
+               f->alog->buf = NULL;
        }
-       unlock(f->alog);
+       spin_unlock(&f->alog->lock);
        poperror();
 }
 
 static int
 netlogready(void *a)
 {
-       Fs *f = a;
+       struct Fs *f = a;
 
        return f->alog->len;
 }
 
 long
-netlogread(Fs *f, void *a, ulong, long n)
+netlogread(struct Fs *f, void *a, uint32_t unused, long n)
 {
+       ERRSTACK(2);
        int i, d;
        char *p, *rptr;
 
-       qlock(f->alog);
+       qlock(&f->alog->qlock);
        if(waserror()){
-               qunlock(f->alog);
+               qunlock(&f->alog->qlock);
                nexterror();
        }
 
        for(;;){
-               lock(f->alog);
+               spin_lock(&f->alog->lock);
                if(f->alog->len){
                        if(n > f->alog->len)
                                n = f->alog->len;
@@ -145,7 +155,7 @@ netlogread(Fs *f, void *a, ulong, long n)
                                f->alog->rptr = f->alog->buf + d;
                        }
                        f->alog->len -= n;
-                       unlock(f->alog);
+                       spin_unlock(&f->alog->lock);
 
                        i = n-d;
                        p = a;
@@ -154,37 +164,36 @@ netlogread(Fs *f, void *a, ulong, long n)
                        break;
                }
                else
-                       unlock(f->alog);
+                       spin_unlock(&f->alog->lock);
 
-               rendez_sleep(f->alog, netlogready, f);
+               rendez_sleep(&f->alog->r, netlogready, f);
        }
 
-       qunlock(f->alog);
+       qunlock(&f->alog->qlock);
        poperror();
 
        return n;
 }
 
 void
-netlogctl(Fs *f, char* s, int n)
+netlogctl(struct Fs *f, char* s, int n)
 {
-       int i, set;
+       ERRSTACK(2);
+       int i, set = 0;
        Netlogflag *fp;
-       Cmdbuf *cb;
-       Cmdtab *ct;
+       struct cmdbuf *cb;
+       struct cmdtab *ct;
 
        cb = parsecmd(s, n);
        if(waserror()){
-               free(cb);
+               kfree(cb);
                nexterror();
        }
 
        if(cb->nf < 2)
                error(Ebadnetctl);
 
-       ct = lookupcmd(cb, routecmd, nelem(routecmd));
-
-       SET(set);
+       ct = lookupcmd(cb, routecmd, ARRAY_SIZE(routecmd));
 
        switch(ct->index){
        case CMset:
@@ -201,7 +210,7 @@ netlogctl(Fs *f, char* s, int n)
                        f->alog->iponlyset = 0;
                else
                        f->alog->iponlyset = 1;
-               free(cb);
+               kfree(cb);
                return;
 
        default:
@@ -212,7 +221,7 @@ netlogctl(Fs *f, char* s, int n)
                for(fp = flags; fp->name; fp++)
                        if(strcmp(fp->name, cb->f[i]) == 0)
                                break;
-               if(fp->name == nil)
+               if(fp->name == NULL)
                        continue;
                if(set)
                        f->alog->logmask |= fp->mask;
@@ -220,12 +229,12 @@ netlogctl(Fs *f, char* s, int n)
                        f->alog->logmask &= ~fp->mask;
        }
 
-       free(cb);
+       kfree(cb);
        poperror();
 }
 
 void
-netlog(Fs *f, int mask, char *fmt, ...)
+netlog(struct Fs *f, int mask, char *fmt, ...)
 {
        char buf[128], *t, *fp;
        int i, n;
@@ -238,10 +247,10 @@ netlog(Fs *f, int mask, char *fmt, ...)
                return;
 
        va_start(arg, fmt);
-       n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
+       n = snprintf(buf, sizeof(buf), fmt, arg);
        va_end(arg);
 
-       lock(f->alog);
+       spin_lock(&f->alog->lock);
        i = f->alog->len + n - Nlog;
        if(i > 0){
                f->alog->len -= i;
@@ -257,7 +266,7 @@ netlog(Fs *f, int mask, char *fmt, ...)
                        t = f->alog->buf + (t - f->alog->end);
                *t++ = *fp++;
        }
-       unlock(f->alog);
+       spin_unlock(&f->alog->lock);
 
-       rendez_wakeup(f->alog);
+       rendez_wakeup(&f->alog->r);
 }
index 33cddad..6ca5640 100644 (file)
@@ -109,6 +109,19 @@ strchr(const char *s, char c)
        return 0;
 }
 
+// Return a pointer to the last occurrence of 'c' in 's',
+// or a null pointer if the string has no 'c'.
+char *
+strrchr(const char *s, char c)
+{
+       char *lastc = NULL;
+       for (; *s; s++)
+               if (*s == c){
+                       lastc = s;
+               }
+       return lastc;
+}
+
 void *
 memchr(void* mem, int chr, int len)
 {