[dovecot-cvs] dovecot/src/lib fdpass.c,1.7,1.8 fdpass.h,1.2,1.3

cras at procontrol.fi cras at procontrol.fi
Sat Nov 16 07:19:06 EET 2002


Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv24054

Modified Files:
	fdpass.c fdpass.h 
Log Message:
Some fixes, cleanups and possibility to send/receive data without actually
passing the fds (ie. just a sendmsg/recvmsg wrapper).



Index: fdpass.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/fdpass.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- fdpass.c	20 Oct 2002 03:26:00 -0000	1.7
+++ fdpass.c	16 Nov 2002 05:19:03 -0000	1.8
@@ -41,12 +41,11 @@
 	(CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
 #endif
 
-int fd_send(int handle, int send_fd, const void *data, size_t size)
+ssize_t fd_send(int handle, int send_fd, const void *data, size_t size)
 {
         struct msghdr msg;
         struct iovec iov;
         struct cmsghdr *cmsg;
-	int *fdptr;
 	char buf[CMSG_SPACE(sizeof(int))];
 
 	i_assert(size < SSIZE_T_MAX);
@@ -55,26 +54,32 @@
 
         iov.iov_base = (void *) data;
         iov.iov_len = size;
-        msg.msg_control = buf;
-        msg.msg_controllen = sizeof(buf);
+
+	if (send_fd != -1) {
+		msg.msg_control = buf;
+		msg.msg_controllen = sizeof(buf);
+	}
+
         msg.msg_iov = &iov;
 	msg.msg_iovlen = 1;
 
-        cmsg = CMSG_FIRSTHDR(&msg);
-        cmsg->cmsg_level = SOL_SOCKET;
-        cmsg->cmsg_type = SCM_RIGHTS;
-	cmsg->cmsg_len = CMSG_LEN(sizeof(int));
-	fdptr = (int *) CMSG_DATA(cmsg);
-	*fdptr = send_fd;
+	if (send_fd != -1) {
+		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)) = send_fd;
+	}
+
 	return sendmsg(handle, &msg, 0);
 }
 
-int fd_read(int handle, void *data, size_t size, int *fd)
+ssize_t fd_read(int handle, void *data, size_t size, int *fd)
 {
 	struct msghdr msg;
 	struct iovec iov;
 	struct cmsghdr *cmsg;
-	int ret;
+	ssize_t ret;
 	char buf[CMSG_SPACE(sizeof(int))];
 
 	i_assert(size < SSIZE_T_MAX);
@@ -92,6 +97,9 @@
 	iov.iov_len = size;
 
 	ret = recvmsg(handle, &msg, 0);
-	*fd = *(int *) CMSG_DATA(cmsg);
+	if (msg.msg_controllen != sizeof(buf))
+		*fd = -1;
+	else
+		*fd = *(int *) CMSG_DATA(cmsg);
 	return ret;
 }

Index: fdpass.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib/fdpass.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- fdpass.h	8 Sep 2002 13:20:28 -0000	1.2
+++ fdpass.h	16 Nov 2002 05:19:03 -0000	1.3
@@ -1,11 +1,12 @@
 #ifndef __FDPASS_H
 #define __FDPASS_H
 
-/* Returns number of bytes sent, -1 if error. */
-int fd_send(int handle, int send_fd, const void *data, size_t size);
+/* Returns number of bytes sent, -1 if error. send_fd can be -1 if we just
+   want to send the data with sendmsg(). */
+ssize_t fd_send(int handle, int send_fd, const void *data, size_t size);
 
-/* Returns number of bytes read, or -1 if error. fd is set only
-   if return value is larger than 0. */
-int fd_read(int handle, void *data, size_t size, int *fd);
+/* Returns number of bytes read, or -1 if error. fd is set -1 if read was only
+   partial (returns 0) or data was received without a passed fd. */
+ssize_t fd_read(int handle, void *data, size_t size, int *fd);
 
 #endif




More information about the dovecot-cvs mailing list