]> git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/af_unix.h
af_unix: improve SCM_RIGHTS file descriptor retrieval
[mirror_lxc.git] / src / lxc / af_unix.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #ifndef __LXC_AF_UNIX_H
4 #define __LXC_AF_UNIX_H
5
6 #include <stdio.h>
7 #include <sys/socket.h>
8 #include <stddef.h>
9 #include <sys/un.h>
10
11 #include "compiler.h"
12 #include "macro.h"
13 #include "memory_utils.h"
14
15 /*
16 * Technically 253 is the kernel limit but we want to the struct to be a
17 * multiple of 8.
18 */
19 #define KERNEL_SCM_MAX_FD 252
20
21 struct unix_fds {
22 __u32 fd_count_max;
23 __u32 fd_count_ret;
24 __s32 fd[KERNEL_SCM_MAX_FD];
25 } __attribute__((aligned(8)));
26
27 /* does not enforce \0-termination */
28 __hidden extern int lxc_abstract_unix_open(const char *path, int type, int flags);
29 __hidden extern void lxc_abstract_unix_close(int fd);
30 /* does not enforce \0-termination */
31 __hidden extern int lxc_abstract_unix_connect(const char *path);
32
33 __hidden extern int lxc_abstract_unix_send_fds(int fd, const int *sendfds,
34 int num_sendfds, void *data,
35 size_t size) __access_r(2, 3)
36 __access_r(4, 5);
37
38 __hidden extern int lxc_abstract_unix_send_fds_iov(int fd, const int *sendfds,
39 int num_sendfds,
40 struct iovec *iov,
41 size_t iovlen)
42 __access_r(2, 3);
43
44 __hidden extern ssize_t lxc_abstract_unix_recv_fds(int fd,
45 struct unix_fds *ret_fds,
46 void *ret_data,
47 size_t size_ret_data)
48 __access_r(3, 4);
49
50 __hidden extern ssize_t lxc_abstract_unix_recv_one_fd(int fd, int *ret_fd,
51 void *ret_data,
52 size_t size_ret_data)
53 __access_r(3, 4);
54
55 __hidden extern ssize_t lxc_abstract_unix_recv_two_fds(int fd, int *ret_fd);
56
57 __hidden extern int lxc_unix_send_fds(int fd, int *sendfds, int num_sendfds, void *data, size_t size);
58
59 __hidden extern int lxc_abstract_unix_send_credential(int fd, void *data, size_t size)
60 __access_r(2, 3);
61
62 __hidden extern int lxc_abstract_unix_rcv_credential(int fd, void *data, size_t size)
63 __access_w(2, 3);
64
65 __hidden extern int lxc_unix_sockaddr(struct sockaddr_un *ret, const char *path);
66 __hidden extern int lxc_unix_connect(struct sockaddr_un *addr);
67 __hidden extern int lxc_unix_connect_type(struct sockaddr_un *addr, int type);
68 __hidden extern int lxc_socket_set_timeout(int fd, int rcv_timeout, int snd_timeout);
69
70 static inline void put_unix_fds(struct unix_fds *fds)
71 {
72 if (!IS_ERR_OR_NULL(fds)) {
73 for (size_t idx = 0; idx < fds->fd_count_ret; idx++)
74 close_prot_errno_disarm(fds->fd[idx]);
75 }
76 }
77 define_cleanup_function(struct unix_fds *, put_unix_fds);
78
79 #endif /* __LXC_AF_UNIX_H */