net: rock: Use a helper for conversation filenames (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];                      /* Only used for relative path lookups now */
61         int ctl_fd;                                     /* fd of the ctl file */
62         int other;                                      /* fd of the remote end for Unix domain */
63         bool has_listen_fd;                     /* has set up a listen file, O_PATH */
64         int listen_fd;                          /* fd of the listen file, if any */
65 };
66
67 extern Rock *_sock_findrock(int, struct stat *);
68 extern Rock *_sock_newrock(int);
69 extern void _sock_fd_closed(int fd);
70 extern void _sock_srvname(char *, char *);
71 extern int _sock_srv(char *, int);
72 extern int _sock_data(int, const char *, int, int, int, Rock **);
73 extern int _sock_ipattr(const char *);
74 extern void _sock_get_conv_filename(Rock *r, const char *name, char *retloc);
75 extern void _sock_ingetaddr(Rock *, struct sockaddr_in *, socklen_t *,
76                                                         const char *);
77 extern int _sock_strip_opts(int type);
78 extern int _sock_get_opts(int type);
79 extern void _sock_lookup_rock_fds(int sock_fd, bool can_open_listen_fd,
80                                   int *listen_fd_r, int *ctl_fd_r);
81 extern void _sock_mirror_fcntl(int sock_fd, int cmd, long arg);
82
83 int get_sibling_fd(int fd, const char *sibling);
84 int write_hex_to_fd(int fd, uint64_t num);
85
86 /* Integer to string conversion helpers, probably faster than snprintf. */
87 char *u64_to_str(uint64_t num, char *buf, size_t len);
88
89 extern void _syserrno(void);
90
91 /* The plan9 UDP header looks like:
92  *
93  * 52 bytes
94  *              raddr (16 b)
95  *              laddr (16 b)
96  *              IFC addr (ignored if user says it)  (16 b)
97  *              rport (2 b) (network ordering)
98  *              lport (ignored if user says it) (2b)
99  *
100  * The v4 addr format is 10 bytes of 0s, then two 0xff, then 4 bytes of addr. */
101
102 #define P9_UDP_HDR_SZ 52
103
104 /* Takes network-byte ordered IPv4 addr and writes it into buf, in the plan 9 IP
105  * addr format */
106 void naddr_to_plan9addr(uint32_t sin_addr, uint8_t * buf);
107 /* does v4 only */
108 uint32_t plan9addr_to_naddr(uint8_t * buf);
109 /* Returns a rock* if the socket exists and is UDP */
110 Rock *udp_sock_get_rock(int fd);
111
112 __END_DECLS