X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fproc.c;h=ac777d4bfe8299769643236cbed649fde1440f65;hb=b1b0fe0f4793825232288427da4856e9adf8b868;hp=86464348f625fb125c7e3ce2a7114bc7e45f7fc2;hpb=6a7a868e28e79f5502cc4b37578c263f640439c8;p=ashd.git diff --git a/lib/proc.c b/lib/proc.c index 8646434..ac777d4 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -22,6 +22,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -33,7 +34,6 @@ int stdmkchild(char **argv, void (*chinit)(void *), void *idata) { - int i; pid_t pid; int fd[2]; @@ -44,21 +44,19 @@ int stdmkchild(char **argv, void (*chinit)(void *), void *idata) if(pid == 0) { if(chinit != NULL) chinit(idata); - for(i = 3; i < FD_SETSIZE; i++) { - if(i != fd[0]) - close(i); - } dup2(fd[0], 0); close(fd[0]); + close(fd[1]); execvp(argv[0], argv); flog(LOG_WARNING, "could not exec child program %s: %s", argv[0], strerror(errno)); exit(127); } close(fd[0]); + fcntl(fd[1], F_SETFD, FD_CLOEXEC); return(fd[1]); } -int sendfd(int sock, int fd, char *data, size_t datalen) +int sendfd2(int sock, int fd, char *data, size_t datalen, int flags) { struct msghdr msg; struct cmsghdr *cmsg; @@ -80,7 +78,12 @@ int sendfd(int sock, int fd, char *data, size_t datalen) *((int *)CMSG_DATA(cmsg)) = fd; msg.msg_controllen = cmsg->cmsg_len; - return(sendmsg(sock, &msg, MSG_NOSIGNAL | MSG_DONTWAIT)); + return(sendmsg(sock, &msg, flags)); +} + +int sendfd(int sock, int fd, char *data, size_t datalen) +{ + return(sendfd2(sock, fd, data, datalen, MSG_NOSIGNAL)); } int recvfd(int sock, char **data, size_t *datalen) @@ -141,8 +144,7 @@ pid_t stdforkserve(char **argv, struct hthead *req, int fd, void (*chinit)(void dup2(fd, 0); dup2(fd, 1); - for(i = 3; i < FD_SETSIZE; i++) - close(i); + close(fd); bufinit(args); for(i = 0; argv[i]; i++)