sysconf.c.patch   [plain text]


--- sysconf.c.orig	2007-04-03 12:19:23.000000000 -0700
+++ sysconf.c	2007-04-05 11:33:36.000000000 -0700
@@ -45,6 +45,8 @@
 #include <sys/sysctl.h>
 #include <sys/resource.h>
 #include <sys/socket.h>
+#include <sys/aio.h>
+#include <sys/semaphore.h>
 
 #include <errno.h>
 #include <limits.h>
@@ -75,8 +77,9 @@
 	int name;
 {
 	struct rlimit rl;
+	quad_t qdvalue;	/* for kern.sysv.shmmin */
 	size_t len;
-	int mib[2], sverrno, value;
+	int mib[3], sverrno, value;
 	long defaultresult;
 	const char *path;
 
@@ -254,76 +257,91 @@
 		return (_POSIX_TIMERS);
 #endif
 	case _SC_AIO_LISTIO_MAX:
-		mib[0] = CTL_P1003_1B;
-		mib[1] = CTL_P1003_1B_AIO_LISTIO_MAX;
-		break;
 	case _SC_AIO_MAX:
-		mib[0] = CTL_P1003_1B;
-		mib[1] = CTL_P1003_1B_AIO_MAX;
+		mib[0] = CTL_KERN;;
+		mib[1] = KERN_AIOMAX;
 		break;
+
 	case _SC_AIO_PRIO_DELTA_MAX:
+#if defined(CTL_P1003_1B) && defined(CTL_P1003_1B_AIO_PRIO_DELTA_MAX)
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_AIO_PRIO_DELTA_MAX;
 		break;
+#else
+		return (-1);
+#endif
 	case _SC_DELAYTIMER_MAX:
+#if defined(CTL_P1003_1B) && defined(CTL_P1003_1B_DELAYTIMER_MAX)
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_DELAYTIMER_MAX;
 		goto yesno;
+#else
+		return (-1);
+#endif
 	case _SC_MQ_OPEN_MAX:
+#if defined(CTL_P1003_1B) && defined(CTL_P1003_1B_MQ_OPEN_MAX)
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_MQ_OPEN_MAX;
 		goto yesno;
+#else
+		return (-1);
+#endif
 	case _SC_PAGESIZE:
 		defaultresult = getpagesize();
+#if defined(CTL_P1003_1B) && defined(CTL_P1003_1B_PAGESIZE)
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_PAGESIZE;
 		goto yesno;
+#else
+		return defaultresult;
+#endif
 	case _SC_RTSIG_MAX:
+#if defined(CTL_P1003_1B) && defined(CTL_P1003_1B_RTSIG_MAX)
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_RTSIG_MAX;
 		goto yesno;
+#else
+		return (-1);
+#endif
 	case _SC_SEM_NSEMS_MAX:
-		mib[0] = CTL_P1003_1B;
-		mib[1] = CTL_P1003_1B_SEM_NSEMS_MAX;
-		goto yesno;
+		return (sysctlbyname("kern.sysv.semmns", &value, &len, NULL, 0) == -1 ? -1 : value);
+
 	case _SC_SEM_VALUE_MAX:
+#if SEM_VALUE_MAX == 0
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_SEM_VALUE_MAX;
 		goto yesno;
+#else
+		return (SEM_VALUE_MAX);
+#endif
 	case _SC_SIGQUEUE_MAX:
+#if defined(CTL_P1003_1B) && defined(CTL_P1003_1B_SIGQUEUE_MAX)
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_SIGQUEUE_MAX;
 		goto yesno;
+#else
+		return (-1);
+#endif
 	case _SC_TIMER_MAX:
+#if defined(CTL_P1003_1B) && defined(CTL_P1003_1B_TIMER_MAX)
 		mib[0] = CTL_P1003_1B;
 		mib[1] = CTL_P1003_1B_TIMER_MAX;
+#else
+		return (-1);
+#endif
 
 yesno:		if (sysctl(mib, 2, &value, &len, NULL, 0) == -1)
 			return (-1);
 		if (value == 0)
 			return (defaultresult);
 		return (value);
-
 	case _SC_2_PBS:
 	case _SC_2_PBS_ACCOUNTING:
 	case _SC_2_PBS_CHECKPOINT:
 	case _SC_2_PBS_LOCATE:
 	case _SC_2_PBS_MESSAGE:
 	case _SC_2_PBS_TRACK:
-#if _POSIX2_PBS == 0
-#error "don't know how to determine _SC_2_PBS"
-		/*
-		 * This probably requires digging through the filesystem
-		 * to see if the appropriate package has been installed.
-		 * Since we don't currently support this option at all,
-		 * it's not worth the effort to write the code now.
-		 * Figuring out which of the sub-options are supported
-		 * would be even more difficult, so it's probably easier
-		 * to always say ``no''.
-		 */
-#else
-		return (_POSIX2_PBS);
-#endif
+		return -1;
 	case _SC_ADVISORY_INFO:
 #if _POSIX_ADVISORY_INFO == 0
 #error "_POSIX_ADVISORY_INFO"
@@ -348,18 +366,12 @@
 #else
 		return (_POSIX_CPUTIME);
 #endif
-#ifdef notdef
 	case _SC_FILE_LOCKING:
-		/*
-		 * XXX - The standard doesn't tell us how to define
-		 * _POSIX_FILE_LOCKING, so we can't answer this one.
-		 */
-#endif
-#if _POSIX_THREAD_SAFE_FUNCTIONS > -1
 	case _SC_GETGR_R_SIZE_MAX:
+/*		return sizeof(group) + group_name_max + group_passwd_max + max_group_member*(MAXLOGNAME+1); */
+		return 4096;	/* INT_MAX is too big for Perl */
 	case _SC_GETPW_R_SIZE_MAX:
-#error "somebody needs to implement this"
-#endif
+		return 4096;
 	case _SC_HOST_NAME_MAX:
 		return (MAXHOSTNAMELEN - 1); /* does not include \0 */
 	case _SC_LOGIN_NAME_MAX:
@@ -370,10 +382,8 @@
 #else
 		return (_POSIX_MONOTONIC_CLOCK);
 #endif
-#if _POSIX_MESSAGE_PASSING > -1
 	case _SC_MQ_PRIO_MAX:
-		return (MQ_PRIO_MAX);
-#endif
+		return (-1);
 	case _SC_READER_WRITER_LOCKS:
 		return (_POSIX_READER_WRITER_LOCKS);
 	case _SC_REGEXP:
@@ -410,10 +420,16 @@
 		return (_POSIX_THREAD_PROCESS_SHARED);
 	case _SC_THREAD_SAFE_FUNCTIONS:
 		return (_POSIX_THREAD_SAFE_FUNCTIONS);
+	case _SC_THREAD_SPORADIC_SERVER:
+		return (_POSIX_THREAD_SPORADIC_SERVER);
 	case _SC_THREAD_STACK_MIN:
 		return (PTHREAD_STACK_MIN);
 	case _SC_THREAD_THREADS_MAX:
+#ifdef PTHREAD_THREADS_MAX
 		return (PTHREAD_THREADS_MAX); /* XXX wrong type! */
+#else
+		return (-1);
+#endif
 	case _SC_TIMEOUTS:
 		return (_POSIX_TIMEOUTS);
 	case _SC_THREADS:
@@ -425,16 +441,14 @@
 #else
 		return (_POSIX_TRACE);
 #endif
-#if _POSIX_TRACE > -1
 	case _SC_TRACE_EVENT_FILTER:
 		return (_POSIX_TRACE_EVENT_FILTER);
 	case _SC_TRACE_INHERIT:
 		return (_POSIX_TRACE_INHERIT);
 	case _SC_TRACE_LOG:
 		return (_POSIX_TRACE_LOG);
-#endif
 	case _SC_TTY_NAME_MAX:
-		path = _PATH_DEV;
+		path = "/"; // should be _PATH_DEV (PR-3624562)
 		goto do_NAME_MAX;
 	case _SC_TYPED_MEMORY_OBJECTS:
 #if _POSIX_TYPED_MEMORY_OBJECTS == 0
@@ -491,11 +505,15 @@
 		return (_V6_LPBIG_OFFBIG);
 #endif
 	case _SC_ATEXIT_MAX:
-		return (ATEXIT_SIZE);
+		return (INT_MAX);	/* unlimited */
 	case _SC_IOV_MAX:
+#ifdef KERN_IOV_MAX
 		mib[0] = CTL_KERN;
 		mib[1] = KERN_IOV_MAX;
 		break;
+#else
+		return (IOV_MAX);
+#endif
 	case _SC_XOPEN_CRYPT:
 		return (_XOPEN_CRYPT);
 	case _SC_XOPEN_ENH_I18N:
@@ -531,7 +549,8 @@
 #endif
 	case _SC_XOPEN_SHM:
 		sverrno = errno;
-		if (sysctlbyname("kern.ipc.shmmin", &value, &len, NULL, 
+		len = sizeof(qdvalue);
+		if (sysctlbyname("kern.sysv.shmmin", &qdvalue, &len, NULL, 
 		    0) == -1) {
 			errno = sverrno;
 			return (-1);
@@ -568,11 +587,37 @@
 		return (_POSIX_IPV6);
 #endif
 
+#ifdef _SC_NPROCESSORS_CONF
 	case _SC_NPROCESSORS_CONF:
+#endif
+#ifdef _SC_NPROCESSORS_ONLN
 	case _SC_NPROCESSORS_ONLN:
+#endif
+#if defined(_SC_NPROCESSORS_CONF) || defined(_SC_NPROCESSORS_ONLN)
 		mib[0] = CTL_HW;
 		mib[1] = HW_NCPU;
 		break;
+#endif
+	case _SC_XBS5_ILP32_OFF32:
+		return (_XBS5_ILP32_OFF32);
+	case _SC_XBS5_ILP32_OFFBIG:
+		return (_XBS5_ILP32_OFFBIG);
+	case _SC_XBS5_LP64_OFF64:
+		return (_XBS5_LP64_OFF64);
+	case _SC_XBS5_LPBIG_OFFBIG:
+		return (_XBS5_LPBIG_OFFBIG);
+	case _SC_SS_REPL_MAX:
+		return (_POSIX_SS_REPL_MAX);
+	case _SC_TRACE_EVENT_NAME_MAX:
+		return (_POSIX_TRACE_EVENT_NAME_MAX);
+	case _SC_TRACE_NAME_MAX:
+		return (_POSIX_TRACE_NAME_MAX);
+	case _SC_TRACE_SYS_MAX:
+		return (_POSIX_TRACE_SYS_MAX);
+	case _SC_TRACE_USER_EVENT_MAX:
+		return (_POSIX_TRACE_USER_EVENT_MAX);
+	case _SC_PASS_MAX:
+		return (PASS_MAX);
 
 	default:
 		errno = EINVAL;