]> git.llucax.com Git - software/posixx.git/blob - src/socket/opt.hpp
Initial import of the POSIX thin wrapper for C++
[software/posixx.git] / src / socket / opt.hpp
1 #ifndef POSIXX_SOCKET_OPT_HPP_
2 #define POSIXX_SOCKET_OPT_HPP_
3
4 #include <sys/socket.h>
5 #include <linux/if.h> // TODO: split POSIX and Linux options
6
7 /// @file
8
9 namespace posixx { namespace socket {
10
11 /**
12  * Type-safe socket options
13  *
14  * @see posixx::socket::setsockopt(), posixx::socket::getsockopt()
15  */
16 namespace opt {
17
18 #define MKSOLOPT(O, T, R, W) \
19         struct O { \
20                 enum { \
21                         level   = SOL_SOCKET, \
22                         optname = SO_ ## O, \
23                         read    = R, \
24                         write   = W }; \
25                 typedef T; }
26 #define MKSOLOPT_R(O, T) MKSOLOPT(O, T type, true, false)
27 #define MKSOLOPT_RW(O, T) MKSOLOPT(O, T type, true, true)
28 #define MKSOLOPT_ARRAY(O, T, S) MKSOLOPT(O, T type[S], true, true)
29
30 MKSOLOPT_R(ACCEPTCONN, int);
31 MKSOLOPT_ARRAY(BINDTODEVICE, char, IFNAMSIZ);
32 MKSOLOPT_RW(BROADCAST, int);
33 MKSOLOPT_RW(BSDCOMPAT, int);
34 //XXX DEBUG is replaced by the preprocessor in debug builds MKSOLOPT_RW(DEBUG, int);
35 MKSOLOPT_R(ERROR, int);
36 MKSOLOPT_RW(DONTROUTE, int);
37 MKSOLOPT_RW(KEEPALIVE, int);
38 MKSOLOPT_RW(LINGER, linger);
39 MKSOLOPT_RW(OOBINLINE, int);
40 MKSOLOPT_RW(PASSCRED, int);
41 MKSOLOPT_R(PEERCRED, ucred);
42 MKSOLOPT_RW(PRIORITY, int);
43 MKSOLOPT_RW(RCVBUF, size_t);
44 MKSOLOPT_RW(RCVBUFFORCE, size_t);
45 MKSOLOPT_RW(RCVLOWAT, size_t);
46 MKSOLOPT_R(SNDLOWAT, size_t);
47 MKSOLOPT_RW(RCVTIMEO, timeval);
48 MKSOLOPT_RW(SNDTIMEO, timeval);
49 MKSOLOPT_RW(REUSEADDR, int);
50 MKSOLOPT_RW(SNDBUF, size_t);
51 MKSOLOPT_RW(SNDBUFFORCE, size_t);
52 MKSOLOPT_RW(TIMESTAMP, int);
53 MKSOLOPT_R(TYPE, int);
54
55 #undef MKSOLOPT
56 #undef MKSOLOPT_R
57 #undef MKSOLOPT_RW
58 #undef MKSOLOPT_ARRAY
59
60 } } } // namespace posixx::socket::opt
61
62 #endif // POSIXX_SOCKET_OPT_HPP_