19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier
49a747e4fSDavid du Colombier static char *unknown = "???";
59a747e4fSDavid du Colombier
69a747e4fSDavid du Colombier static void
getendpoint(char * dir,char * file,char ** sysp,char ** servp)79a747e4fSDavid du Colombier getendpoint(char *dir, char *file, char **sysp, char **servp)
89a747e4fSDavid du Colombier {
99a747e4fSDavid du Colombier int fd, n;
109a747e4fSDavid du Colombier char buf[128];
119a747e4fSDavid du Colombier char *sys, *serv;
129a747e4fSDavid du Colombier
139a747e4fSDavid du Colombier sys = serv = 0;
149a747e4fSDavid du Colombier
159a747e4fSDavid du Colombier snprint(buf, sizeof buf, "%s/%s", dir, file);
169a747e4fSDavid du Colombier fd = open(buf, OREAD);
179a747e4fSDavid du Colombier if(fd >= 0){
189a747e4fSDavid du Colombier n = read(fd, buf, sizeof(buf)-1);
199a747e4fSDavid du Colombier if(n>0){
209a747e4fSDavid du Colombier buf[n-1] = 0;
219a747e4fSDavid du Colombier serv = strchr(buf, '!');
229a747e4fSDavid du Colombier if(serv){
239a747e4fSDavid du Colombier *serv++ = 0;
249a747e4fSDavid du Colombier serv = strdup(serv);
259a747e4fSDavid du Colombier }
269a747e4fSDavid du Colombier sys = strdup(buf);
279a747e4fSDavid du Colombier }
289a747e4fSDavid du Colombier close(fd);
299a747e4fSDavid du Colombier }
309a747e4fSDavid du Colombier if(serv == 0)
319a747e4fSDavid du Colombier serv = unknown;
329a747e4fSDavid du Colombier if(sys == 0)
339a747e4fSDavid du Colombier sys = unknown;
349a747e4fSDavid du Colombier *servp = serv;
359a747e4fSDavid du Colombier *sysp = sys;
369a747e4fSDavid du Colombier }
379a747e4fSDavid du Colombier
389a747e4fSDavid du Colombier NetConnInfo*
getnetconninfo(char * dir,int fd)399a747e4fSDavid du Colombier getnetconninfo(char *dir, int fd)
409a747e4fSDavid du Colombier {
419a747e4fSDavid du Colombier NetConnInfo *nci;
429a747e4fSDavid du Colombier char *cp;
439a747e4fSDavid du Colombier Dir *d;
449a747e4fSDavid du Colombier char spec[10];
459a747e4fSDavid du Colombier char path[128];
4613c0d2ddSDavid du Colombier char netname[128], *p;
479a747e4fSDavid du Colombier
489a747e4fSDavid du Colombier /* get a directory address via fd */
499a747e4fSDavid du Colombier if(dir == nil || *dir == 0){
509a747e4fSDavid du Colombier if(fd2path(fd, path, sizeof(path)) < 0)
519a747e4fSDavid du Colombier return nil;
529a747e4fSDavid du Colombier cp = strrchr(path, '/');
539a747e4fSDavid du Colombier if(cp == nil)
549a747e4fSDavid du Colombier return nil;
559a747e4fSDavid du Colombier *cp = 0;
569a747e4fSDavid du Colombier dir = path;
579a747e4fSDavid du Colombier }
589a747e4fSDavid du Colombier
599a747e4fSDavid du Colombier nci = mallocz(sizeof *nci, 1);
609a747e4fSDavid du Colombier if(nci == nil)
619a747e4fSDavid du Colombier return nil;
629a747e4fSDavid du Colombier
639a747e4fSDavid du Colombier /* copy connection directory */
649a747e4fSDavid du Colombier nci->dir = strdup(dir);
659a747e4fSDavid du Colombier if(nci->dir == nil)
669a747e4fSDavid du Colombier goto err;
679a747e4fSDavid du Colombier
689a747e4fSDavid du Colombier /* get netroot */
699a747e4fSDavid du Colombier nci->root = strdup(dir);
709a747e4fSDavid du Colombier if(nci->root == nil)
719a747e4fSDavid du Colombier goto err;
729a747e4fSDavid du Colombier cp = strchr(nci->root+1, '/');
739a747e4fSDavid du Colombier if(cp == nil)
749a747e4fSDavid du Colombier goto err;
759a747e4fSDavid du Colombier *cp = 0;
769a747e4fSDavid du Colombier
779a747e4fSDavid du Colombier /* figure out bind spec */
789a747e4fSDavid du Colombier d = dirstat(nci->dir);
799a747e4fSDavid du Colombier if(d != nil){
80*0b68c76dSDavid du Colombier snprint(spec, sizeof spec, "#%C%d", d->type, d->dev);
819a747e4fSDavid du Colombier nci->spec = strdup(spec);
829a747e4fSDavid du Colombier }
839a747e4fSDavid du Colombier if(nci->spec == nil)
849a747e4fSDavid du Colombier nci->spec = unknown;
859a747e4fSDavid du Colombier free(d);
869a747e4fSDavid du Colombier
879a747e4fSDavid du Colombier /* get the two end points */
889a747e4fSDavid du Colombier getendpoint(nci->dir, "local", &nci->lsys, &nci->lserv);
899a747e4fSDavid du Colombier if(nci->lsys == nil || nci->lserv == nil)
909a747e4fSDavid du Colombier goto err;
919a747e4fSDavid du Colombier getendpoint(nci->dir, "remote", &nci->rsys, &nci->rserv);
929a747e4fSDavid du Colombier if(nci->rsys == nil || nci->rserv == nil)
939a747e4fSDavid du Colombier goto err;
949a747e4fSDavid du Colombier
9513c0d2ddSDavid du Colombier strecpy(netname, netname+sizeof netname, nci->dir);
9613c0d2ddSDavid du Colombier if((p = strrchr(netname, '/')) != nil)
9713c0d2ddSDavid du Colombier *p = 0;
9813c0d2ddSDavid du Colombier if(strncmp(netname, "/net/", 5) == 0)
9913c0d2ddSDavid du Colombier memmove(netname, netname+5, strlen(netname+5)+1);
10013c0d2ddSDavid du Colombier nci->laddr = smprint("%s!%s!%s", netname, nci->lsys, nci->lserv);
10113c0d2ddSDavid du Colombier nci->raddr = smprint("%s!%s!%s", netname, nci->rsys, nci->rserv);
10213c0d2ddSDavid du Colombier if(nci->laddr == nil || nci->raddr == nil)
10313c0d2ddSDavid du Colombier goto err;
1049a747e4fSDavid du Colombier return nci;
1059a747e4fSDavid du Colombier err:
1069a747e4fSDavid du Colombier freenetconninfo(nci);
1079a747e4fSDavid du Colombier return nil;
1089a747e4fSDavid du Colombier }
1099a747e4fSDavid du Colombier
1109a747e4fSDavid du Colombier static void
xfree(char * x)1119a747e4fSDavid du Colombier xfree(char *x)
1129a747e4fSDavid du Colombier {
1139a747e4fSDavid du Colombier if(x == nil || x == unknown)
1149a747e4fSDavid du Colombier return;
1159a747e4fSDavid du Colombier free(x);
1169a747e4fSDavid du Colombier }
1179a747e4fSDavid du Colombier
1189a747e4fSDavid du Colombier void
freenetconninfo(NetConnInfo * nci)1199a747e4fSDavid du Colombier freenetconninfo(NetConnInfo *nci)
1209a747e4fSDavid du Colombier {
1219a747e4fSDavid du Colombier if(nci == nil)
1229a747e4fSDavid du Colombier return;
1239a747e4fSDavid du Colombier xfree(nci->root);
1249a747e4fSDavid du Colombier xfree(nci->dir);
1259a747e4fSDavid du Colombier xfree(nci->spec);
1269a747e4fSDavid du Colombier xfree(nci->lsys);
1279a747e4fSDavid du Colombier xfree(nci->lserv);
1289a747e4fSDavid du Colombier xfree(nci->rsys);
1299a747e4fSDavid du Colombier xfree(nci->rserv);
13013c0d2ddSDavid du Colombier xfree(nci->laddr);
13113c0d2ddSDavid du Colombier xfree(nci->raddr);
1329a747e4fSDavid du Colombier free(nci);
1339a747e4fSDavid du Colombier }
134