This libc patch makes __kernel_osreldate() available to the rest of libc, and replaces some of the KERN_OSRELDATE sysctl checks with calls to this function. This saves some code size and a few syscalls in runtime.
Afterwards AT_OSRELDATE could be used to initialize __osreldate on 9.x kernels, saving the initial sysctl query as well. -- Robert Millan
Index: clone.c =================================================================== --- clone.c (revision 3595) +++ clone.c (working copy) @@ -29,24 +29,24 @@ #include <sys/sysctl.h> -static inline int +int __osreldate; + +int __kernel_osreldate(void) { - static int osreldate; - int mib[2]; size_t size; char *temp; - if (osreldate == 0) + if (__osreldate == 0) { mib[0] = CTL_KERN; mib[1] = KERN_OSRELDATE; - size = sizeof osreldate; - if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1) + size = sizeof __osreldate; + if (__sysctl(mib, 2, &__osreldate, &size, NULL, 0) == -1) return (-1); } - return (osreldate); + return (__osreldate); } /* __start_thread (flags, child_stack, fn, arg) Index: dl-sysdep.c =================================================================== --- dl-sysdep.c (revision 3598) +++ dl-sysdep.c (working copy) @@ -254,13 +254,9 @@ attribute_hidden _dl_discover_osversion (void) { - int request[2] = { CTL_KERN, KERN_OSRELDATE }; - size_t len; int version; - len = sizeof(version); - if (__sysctl (request, 2, &version, &len, NULL, 0) < 0) - return -1; + version = __kernel_osreldate (); /* * scheme is: <major><two digit minor>Rxx Index: getosreldate.c =================================================================== --- getosreldate.c (revision 3595) +++ getosreldate.c (working copy) @@ -47,11 +47,7 @@ return (osreldate); } - mib[0] = CTL_KERN; - mib[1] = KERN_OSRELDATE; - size = sizeof osreldate; - if (__sysctl(mib, 2, &osreldate, &size, NULL, 0) == -1) - return (-1); + osreldate = __osreldate; } return (osreldate); } Index: testrtsig.h =================================================================== --- testrtsig.h (revision 3595) +++ testrtsig.h (working copy) @@ -29,16 +29,8 @@ #if __ASSUME_REALTIME_SIGNALS return 1; #else - - int request[2] = { CTL_KERN, KERN_OSRELDATE}; - size_t len; - int val; - - len = sizeof (val); - if (__sysctl (request, 2, &val, &len, NULL, 0) < 0) + if (__kernel_osreldate () < 700050) /* FreeBSD 7.0 is 700055 */ return 0; - if ( val < 700050) /* FreeBSD 7.0 is 700055 */ - return 0; return 1; #endif }