##// END OF EJS Templates
tweak-default: no longer enable the experimental return code...
tweak-default: no longer enable the experimental return code The change is quite new and undocumented (since it is experimental) so it seems premature to make it available in tweak default. In addition, I am not sure the new return code are frozen yet (eg: some of the initial feedback have not been incorporated). Before the release I doubled check (probably with Martin) that they were not enabled by default and got replied that they were only enabled in the tests. Have I been aware that they have been also enabled in tweak default I would I have lobbied to delay that. I discovered they were in tweak default from users feedback. They found it an unpleasant and unexpected surprise of 5.7. So I suggest we no enable enable this experimental feature for Mercurial 5.7 and revisit this later, when the feature will be more mature. Differential Revision: https://phab.mercurial-scm.org/D9975

File last commit:

r40005:208cb7a9 default
r47216:839cacdf stable
Show More
sendfds.c
51 lines | 1.3 KiB | text/x-c | CLexer
/*
* 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);
}