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,
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*);
void setext(char*, int, char*);
void cleanmf(Mfile*);
-extern void paralloc(void);
-
QLock dblock; /* mutex on database operations */
QLock netlock; /* mutex for netinit() */
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 },
};
netinit(0);
if(!justsetname){
+ csuser = estrdup(getuser());
mountinit(servefile, mntpt);
io();
}
{
Job *job;
- job = mallocz(sizeof(Job), 1);
+ job = emalloc(sizeof *job);
qlock(&joblock);
job->next = joblist;
joblist = job;
for(;;){
n = read9pmsg(mfd[0], mdata, sizeof mdata);
- if(n<=0)
+ if(n < 0)
error("mount read");
+ if(n == 0)
+ continue;
job = newjob();
if(convM2S(mdata, n, &job->request) != n){
syslog(1, logfile, "format error %ux %ux %ux %ux %ux",
if(debug)
syslog(0, logfile, "%F", &job->request);
-
switch(job->request.type){
default:
syslog(1, logfile, "unknown request type %d", job->request.type);
if(*isslave){
if(debug)
syslog(0, logfile, "slave death %d", getpid());
+ adec(&active);
_exits(0);
}
}
}
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
*/
goto send;
}
+query:
if(mf->ref){
err = "query already in progress";
goto send;
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;
}
if(p && *p){
attr = ipattr(p);
if(strcmp(attr, "ip") != 0)
- mysysname = strdup(p);
+ mysysname = estrdup(p);
}
/*
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;
}
}
}
for(tt = t; tt != nil; tt = tt->entry){
if(strcmp(tt->attr, "sys") == 0){
- mysysname = strdup(tt->val);
+ mysysname = estrdup(tt->val);
break;
}
}
/* 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 */
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;
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){
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);
}
/*
else
snprint(reply, sizeof(reply), "%s/%s/clone %s%s", mntpt, np->net,
t->val, x);
- return strdup(reply);
+ return estrdup(reply);
}
/*
{
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);
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");
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, " ");
x = malloc(size);
if(x == nil)
- abort();
+ error("out of memory");
memset(x, 0, size);
return x;
}
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;
}