5 #include <sys/socket.h>
6 #include <netinet/in.h>
7 #include <netinet/tcp.h>
14 extern int _p9netfd(char*);
16 static char *unknown = "unknown";
19 convert(int s, struct sockaddr *sa, char **lsys, char **lserv, char **laddr)
21 struct sockaddr_un *sun;
22 struct sockaddr_in *sin;
29 switch(sa->sa_family){
32 ip = (uchar*)&sin->sin_addr;
37 *lsys = smprint("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
38 *lserv = smprint("%d", ntohs(sin->sin_port));
40 if(getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) < 0)
44 else if(n == SOCK_DGRAM)
47 werrstr("unknown network type");
50 *laddr = smprint("%s!%s!%s", net, *lsys, *lserv);
51 if(*lsys == nil || *lserv == nil || *laddr == nil)
58 *laddr = smprint("unix!%s", sun->sun_path);
63 werrstr("unknown socket family");
69 getnetconninfo(char *dir, int fd)
74 struct sockaddr_in sin;
75 struct sockaddr_un sun;
80 if((fd = _p9netfd(dir)) < 0){
81 werrstr("no such network connection %s", dir);
86 nci = mallocz(sizeof *nci, 1);
89 nci->dir = smprint("/dev/fd/%d", fd);
90 nci->root = strdup("/net");
92 if(nci->dir == nil || nci->root == nil)
95 if(getsockname(fd, &u.sa, &sn) < 0)
97 if(convert(fd, &u.sa, &nci->lsys, &nci->lserv, &nci->laddr) < 0)
100 if(getpeername(fd, &u.sa, &sn) < 0)
102 if(convert(fd, &u.sa, &nci->rsys, &nci->rserv, &nci->raddr) < 0)
107 freenetconninfo(nci);
114 if(v != nil && v != unknown)
119 freenetconninfo(NetConnInfo *nci)