Branch data Line data Source code
1 : : #ifndef __CR_UTIL_NET_H__
2 : : #define __CR_UTIL_NET_H__
3 : :
4 : : #include <sys/socket.h>
5 : : #include <sys/un.h>
6 : :
7 : : #define UNIX_PATH_MAX (sizeof(struct sockaddr_un) - \
8 : : (size_t)((struct sockaddr_un *) 0)->sun_path)
9 : :
10 : : #ifndef SO_PEEK_OFF
11 : : #define SO_PEEK_OFF 42
12 : : #endif
13 : :
14 : : /*
15 : : * Because of kernel doing kmalloc for user data passed
16 : : * in SCM messages, and there is SCM_MAX_FD as a limit
17 : : * for descriptors passed at once we're trying to reduce
18 : : * the pressue on kernel memory manager and use predefined
19 : : * known to work well size of the message buffer.
20 : : */
21 : : #define CR_SCM_MSG_SIZE (1024)
22 : : #define CR_SCM_MAX_FD (252)
23 : :
24 : : struct fd_opts {
25 : : char flags;
26 : : struct {
27 : : uint32_t uid;
28 : : uint32_t euid;
29 : : uint32_t signum;
30 : : uint32_t pid_type;
31 : : uint32_t pid;
32 : : } fown;
33 : : };
34 : :
35 : : struct scm_fdset {
36 : : struct msghdr hdr;
37 : : struct iovec iov;
38 : : char msg_buf[CR_SCM_MSG_SIZE];
39 : : struct fd_opts opts[CR_SCM_MAX_FD];
40 : : };
41 : :
42 : : extern int send_fds(int sock, struct sockaddr_un *saddr, int saddr_len,
43 : : int *fds, int nr_fds, bool with_flags);
44 : : extern int recv_fds(int sock, int *fds, int nr_fds, struct fd_opts *opts);
45 : :
46 : 1224 : static inline int send_fd(int sock, struct sockaddr_un *saddr, int saddr_len, int fd)
47 : : {
48 : 1224 : return send_fds(sock, saddr, saddr_len, &fd, 1, false);
49 : : }
50 : :
51 : 602 : static inline int recv_fd(int sock)
52 : : {
53 : : int fd, ret;
54 : :
55 : 602 : ret = recv_fds(sock, &fd, 1, NULL);
56 [ + - ]: 602 : if (ret)
57 : : return -1;
58 : :
59 : 602 : return fd;
60 : : }
61 : :
62 : : #endif /* __CR_UTIL_NET_H__ */
|