ports/103282: patch devel/p5-PPerl for amd64

Vivek Khera vivek at khera.org
Thu Sep 14 19:50:20 UTC 2006


>Number:         103282
>Category:       ports
>Synopsis:       patch devel/p5-PPerl for amd64
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Thu Sep 14 19:50:19 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Vivek Khera
>Release:        FreeBSD 6.1-PRERELEASE amd64
>Organization:
>Environment:
System: FreeBSD yertle.int.kciLink.com 6.1-PRERELEASE FreeBSD 6.1-PRERELEASE #4: Thu Mar 2 13:53:40 EST 2006 khera at yertle.int.kciLink.com:/usr/obj/usr/src/sys/KCI64 amd64


	
>Description:
	
devel/p5-PPerl port fails its self tests on amd64 due to the code that it uses
for passing file descriptors over a socket.  this patch fixes that issue, plus
a minor bug in argument processing and compile flag settings.

>How-To-Repeat:
	

build PPerl on amd64 and run "make test" in the WRKSRC directory.

>Fix:

	

The below patches have been sent to the upstream author for inclusion in the
next release.  I submit to ports as a stop-gap measure until that release is
issued.

Add this file in the files subdir for the port as patch-pperl-64bit


diff -Nru ./Makefile.PL ./Makefile.PL
--- ./Makefile.PL	Thu Jul 11 11:11:50 2002
+++ ./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 ./main.c ./main.c
--- ./main.c	Tue Mar  2 12:06:15 2004
+++ ./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 ./pass_fd.c ./pass_fd.c
--- ./pass_fd.c	Thu Aug 22 04:37:09 2002
+++ ./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
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list