[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