5 #include <sys/socket.h>
6 #include <netinet/in.h>
7 #include <netinet/tcp.h>
15 extern int _p9netfd(char*);
17 static char *unknown = "unknown";
20 convert(int s, struct sockaddr *sa, char **lsys, char **lserv, char **laddr)
22 struct sockaddr_un *sun;
23 struct sockaddr_in *sin;
24 struct sockaddr_in6 *sin6;
31 switch(sa->sa_family){
34 ip = (uchar*)&sin->sin_addr;
39 *lsys = smprint("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
40 *lserv = smprint("%d", ntohs(sin->sin_port));
42 if(getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) < 0)
46 else if(n == SOCK_DGRAM)
49 werrstr("unknown network type");
52 *laddr = smprint("%s!%s!%s", net, *lsys, *lserv);
53 if(*lsys == nil || *lserv == nil || *laddr == nil)
58 if (memcmp(&sin6->sin6_addr, &in6addr_any, sizeof(in6addr_any)) == 0)
61 *lsys = malloc(INET6_ADDRSTRLEN);
62 inet_ntop(AF_INET6, &sin6->sin6_addr, *lsys, INET6_ADDRSTRLEN);
64 *lserv = smprint("%d", ntohs(sin6->sin6_port));
66 if(getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) < 0)
70 else if(n == SOCK_DGRAM)
73 werrstr("unknown network type");
76 *laddr = smprint("%s!%s!%s", net, *lsys, *lserv);
77 if(*lsys == nil || *lserv == nil || *laddr == nil)
84 *laddr = smprint("unix!%s", sun->sun_path);
89 werrstr("unknown socket family");
95 getnetconninfo(char *dir, int fd)
100 struct sockaddr_in sin;
101 struct sockaddr_in6 sin6;
102 struct sockaddr_un sun;
107 if((fd = _p9netfd(dir)) < 0){
108 werrstr("no such network connection %s", dir);
113 nci = mallocz(sizeof *nci, 1);
116 nci->dir = smprint("/dev/fd/%d", fd);
117 nci->root = strdup("/net");
119 if(nci->dir == nil || nci->root == nil)
122 if(getsockname(fd, &u.sa, &sn) < 0)
124 if(convert(fd, &u.sa, &nci->lsys, &nci->lserv, &nci->laddr) < 0)
127 if(getpeername(fd, &u.sa, &sn) < 0)
129 if(convert(fd, &u.sa, &nci->rsys, &nci->rserv, &nci->raddr) < 0)
134 freenetconninfo(nci);
141 if(v != nil && v != unknown)
146 freenetconninfo(NetConnInfo *nci)