xref: /plan9-contrib/sys/src/libc/9sys/getnetconninfo.c (revision 0b68c76d63d3614e55179bb2b52f8da72437084f)
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