Pushes the Plan 9 BSD shims into glibc (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;                                      /* ... */
47         int protocol;                           /* ... */
48         struct sockaddr addr;           /* address from bind */
49         int reserved;                           /* use a priveledged port # (< 1024) */
50         struct sockaddr raddr;          /* peer address */
51         char ctl[Ctlsize];                      /* name of control file (if any) */
52         int other;                                      /* fd of the remote end for Unix domain */
53 };
54
55 extern Rock *_sock_findrock(int, struct stat *);
56 extern Rock *_sock_newrock(int);
57 extern void _sock_srvname(char *, char *);
58 extern int _sock_srv(char *, int);
59 extern int _sock_data(int, char *, int, int, int, Rock **);
60 extern int _sock_ipattr(const char *);
61 extern void _sock_ingetaddr(Rock *, struct sockaddr_in *, socklen_t *,
62                                                         const char *);
63
64 extern void _syserrno(void);
65
66 /* The plan9 UDP header looks like:
67  *
68  * 52 bytes
69  *              raddr (16 b)
70  *              laddr (16 b)
71  *              IFC addr (ignored if user says it)  (16 b)
72  *              rport (2 b) (network ordering)
73  *              lport (ignored if user says it) (2b)
74  *
75  * The v4 addr format is 10 bytes of 0s, then two 0xff, then 4 bytes of addr. */
76
77 #define P9_UDP_HDR_SZ 52
78
79 /* Takes network-byte ordered IPv4 addr and writes it into buf, in the plan 9 IP
80  * addr format */
81 void naddr_to_plan9addr(uint32_t sin_addr, uint8_t * buf);
82 /* does v4 only */
83 uint32_t plan9addr_to_naddr(uint8_t * buf);
84 /* Returns a rock* if the socket exists and is UDP */
85 Rock *udp_sock_get_rock(int fd);
86
87 __END_DECLS
88 #endif /* PLAN9_SOCKETS_H */