9 static char *nets[] = { "tcp", "udp", nil };
10 #define CLASS(p) ((*(uchar*)(p))>>6)
13 parseip(char *host, u32int *pip)
20 for(i=0; i<4 && *p; i++){
21 x = strtoul(p, &p, 0);
24 if(*p != '.' && *p != 0)
53 *pip = *(u32int*)addr;
58 _p9dialparse(char *addr, char **pnet, char **punix, u32int *phost, int *pport)
60 char *net, *host, *port, *e;
64 struct sockaddr_un *sockun;
66 if(strncmp(addr, "/net/", 5) == 0)
70 if((host = strchr(net, '!')) == nil){
71 werrstr("malformed address");
75 if((port = strchr(host, '!')) == nil){
76 if(strcmp(net, "unix")==0 || strcmp(net, "net")==0){
78 if(strlen(host)+1 > sizeof sockun->sun_path){
79 werrstr("unix socket name too long");
88 werrstr("malformed address");
94 werrstr("malformed address (empty host)");
98 werrstr("malformed address (empty port)");
102 if(strcmp(net, "unix") == 0)
105 if(strcmp(net, "tcp")!=0 && strcmp(net, "udp")!=0){
106 werrstr("bad network %s!%s!%s", net, host, port);
111 if(strcmp(host, "*") == 0)
113 else if(parseip(host, phost) == 0)
115 else if((he = gethostbyname(host)) != nil)
116 *phost = *(u32int*)(he->h_addr);
118 werrstr("unknown host %s", host);
122 /* translate network and port; should return list rather than first */
123 if(strcmp(net, "net") == 0){
124 for(i=0; nets[i]; i++){
125 if((se = getservbyname(port, nets[i])) != nil){
127 *pport = ntohs(se->s_port);
131 werrstr("unknown service %s", port);
135 if(strcmp(net, "tcp") != 0 && strcmp(net, "udp") != 0){
136 werrstr("unknown network %s", net);
141 i = strtol(port, &e, 0);
147 if((se = getservbyname(port, net)) != nil){
148 *pport = ntohs(se->s_port);
151 werrstr("unknown service %s", port);