]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/socket-util.h
core: rework how we match mount units against each other
[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>
42f4e3c4
LP
30
31#include "macro.h"
32#include "util.h"
33
f6144808
LP
34union sockaddr_union {
35 struct sockaddr sa;
36 struct sockaddr_in in4;
37 struct sockaddr_in6 in6;
38 struct sockaddr_un un;
7a22745a 39 struct sockaddr_nl nl;
f6144808
LP
40 struct sockaddr_storage storage;
41};
42
542563ba 43typedef struct SocketAddress {
f6144808 44 union sockaddr_union sockaddr;
42f4e3c4
LP
45
46 /* We store the size here explicitly due to the weird
47 * sockaddr_un semantics for abstract sockets */
48 socklen_t size;
49
50 /* Socket type, i.e. SOCK_STREAM, SOCK_DGRAM, ... */
51 int type;
7a22745a
LP
52
53 /* Socket protocol, IPPROTO_xxx, usually 0, except for netlink */
54 int protocol;
542563ba 55} SocketAddress;
42f4e3c4 56
542563ba
LP
57typedef enum SocketAddressBindIPv6Only {
58 SOCKET_ADDRESS_DEFAULT,
59 SOCKET_ADDRESS_BOTH,
c0120d99
LP
60 SOCKET_ADDRESS_IPV6_ONLY,
61 _SOCKET_ADDRESS_BIND_IPV6_ONLY_MAX,
62 _SOCKET_ADDRESS_BIND_IPV6_ONLY_INVALID = -1
542563ba 63} SocketAddressBindIPv6Only;
42f4e3c4 64
542563ba 65#define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
42f4e3c4 66
542563ba 67int socket_address_parse(SocketAddress *a, const char *s);
7a22745a 68int socket_address_parse_netlink(SocketAddress *a, const char *s);
542563ba 69int socket_address_print(const SocketAddress *a, char **p);
44a6b1b6 70int socket_address_verify(const SocketAddress *a) _pure_;
b5a0699f 71
44a6b1b6 72bool socket_address_can_accept(const SocketAddress *a) _pure_;
4f2d528d 73
b5a0699f
LP
74int socket_address_listen(
75 const SocketAddress *a,
76 int backlog,
77 SocketAddressBindIPv6Only only,
78 const char *bind_to_device,
4fd5948e 79 bool free_bind,
6b6d2dee 80 bool transparent,
b5a0699f
LP
81 mode_t directory_mode,
82 mode_t socket_mode,
56cf987f 83 const char *label,
b5a0699f 84 int *ret);
42f4e3c4 85
27ca8d7a 86bool socket_address_is(const SocketAddress *a, const char *s, int type);
7a22745a 87bool socket_address_is_netlink(const SocketAddress *a, const char *s);
a16e1123 88
01e10de3
LP
89bool socket_address_matches_fd(const SocketAddress *a, int fd);
90
2ca0435b
ZJS
91int make_socket_fd(const char* address, int flags);
92
44a6b1b6 93bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
a16e1123 94
a57f7e2c 95const char* socket_address_get_path(const SocketAddress *a);
6e2ef85b 96
44a6b1b6
ZJS
97const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
98SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
c0120d99 99
f8b69d1d 100int netlink_family_to_string_alloc(int b, char **s);
7a22745a
LP
101int netlink_family_from_string(const char *s);
102
5bfcc1c6 103bool socket_ipv6_is_supported(void);