[Glibc-bsd-commits] r2531 - trunk/glibc-ports/kfreebsd

Aurelien Jarno aurel32 at alioth.debian.org
Sun May 24 14:54:29 UTC 2009


Author: aurel32
Date: 2009-05-24 14:54:29 +0000 (Sun, 24 May 2009)
New Revision: 2531

Modified:
   trunk/glibc-ports/kfreebsd/dl-sysdep.c
Log:
Simplify kernel version detection


Modified: trunk/glibc-ports/kfreebsd/dl-sysdep.c
===================================================================
--- trunk/glibc-ports/kfreebsd/dl-sysdep.c	2009-05-24 13:58:31 UTC (rev 2530)
+++ trunk/glibc-ports/kfreebsd/dl-sysdep.c	2009-05-24 14:54:29 UTC (rev 2531)
@@ -23,7 +23,7 @@
 #include <string.h>
 #include <fcntl.h>
 #include <unistd.h>
-#include <sys/utsname.h>
+#include <sys/sysctl.h>
 #include <ldsodefs.h>
 #include <kernel-features.h>
 
@@ -35,44 +35,16 @@
 attribute_hidden
 _dl_discover_osversion (void)
 {
-  char bufmem[64];
-  char *buf = bufmem;
-  unsigned int version;
-  int parts;
-  char *cp;
-  struct utsname uts;
+  int request[2] = { CTL_KERN, KERN_OSRELDATE };
+  size_t len;
+  int version;
 
-  /* Try the uname syscall */
-  if (__uname (&uts))
+  len = sizeof(version);
+  if (__sysctl (request, 2, &version, &len, NULL, 0) < 0)
     return -1;
 
-  /* Now convert it into a number.  The string consists of at most
-     three parts.  */
-  version = 0;
-  parts = 0;
-  buf = uts.release;
-  cp = buf;
-  while ((*cp >= '0') && (*cp <= '9'))
-    {
-      unsigned int here = *cp++ - '0';
-
-      while ((*cp >= '0') && (*cp <= '9'))
-	{
-	  here *= 10;
-	  here += *cp++ - '0';
-	}
-
-      ++parts;
-      version <<= 8;
-      version |= here;
-
-      if (*cp++ != '.' || parts == 3)
-	/* Another part following?  */
-	break;
-    }
-
-  if (parts < 3)
-    version <<= 8 * (3 - parts);
-
-  return version;
+  /* Convert to the GLIBC versioning system */
+  return ((version / 100000) << 16)
+	 | (((version % 100000) / 1000) << 8)
+	 | ((version % 1000) / 10);
 }




More information about the Glibc-bsd-commits mailing list