]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/ndb/cs.c
ndb/cs, ndb/dns: ignore special commands from users different from the one we run...
[plan9front.git] / sys / src / cmd / ndb / cs.c
index fd6f0c51f1fa9c147f77bd460bc1f76bacc953db..f760c8f394fb17ff43b870e39aa7f5c40b5b472f 100644 (file)
@@ -17,6 +17,7 @@ enum
        Maxfdata=               8192,
        Maxhost=                64,             /* maximum host name size */
        Maxservice=             64,             /* maximum service name size */
+       Maxactive=              200,            /* maximum number of active slave procs */
 
        Qdir=                   0,
        Qcs=                    1,
@@ -83,8 +84,10 @@ int  paranoia;
 int    ipv6lookups = 1;
 jmp_buf        masterjmp;      /* return through here after a slave process has been created */
 int    *isslave;       /* *isslave non-zero means this is a slave process */
+long   active;         /* number of active slaves */
 char   *dbfile;
 Ndb    *db, *netdb;
+char   *csuser;
 
 void   rversion(Job*);
 void   rflush(Job*);
@@ -120,8 +123,6 @@ void        freejob(Job*);
 void   setext(char*, int, char*);
 void   cleanmf(Mfile*);
 
-extern void    paralloc(void);
-
 QLock  dblock;         /* mutex on database operations */
 QLock  netlock;        /* mutex for netinit() */
 
@@ -150,22 +151,23 @@ struct Network
        Network         *next;
 };
 
-enum
-{
-       Ntcp = 0,
+enum {
+       Ntcp = 1,
 };
 
 /*
  *  net doesn't apply to (r)udp, icmp(v6), or telco (for speed).
  */
 Network network[] = {
-[Ntcp] { "tcp",        iplookup,       iptrans,        0 },
-       { "udp",        iplookup,       iptrans,        1 },
-       { "icmp",       iplookup,       iptrans,        1 },
-       { "icmpv6",     iplookup,       iptrans,        1 },
-       { "rudp",       iplookup,       iptrans,        1 },
-       { "ssh",        iplookup,       iptrans,        1 },
-       { "telco",      telcolookup,    telcotrans,     1 },
+       { "il",         iplookup,       iptrans,        0, 1, },
+       { "tcp",        iplookup,       iptrans,        0, 0, },
+       { "il",         iplookup,       iptrans,        0, 0, },
+       { "udp",        iplookup,       iptrans,        1, 0, },
+       { "icmp",       iplookup,       iptrans,        1, 0, },
+       { "icmpv6",     iplookup,       iptrans,        1, 0, },
+       { "rudp",       iplookup,       iptrans,        1, 0, },
+       { "ssh",        iplookup,       iptrans,        1, 0, },
+       { "telco",      telcolookup,    telcotrans,     1, 0, },
        { 0 },
 };
 
@@ -265,6 +267,7 @@ main(int argc, char *argv[])
        netinit(0);
 
        if(!justsetname){
+               csuser = estrdup(getuser());
                mountinit(servefile, mntpt);
                io();
        }
@@ -377,7 +380,7 @@ newjob(void)
 {
        Job *job;
 
-       job = mallocz(sizeof(Job), 1);
+       job = emalloc(sizeof *job);
        qlock(&joblock);
        job->next = joblist;
        joblist = job;
@@ -455,7 +458,6 @@ io(void)
                if(debug)
                        syslog(0, logfile, "%F", &job->request);
 
-
                switch(job->request.type){
                default:
                        syslog(1, logfile, "unknown request type %d", job->request.type);
@@ -510,6 +512,7 @@ io(void)
                if(*isslave){
                        if(debug)
                                syslog(0, logfile, "slave death %d", getpid());
+                       adec(&active);
                        _exits(0);
                }
        }
@@ -778,6 +781,9 @@ rwrite(Job *job, Mfile *mf)
        }
        job->request.data[cnt] = 0;
 
+       if(strcmp(mf->user, "none") == 0 || strcmp(mf->user, csuser) != 0)
+               goto query;     /* skip special commands if not owner */
+
        /*
         *  toggle debugging
         */
@@ -824,6 +830,7 @@ rwrite(Job *job, Mfile *mf)
                goto send;
        }
 
+query:
        if(mf->ref){
                err = "query already in progress";
                goto send;
@@ -851,18 +858,18 @@ rwrite(Job *job, Mfile *mf)
        n = getfields(job->request.data, field, 4, 1, "!");
        switch(n){
        case 1:
-               mf->net = strdup("net");
-               mf->host = strdup(field[0]);
+               mf->net = estrdup("net");
+               mf->host = estrdup(field[0]);
                break;
        case 4:
-               mf->rem = strdup(field[3]);
+               mf->rem = estrdup(field[3]);
                /* fall through */
        case 3:
-               mf->serv = strdup(field[2]);
+               mf->serv = estrdup(field[2]);
                /* fall through */
        case 2:
-               mf->host = strdup(field[1]);
-               mf->net = strdup(field[0]);
+               mf->host = estrdup(field[1]);
+               mf->net = estrdup(field[0]);
                break;
        }
 
@@ -1025,7 +1032,7 @@ ipid(void)
                if(p && *p){
                        attr = ipattr(p);
                        if(strcmp(attr, "ip") != 0)
-                               mysysname = strdup(p);
+                               mysysname = estrdup(p);
                }
 
                /*
@@ -1037,7 +1044,7 @@ ipid(void)
                        ndbreopen(netdb);
                        for(tt = t = ndbparse(netdb); t != nil; t = t->entry){
                                if(strcmp(t->attr, "sys") == 0){
-                                       mysysname = strdup(t->val);
+                                       mysysname = estrdup(t->val);
                                        break;
                                }
                        }
@@ -1062,7 +1069,7 @@ ipid(void)
                        }
                        for(tt = t; tt != nil; tt = tt->entry){
                                if(strcmp(tt->attr, "sys") == 0){
-                                       mysysname = strdup(tt->val);
+                                       mysysname = estrdup(tt->val);
                                        break;
                                }
                        }
@@ -1071,7 +1078,7 @@ ipid(void)
 
                /* nothing else worked, use the ip address */
                if(mysysname == 0 && isvalidip(ipa))
-                       mysysname = strdup(ipaddr);
+                       mysysname = estrdup(ipaddr);
 
 
                /* set /dev/sysname if we now know it */
@@ -1272,7 +1279,7 @@ lookup(Mfile *mf)
                else
                        snprint(reply, sizeof(reply), "%s/%s/clone %s",
                                mntpt, mf->net, mf->host);
-               mf->reply[0] = strdup(reply);
+               mf->reply[0] = estrdup(reply);
                mf->replylen[0] = strlen(reply);
                mf->nreply = 1;
                return 1;
@@ -1324,7 +1331,7 @@ ipserv(Network *np, char *name, char *buf, int blen)
                if(atoi(name) < 1024 && strcmp(np->net, "tcp") == 0)
                        p = ndbgetvalue(db, &s, "port", name, "port", &t);
                if(p == nil)
-                       p = strdup(name);
+                       p = estrdup(name);
        }
 
        if(t){
@@ -1518,7 +1525,7 @@ iptrans(Ndbtuple *t, Network *np, char *serv, char *rem, int hack)
                snprint(reply, sizeof(reply), "%s/%s/clone %s!%s%s%s",
                        mntpt, np->net, t->val, ts, x, hack? "!fasttimeout": "");
 
-       return strdup(reply);
+       return estrdup(reply);
 }
 
 /*
@@ -1562,7 +1569,7 @@ telcotrans(Ndbtuple *t, Network *np, char *serv, char *rem, int)
        else
                snprint(reply, sizeof(reply), "%s/%s/clone %s%s", mntpt, np->net,
                        t->val, x);
-       return strdup(reply);
+       return estrdup(reply);
 }
 
 /*
@@ -1602,15 +1609,19 @@ slave(char *host)
 {
        if(*isslave)
                return;         /* we're already a slave process */
-
+       if(ainc(&active) >= Maxactive){
+               adec(&active);
+               return;
+       }
        switch(rfork(RFPROC|RFNOTEG|RFMEM|RFNOWAIT)){
        case -1:
+               adec(&active);
                break;
        case 0:
+               *isslave = 1;
                if(debug)
                        syslog(0, logfile, "slave %d", getpid());
                procsetname("%s", host);
-               *isslave = 1;
                break;
        default:
                longjmp(masterjmp, 1);
@@ -1653,6 +1664,11 @@ dnsiplookup(char *host, Ndbs *s)
 
        qunlock(&dblock);
        slave(host);
+       if(*isslave == 0){
+               qlock(&dblock);
+               werrstr("too mutch activity");
+               return nil;
+       }
 
        if(strcmp(ipattr(host), "ip") == 0)
                t = dnsquery(mntpt, host, "ptr");
@@ -1711,7 +1727,7 @@ qreply(Mfile *mf, Ndbtuple *t)
 
                if(nt->line != nt->entry){
                        mf->replylen[mf->nreply] = s_len(s);
-                       mf->reply[mf->nreply++] = strdup(s_to_c(s));
+                       mf->reply[mf->nreply++] = estrdup(s_to_c(s));
                        s_restart(s);
                } else
                        s_append(s, " ");
@@ -1912,7 +1928,7 @@ emalloc(int size)
 
        x = malloc(size);
        if(x == nil)
-               abort();
+               error("out of memory");
        memset(x, 0, size);
        return x;
 }
@@ -1923,10 +1939,11 @@ estrdup(char *s)
        int size;
        char *p;
 
-       size = strlen(s)+1;
-       p = malloc(size);
+       size = strlen(s);
+       p = malloc(size+1);
        if(p == nil)
-               abort();
+               error("out of memory");
        memmove(p, s, size);
+       p[size] = 0;
        return p;
 }