Port tests/timerfd.c
[akaros.git] / tests / cs.c
index 7d2e993..d0de3fc 100644 (file)
@@ -9,7 +9,7 @@
 #include <stdlib.h>
 
 #include <stdio.h>
-#include <parlib.h>
+#include <parlib/parlib.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <ctype.h>
 #include <error.h>
-#include <iplib.h>
-#include <dir.h>
-#include <ndb.h>
+#include <iplib/iplib.h>
+#include <ndblib/ndb.h>
+#include <ndblib/fcallfmt.h>
 #include <fcall.h>
+#include <parlib/spinlock.h>
+
+#define ARRAY_SIZE(x) (sizeof((x))/sizeof((x)[0]))
 
 enum
 {
@@ -94,8 +97,7 @@ struct Job
        pthread_t thread;
 };
 
-//spinlock_t   joblock;
-int joblock;
+spinlock_t joblock = SPINLOCK_INITIALIZER;
 Job    *joblist;
 
 Mlist  *mlist;
@@ -141,8 +143,8 @@ void        cleanmf(Mfile*);
 
 extern void    paralloc(void);
 
-spinlock_t     dblock;         /* mutex on database operations */
-spinlock_t     netlock;        /* mutex for netinit() */
+spinlock_t dblock = SPINLOCK_INITIALIZER;      /* mutex on database operations */
+spinlock_t netlock = SPINLOCK_INITIALIZER;     /* mutex for netinit() */
 
 char   *logfile = "cs";
 char   *paranoiafile = "cs.paranoia";
@@ -188,7 +190,7 @@ Network network[] = {
        { 0 },
 };
 
-spinlock_t ipifclock;
+spinlock_t ipifclock = SPINLOCK_INITIALIZER;
 struct ipifc *ipifcs;
 
 char   eaddr[16];              /* ascii ethernet address */
@@ -234,7 +236,7 @@ procsetname(char *fmt, ...)
        va_end(arg);
        if (cmdname == NULL)
                return;
-       snprintf(buf, sizeof buf, "#p/%d/args", getpid());
+       snprintf(buf, sizeof buf, "#proc/%d/args", getpid());
        if((fd = open(buf, OWRITE)) >= 0){
                write(fd, cmdname, strlen(cmdname)+1);
                close(fd);
@@ -251,6 +253,7 @@ main(int argc, char *argv[])
        argv0 = argv[0];
        justsetname = 0;
        setnetmtpt(mntpt, sizeof(mntpt), NULL);
+       register_printf_specifier('F', printf_fcall, printf_fcall_info);
        ext[0] = 0;
        argc--, argv++;
        while (argc && **argv == '-'){
@@ -282,10 +285,13 @@ main(int argc, char *argv[])
        }
 
        //rfork(RFREND|RFNOTEG);
+       /* Make us an SCP with a 2LS */
+       parlib_wants_to_be_mcp = FALSE;
 
-       snprintf(servefile, sizeof(servefile), "#s/cs%s", ext);
+       snprintf(servefile, sizeof(servefile), "#srv/cs%s", ext);
        snprintf(netndb, sizeof(netndb), "%s/ndb", mntpt);
-       syscall(SYS_nunmount, (unsigned long)servefile, (unsigned long)mntpt);
+       syscall(SYS_nunmount, (unsigned long)servefile, strlen(servefile),
+               (unsigned long)mntpt, strlen(mntpt));
        remove(servefile);
 
        ndbinit();
@@ -327,7 +333,7 @@ mountinit(char *service, char *mntpt)
        char buf[32];
        int ret;
 
-       ret = syscall(SYS_pipe, (unsigned long)p);
+       ret = pipe(p);
        if (ret < 0){
                error(1, 0, "pipe: %r");
                exit(1);
@@ -338,15 +344,14 @@ mountinit(char *service, char *mntpt)
         * ORCLOSE means remove on last close. Handy. Not here yet. 
         */
        f = open(service, O_WRONLY|O_CREAT/*|ORCLOSE*/, 0666);
-printf("open %s gets %d\n", service, f);
        if(f < 0)
                error(1, 0, "%s: %r",service);
        snprintf(buf, sizeof(buf), "%d", p[1]);
        if(write(f, buf, strlen(buf)) != strlen(buf))
                error(1, 0, "Write %s: %r", service);
-       /* using #s: we create a pipe and drop it into #s
+       /* using #s: we create a pipe and drop it into #srv.
         * we no longer mount. That's up to you.
-        * #s will route requests to us.
+        * #srv will route requests to us.
         */
        close(p[1]);
 
@@ -399,12 +404,11 @@ newjob(void)
        if (! job){
                error(1, 0, "%s: %r","job calloc");
        }
-#warning "fix lock"
-//     //lock(&joblock);
+       spinlock_lock(&joblock);
        job->next = joblist;
        joblist = job;
        job->request.tag = -1;
-//     //unlock(&joblock);
+       spinlock_unlock(&joblock);
        return job;
 }
 
@@ -412,16 +416,18 @@ void
 freejob(Job *job)
 {
        Job **l;
-return;
-       //lock(&joblock);
+       Job *to_free = 0;
+       spinlock_lock(&joblock);
        for(l = &joblist; *l; l = &(*l)->next){
                if((*l) == job){
                        *l = job->next;
-                       free(job);
+                       to_free = job;
                        break;
                }
        }
-       //unlock(&joblock);
+       spinlock_unlock(&joblock);
+       if (to_free)
+               free(to_free);
 }
 
 void
@@ -429,28 +435,25 @@ flushjob(int tag)
 {
        Job *job;
 
-       //lock(&joblock);
+       spinlock_lock(&joblock);
        for(job = joblist; job; job = job->next){
                if(job->request.tag == tag && job->request.type != Tflush){
                        job->flushed = 1;
                        break;
                }
        }
-       //unlock(&joblock);
+       spinlock_unlock(&joblock);
 }
 
 void *job_thread(void* arg)
 {
        Mfile *mf;
        Job *job = arg;
-       //lock(&dblock);
-printf("JOB!\n");
+       spinlock_lock(&dblock);
        mf = newfid(job->request.fid);
 
-printf("NEWFID is %p\n", mf);
        if(debug)
                fprintf(stderr, "CS:%F", &job->request);
-printf("DO %d\n", job->request.type);
        switch(job->request.type){
        default:
                fprintf(stderr, "CS:unknown request type %d", job->request.type);
@@ -495,11 +498,12 @@ printf("DO %d\n", job->request.type);
                rwstat(job, mf);
                break;
        }
-       //unlock(&dblock);
+       spinlock_unlock(&dblock);
 
        freejob(job);
 
-       fprintf(stderr, "CS:Job done\n");
+       if (debug)
+               fprintf(stderr, "CS:Job done\n");
        return 0;
 }
 
@@ -523,6 +527,8 @@ io(void)
                        error(1, 0, "%s: %r","mount read");
                job = newjob();
                if(convM2S(mdata, n, &job->request) != n){
+                       fprintf(stderr, "convM2S went south: format error %ux %ux %ux %ux %ux",
+                               mdata[0], mdata[1], mdata[2], mdata[3], mdata[4]);
                        error(1, 0, "format error %ux %ux %ux %ux %ux",
                                mdata[0], mdata[1], mdata[2], mdata[3], mdata[4]);
                        freejob(job);
@@ -531,17 +537,10 @@ io(void)
                /* stash the thread in the job so we can join them all
                 * later if we want to.
                 */
-#if 0
-printf("RUN THAT JOB!\n");
                if (pthread_create(&job->thread, NULL, &job_thread, job)) {
-printf("ERROR!\n");
                        error(1, 0, "%s: %r","Failed to create job");
                        continue;
                }
-#endif
-       job_thread(job);
-
-
        }
 }
 
@@ -627,7 +626,6 @@ rwalk(Job *job, Mfile *mf)
        if(nelems > 0){
                /* walk fid */
                for(i=0; i<nelems && i<MAXWELEM; i++){
-printf("cs: i %d nelems %d \n", i, nelems);
                        if((qid.type & QTDIR) == 0){
                                err = "not a directory";
                                break;
@@ -643,11 +641,9 @@ printf("cs: i %d nelems %d \n", i, nelems);
                        if(strcmp(elems[i], "cs") == 0){
                                qid.type = QTFILE;
                                qid.path = Qcs;
-printf("found cs, goto Found\n");
                                goto Found;
                        }
-                       err = malloc(4096);
-                       snprintf(err, 4096,"%s:file does not exist", elems[i]);
+                       err = "file does not exist";
                        break;
                }
        }
@@ -663,10 +659,6 @@ printf("found cs, goto Found\n");
        if(err == NULL)
                mf->qid = qid;
        sendmsg(job, err);
-       free(err);
-       /* shoot me. */
-       /* we can fix this or we can get a real language. Guess how Ron votes? */
-       err = "file does not exist";
        return err;
 }
 
@@ -746,8 +738,6 @@ rread(Job *job, Mfile *mf)
                }
 
                /* give back a single reply (or part of one) */
-               printf("mf->reply[%d] is %s; off %d, toff %d\n", 
-                               i, mf->reply[i], off, toff);
                job->reply.data = mf->reply[i] + (off - toff);
                if(cnt > toff - off + n)
                        n = toff - off + n;
@@ -807,7 +797,6 @@ rwrite(Job *job, Mfile *mf)
                goto send;
        }
        job->request.data[cnt] = 0;
-printf("CS: request data is :%s:\n", job->request.data);
        /*
         *  toggle debugging
         */
@@ -890,8 +879,6 @@ printf("CS: request data is :%s:\n", job->request.data);
                mf->net = strdup(field[0]);
                break;
        }
-printf("CS: net %s host %s serv %s rem %s\n", 
-mf->net, mf->host, mf->serv, mf->rem);
        /*
         *  do the first net worth of lookup
         */
@@ -967,19 +954,16 @@ sendmsg(Job *job, char *err)
                job->reply.type = job->request.type+1;
        }
        job->reply.tag = job->request.tag;
-       if (job->reply.type == Rread && job->reply.data)
-               hexdump(stdout, job->reply.data, job->reply.count);
        n = convS2M(&job->reply, mdata, sizeof mdata);
        if(n == 1){
                fprintf(stderr,  "CS:sendmsg convS2M of %F returns 0", &job->reply);
                abort();
        }
-       //lock(&joblock);
-       hexdump(stdout, mdata, n);
+       spinlock_lock(&joblock);
        if(job->flushed == 0)
                if(write(mfd[1], mdata, n)!=n)
                        error(1, 0, "%s: %r","mount write");
-       //unlock(&joblock);
+       spinlock_unlock(&joblock);
        if(debug)
                fprintf(stderr,  "CS:%F %d", &job->reply, n);
 }
@@ -1206,7 +1190,6 @@ lookup(Mfile *mf)
        if(mf->net == NULL)
                return 0;       /* must have been a genquery */
 
-printf("CS: Look up net %s \n", mf->net);
        if(strcmp(mf->net, "net") == 0){
                /*
                 *  go through set of default nets
@@ -1247,16 +1230,13 @@ printf("CS: Look up net %s \n", mf->net);
        /*
         *  look for a specific network
         */
-printf("CS: netlist is %p\n", netlist);
        for(np = netlist; np && np->net != NULL; np++){
                if(np->fasttimeouthack)
                        continue;
-printf("CS: compare net np->net %s mf->net %s\n", np->net, mf->net);
                if(strcmp(np->net, mf->net) == 0)
                        break;
        }
 
-printf("CS: np is %p np->net %p\n", np, np ? np->net : NULL);
        if(np && np->net != NULL){
                /*
                 *  known network
@@ -1264,7 +1244,6 @@ printf("CS: np is %p np->net %p\n", np, np ? np->net : NULL);
                nt = (*np->lookup)(np, mf->host, mf->serv, 1);
                for(t = nt; mf->nreply < Nreply && t; t = t->entry){
                        cp = (*np->trans)(t, np, mf->serv, mf->rem, 0);
-printf("CS: Lookup %s\n", cp);
                        if(cp){
                                mf->replylen[mf->nreply] = strlen(cp);
                                mf->reply[mf->nreply++] = cp;
@@ -1274,7 +1253,6 @@ printf("CS: Lookup %s\n", cp);
                ndbfree(nt);
                return rv;
        } else {
-printf("UNKONW NET\n");
                /*
                 *  not a known network, don't translate host or service
                 */
@@ -1284,7 +1262,6 @@ printf("UNKONW NET\n");
                else
                        snprintf(reply, sizeof(reply), "%s/%s/clone %s",
                                mntpt, mf->net, mf->host);
-printf("CS: reply is %s\n", reply);
                mf->reply[0] = strdup(reply);
                mf->replylen[0] = strlen(reply);
                mf->nreply = 1;
@@ -1308,7 +1285,6 @@ ipserv(Network *np, char *name, char *buf, int blen)
        struct ndbtuple *t, *nt;
        struct ndbs s;
 
-printf("CS: port %s\n", name);
        /* '*' means any service */
        if(strcmp(name, "*")==0){
                strcpy(buf, name);
@@ -1329,7 +1305,6 @@ printf("CS: port %s\n", name);
        p = NULL;
        if(alpha){
                p = ndbgetvalue(db, &s, np->net, name, "port", &t);
-printf("CS: get value of port %s, p is (we hope not null)%p\n", name, p);
                if(p == NULL)
                        return 0;
        } else {
@@ -1350,7 +1325,6 @@ printf("CS: get value of port %s, p is (we hope not null)%p\n", name, p);
        }
        snprintf(buf, blen, "%s%s", p, restr ? "!r" : "");
        free(p);
-printf("CS: buf is %s\n", buf);
        return buf;
 }
 
@@ -1473,7 +1447,7 @@ iplookup(Network *np, char *host, char *serv, int nolookup)
        /*
         * reorder according to our interfaces
         */
-       //lock(&ipifclock);
+       spinlock_lock(&ipifclock);
        for(ifc = ipifcs; ifc != NULL; ifc = ifc->next){
                for(lifc = ifc->lifc; lifc != NULL; lifc = lifc->next){
                        maskip(lifc->ip, lifc->mask, net);
@@ -1484,13 +1458,13 @@ iplookup(Network *np, char *host, char *serv, int nolookup)
                                maskip(ip, lifc->mask, tnet);
                                if(memcmp(net, tnet, IPaddrlen) == 0){
                                        t = reorder(t, nt);
-                                       //unlock(&ipifclock);
+                                       spinlock_unlock(&ipifclock);
                                        return t;
                                }
                        }
                }
        }
-       //unlock(&ipifclock);
+       spinlock_unlock(&ipifclock);
 
        return t;
 }
@@ -1630,7 +1604,7 @@ dnsiplookup(char *host, struct ndbs *s)
        char buf[Maxreply];
        struct ndbtuple *t;
 
-       //unlock(&dblock);
+       spinlock_unlock(&dblock);
 
        /* save the name */
        snprintf(buf, sizeof(buf), "%s", host);
@@ -1653,7 +1627,7 @@ dnsiplookup(char *host, struct ndbs *s)
                        werrstr("temporary problem: %s", buf);
        }
 
-       //lock(&dblock);
+       spinlock_lock(&dblock);
        return t;
 }
 
@@ -1699,7 +1673,7 @@ qreply(Mfile *mf, struct ndbtuple *t)
                        len = 0;
                else {
                        len -= amt;
-                       cur += len;
+                       cur += amt;
                }
 
                if(nt->line != nt->entry){
@@ -1713,7 +1687,7 @@ qreply(Mfile *mf, struct ndbtuple *t)
                                len = 0;
                        else {
                                len -= amt;
-                               cur += len;
+                               cur += amt;
                        }
                }