8 #include <netinet/in.h>
10 static char *nets[] = { "tcp", "udp", nil };
11 #define CLASS(p) ((*(uchar*)(p))>>6)
22 "tcp", "exportfs", 17007,
23 "tcp", "rexexec", 17009,
26 "tcp", "venti", 17034,
28 "tcp", "secstore", 5356,
32 parseip(char *host, u32int *pip)
39 for(i=0; i<4 && *p; i++){
40 x = strtoul(p, &p, 0);
43 if(*p != '.' && *p != 0)
72 *pip = *(u32int*)addr;
77 p9dialparse(char *addr, char **pnet, char **punix, u32int *phost, int *pport)
79 char *net, *host, *port, *e;
83 struct sockaddr_un *sockun;
85 if(strncmp(addr, "/net/", 5) == 0)
90 if((host = strchr(net, '!')) == nil){
91 werrstr("malformed address");
95 if((port = strchr(host, '!')) == nil){
96 if(strcmp(net, "unix")==0 || strcmp(net, "net")==0){
98 if(strlen(host)+1 > sizeof sockun->sun_path){
99 werrstr("unix socket name too long");
108 werrstr("malformed address");
114 werrstr("malformed address (empty host)");
118 werrstr("malformed address (empty port)");
122 if(strcmp(net, "unix") == 0)
125 if(strcmp(net, "tcp")!=0 && strcmp(net, "udp")!=0 && strcmp(net, "net") != 0){
126 werrstr("bad network %s!%s!%s", net, host, port);
131 if(strcmp(host, "*") == 0)
133 else if(parseip(host, phost) == 0)
135 else if((he = gethostbyname(host)) != nil)
136 *phost = *(u32int*)(he->h_addr);
138 werrstr("unknown host %s", host);
142 /* translate network and port; should return list rather than first */
143 if(strcmp(net, "net") == 0){
144 for(i=0; nets[i]; i++){
145 if((se = getservbyname(port, nets[i])) != nil){
147 *pport = ntohs(se->s_port);
153 for(i=0; i<nelem(porttbl); i++){
154 if(strcmp(net, "net") == 0 || strcmp(porttbl[i].net, net) == 0)
155 if(strcmp(porttbl[i].service, port) == 0){
156 *pnet = porttbl[i].net;
157 *pport = porttbl[i].port;
162 if(strcmp(net, "net") == 0){
163 werrstr("unknown service net!*!%s", port);
167 if(strcmp(net, "tcp") != 0 && strcmp(net, "udp") != 0){
168 werrstr("unknown network %s", net);
173 i = strtol(port, &e, 0);
179 if((se = getservbyname(port, net)) != nil){
180 *pport = ntohs(se->s_port);
183 werrstr("unknown service %s!*!%s", net, port);