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