]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/socket-util.h
hwdb: Update database of Bluetooth company identifiers
[thirdparty/systemd.git] / src / shared / 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
42f4e3c4
LP
24#include <sys/socket.h>
25#include <netinet/in.h>
26#include <sys/un.h>
acbb0225 27#include <net/if.h>
7a22745a
LP
28#include <asm/types.h>
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);
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_;
b5a0699f 73
44a6b1b6 74bool socket_address_can_accept(const SocketAddress *a) _pure_;
4f2d528d 75
b5a0699f
LP
76int socket_address_listen(
77 const SocketAddress *a,
175a3d25 78 int flags,
b5a0699f
LP
79 int backlog,
80 SocketAddressBindIPv6Only only,
81 const char *bind_to_device,
4fd5948e 82 bool free_bind,
6b6d2dee 83 bool transparent,
b5a0699f
LP
84 mode_t directory_mode,
85 mode_t socket_mode,
175a3d25 86 const char *label);
e0aa3726 87int make_socket_fd(int log_level, const char* address, int flags);
42f4e3c4 88
27ca8d7a 89bool socket_address_is(const SocketAddress *a, const char *s, int type);
7a22745a 90bool socket_address_is_netlink(const SocketAddress *a, const char *s);
a16e1123 91
01e10de3
LP
92bool socket_address_matches_fd(const SocketAddress *a, int fd);
93
44a6b1b6 94bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
a16e1123 95
a57f7e2c 96const char* socket_address_get_path(const SocketAddress *a);
6e2ef85b 97
4d49b48c
LP
98bool socket_ipv6_is_supported(void);
99
100int sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, char **ret);
101int getpeername_pretty(int fd, char **ret);
102int getsockname_pretty(int fd, char **ret);
103
44a6b1b6
ZJS
104const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
105SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
c0120d99 106
f8b69d1d 107int netlink_family_to_string_alloc(int b, char **s);
4d49b48c 108int netlink_family_from_string(const char *s) _pure_;