Mercurial > hg
annotate rust/chg/src/sendfds.c @ 42783:c8d3af9c7e65
perf: handle NameError for `pycompat.foo` when pycompat wasn't imported
On old Mercurial versions, we won't have a pycompat variable defined,
and then `pycompat.foo` will raise a NameError.
Differential Revision: https://phab.mercurial-scm.org/D6743
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Mon, 19 Aug 2019 10:38:38 -0700 |
parents | 208cb7a9d0fa |
children |
rev | line source |
---|---|
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 } |