1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
6 This file is part of systemd.
8 Copyright 2010 Lennart Poettering
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.
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.
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/>.
24 #include <sys/socket.h>
25 #include <netinet/in.h>
28 #include <asm/types.h>
29 #include <linux/netlink.h>
34 union sockaddr_union {
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;
43 typedef struct SocketAddress {
44 union sockaddr_union sockaddr;
46 /* We store the size here explicitly due to the weird
47 * sockaddr_un semantics for abstract sockets */
50 /* Socket type, i.e. SOCK_STREAM, SOCK_DGRAM, ... */
53 /* Socket protocol, IPPROTO_xxx, usually 0, except for netlink */
57 typedef enum SocketAddressBindIPv6Only {
58 SOCKET_ADDRESS_DEFAULT,
60 SOCKET_ADDRESS_IPV6_ONLY,
61 _SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX,
62 _SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -1
63 } SocketAddressBindIPv6Only;
65 #define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
67 int socket_address_parse(SocketAddress *a, const char *s);
68 int socket_address_parse_netlink(SocketAddress *a, const char *s);
69 int socket_address_print(const SocketAddress *a, char **p);
70 int socket_address_verify(const SocketAddress *a) _pure_;
72 bool socket_address_can_accept(const SocketAddress *a) _pure_;
74 int socket_address_listen(
75 const SocketAddress *a,
78 SocketAddressBindIPv6Only only,
79 const char *bind_to_device,
82 mode_t directory_mode,
86 bool socket_address_is(const SocketAddress *a, const char *s, int type);
87 bool socket_address_is_netlink(const SocketAddress *a, const char *s);
89 bool socket_address_matches_fd(const SocketAddress *a, int fd);
91 bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
93 const char* socket_address_get_path(const SocketAddress *a);
95 bool socket_ipv6_is_supported(void);
97 int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, char **ret);
98 int getpeername_pretty(int fd, char **ret);
99 int getsockname_pretty(int fd, char **ret);
101 const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
102 SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
104 int netlink_family_to_string_alloc(int b, char **s);
105 int netlink_family_from_string(const char *s) _pure_;