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>
5 478ee963 2003-11-23 devnull #include <sys/types.h>
6 478ee963 2003-11-23 devnull #include <netdb.h>
7 478ee963 2003-11-23 devnull #include <sys/un.h>
9 fd04aace 2003-11-23 devnull static char *nets[] = { "tcp", "udp", nil };
10 fd04aace 2003-11-23 devnull #define CLASS(p) ((*(uchar*)(p))>>6)
12 fd04aace 2003-11-23 devnull static int
13 fd04aace 2003-11-23 devnull parseip(char *host, u32int *pip)
15 fd04aace 2003-11-23 devnull uchar addr[4];
16 fd04aace 2003-11-23 devnull int x, i;
19 fd04aace 2003-11-23 devnull p = host;
20 fd04aace 2003-11-23 devnull for(i=0; i<4 && *p; i++){
21 fd04aace 2003-11-23 devnull x = strtoul(p, &p, 0);
22 fd04aace 2003-11-23 devnull if(x < 0 || x >= 256)
23 fd04aace 2003-11-23 devnull return -1;
24 fd04aace 2003-11-23 devnull if(*p != '.' && *p != 0)
25 fd04aace 2003-11-23 devnull return -1;
26 fd04aace 2003-11-23 devnull if(*p == '.')
28 fd04aace 2003-11-23 devnull addr[i] = x;
31 fd04aace 2003-11-23 devnull switch(CLASS(addr)){
34 fd04aace 2003-11-23 devnull if(i == 3){
35 fd04aace 2003-11-23 devnull addr[3] = addr[2];
36 fd04aace 2003-11-23 devnull addr[2] = addr[1];
37 fd04aace 2003-11-23 devnull addr[1] = 0;
38 fd04aace 2003-11-23 devnull }else if(i == 2){
39 fd04aace 2003-11-23 devnull addr[3] = addr[1];
40 fd04aace 2003-11-23 devnull addr[2] = 0;
41 fd04aace 2003-11-23 devnull addr[1] = 0;
42 fd04aace 2003-11-23 devnull }else if(i != 4)
43 fd04aace 2003-11-23 devnull return -1;
46 fd04aace 2003-11-23 devnull if(i == 3){
47 fd04aace 2003-11-23 devnull addr[3] = addr[2];
48 fd04aace 2003-11-23 devnull addr[2] = 0;
49 fd04aace 2003-11-23 devnull }else if(i != 4)
50 fd04aace 2003-11-23 devnull return -1;
53 fd04aace 2003-11-23 devnull *pip = *(u32int*)addr;
54 fd04aace 2003-11-23 devnull return 0;
58 fd04aace 2003-11-23 devnull _p9dialparse(char *addr, char **pnet, char **punix, u32int *phost, int *pport)
60 fd04aace 2003-11-23 devnull char *net, *host, *port, *e;
62 fd04aace 2003-11-23 devnull struct servent *se;
63 fd04aace 2003-11-23 devnull struct hostent *he;
64 1c253ceb 2003-11-23 devnull struct sockaddr_un *sockun;
66 fd04aace 2003-11-23 devnull if(strncmp(addr, "/net/", 5) == 0)
67 fd04aace 2003-11-23 devnull addr += 5;
69 fd04aace 2003-11-23 devnull net = addr;
70 fd04aace 2003-11-23 devnull if((host = strchr(net, '!')) == nil){
71 fd04aace 2003-11-23 devnull werrstr("malformed address");
72 fd04aace 2003-11-23 devnull return -1;
74 fd04aace 2003-11-23 devnull *host++ = 0;
75 fd04aace 2003-11-23 devnull if((port = strchr(host, '!')) == nil){
76 fd04aace 2003-11-23 devnull if(strcmp(net, "unix")==0 || strcmp(net, "net")==0){
78 1c253ceb 2003-11-23 devnull if(strlen(host)+1 > sizeof sockun->sun_path){
79 fd04aace 2003-11-23 devnull werrstr("unix socket name too long");
80 fd04aace 2003-11-23 devnull return -1;
82 fd04aace 2003-11-23 devnull *punix = host;
83 fd04aace 2003-11-23 devnull *pnet = "unix";
84 fd04aace 2003-11-23 devnull *phost = 0;
85 fd04aace 2003-11-23 devnull *pport = 0;
86 fd04aace 2003-11-23 devnull return 0;
88 fd04aace 2003-11-23 devnull werrstr("malformed address");
89 fd04aace 2003-11-23 devnull return -1;
91 fd04aace 2003-11-23 devnull *port++ = 0;
93 fd04aace 2003-11-23 devnull if(*host == 0){
94 fd04aace 2003-11-23 devnull werrstr("malformed address (empty host)");
95 fd04aace 2003-11-23 devnull return -1;
97 fd04aace 2003-11-23 devnull if(*port == 0){
98 fd04aace 2003-11-23 devnull werrstr("malformed address (empty port)");
99 fd04aace 2003-11-23 devnull return -1;
102 fd04aace 2003-11-23 devnull if(strcmp(net, "unix") == 0)
103 fd04aace 2003-11-23 devnull goto Unix;
105 fd04aace 2003-11-23 devnull if(strcmp(net, "tcp")!=0 && strcmp(net, "udp")!=0){
106 fd04aace 2003-11-23 devnull werrstr("bad network %s!%s!%s", net, host, port);
107 fd04aace 2003-11-23 devnull return -1;
110 fd04aace 2003-11-23 devnull /* translate host */
111 fd04aace 2003-11-23 devnull if(strcmp(host, "*") == 0)
112 fd04aace 2003-11-23 devnull *phost = 0;
113 fd04aace 2003-11-23 devnull else if(parseip(host, phost) == 0)
115 fd04aace 2003-11-23 devnull else if((he = gethostbyname(host)) != nil)
116 fd04aace 2003-11-23 devnull *phost = *(u32int*)(he->h_addr);
118 fd04aace 2003-11-23 devnull werrstr("unknown host %s", host);
119 fd04aace 2003-11-23 devnull return -1;
122 fd04aace 2003-11-23 devnull /* translate network and port; should return list rather than first */
123 fd04aace 2003-11-23 devnull if(strcmp(net, "net") == 0){
124 fd04aace 2003-11-23 devnull for(i=0; nets[i]; i++){
125 fd04aace 2003-11-23 devnull if((se = getservbyname(port, nets[i])) != nil){
126 fd04aace 2003-11-23 devnull *pnet = nets[i];
127 fd04aace 2003-11-23 devnull *pport = ntohs(se->s_port);
128 fd04aace 2003-11-23 devnull return 0;
131 fd04aace 2003-11-23 devnull werrstr("unknown service %s", port);
132 fd04aace 2003-11-23 devnull return -1;
135 fd04aace 2003-11-23 devnull if(strcmp(net, "tcp") != 0 && strcmp(net, "udp") != 0){
136 fd04aace 2003-11-23 devnull werrstr("unknown network %s", net);
137 fd04aace 2003-11-23 devnull return -1;
140 fd04aace 2003-11-23 devnull *pnet = net;
141 fd04aace 2003-11-23 devnull i = strtol(port, &e, 0);
142 fd04aace 2003-11-23 devnull if(*e == 0){
143 fd04aace 2003-11-23 devnull *pport = i;
144 fd04aace 2003-11-23 devnull return 0;
147 fd04aace 2003-11-23 devnull if((se = getservbyname(port, net)) != nil){
148 fd04aace 2003-11-23 devnull *pport = ntohs(se->s_port);
149 fd04aace 2003-11-23 devnull return 0;
151 fd04aace 2003-11-23 devnull werrstr("unknown service %s", port);
152 fd04aace 2003-11-23 devnull return -1;