PCI: adds device-specific data pointer
[akaros.git] / user / bsd / getprotobyname.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 /* posix */
10 #include <sys/types.h>
11 #include <unistd.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <fcntl.h>
15 #include <string.h>
16 #include <errno.h>
17
18 /* bsd extensions */
19 #include <sys/uio.h>
20 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <netdb.h>
23
24 #include "priv.h"
25
26 extern int h_errno;
27
28 enum
29 {
30         Nname= 6,
31 };
32
33 static struct protoent r;
34
35 struct protoent *getprotobyname(const char *name) {
36         int fd, i, m;
37         char *p, *bp;
38         int nn, na;
39         unsigned long x;
40         static char buf[1024], proto[1024];
41         static char *nptr[Nname+1];
42
43         /* connect to server */
44         fd = open("/net/cs", O_RDWR);
45         if(fd < 0){
46                 h_errno = NO_RECOVERY;
47                 return 0;
48         }
49
50         /* construct the query, always expect a protocol# back */
51         snprintf(buf, sizeof buf, "!protocol=%s ipv4proto=*", name);
52
53         /* query the server */
54         if(write(fd, buf, strlen(buf)) < 0){
55                 h_errno = TRY_AGAIN;
56                 return 0;
57         }
58         lseek(fd, 0, 0);
59         for(i = 0; i < sizeof(buf)-1; i += m){
60                 m = read(fd, buf+i, sizeof(buf) - 1 - i);
61                 if(m <= 0)
62                         break;
63                 buf[i+m++] = ' ';
64         }
65         close(fd);
66         buf[i] = 0;
67
68         /* parse the reply */
69         nn = na = 0;
70         for(bp = buf;;){
71                 p = strchr(bp, '=');
72                 if(p == 0)
73                         break;
74                 *p++ = 0;
75                 if(strcmp(bp, "protocol") == 0){
76                         if(!nn)
77                                 r.p_name = p;
78                         if(nn < Nname)
79                                 nptr[nn++] = p;
80                 } else if(strcmp(bp, "ipv4proto") == 0){
81                         r.p_proto = atoi(p);
82                         na++;
83                 }
84                 while(*p && *p != ' ')
85                         p++;
86                 if(*p)
87                         *p++ = 0;
88                 bp = p;
89         }
90         nptr[nn] = 0;
91         r.p_aliases = nptr;
92         if (nn+na == 0)
93                 return 0;
94
95         return &r;
96 }