Split socket()'s type into two Rock fields (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / plan9_sockets.h
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 #ifndef PLAN9_SOCKETS_H
10 #define PLAN9_SOCKETS_H
11
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <unistd.h>
15 #include <sys/socket.h>
16
17 #include <netinet/in.h>
18 #include <netdb.h>
19
20 __BEGIN_DECLS typedef struct Rock Rock;
21
22 enum {
23         Ctlsize = 128,
24
25         /* states */
26         Sopen = 0,
27         Sbound,
28         Sconnected,
29
30         /* types of name */
31         Tsys = 0,
32         Tip,
33         Tdom,
34 };
35
36 /*
37  *  since BSD programs expect to perform both control and data functions
38  *  through a single fd, we need to hide enough info under a rock to
39  *  be able to open the control file when we need it.
40  */
41 struct Rock {
42         Rock *next;
43         unsigned long dev;                      /* inode & dev of data file */
44         unsigned long inode;            /* ... */
45         int domain;                                     /* from socket call */
46         int stype;                                      /* socket type, from socket()'s type field */
47         int sopts;                                      /* socket options, from socket()'s type field */
48         int protocol;                           /* ... */
49         struct sockaddr addr;           /* address from bind */
50         int reserved;                           /* use a priveledged port # (< 1024) */
51         struct sockaddr raddr;          /* peer address */
52         char ctl[Ctlsize];                      /* name of control file (if any) */
53         int other;                                      /* fd of the remote end for Unix domain */
54 };
55
56 extern Rock *_sock_findrock(int, struct stat *);
57 extern Rock *_sock_newrock(int);
58 extern void _sock_srvname(char *, char *);
59 extern int _sock_srv(char *, int);
60 extern int _sock_data(int, char *, int, int, int, Rock **);
61 extern int _sock_ipattr(const char *);
62 extern void _sock_ingetaddr(Rock *, struct sockaddr_in *, socklen_t *,
63                                                         const char *);
64 extern int _sock_strip_opts(int type);
65 extern int _sock_get_opts(int type);
66
67 extern void _syserrno(void);
68
69 /* The plan9 UDP header looks like:
70  *
71  * 52 bytes
72  *              raddr (16 b)
73  *              laddr (16 b)
74  *              IFC addr (ignored if user says it)  (16 b)
75  *              rport (2 b) (network ordering)
76  *              lport (ignored if user says it) (2b)
77  *
78  * The v4 addr format is 10 bytes of 0s, then two 0xff, then 4 bytes of addr. */
79
80 #define P9_UDP_HDR_SZ 52
81
82 /* Takes network-byte ordered IPv4 addr and writes it into buf, in the plan 9 IP
83  * addr format */
84 void naddr_to_plan9addr(uint32_t sin_addr, uint8_t * buf);
85 /* does v4 only */
86 uint32_t plan9addr_to_naddr(uint8_t * buf);
87 /* Returns a rock* if the socket exists and is UDP */
88 Rock *udp_sock_get_rock(int fd);
89
90 __END_DECLS
91 #endif /* PLAN9_SOCKETS_H */