chiark / gitweb /
nss-myhostname: only export the NSS entry point symbols, nothing else
[elogind.git] / src / shared / 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 <sys/un.h>
27 #include <asm/types.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 union in_addr_union {
45         struct in_addr in;
46         struct in6_addr in6;
47 };
48
49 typedef struct SocketAddress {
50         union sockaddr_union sockaddr;
51
52         /* We store the size here explicitly due to the weird
53          * sockaddr_un semantics for abstract sockets */
54         socklen_t size;
55
56         /* Socket type, i.e. SOCK_STREAM, SOCK_DGRAM, ... */
57         int type;
58
59         /* Socket protocol, IPPROTO_xxx, usually 0, except for netlink */
60         int protocol;
61 } SocketAddress;
62
63 typedef enum SocketAddressBindIPv6Only {
64         SOCKET_ADDRESS_DEFAULT,
65         SOCKET_ADDRESS_BOTH,
66         SOCKET_ADDRESS_IPV6_ONLY,
67         _SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX,
68         _SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -1
69 } SocketAddressBindIPv6Only;
70
71 #define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
72
73 int socket_address_parse(SocketAddress *a, const char *s);
74 int socket_address_parse_netlink(SocketAddress *a, const char *s);
75 int socket_address_print(const SocketAddress *a, char **p);
76 int socket_address_verify(const SocketAddress *a) _pure_;
77 int socket_address_unlink(SocketAddress *a);
78
79 bool socket_address_can_accept(const SocketAddress *a) _pure_;
80
81 int socket_address_listen(
82                 const SocketAddress *a,
83                 int flags,
84                 int backlog,
85                 SocketAddressBindIPv6Only only,
86                 const char *bind_to_device,
87                 bool free_bind,
88                 bool transparent,
89                 mode_t directory_mode,
90                 mode_t socket_mode,
91                 const char *label);
92 int make_socket_fd(int log_level, const char* address, int flags);
93
94 bool socket_address_is(const SocketAddress *a, const char *s, int type);
95 bool socket_address_is_netlink(const SocketAddress *a, const char *s);
96
97 bool socket_address_matches_fd(const SocketAddress *a, int fd);
98
99 bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
100
101 const char* socket_address_get_path(const SocketAddress *a);
102
103 bool socket_ipv6_is_supported(void);
104
105 int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, char **ret);
106 int getpeername_pretty(int fd, char **ret);
107 int getsockname_pretty(int fd, char **ret);
108
109 const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
110 SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
111
112 int netlink_family_to_string_alloc(int b, char **s);
113 int netlink_family_from_string(const char *s) _pure_;
114
115 int in_addr_null(unsigned family, union in_addr_union *u);
116 int in_addr_equal(unsigned family, union in_addr_union *a, union in_addr_union *b);
117 int in_addr_prefix_intersect(unsigned family, const union in_addr_union *a, unsigned aprefixlen, const union in_addr_union *b, unsigned bprefixlen);
118 int in_addr_prefix_next(unsigned family, union in_addr_union *u, unsigned prefixlen);
119 int in_addr_to_string(unsigned family, const union in_addr_union *u, char **ret);
120 int in_addr_from_string(unsigned family, const char *s, union in_addr_union *ret);