Mercurial > public > mercurial-scm > hg-stable
view rust/chg/src/sendfds.c @ 44853:a347a329e48d
rust-chg: reimplement locator by using async/await and tokio-0.2
connect_spawned() is rewritten from scratch by using std::process. Before,
it would select completion of either connection or server process. New code
could be implemented as such, but it's much simpler to occasionally run
try_wait() to detect server death.
Differential Revision: https://phab.mercurial-scm.org/D8447
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 11 Apr 2020 00:47:32 +0900 |
parents | 208cb7a9d0fa |
children |
line wrap: on
line source
/* * Utility to send fds via Unix domain socket * * Copyright 2011, 2018 Yuya Nishihara <yuya@tcha.org> * * This software may be used and distributed according to the terms of the * GNU General Public License version 2 or any later version. */ #include <errno.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #define MAX_FD_LEN 10 /* * Sends the given fds with 1-byte dummy payload. * * Returns the number of bytes sent on success, -1 on error and errno is set * appropriately. */ ssize_t sendfds(int sockfd, const int *fds, size_t fdlen) { char dummy[1] = {0}; struct iovec iov = {dummy, sizeof(dummy)}; char fdbuf[CMSG_SPACE(sizeof(fds[0]) * MAX_FD_LEN)]; struct msghdr msgh; struct cmsghdr *cmsg; /* just use a fixed-size buffer since we'll never send tons of fds */ if (fdlen > MAX_FD_LEN) { errno = EINVAL; return -1; } memset(&msgh, 0, sizeof(msgh)); msgh.msg_iov = &iov; msgh.msg_iovlen = 1; msgh.msg_control = fdbuf; msgh.msg_controllen = CMSG_SPACE(sizeof(fds[0]) * fdlen); cmsg = CMSG_FIRSTHDR(&msgh); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(fds[0]) * fdlen); memcpy(CMSG_DATA(cmsg), fds, sizeof(fds[0]) * fdlen); msgh.msg_controllen = cmsg->cmsg_len; return sendmsg(sockfd, &msgh, 0); }