Subject: pkg/34763: rxvt-unicode: Fix compilation for systems without SCM_RIGHTS
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: Christian Biere <christianbiere@gmx.de>
List: pkgsrc-bugs
Date: 10/09/2006 01:10:01
>Number:         34763
>Category:       pkg
>Synopsis:       rxvt-unicode: Fix compilation for systems without SCM_RIGHTS
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    pkg-manager
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Mon Oct 09 01:10:01 +0000 2006
>Originator:     Christian Biere
>Release:        NetBSD 4.99.3
>Description:
The following patch fixes rxvt-unicode so that it compiles on systems
which don't support file descriptor passing with SCM_RIGHTS and
msg_controllen but use msg_msgaccrights instead. I offered this patch
to the author of rxvt-unicode but he rejected it suggesting to set
_XOPEN_SOURCE appropriately. Indeed, that would make msg_controllen and
SCM_RIGHTS available at least on IRIX. However, it would break compilation
on Solaris for example. Setting _XOPEN_SOURCE has usually tons of
side-effects and is inherently non-portable as you never no which system
breaks when you fiddle with it and there's no guarantee that you can make
SCM_RIGHTS etc. available on any given system anyway.

In contrast, using msg_accrights just works and my patch definitely breaks
nothing.

>How-To-Repeat:
Try to compile rxvt-unicode on IRIX 6.5.
>Fix:

$NetBSD$

--- configure	2006-02-08 23:48:51.000000000 +0100
+++ configure	2006-10-09 01:15:28.000000000 +0200
@@ -11787,7 +11787,6 @@
 {
   msghdr msg;
   iovec iov;
-  char buf [100];
   char data = 0;
 
   iov.iov_base = &data;
@@ -11795,6 +11794,9 @@
 
   msg.msg_iov        = &iov;
   msg.msg_iovlen     = 1;
+
+#ifdef SCM_RIGHTS
+  char buf [100];
   msg.msg_control    = buf;
   msg.msg_controllen = sizeof buf;
 
@@ -11804,6 +11806,10 @@
   cmsg->cmsg_len   = 100;
 
   *(int *)CMSG_DATA (cmsg) = 5;
+#else	/* !SCM_RIGHTS */
+  msg.msg_accrights    = (void *)&fd;
+  msg.msg_accrightslen = sizeof fd;
+#endif	/* SCM_RIGHTS */
 
   return sendmsg (3, &msg, 0);
 }
--- ptytty.m4	2006-02-07 06:31:56.000000000 +0100
+++ ptytty.m4	2006-10-09 01:15:20.000000000 +0200
@@ -465,7 +465,6 @@
 {
   msghdr msg;
   iovec iov;
-  char buf [100];
   char data = 0;
 
   iov.iov_base = &data;
@@ -473,6 +472,9 @@
 
   msg.msg_iov        = &iov;
   msg.msg_iovlen     = 1;
+
+#ifdef SCM_RIGHTS
+  char buf [100];
   msg.msg_control    = buf;
   msg.msg_controllen = sizeof buf;
 
@@ -482,6 +484,10 @@
   cmsg->cmsg_len   = 100;
 
   *(int *)CMSG_DATA (cmsg) = 5;
+#else	/* !SCM_RIGHTS */
+  msg.msg_accrights    = (void *)&fd;
+  msg.msg_accrightslen = sizeof fd;
+#endif	/* SCM_RIGHTS */
 
   return sendmsg (3, &msg, 0);
 }
--- src/fdpass.C	2006-06-06 01:01:00.000000000 +0200
+++ src/fdpass.C	2006-10-09 02:12:33.000000000 +0200
@@ -33,7 +33,8 @@
 
 #include "libptytty.h"
 
-#ifndef CMSG_LEN // CMSG_SPACe && CMSG_LEN are rfc2292 extensions to unix
+#if defined(SCM_RIGHTS) && !defined(CMSG_LEN)
+// CMSG_SPACe && CMSG_LEN are rfc2292 extensions to unix
 # define CMSG_LEN(len) (sizeof (cmsghdr) + len)
 #endif
 
@@ -42,7 +43,6 @@
 {
   msghdr msg;
   iovec iov;
-  char buf [CMSG_LEN (sizeof (int))];
   char data = 0;
 
   iov.iov_base = &data;
@@ -52,6 +52,9 @@
   msg.msg_namelen    = 0;
   msg.msg_iov        = &iov;
   msg.msg_iovlen     = 1;
+
+#ifdef SCM_RIGHTS
+  char buf [CMSG_LEN (sizeof (int))];
   msg.msg_control    = (void *)buf;
   msg.msg_controllen = sizeof buf;
 
@@ -63,6 +66,10 @@
   *(int *)CMSG_DATA (cmsg) = fd;
 
   msg.msg_controllen = cmsg->cmsg_len;
+#else  /* SCM_RIGHTS */
+  msg.msg_accrights  = (void *)&fd;
+  msg.msg_accrightslen = sizeof fd;
+#endif /* !SCM_RIGHTS */
 
   return sendmsg (socket, &msg, 0) >= 0;
 }
@@ -72,8 +79,8 @@
 {
   msghdr msg;
   iovec iov;
-  char buf [CMSG_LEN (sizeof (int))];  /* ancillary data buffer */
   char data = 1;
+  int fd;
 
   iov.iov_base = &data;
   iov.iov_len  = 1;
@@ -82,6 +89,9 @@
   msg.msg_namelen    = 0;
   msg.msg_iov        = &iov;
   msg.msg_iovlen     = 1;
+
+#ifdef SCM_RIGHTS
+  char buf [CMSG_LEN (sizeof (int))];  /* ancillary data buffer */
   msg.msg_control    = buf;
   msg.msg_controllen = sizeof buf;
 
@@ -91,15 +101,26 @@
   cmsg->cmsg_len   = CMSG_LEN (sizeof (int));
 
   msg.msg_controllen = cmsg->cmsg_len;
+#else /* !SCM_RIGHTS */
+  msg.msg_accrights  = (void *)&fd;
+  msg.msg_accrightslen = sizeof fd;
+#endif /* SCM_RIGHTS */
+
+  if (recvmsg (socket, &msg, 0) <= 0 || data != 0)
+     return -1;
 
-  if (recvmsg (socket, &msg, 0) <= 0
-      || data               != 0
-      || msg.msg_controllen < CMSG_LEN (sizeof (int))
+#ifdef SCM_RIGHTS
+  if (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;
 
-  return *(int *)CMSG_DATA (cmsg);
-}
+  fd = *(int *)CMSG_DATA (cmsg);
+#else /* SCM_RIGHTS */
+  if (!msg.msg_accrights || msg.msg_accrightslen != sizeof fd)
+    return -1;
+#endif /* !SCM_RIGHTS */
 
+  return fd;
+}