##// END OF EJS Templates
absorb: preserve changesets which were already empty...
absorb: preserve changesets which were already empty Most commands in Mercurial (commit, rebase, absorb itself) don’t create empty changesets or drop them if they become empty. If there’s a changeset that’s empty, it must be a deliberate choice of the user. At least it shouldn’t be absorb’s responsibility to prune them. The fact that changesets that became empty during absorb are pruned, is unaffected by this. This case was found while writing patches which make it possible to configure absorb and rebase to not drop empty changesets. Even without having such config set, I think it’s valuable to preserve changesets which were already empty.

File last commit:

r40005:208cb7a9 default
r45518:1ca0047f default
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);
}