X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=fishdescriptor%2Fdonate.c;h=60ca2666379bfaed7e52d1c38411349905057638;hp=c2d59cb701b3e9cb977e447caec81e66f7b684f8;hb=95e48f3e3aedce1f276a5f0591f706c2df95ee72;hpb=69b7170a72633ad98a9ab868a1e7a3fac99cdb33 diff --git a/fishdescriptor/donate.c b/fishdescriptor/donate.c index c2d59cb..60ca266 100644 --- a/fishdescriptor/donate.c +++ b/fishdescriptor/donate.c @@ -16,39 +16,36 @@ * along with this program. If not, see . */ -int libxl__sendmsg_fds(libxl__gc *gc, int carrier, - const void *data, size_t datalen, - int nfds, const int fds[], const char *what) { - struct msghdr msg = { 0 }; - struct cmsghdr *cmsg; - size_t spaceneeded = nfds * sizeof(fds[0]); - char control[CMSG_SPACE(spaceneeded)]; - struct iovec iov; - int r; +/* return conventions: functions here return errno values */ - iov.iov_base = (void*)data; - iov.iov_len = datalen; +static int fishdescriptor_sendmsg_fds(int carrier, + int nfds, const int fds[]) { + struct msghdr msg = { 0 }; + struct cmsghdr *cmsg; + size_t spaceneeded = nfds * sizeof(fds[0]); + char control[CMSG_SPACE(spaceneeded)]; + struct iovec iov; + int r; - /* compose the message */ - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = control; - msg.msg_controllen = sizeof(control); + iov.iov_base = &nfds; + iov.iov_len = sizeof(nfds); - /* attach open fd */ - cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN(spaceneeded); - memcpy(CMSG_DATA(cmsg), fds, spaceneeded); + /* compose the message */ + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = control; + msg.msg_controllen = sizeof(control); - msg.msg_controllen = cmsg->cmsg_len; - - r = sendmsg(carrier, &msg, 0); - if (r < 0) { - LOGE(ERROR, "failed to send fd-carrying message (%s)", what); - return ERROR_FAIL; - } + /* attach open fd */ + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + cmsg->cmsg_len = CMSG_LEN(spaceneeded); + memcpy(CMSG_DATA(cmsg), fds, spaceneeded); + msg.msg_controllen = cmsg->cmsg_len; + + r = sendmsg(carrier, &msg, 0); + if (r < 0) return 0; }