Blame


1 06f4d920 2005-02-13 devnull #include <u.h>
2 06f4d920 2005-02-13 devnull #define NOPLAN9DEFINES
3 06f4d920 2005-02-13 devnull #include <libc.h>
4 06f4d920 2005-02-13 devnull
5 06f4d920 2005-02-13 devnull #include <sys/socket.h>
6 06f4d920 2005-02-13 devnull #include <netinet/in.h>
7 06f4d920 2005-02-13 devnull #include <netinet/tcp.h>
8 06f4d920 2005-02-13 devnull #include <sys/un.h>
9 06f4d920 2005-02-13 devnull #include <errno.h>
10 06f4d920 2005-02-13 devnull
11 06f4d920 2005-02-13 devnull #undef sun
12 06f4d920 2005-02-13 devnull #define sun sockun
13 06f4d920 2005-02-13 devnull
14 06f4d920 2005-02-13 devnull extern int _p9netfd(char*);
15 06f4d920 2005-02-13 devnull
16 06f4d920 2005-02-13 devnull static char *unknown = "unknown";
17 06f4d920 2005-02-13 devnull
18 06f4d920 2005-02-13 devnull static int
19 06f4d920 2005-02-13 devnull convert(int s, struct sockaddr *sa, char **lsys, char **lserv, char **laddr)
20 06f4d920 2005-02-13 devnull {
21 06f4d920 2005-02-13 devnull struct sockaddr_un *sun;
22 06f4d920 2005-02-13 devnull struct sockaddr_in *sin;
23 06f4d920 2005-02-13 devnull uchar *ip;
24 06f4d920 2005-02-13 devnull u32int ipl;
25 06f4d920 2005-02-13 devnull socklen_t sn;
26 06f4d920 2005-02-13 devnull int n;
27 06f4d920 2005-02-13 devnull char *net;
28 06f4d920 2005-02-13 devnull
29 06f4d920 2005-02-13 devnull switch(sa->sa_family){
30 06f4d920 2005-02-13 devnull case AF_INET:
31 06f4d920 2005-02-13 devnull sin = (void*)sa;
32 06f4d920 2005-02-13 devnull ip = (uchar*)&sin->sin_addr;
33 06f4d920 2005-02-13 devnull ipl = *(u32int*)ip;
34 06f4d920 2005-02-13 devnull if(ipl == 0)
35 06f4d920 2005-02-13 devnull *lsys = strdup("*");
36 06f4d920 2005-02-13 devnull else
37 06f4d920 2005-02-13 devnull *lsys = smprint("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
38 06f4d920 2005-02-13 devnull *lserv = smprint("%d", ntohs(sin->sin_port));
39 06f4d920 2005-02-13 devnull sn = sizeof n;
40 06f4d920 2005-02-13 devnull if(getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) < 0)
41 06f4d920 2005-02-13 devnull return -1;
42 06f4d920 2005-02-13 devnull if(n == SOCK_STREAM)
43 06f4d920 2005-02-13 devnull net = "tcp";
44 06f4d920 2005-02-13 devnull else if(n == SOCK_DGRAM)
45 06f4d920 2005-02-13 devnull net = "udp";
46 06f4d920 2005-02-13 devnull else{
47 06f4d920 2005-02-13 devnull werrstr("unknown network type");
48 06f4d920 2005-02-13 devnull return -1;
49 06f4d920 2005-02-13 devnull }
50 06f4d920 2005-02-13 devnull *laddr = smprint("%s!%s!%s", net, *lsys, *lserv);
51 06f4d920 2005-02-13 devnull if(*lsys == nil || *lserv == nil || *laddr == nil)
52 06f4d920 2005-02-13 devnull return -1;
53 06f4d920 2005-02-13 devnull return 0;
54 06f4d920 2005-02-13 devnull case AF_UNIX:
55 06f4d920 2005-02-13 devnull sun = (void*)sa;
56 06f4d920 2005-02-13 devnull *lsys = unknown;
57 06f4d920 2005-02-13 devnull *lserv = unknown;
58 06f4d920 2005-02-13 devnull *laddr = smprint("unix!%s", sun->sun_path);
59 06f4d920 2005-02-13 devnull if(*laddr == nil)
60 06f4d920 2005-02-13 devnull return -1;
61 06f4d920 2005-02-13 devnull return 0;
62 06f4d920 2005-02-13 devnull default:
63 06f4d920 2005-02-13 devnull werrstr("unknown socket family");
64 06f4d920 2005-02-13 devnull return -1;
65 06f4d920 2005-02-13 devnull }
66 06f4d920 2005-02-13 devnull }
67 06f4d920 2005-02-13 devnull
68 06f4d920 2005-02-13 devnull NetConnInfo*
69 06f4d920 2005-02-13 devnull getnetconninfo(char *dir, int fd)
70 06f4d920 2005-02-13 devnull {
71 06f4d920 2005-02-13 devnull socklen_t sn;
72 06f4d920 2005-02-13 devnull union {
73 06f4d920 2005-02-13 devnull struct sockaddr sa;
74 06f4d920 2005-02-13 devnull struct sockaddr_in sin;
75 06f4d920 2005-02-13 devnull struct sockaddr_un sun;
76 06f4d920 2005-02-13 devnull } u;
77 06f4d920 2005-02-13 devnull NetConnInfo *nci;
78 06f4d920 2005-02-13 devnull
79 06f4d920 2005-02-13 devnull if(dir){
80 06f4d920 2005-02-13 devnull if((fd = _p9netfd(dir)) < 0){
81 06f4d920 2005-02-13 devnull werrstr("no such network connection %s", dir);
82 06f4d920 2005-02-13 devnull return nil;
83 06f4d920 2005-02-13 devnull }
84 06f4d920 2005-02-13 devnull }
85 06f4d920 2005-02-13 devnull
86 06f4d920 2005-02-13 devnull nci = mallocz(sizeof *nci, 1);
87 06f4d920 2005-02-13 devnull if(nci == nil)
88 06f4d920 2005-02-13 devnull goto err;
89 06f4d920 2005-02-13 devnull nci->dir = smprint("/dev/fd/%d", fd);
90 06f4d920 2005-02-13 devnull nci->root = strdup("/net");
91 06f4d920 2005-02-13 devnull nci->spec = unknown;
92 06f4d920 2005-02-13 devnull if(nci->dir == nil || nci->root == nil)
93 06f4d920 2005-02-13 devnull goto err;
94 493b97a4 2006-02-18 devnull sn = sizeof u;
95 06f4d920 2005-02-13 devnull if(getsockname(fd, &u.sa, &sn) < 0)
96 06f4d920 2005-02-13 devnull goto err;
97 06f4d920 2005-02-13 devnull if(convert(fd, &u.sa, &nci->lsys, &nci->lserv, &nci->laddr) < 0)
98 06f4d920 2005-02-13 devnull goto err;
99 493b97a4 2006-02-18 devnull sn = sizeof u;
100 06f4d920 2005-02-13 devnull if(getpeername(fd, &u.sa, &sn) < 0)
101 06f4d920 2005-02-13 devnull goto err;
102 06f4d920 2005-02-13 devnull if(convert(fd, &u.sa, &nci->rsys, &nci->rserv, &nci->raddr) < 0)
103 06f4d920 2005-02-13 devnull goto err;
104 06f4d920 2005-02-13 devnull return nci;
105 06f4d920 2005-02-13 devnull
106 06f4d920 2005-02-13 devnull err:
107 06f4d920 2005-02-13 devnull freenetconninfo(nci);
108 06f4d920 2005-02-13 devnull return nil;
109 06f4d920 2005-02-13 devnull }
110 06f4d920 2005-02-13 devnull
111 06f4d920 2005-02-13 devnull static void
112 06f4d920 2005-02-13 devnull xfree(void *v)
113 06f4d920 2005-02-13 devnull {
114 06f4d920 2005-02-13 devnull if(v != nil && v != unknown)
115 06f4d920 2005-02-13 devnull free(v);
116 06f4d920 2005-02-13 devnull }
117 06f4d920 2005-02-13 devnull
118 06f4d920 2005-02-13 devnull void
119 06f4d920 2005-02-13 devnull freenetconninfo(NetConnInfo *nci)
120 06f4d920 2005-02-13 devnull {
121 06f4d920 2005-02-13 devnull if(nci == nil)
122 06f4d920 2005-02-13 devnull return;
123 06f4d920 2005-02-13 devnull xfree(nci->dir);
124 06f4d920 2005-02-13 devnull xfree(nci->root);
125 06f4d920 2005-02-13 devnull xfree(nci->spec);
126 06f4d920 2005-02-13 devnull xfree(nci->lsys);
127 06f4d920 2005-02-13 devnull xfree(nci->lserv);
128 06f4d920 2005-02-13 devnull xfree(nci->rsys);
129 06f4d920 2005-02-13 devnull xfree(nci->rserv);
130 06f4d920 2005-02-13 devnull xfree(nci->laddr);
131 06f4d920 2005-02-13 devnull xfree(nci->raddr);
132 06f4d920 2005-02-13 devnull free(nci);
133 06f4d920 2005-02-13 devnull }
134 06f4d920 2005-02-13 devnull