Subject: | PPerl patch to work on amd64 platform |
Attached patch updates the send_fd and recv_fd functions to work with
64-bit systems. Patch tested on FreeBSD 5.4 i386, FreeBSD 6.1 i386 and
amd64. All self-tests pass with this patch.
Code is based on that in postfix 2.3.3 so should be extremely portable.
Subject: | pperl.64bit.patch |
diff -Nru PPerl-0.25/Makefile.PL PPerl-0.25.new/Makefile.PL
--- PPerl-0.25/Makefile.PL Thu Jul 11 11:11:50 2002
+++ PPerl-0.25.new/Makefile.PL Thu Sep 14 11:48:23 2006
@@ -69,7 +69,7 @@
main.o: Makefile main.c pperl.h
pperl: main.o pass_fd.o
-\t\$(CC) \$(CFLAGS) \$(LDFLAGS) \$(DEFINE) -o pperl main.o pass_fd.o $Config{libs}
+\t\$(CC) \$(CCFLAGS) \$(OPTIMIZE) \$(LDFLAGS) \$(DEFINE) -o pperl main.o pass_fd.o $Config{libs}
pass_fd.c: pass_fd.h
diff -Nru PPerl-0.25/main.c PPerl-0.25.new/main.c
--- PPerl-0.25/main.c Tue Mar 2 12:06:15 2004
+++ PPerl-0.25.new/main.c Thu Sep 14 11:42:42 2006
@@ -105,11 +105,11 @@
newval = atoi(pArg);
if (newval > 0) prefork = newval;
}
- else if (!strncmp(pArg, "--logfile", 7) ) {
+ else if (!strncmp(pArg, "--logfile", 9) ) {
int newval;
char *filename;
- if (pArg[7] == '=') /* --logfile=.... */
- pArg += 13;
+ if (pArg[9] == '=') /* --logfile=.... */
+ pArg += 10;
else
pArg = argv[++i];
diff -Nru PPerl-0.25/pass_fd.c PPerl-0.25.new/pass_fd.c
--- PPerl-0.25/pass_fd.c Thu Aug 22 04:37:09 2002
+++ PPerl-0.25.new/pass_fd.c Thu Sep 14 11:36:05 2006
@@ -93,73 +93,74 @@
#else
-struct cmessage {
- struct cmsghdr cmsg;
- int fd;
-};
+/* based on code from Postfix 2.3.3 (vk) */
+
+union {
+ struct cmsghdr just_for_alignment;
+ char control[CMSG_SPACE(sizeof(int))];
+} control_un;
int
-send_fd(int over, int this)
+send_fd(int over, int sendfd)
{
- struct iovec iov[1];
- struct msghdr msg;
- struct cmessage cm;
- char sendbuf[] = "";
-
- iov[0].iov_base = (char *)&sendbuf;
- iov[0].iov_len = sizeof(sendbuf);
-
- cm.cmsg.cmsg_type = SCM_RIGHTS;
- cm.cmsg.cmsg_level = SOL_SOCKET;
- cm.cmsg.cmsg_len = sizeof(struct cmessage);
- cm.fd = this;
-
- msg.msg_iov = iov;
- msg.msg_iovlen = 1;
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_control = (caddr_t)&cm;
- msg.msg_controllen = sizeof(struct cmessage);
- msg.msg_flags = 0;
-
- if (sendmsg(over, &msg, 0) < 0)
- return -1;
- return 0;
+ struct iovec iov[1];
+ struct msghdr msg;
+ struct cmsghdr *cmptr;
+
+ memset((char *) &msg, 0, sizeof(msg));
+
+ msg.msg_control = control_un.control;
+ msg.msg_controllen = CMSG_LEN(sizeof(sendfd));
+
+ cmptr = CMSG_FIRSTHDR(&msg);
+ cmptr->cmsg_len = CMSG_LEN(sizeof(sendfd));
+ cmptr->cmsg_level = SOL_SOCKET;
+ cmptr->cmsg_type = SCM_RIGHTS;
+ *(int *) CMSG_DATA(cmptr) = sendfd;
+
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+
+ iov[0].iov_base = "";
+ iov[0].iov_len = 1;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+
+ if (sendmsg(over, &msg, 0) < 0)
+ return -1;
+ return 0;
}
int
recv_fd(int over)
{
- struct iovec iov[1];
struct msghdr msg;
- struct cmessage cm;
- ssize_t got;
- char recbuf;
-
- /* in examples this was >1 but this causes too much to be read,
- * causing sync issues */
+ struct iovec iov[1];
+ char buf[1];
+ struct cmsghdr *cmptr;
- iov[0].iov_base = &recbuf;
- iov[0].iov_len = 1;
+ memset((char *) &msg, 0, sizeof(msg));
+ msg.msg_control = control_un.control;
+ msg.msg_controllen = CMSG_LEN(sizeof(int));
- bzero((char *)&cm, sizeof(cm));
- bzero((char *)&msg, sizeof(msg));
+ msg.msg_name = 0;
+ msg.msg_namelen = 0;
+ iov[0].iov_base = buf;
+ iov[0].iov_len = sizeof(buf);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_control = (caddr_t)&cm;
- msg.msg_controllen = sizeof(struct cmessage);
- msg.msg_flags = 0;
-
- if ((got = recvmsg(over, &msg, 0)) < 0)
- return -1;
- if (cm.cmsg.cmsg_type != SCM_RIGHTS)
- return -1;
+ if (recvmsg(over, &msg, 0) < 0)
+ return (-1);
- return cm.fd;
+ if ((cmptr = CMSG_FIRSTHDR(&msg)) != 0
+ && cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {
+ if (cmptr->cmsg_level != SOL_SOCKET || cmptr->cmsg_type != SCM_RIGHTS)
+ return(-1); /* error */
+ return (*(int *) CMSG_DATA(cmptr)); /* the file handle */
+ } else
+ return (-1);
}
#endif