chiark / gitweb /
Prep v228: Clean up the new src/basic/*-util-[hc] files:
[elogind.git] / src / basic / socket-util.h
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 #pragma once
4
5 /***
6   This file is part of systemd.
7
8   Copyright 2010 Lennart Poettering
9
10   systemd is free software; you can redistribute it and/or modify it
11   under the terms of the GNU Lesser General Public License as published by
12   the Free Software Foundation; either version 2.1 of the License, or
13   (at your option) any later version.
14
15   systemd is distributed in the hope that it will be useful, but
16   WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18   Lesser General Public License for more details.
19
20   You should have received a copy of the GNU Lesser General Public License
21   along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 ***/
23
24 #include <sys/socket.h>
25 #include <netinet/in.h>
26 #include <netinet/ether.h>
27 #include <sys/un.h>
28 #include <linux/netlink.h>
29 #include <linux/if_packet.h>
30
31 #include "macro.h"
32 #include "util.h"
33
34 union sockaddr_union {
35         struct sockaddr sa;
36         struct sockaddr_in in;
37         struct sockaddr_in6 in6;
38         struct sockaddr_un un;
39         struct sockaddr_nl nl;
40         struct sockaddr_storage storage;
41         struct sockaddr_ll ll;
42 };
43
44 /// UNNEEDED by elogind
45 #if 0
46 typedef struct SocketAddress {
47         union sockaddr_union sockaddr;
48
49         /* We store the size here explicitly due to the weird
50          * sockaddr_un semantics for abstract sockets */
51         socklen_t size;
52
53         /* Socket type, i.e. SOCK_STREAM, SOCK_DGRAM, ... */
54         int type;
55
56         /* Socket protocol, IPPROTO_xxx, usually 0, except for netlink */
57         int protocol;
58 } SocketAddress;
59
60 typedef enum SocketAddressBindIPv6Only {
61         SOCKET_ADDRESS_DEFAULT,
62         SOCKET_ADDRESS_BOTH,
63         SOCKET_ADDRESS_IPV6_ONLY,
64         _SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX,
65         _SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -1
66 } SocketAddressBindIPv6Only;
67
68 #define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
69 #endif // 0
70
71 // UNNEEDED int socket_address_parse(SocketAddress *a, const char *s);
72 // UNNEEDED int socket_address_parse_and_warn(SocketAddress *a, const char *s);
73 // UNNEEDED int socket_address_parse_netlink(SocketAddress *a, const char *s);
74 // UNNEEDED int socket_address_print(const SocketAddress *a, char **p);
75 // UNNEEDED int socket_address_verify(const SocketAddress *a) _pure_;
76 // UNNEEDED int socket_address_unlink(SocketAddress *a);
77
78 // UNNEEDED bool socket_address_can_accept(const SocketAddress *a) _pure_;
79
80 /// UNNEEDED by elogind
81 #if 0
82 int socket_address_listen(
83                 const SocketAddress *a,
84                 int flags,
85                 int backlog,
86                 SocketAddressBindIPv6Only only,
87                 const char *bind_to_device,
88                 bool reuse_port,
89                 bool free_bind,
90                 bool transparent,
91                 mode_t directory_mode,
92                 mode_t socket_mode,
93                 const char *label);
94 int make_socket_fd(int log_level, const char* address, int flags);
95 #endif // 0
96
97 // UNNEEDED bool socket_address_is(const SocketAddress *a, const char *s, int type);
98 // UNNEEDED bool socket_address_is_netlink(const SocketAddress *a, const char *s);
99
100 // UNNEEDED bool socket_address_matches_fd(const SocketAddress *a, int fd);
101
102 // UNNEEDED bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
103
104 // UNNEEDED const char* socket_address_get_path(const SocketAddress *a);
105
106 bool socket_ipv6_is_supported(void);
107
108 // UNNEEDED int sockaddr_port(const struct sockaddr *_sa) _pure_;
109
110 // UNNEEDED Sint sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
111 // UNNEEDED int getpeername_pretty(int fd, char **ret);
112 // UNNEEDED int getsockname_pretty(int fd, char **ret);
113
114 // UNNEEDED int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret);
115 // UNNEEDED int getnameinfo_pretty(int fd, char **ret);
116
117 // UNNEEDED const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
118 // UNNEEDED SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
119
120 // UNNEEDED int netlink_family_to_string_alloc(int b, char **s);
121 // UNNEEDED int netlink_family_from_string(const char *s) _pure_;
122
123 // UNNEEDED bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b);
124
125 int fd_inc_sndbuf(int fd, size_t n);
126 int fd_inc_rcvbuf(int fd, size_t n);
127
128 // UNNEEDED int ip_tos_to_string_alloc(int i, char **s);
129 // UNNEEDED int ip_tos_from_string(const char *s);
130
131 int getpeercred(int fd, struct ucred *ucred);
132 int getpeersec(int fd, char **ret);
133
134 int send_one_fd(int transport_fd, int fd, int flags);
135 // UNNEEDED int receive_one_fd(int transport_fd, int flags);
136
137 #define CMSG_FOREACH(cmsg, mh)                                          \
138         for ((cmsg) = CMSG_FIRSTHDR(mh); (cmsg); (cmsg) = CMSG_NXTHDR((mh), (cmsg)))