]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/basic/socket-util.h
tree-wide: sort includes in *.h
[thirdparty/systemd.git] / src / basic / socket-util.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
42f4e3c4 2
c2f1db8f 3#pragma once
42f4e3c4 4
a7334b09
LP
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
5430f7f2
LP
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
a7334b09
LP
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
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
db73295a 24#include <netinet/ether.h>
71d35b6b
TA
25#include <netinet/in.h>
26#include <sys/socket.h>
42f4e3c4 27#include <sys/un.h>
7a22745a 28#include <linux/netlink.h>
e88bc795 29#include <linux/if_packet.h>
42f4e3c4
LP
30
31#include "macro.h"
32#include "util.h"
33
f6144808
LP
34union sockaddr_union {
35 struct sockaddr sa;
4d49b48c 36 struct sockaddr_in in;
f6144808
LP
37 struct sockaddr_in6 in6;
38 struct sockaddr_un un;
7a22745a 39 struct sockaddr_nl nl;
f6144808 40 struct sockaddr_storage storage;
e88bc795 41 struct sockaddr_ll ll;
f6144808
LP
42};
43
542563ba 44typedef struct SocketAddress {
f6144808 45 union sockaddr_union sockaddr;
42f4e3c4
LP
46
47 /* We store the size here explicitly due to the weird
48 * sockaddr_un semantics for abstract sockets */
49 socklen_t size;
50
51 /* Socket type, i.e. SOCK_STREAM, SOCK_DGRAM, ... */
52 int type;
7a22745a
LP
53
54 /* Socket protocol, IPPROTO_xxx, usually 0, except for netlink */
55 int protocol;
542563ba 56} SocketAddress;
42f4e3c4 57
542563ba
LP
58typedef enum SocketAddressBindIPv6Only {
59 SOCKET_ADDRESS_DEFAULT,
60 SOCKET_ADDRESS_BOTH,
c0120d99
LP
61 SOCKET_ADDRESS_IPV6_ONLY,
62 _SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX,
63 _SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -1
542563ba 64} SocketAddressBindIPv6Only;
42f4e3c4 65
542563ba 66#define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
42f4e3c4 67
542563ba 68int socket_address_parse(SocketAddress *a, const char *s);
7693146d 69int socket_address_parse_and_warn(SocketAddress *a, const char *s);
7a22745a 70int socket_address_parse_netlink(SocketAddress *a, const char *s);
542563ba 71int socket_address_print(const SocketAddress *a, char **p);
44a6b1b6 72int socket_address_verify(const SocketAddress *a) _pure_;
bd1fe7c7 73int socket_address_unlink(SocketAddress *a);
b5a0699f 74
44a6b1b6 75bool socket_address_can_accept(const SocketAddress *a) _pure_;
4f2d528d 76
b5a0699f
LP
77int socket_address_listen(
78 const SocketAddress *a,
175a3d25 79 int flags,
b5a0699f
LP
80 int backlog,
81 SocketAddressBindIPv6Only only,
82 const char *bind_to_device,
54255c64 83 bool reuse_port,
4fd5948e 84 bool free_bind,
6b6d2dee 85 bool transparent,
b5a0699f
LP
86 mode_t directory_mode,
87 mode_t socket_mode,
175a3d25 88 const char *label);
e0aa3726 89int make_socket_fd(int log_level, const char* address, int flags);
42f4e3c4 90
27ca8d7a 91bool socket_address_is(const SocketAddress *a, const char *s, int type);
7a22745a 92bool socket_address_is_netlink(const SocketAddress *a, const char *s);
a16e1123 93
01e10de3
LP
94bool socket_address_matches_fd(const SocketAddress *a, int fd);
95
44a6b1b6 96bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
a16e1123 97
a57f7e2c 98const char* socket_address_get_path(const SocketAddress *a);
6e2ef85b 99
4d49b48c
LP
100bool socket_ipv6_is_supported(void);
101
3b1c5241
SL
102int sockaddr_port(const struct sockaddr *_sa) _pure_;
103
104int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
4d49b48c
LP
105int getpeername_pretty(int fd, char **ret);
106int getsockname_pretty(int fd, char **ret);
107
b31f535c
ZJS
108int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret);
109int getnameinfo_pretty(int fd, char **ret);
110
44a6b1b6
ZJS
111const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
112SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
c0120d99 113
f8b69d1d 114int netlink_family_to_string_alloc(int b, char **s);
4d49b48c 115int netlink_family_from_string(const char *s) _pure_;
f01e5736
LP
116
117bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b);
2583fbea
LP
118
119int fd_inc_sndbuf(int fd, size_t n);
120int fd_inc_rcvbuf(int fd, size_t n);
121
122int ip_tos_to_string_alloc(int i, char **s);
123int ip_tos_from_string(const char *s);
124
125int getpeercred(int fd, struct ucred *ucred);
126int getpeersec(int fd, char **ret);
127
128int send_one_fd(int transport_fd, int fd, int flags);
129int receive_one_fd(int transport_fd, int flags);
8f328d36
LP
130
131#define CMSG_FOREACH(cmsg, mh) \
132 for ((cmsg) = CMSG_FIRSTHDR(mh); (cmsg); (cmsg) = CMSG_NXTHDR((mh), (cmsg)))