Stop using snprintf in write_hex_to_fd (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / sys / plan9_helpers.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
10 #pragma once
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
21
22 typedef struct Rock Rock;
23
24 enum {
25         Ctlsize = 128,
26
27         /* states */
28         Sopen = 0,
29         Sbound,
30         Sconnected,
31
32         /* types of name */
33         Tsys = 0,
34         Tip,
35         Tdom,
36 };
37
38 /*
39  *  since BSD programs expect to perform both control and data functions
40  *  through a single fd, we need to hide enough info under a rock to
41  *  be able to open the control file when we need it.
42  */
43 struct Rock {
44         Rock *next;
45         unsigned long dev;                      /* inode & dev of data file */
46         unsigned long inode;            /* ... */
47         int domain;                                     /* from socket call */
48         int stype;                                      /* socket type, from socket()'s type field */
49         int sopts;                                      /* socket options, from socket()'s type field */
50         int protocol;                           /* ... */
51         int reserved;                           /* use a priveledged port # (< 1024) */
52         union {
53                 struct sockaddr addr;   /* address from bind */
54                 struct sockaddr_storage addr_stor;
55         };
56         union {
57                 struct sockaddr raddr;  /* peer address */
58                 struct sockaddr_storage raddr_stor;
59         };
60         char ctl[Ctlsize];                      /* name of control file (if any) */
61         int other;                                      /* fd of the remote end for Unix domain */
62         bool is_listener;                       /* has called listen() and will accept() */
63         int listen_fd;                          /* fd of the listen file, if any */
64 };
65
66 extern Rock *_sock_findrock(int, struct stat *);
67 extern Rock *_sock_newrock(int);
68 extern void _sock_fd_closed(int fd);
69 extern void _sock_srvname(char *, char *);
70 extern int _sock_srv(char *, int);
71 extern int _sock_data(int, const char *, int, int, int, Rock **);
72 extern int _sock_ipattr(const char *);
73 extern void _sock_ingetaddr(Rock *, struct sockaddr_in *, socklen_t *,
74                                                         const char *);
75 extern int _sock_strip_opts(int type);
76 extern int _sock_get_opts(int type);
77 extern int _rock_open_listen_fd(Rock *r);
78 extern int _sock_lookup_listen_fd(int sock_fd);
79
80 int get_sibling_fd(int fd, const char *sibling);
81 int write_hex_to_fd(int fd, uint64_t num);
82
83 /* Integer to string conversion helpers, probably faster than snprintf. */
84 char *u64_to_str(uint64_t num, char *buf, size_t len);
85
86 extern void _syserrno(void);
87
88 /* The plan9 UDP header looks like:
89  *
90  * 52 bytes
91  *              raddr (16 b)
92  *              laddr (16 b)
93  *              IFC addr (ignored if user says it)  (16 b)
94  *              rport (2 b) (network ordering)
95  *              lport (ignored if user says it) (2b)
96  *
97  * The v4 addr format is 10 bytes of 0s, then two 0xff, then 4 bytes of addr. */
98
99 #define P9_UDP_HDR_SZ 52
100
101 /* Takes network-byte ordered IPv4 addr and writes it into buf, in the plan 9 IP
102  * addr format */
103 void naddr_to_plan9addr(uint32_t sin_addr, uint8_t * buf);
104 /* does v4 only */
105 uint32_t plan9addr_to_naddr(uint8_t * buf);
106 /* Returns a rock* if the socket exists and is UDP */
107 Rock *udp_sock_get_rock(int fd);
108
109 __END_DECLS