Blame


1 1c253ceb 2003-11-23 devnull #include <u.h>
2 478ee963 2003-11-23 devnull #define NOPLAN9DEFINES
3 1c253ceb 2003-11-23 devnull #include <libc.h>
4 1c253ceb 2003-11-23 devnull
5 478ee963 2003-11-23 devnull #include <sys/types.h>
6 d765c371 2012-06-27 0intro #include <sys/socket.h>
7 478ee963 2003-11-23 devnull #include <netdb.h>
8 478ee963 2003-11-23 devnull #include <sys/un.h>
9 c2070b2f 2004-12-29 devnull #include <netinet/in.h>
10 478ee963 2003-11-23 devnull
11 fd04aace 2003-11-23 devnull static char *nets[] = { "tcp", "udp", nil };
12 fd04aace 2003-11-23 devnull #define CLASS(p) ((*(uchar*)(p))>>6)
13 fd04aace 2003-11-23 devnull
14 b589fce2 2005-02-11 devnull static struct {
15 b589fce2 2005-02-11 devnull char *net;
16 b589fce2 2005-02-11 devnull char *service;
17 b589fce2 2005-02-11 devnull int port;
18 b589fce2 2005-02-11 devnull } porttbl[] = {
19 b589fce2 2005-02-11 devnull "tcp", "9fs", 564,
20 b589fce2 2005-02-11 devnull "tcp", "whoami", 565,
21 b589fce2 2005-02-11 devnull "tcp", "guard", 566,
22 b589fce2 2005-02-11 devnull "tcp", "ticket", 567,
23 b589fce2 2005-02-11 devnull "tcp", "exportfs", 17007,
24 b589fce2 2005-02-11 devnull "tcp", "rexexec", 17009,
25 b589fce2 2005-02-11 devnull "tcp", "ncpu", 17010,
26 b589fce2 2005-02-11 devnull "tcp", "cpu", 17013,
27 b589fce2 2005-02-11 devnull "tcp", "venti", 17034,
28 b589fce2 2005-02-11 devnull "tcp", "wiki", 17035,
29 b589fce2 2005-02-11 devnull "tcp", "secstore", 5356,
30 772b39cd 2006-02-20 devnull "udp", "dns", 53,
31 772b39cd 2006-02-20 devnull "tcp", "dns", 53,
32 b589fce2 2005-02-11 devnull };
33 b589fce2 2005-02-11 devnull
34 fd04aace 2003-11-23 devnull static int
35 3409bc9a 2012-06-02 0intro setport(struct sockaddr_storage *ss, int port)
36 fd04aace 2003-11-23 devnull {
37 3409bc9a 2012-06-02 0intro switch(ss->ss_family){
38 3409bc9a 2012-06-02 0intro case AF_INET:
39 3409bc9a 2012-06-02 0intro ((struct sockaddr_in*)ss)->sin_port = htons(port);
40 fd04aace 2003-11-23 devnull break;
41 3409bc9a 2012-06-02 0intro case AF_INET6:
42 3409bc9a 2012-06-02 0intro ((struct sockaddr_in6*)ss)->sin6_port = htons(port);
43 fd04aace 2003-11-23 devnull break;
44 3409bc9a 2012-06-02 0intro default:
45 3409bc9a 2012-06-02 0intro errstr("unknown protocol family %d", ss->ss_family);
46 3409bc9a 2012-06-02 0intro return -1;
47 fd04aace 2003-11-23 devnull }
48 fd04aace 2003-11-23 devnull return 0;
49 fd04aace 2003-11-23 devnull }
50 fd04aace 2003-11-23 devnull
51 fd04aace 2003-11-23 devnull int
52 3409bc9a 2012-06-02 0intro p9dialparse(char *addr, char **pnet, char **punix, void *phost, int *pport)
53 fd04aace 2003-11-23 devnull {
54 fd04aace 2003-11-23 devnull char *net, *host, *port, *e;
55 fd04aace 2003-11-23 devnull int i;
56 fd04aace 2003-11-23 devnull struct servent *se;
57 fd04aace 2003-11-23 devnull struct hostent *he;
58 3409bc9a 2012-06-02 0intro struct sockaddr_storage *ss;
59 3409bc9a 2012-06-02 0intro struct addrinfo *result;
60 fd04aace 2003-11-23 devnull
61 3409bc9a 2012-06-02 0intro ss = phost;
62 3409bc9a 2012-06-02 0intro
63 1c996338 2012-09-08 rsc memset(ss, 0, sizeof *ss);
64 3409bc9a 2012-06-02 0intro
65 fc11cb4b 2005-05-07 devnull *punix = nil;
66 fd04aace 2003-11-23 devnull net = addr;
67 fd04aace 2003-11-23 devnull if((host = strchr(net, '!')) == nil){
68 fd04aace 2003-11-23 devnull werrstr("malformed address");
69 fd04aace 2003-11-23 devnull return -1;
70 fd04aace 2003-11-23 devnull }
71 fd04aace 2003-11-23 devnull *host++ = 0;
72 fd04aace 2003-11-23 devnull if((port = strchr(host, '!')) == nil){
73 fd04aace 2003-11-23 devnull if(strcmp(net, "unix")==0 || strcmp(net, "net")==0){
74 fd04aace 2003-11-23 devnull Unix:
75 fafa622a 2020-01-12 rsc if(strlen(host)+1 > sizeof ((struct sockaddr_un*)ss)->sun_path){
76 fd04aace 2003-11-23 devnull werrstr("unix socket name too long");
77 fd04aace 2003-11-23 devnull return -1;
78 fd04aace 2003-11-23 devnull }
79 fd04aace 2003-11-23 devnull *punix = host;
80 fd04aace 2003-11-23 devnull *pnet = "unix";
81 3409bc9a 2012-06-02 0intro ss->ss_family = AF_UNIX;
82 3409bc9a 2012-06-02 0intro strcpy(((struct sockaddr_un*)ss)->sun_path, host);
83 fd04aace 2003-11-23 devnull *pport = 0;
84 fd04aace 2003-11-23 devnull return 0;
85 fd04aace 2003-11-23 devnull }
86 fd04aace 2003-11-23 devnull werrstr("malformed address");
87 fd04aace 2003-11-23 devnull return -1;
88 fd04aace 2003-11-23 devnull }
89 fd04aace 2003-11-23 devnull *port++ = 0;
90 fd04aace 2003-11-23 devnull
91 fd04aace 2003-11-23 devnull if(*host == 0){
92 fd04aace 2003-11-23 devnull werrstr("malformed address (empty host)");
93 fd04aace 2003-11-23 devnull return -1;
94 fd04aace 2003-11-23 devnull }
95 fd04aace 2003-11-23 devnull if(*port == 0){
96 fd04aace 2003-11-23 devnull werrstr("malformed address (empty port)");
97 fd04aace 2003-11-23 devnull return -1;
98 fd04aace 2003-11-23 devnull }
99 fd04aace 2003-11-23 devnull
100 fd04aace 2003-11-23 devnull if(strcmp(net, "unix") == 0)
101 fd04aace 2003-11-23 devnull goto Unix;
102 fd04aace 2003-11-23 devnull
103 b589fce2 2005-02-11 devnull if(strcmp(net, "tcp")!=0 && strcmp(net, "udp")!=0 && strcmp(net, "net") != 0){
104 fd04aace 2003-11-23 devnull werrstr("bad network %s!%s!%s", net, host, port);
105 fd04aace 2003-11-23 devnull return -1;
106 fd04aace 2003-11-23 devnull }
107 fd04aace 2003-11-23 devnull
108 fd04aace 2003-11-23 devnull /* translate host */
109 3409bc9a 2012-06-02 0intro if(strcmp(host, "*") == 0){
110 3409bc9a 2012-06-02 0intro ss->ss_family = AF_INET6;
111 3409bc9a 2012-06-02 0intro ((struct sockaddr_in6*)ss)->sin6_addr = in6addr_any;
112 6f568da6 2012-09-11 0intro }else if((he = gethostbyname(host)) != nil && he->h_addr_list[0] != nil){
113 3409bc9a 2012-06-02 0intro ss->ss_family = he->h_addrtype;
114 3409bc9a 2012-06-02 0intro switch(ss->ss_family){
115 3409bc9a 2012-06-02 0intro case AF_INET:
116 3409bc9a 2012-06-02 0intro ((struct sockaddr_in*)ss)->sin_addr = *(struct in_addr*) *(he->h_addr_list);
117 3409bc9a 2012-06-02 0intro break;
118 3409bc9a 2012-06-02 0intro case AF_INET6:
119 3409bc9a 2012-06-02 0intro ((struct sockaddr_in6*)ss)->sin6_addr = *(struct in6_addr*) *(he->h_addr_list);
120 3409bc9a 2012-06-02 0intro break;
121 3409bc9a 2012-06-02 0intro default:
122 3409bc9a 2012-06-02 0intro errstr("unknown protocol family %d", ss->ss_family);
123 3409bc9a 2012-06-02 0intro return -1;
124 3409bc9a 2012-06-02 0intro }
125 3409bc9a 2012-06-02 0intro }else if(getaddrinfo(host, NULL, NULL, &result) == 0) {
126 1c996338 2012-09-08 rsc switch (result->ai_family) {
127 3409bc9a 2012-06-02 0intro case AF_INET:
128 1c996338 2012-09-08 rsc memmove((struct sockaddr_in*)ss, result->ai_addr, result->ai_addrlen);
129 3409bc9a 2012-06-02 0intro break;
130 3409bc9a 2012-06-02 0intro case AF_INET6:
131 1c996338 2012-09-08 rsc memmove((struct sockaddr_in6*)ss, result->ai_addr, result->ai_addrlen);
132 3409bc9a 2012-06-02 0intro break;
133 3409bc9a 2012-06-02 0intro default:
134 3409bc9a 2012-06-02 0intro errstr("unknown protocol family %d", ss->ss_family);
135 3409bc9a 2012-06-02 0intro return -1;
136 3409bc9a 2012-06-02 0intro }
137 3409bc9a 2012-06-02 0intro }else{
138 fd04aace 2003-11-23 devnull werrstr("unknown host %s", host);
139 fd04aace 2003-11-23 devnull return -1;
140 fd04aace 2003-11-23 devnull }
141 fd04aace 2003-11-23 devnull
142 fd04aace 2003-11-23 devnull /* translate network and port; should return list rather than first */
143 fd04aace 2003-11-23 devnull if(strcmp(net, "net") == 0){
144 fd04aace 2003-11-23 devnull for(i=0; nets[i]; i++){
145 fd04aace 2003-11-23 devnull if((se = getservbyname(port, nets[i])) != nil){
146 fd04aace 2003-11-23 devnull *pnet = nets[i];
147 fd04aace 2003-11-23 devnull *pport = ntohs(se->s_port);
148 3409bc9a 2012-06-02 0intro return setport(ss, *pport);
149 fd04aace 2003-11-23 devnull }
150 fd04aace 2003-11-23 devnull }
151 b589fce2 2005-02-11 devnull }
152 b589fce2 2005-02-11 devnull
153 b589fce2 2005-02-11 devnull for(i=0; i<nelem(porttbl); i++){
154 b589fce2 2005-02-11 devnull if(strcmp(net, "net") == 0 || strcmp(porttbl[i].net, net) == 0)
155 b589fce2 2005-02-11 devnull if(strcmp(porttbl[i].service, port) == 0){
156 b589fce2 2005-02-11 devnull *pnet = porttbl[i].net;
157 b589fce2 2005-02-11 devnull *pport = porttbl[i].port;
158 3409bc9a 2012-06-02 0intro return setport(ss, *pport);
159 b589fce2 2005-02-11 devnull }
160 b589fce2 2005-02-11 devnull }
161 b589fce2 2005-02-11 devnull
162 b589fce2 2005-02-11 devnull if(strcmp(net, "net") == 0){
163 b589fce2 2005-02-11 devnull werrstr("unknown service net!*!%s", port);
164 fd04aace 2003-11-23 devnull return -1;
165 fd04aace 2003-11-23 devnull }
166 fd04aace 2003-11-23 devnull
167 fd04aace 2003-11-23 devnull if(strcmp(net, "tcp") != 0 && strcmp(net, "udp") != 0){
168 fd04aace 2003-11-23 devnull werrstr("unknown network %s", net);
169 fd04aace 2003-11-23 devnull return -1;
170 fd04aace 2003-11-23 devnull }
171 fd04aace 2003-11-23 devnull
172 fd04aace 2003-11-23 devnull *pnet = net;
173 fd04aace 2003-11-23 devnull i = strtol(port, &e, 0);
174 fd04aace 2003-11-23 devnull if(*e == 0){
175 fd04aace 2003-11-23 devnull *pport = i;
176 3409bc9a 2012-06-02 0intro return setport(ss, *pport);
177 fd04aace 2003-11-23 devnull }
178 fd04aace 2003-11-23 devnull
179 fd04aace 2003-11-23 devnull if((se = getservbyname(port, net)) != nil){
180 fd04aace 2003-11-23 devnull *pport = ntohs(se->s_port);
181 3409bc9a 2012-06-02 0intro return setport(ss, *pport);
182 fd04aace 2003-11-23 devnull }
183 b589fce2 2005-02-11 devnull werrstr("unknown service %s!*!%s", net, port);
184 fd04aace 2003-11-23 devnull return -1;
185 fd04aace 2003-11-23 devnull }