int authdial(char *netroot, char *dom) { char *p; int rv; if(dom == nil) /* look for one relative to my machine */ return dial(netmkaddr("$auth", netroot, "ticket"), 0, 0, 0); /* look up an auth server in an authentication domain */ p = csgetvalue(netroot, "authdom", dom, "auth", nil); /* if that didn't work, just try the IP domain */ if(p == nil) p = csgetvalue(netroot, "dom", dom, "auth", nil); /* * if that didn't work, try p9auth.$dom. this is very helpful if * you can't edit /lib/ndb. */ if(p == nil) p = smprint("p9auth.%s", dom); if(p == nil){ /* should no longer ever happen */ werrstr("no auth server found for %s", dom); return -1; } rv = dial(netmkaddr(p, netroot, "ticket"), 0, 0, 0); free(p); return rv; }
/* * compile WORD = WORD, becomes a single node with a subop */ void compile_cmp(char *proto, Filter *f, Field *fld) { uint8_t x[IPaddrlen]; char *v; if(f->op != '=') sysfatal("internal error: compile_cmp %s: not a cmp", proto); for(; fld->name != nil; fld++){ if(strcmp(f->l->s, fld->name) == 0){ f->op = WORD; f->subop = fld->subop; switch(fld->ftype){ case Fnum: f->ulv = atoi(f->r->s); break; case Fether: v = csgetvalue(nil, "sys", (char*)f->r->s, "ether", 0); if(v){ parseether(f->a, v); free(v); } else parseether(f->a, f->r->s); break; case Fv4ip: v = csgetvalue(nil, "sys", (char*)f->r->s, "ip", 0); if(v){ f->ulv = parseip(x, v); free(v); }else f->ulv = parseip(x, f->r->s); break; case Fv6ip: v = csgetvalue(nil, "sys", (char*)f->r->s, "ipv6", 0); if(v){ parseip(f->a, v); free(v); }else parseip(f->a, f->r->s); break; case Fba: parseba(f->a, f->r->s); break; default: sysfatal("internal error: compile_cmp %s: %d", proto, fld->ftype); } f->l = f->r = nil; return; } } sysfatal("unknown %s field in: %s = %s", proto, f->l->s, f->r->s); }
static char* domainname(void) { static char sysname[Maxpath]; static char *domain; int n; if(domain) return domain; if(*sysname) return sysname; domain = csgetvalue(0, "sys", sysname, "dom", nil); if(domain) return domain; n = readfile("/dev/sysname", sysname, sizeof(sysname)-1); if(n < 0){ strcpy(sysname, "kremvax"); return sysname; } sysname[n] = 0; return sysname; }
/* side effect: sets network & target */ static int isv4name(char *name) { int r = 1; char *root, *ip, *pr; DS ds; _dial_string_parse(name, &ds); /* cope with leading /net.alt/icmp! and the like */ root = NULL; if (ds.netdir != NULL) { pr = strrchr(ds.netdir, '/'); if (pr == NULL) pr = ds.netdir; else { *pr++ = '\0'; root = ds.netdir; network = strdup(root); } if (strcmp(pr, v4pr.net) == 0) return 1; if (strcmp(pr, v6pr.net) == 0) return 0; } /* if it's a literal, it's obvious from syntax which proto it is */ free(target); target = strdup(ds.rem); if (isdottedquad(ds.rem)) return 1; else if (isv6lit(ds.rem)) return 0; /*we don't have cs.*/ /* map name to ip and look at its syntax */ ip = csgetvalue(root, "sys", ds.rem, "ip", NULL); if (ip == NULL) ip = csgetvalue(root, "dom", ds.rem, "ip", NULL); if (ip == NULL) ip = csgetvalue(root, "sys", ds.rem, "ipv6", NULL); if (ip == NULL) ip = csgetvalue(root, "dom", ds.rem, "ipv6", NULL); if (ip != NULL) r = isv4name(ip); free(ip); return r; }
char* getport(char *net, char *p) { static char port[10]; strncpy(port, p, sizeof(port)-1); port[sizeof(port)-1] = 0; if(notrans || (p = csgetvalue(netroot, "port", p, net, nil)) == nil) return port; strncpy(port, p, sizeof(port)-1); port[sizeof(port)-1] = 0; free(p); return port; }
Ndbtuple* csgetval(char *netroot, char *attr, char *val, char *rattr, char *buf) { Ndbtuple *t; char *p; p = csgetvalue(netroot, attr, val, rattr, &t); if(p == nil){ if(buf != nil) *buf = 0; } else { if(buf != nil){ strncpy(buf, p, Ndbvlen-1); buf[Ndbvlen-1] = 0; } free(p); } return t; }
void pip(char *net, Dir *db) { int n, fd; char buf[128], *p; char *dname; if(strcmp(db->name, "clone") == 0) return; if(strcmp(db->name, "stats") == 0) return; snprint(buf, sizeof buf, "%s/%s/%s/status", netroot, net, db->name); fd = open(buf, OREAD); if(fd < 0) return; n = read(fd, buf, sizeof(buf)); close(fd); if(n < 0) return; buf[n] = 0; p = strchr(buf, ' '); if(p != 0) *p = 0; p = strrchr(buf, '\n'); if(p != 0) *p = 0; Bprint(&out, "%-4s %-4s %-10s %-12s ", net, db->name, db->uid, buf); snprint(buf, sizeof buf, "%s/%s/%s/local", netroot, net, db->name); fd = open(buf, OREAD); if(fd < 0) { Bprint(&out, "\n"); return; } n = read(fd, buf, sizeof(buf)); close(fd); if(n < 0) { Bprint(&out, "\n"); return; } buf[n-1] = 0; p = strchr(buf, '!'); if(p == 0) { Bprint(&out, "\n"); return; } *p = '\0'; Bprint(&out, "%-10s ", getport(net, p+1)); snprint(buf, sizeof buf, "%s/%s/%s/remote", netroot, net, db->name); fd = open(buf, OREAD); if(fd < 0) { print("\n"); return; } n = read(fd, buf, sizeof(buf)); close(fd); if(n < 0) { print("\n"); return; } buf[n-1] = 0; p = strchr(buf, '!'); if(p != nil) *p++ = '\0'; if(notrans){ Bprint(&out, "%-10s %s\n", getport(net, p), buf); return; } dname = csgetvalue(netroot, "ip", buf, "dom", nil); if(dname == nil) { Bprint(&out, "%-10s %s\n", getport(net, p), buf); return; } Bprint(&out, "%-10s %s\n", getport(net, p), dname); Bflush(&out); free(dname); }