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