diff --git a/contrib/chg/hgclient.c b/contrib/chg/hgclient.c --- a/contrib/chg/hgclient.c +++ b/contrib/chg/hgclient.c @@ -418,11 +418,7 @@ hgclient_t *hgc_open(const char *socknam /* don't keep fd on fork(), so that it can be closed when the parent * process get terminated. */ - int flags = fcntl(fd, F_GETFD); - if (flags < 0) - abortmsgerrno("cannot get flags of socket"); - if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) - abortmsgerrno("cannot set flags of socket"); + fsetcloexec(fd); struct sockaddr_un addr; addr.sun_family = AF_UNIX; diff --git a/contrib/chg/util.c b/contrib/chg/util.c --- a/contrib/chg/util.c +++ b/contrib/chg/util.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -91,6 +92,15 @@ void fchdirx(int dirfd) abortmsgerrno("failed to fchdir"); } +void fsetcloexec(int fd) +{ + int flags = fcntl(fd, F_GETFD); + if (flags < 0) + abortmsgerrno("cannot get flags of fd %d", fd); + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) + abortmsgerrno("cannot set flags of fd %d", fd); +} + void *mallocx(size_t size) { void *result = malloc(size); diff --git a/contrib/chg/util.h b/contrib/chg/util.h --- a/contrib/chg/util.h +++ b/contrib/chg/util.h @@ -24,6 +24,7 @@ void enabledebugmsg(void); void debugmsg(const char *fmt, ...) PRINTF_FORMAT_; void fchdirx(int dirfd); +void fsetcloexec(int fd); void *mallocx(size_t size); void *reallocx(void *ptr, size_t size);