--- rxvt-unicode/src/fdpass.C 2006/01/13 07:03:48 1.3 +++ rxvt-unicode/src/fdpass.C 2010/07/21 08:46:13 1.15 @@ -1,4 +1,7 @@ -/*--------------------------------*-C-*---------------------------------* +// This file is part of libptytty. Do not make local modifications. +// http://software.schmorp.de/pkg/libptytty + +/*----------------------------------------------------------------------* * File: fdpass.C *----------------------------------------------------------------------* * @@ -20,28 +23,37 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *----------------------------------------------------------------------*/ -#include "../config.h" -#include "rxvt.h" +#include "config.h" -#if ENABLE_FRILLS && HAVE_UNIX_FDPASS +#include // needed by broken bsds for NULL used in sys/uio.h +#include #include +#include #include -#include "fdpass.h" +#include "libptytty.h" -#include //d +// CMSG_SPACE & CMSG_LEN are rfc2292 extensions to unix +#ifndef CMSG_SPACE +# define CMSG_SPACE(len) (sizeof (cmsghdr) + len) +#endif -#ifndef CMSG_LEN // CMSG_SPACe && CMSG_LEN are rfc2292 extensions to unix +#ifndef CMSG_LEN # define CMSG_LEN(len) (sizeof (cmsghdr) + len) #endif -int -rxvt_send_fd (int socket, int fd) +bool +ptytty::send_fd (int socket, int fd) { + void *buf = malloc (CMSG_SPACE (sizeof (int))); + + if (!buf) + return 0; + msghdr msg; iovec iov; - char buf [CMSG_LEN (sizeof (int))]; + cmsghdr *cmsg; char data = 0; iov.iov_base = &data; @@ -51,27 +63,33 @@ msg.msg_namelen = 0; msg.msg_iov = &iov; msg.msg_iovlen = 1; - msg.msg_control = (void *)buf; - msg.msg_controllen = sizeof buf; + msg.msg_control = buf; + msg.msg_controllen = CMSG_SPACE (sizeof (int)); - cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); + cmsg = CMSG_FIRSTHDR (&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN (sizeof (int)); *(int *)CMSG_DATA (cmsg) = fd; - msg.msg_controllen = cmsg->cmsg_len; + ssize_t result = sendmsg (socket, &msg, 0); + + free (buf); - return sendmsg (socket, &msg, 0); + return result >= 0; } int -rxvt_recv_fd (int socket) +ptytty::recv_fd (int socket) { + void *buf = malloc (CMSG_SPACE (sizeof (int))); + + if (!buf) + return -1; + msghdr msg; iovec iov; - char buf [CMSG_LEN (sizeof (int))]; /* ancillary data buffer */ char data = 1; iov.iov_base = &data; @@ -82,25 +100,24 @@ msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = buf; - msg.msg_controllen = sizeof buf; + msg.msg_controllen = CMSG_SPACE (sizeof (int)); - cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN (sizeof (int)); + int fd = -1; - msg.msg_controllen = cmsg->cmsg_len; + if (recvmsg (socket, &msg, 0) > 0 + && data == 0 + && msg.msg_controllen >= CMSG_SPACE (sizeof (int))) + { + cmsghdr *cmsg = CMSG_FIRSTHDR (&msg); - if (recvmsg (socket, &msg, 0) <= 0 - || data != 0 - || msg.msg_controllen < CMSG_LEN (sizeof (int)) - || cmsg->cmsg_level != SOL_SOCKET - || cmsg->cmsg_type != SCM_RIGHTS - || cmsg->cmsg_len < CMSG_LEN (sizeof (int))) - return -1; + if (cmsg->cmsg_level == SOL_SOCKET + && cmsg->cmsg_type == SCM_RIGHTS + && cmsg->cmsg_len >= CMSG_LEN (sizeof (int))) + fd = *(int *)CMSG_DATA (cmsg); + } - return *(int *)CMSG_DATA (cmsg); -} + free (buf); -#endif + return fd; +}