author | Matt Harbison <matt_harbison@yahoo.com> |
Mon, 13 Jun 2022 11:06:33 -0400 | |
changeset 49317 | 709e5f7eec1f |
parent 39969 | 208cb7a9d0fa |
permissions | -rw-r--r-- |
39969
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
1 |
/* |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
2 |
* Utility to send fds via Unix domain socket |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
3 |
* |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
4 |
* Copyright 2011, 2018 Yuya Nishihara <yuya@tcha.org> |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
5 |
* |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
6 |
* This software may be used and distributed according to the terms of the |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
7 |
* GNU General Public License version 2 or any later version. |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
8 |
*/ |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
9 |
|
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
10 |
#include <errno.h> |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
11 |
#include <stdlib.h> |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
12 |
#include <string.h> |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
13 |
#include <sys/socket.h> |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
14 |
#include <sys/types.h> |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
15 |
|
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
16 |
#define MAX_FD_LEN 10 |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
17 |
|
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
18 |
/* |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
19 |
* Sends the given fds with 1-byte dummy payload. |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
20 |
* |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
21 |
* Returns the number of bytes sent on success, -1 on error and errno is set |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
22 |
* appropriately. |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
23 |
*/ |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
24 |
ssize_t sendfds(int sockfd, const int *fds, size_t fdlen) |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
25 |
{ |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
26 |
char dummy[1] = {0}; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
27 |
struct iovec iov = {dummy, sizeof(dummy)}; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
28 |
char fdbuf[CMSG_SPACE(sizeof(fds[0]) * MAX_FD_LEN)]; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
29 |
struct msghdr msgh; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
30 |
struct cmsghdr *cmsg; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
31 |
|
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
32 |
/* just use a fixed-size buffer since we'll never send tons of fds */ |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
33 |
if (fdlen > MAX_FD_LEN) { |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
34 |
errno = EINVAL; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
35 |
return -1; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
36 |
} |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
37 |
|
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
38 |
memset(&msgh, 0, sizeof(msgh)); |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
39 |
msgh.msg_iov = &iov; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
40 |
msgh.msg_iovlen = 1; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
41 |
msgh.msg_control = fdbuf; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
42 |
msgh.msg_controllen = CMSG_SPACE(sizeof(fds[0]) * fdlen); |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
43 |
|
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
44 |
cmsg = CMSG_FIRSTHDR(&msgh); |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
45 |
cmsg->cmsg_level = SOL_SOCKET; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
46 |
cmsg->cmsg_type = SCM_RIGHTS; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
47 |
cmsg->cmsg_len = CMSG_LEN(sizeof(fds[0]) * fdlen); |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
48 |
memcpy(CMSG_DATA(cmsg), fds, sizeof(fds[0]) * fdlen); |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
49 |
msgh.msg_controllen = cmsg->cmsg_len; |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
50 |
return sendmsg(sockfd, &msgh, 0); |
208cb7a9d0fa
rust-chg: add function to send fds via domain socket
Yuya Nishihara <yuya@tcha.org>
parents:
diff
changeset
|
51 |
} |