[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r1080 - trunk/glibc-2.3-head/sysdeps/kfreebsd



Author: rmh
Date: 2006-01-20 10:16:42 +0000 (Fri, 20 Jan 2006)
New Revision: 1080

Modified:
   trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c
Log:
Misc cleanup and optimisations in uname:
- Less agressive use of stack.
- Use strcpy instead of strncpy when copying sysname (bounds check is done at build time).
- Remove fallback values.  If the kernel doesn't know, we don't either.
(Still using sysctls. uname syscall sets broken version and machine components)

Modified: trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c
===================================================================
--- trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c	2006-01-19 22:09:38 UTC (rev 1079)
+++ trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c	2006-01-20 10:16:42 UTC (rev 1080)
@@ -1,6 +1,6 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Bruno Haible <bruno@clisp.org>, 2002.
+   Contributed by Bruno Haible <bruno@clisp.org>.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -22,105 +22,80 @@
 #include <errno.h>
 #include <string.h>
 
-/* Dummy values used as a fallback.  */
-#define UNAME_SYSNAME	"GNU/kFreeBSD"
-#define UNAME_RELEASE	"4.0"
-#define UNAME_VERSION	"GENERIC"
-#define UNAME_MACHINE	"mmix"
+#define SYSNAME                "GNU/kFreeBSD"
+#define SYSNAME_LEN    13
 
+/* Check for bounds in pre-processor */
+#if SYSNAME_LEN > _UTSNAME_SYSNAME_LENGTH
+#error
+#endif
+
 /* Put information about the system in NAME.  */
 int
 __uname (struct utsname *name)
 {
-  /* Fill nodename: "uname -n".  Fetch sysctl "kern.hostname".  */
-  {
-    int request[2] = { CTL_KERN, KERN_HOSTNAME };
-    size_t len = sizeof (name->nodename);
-    if (__sysctl (request, 2, name->nodename, &len, NULL, 0) >= 0)
-      {
-	if (len < sizeof (name->nodename))
-	  name->nodename[len] = '\0';
-      }
-    else
-      {
-	if (errno != ENOMEM)
-	  strncpy (name->nodename, "localhost", sizeof (name->nodename));
-      }
-  }
+  int request[2] = { CTL_KERN };
+  size_t len;
 
-  /* Fill sysname: "uname -s".  Fetch sysctl "kern.ostype".  */
-  {
-    strncpy (name->sysname, UNAME_SYSNAME, sizeof (name->sysname));
-  }
+  /* Fill sysname: "uname -s". */
+  strcpy (name->sysname, SYSNAME);
 
+  /* Fill nodename: "uname -n".  Fetch sysctl "kern.hostname".  */
+  request[1] = KERN_HOSTNAME;
+  len = sizeof (name->nodename);
+  if (__sysctl (request, 2, name->nodename, &len, NULL, 0) >= 0)
+    {
+      if (len < sizeof (name->nodename))
+	name->nodename[len] = '\0';
+    }
+
   /* Fill release: "uname -r".  Fetch sysctl "kern.osrelease".  */
-  {
-    int request[2] = { CTL_KERN, KERN_OSRELEASE };
-    size_t len = sizeof (name->release);
-    if (__sysctl (request, 2, name->release, &len, NULL, 0) >= 0)
-      {
-	if (len < sizeof (name->release))
-	  name->release[len] = '\0';
-      }
-    else
-      {
-	if (errno != ENOMEM)
-	  strncpy (name->release, UNAME_RELEASE, sizeof (name->release));
-      }
-  }
+  request[1] = KERN_OSRELEASE;
+  len = sizeof (name->release);
+  if (__sysctl (request, 2, name->release, &len, NULL, 0) >= 0)
+    {
+      if (len < sizeof (name->release))
+        name->release[len] = '\0';
+    }
 
   /* Fill version: "uname -v".  Fetch sysctl "kern.version".  */
-  {
-    int request[2] = { CTL_KERN, KERN_VERSION };
-    size_t len = sizeof (name->version);
-    if (__sysctl (request, 2, name->version, &len, NULL, 0) >= 0)
-      {
-	if (len < sizeof (name->version))
-	  name->version[len] = '\0';
-      }
-    else
-      {
-	if (errno != ENOMEM)
-	  strncpy (name->version, UNAME_VERSION, sizeof (name->version));
-      }
-
-    /* Remove trailing whitespace.  Turn non-trailing whitespace to
-       spaces.  */
+  request[1] = KERN_VERSION;
+  len = sizeof (name->version);
+  if (__sysctl (request, 2, name->version, &len, NULL, 0) >= 0)
     {
-      char *p0 = name->version;
-      char *p = p0 + __strnlen (p0, sizeof (name->version));
-
-      while (p > p0 && (p[-1] == '\t' || p[-1] == '\n' || p[-1] == ' '))
-	*--p = '\0';
-
-      while (p > p0)
-	{
-	  --p;
-	  if (*p == '\t' || *p == '\n')
-	    *p = ' ';
-	}
+      if (len < sizeof (name->version))
+        name->version[len] = '\0';
     }
-  }
 
-  /* Fill machine: "uname -m".  Fetch sysctl "hw.machine".  */
+  /* Remove trailing whitespace.  Turn non-trailing whitespace to
+     spaces.  */
   {
-    int request[2] = { CTL_HW, HW_MACHINE };
-    size_t len = sizeof (name->machine);
-    if (__sysctl (request, 2, name->machine, &len, NULL, 0) >= 0)
+    char *p0 = name->version;
+    char *p = p0 + __strnlen (p0, sizeof (name->version));
+
+    while (p > p0 && (p[-1] == '\t' || p[-1] == '\n' || p[-1] == ' '))
+      *--p = '\0';
+
+    while (p > p0)
       {
-	if (len < sizeof (name->machine))
-	  name->machine[len] = '\0';
+        --p;
+        if (*p == '\t' || *p == '\n')
+          *p = ' ';
       }
-    else
-      {
-	if (errno != ENOMEM)
-	  strncpy (name->machine, UNAME_MACHINE, sizeof (name->machine));
-      }
   }
 
+  /* Fill machine: "uname -m".  Fetch sysctl "hw.machine".  */
+  request[0] = CTL_HW;
+  request[1] = HW_MACHINE;
+  len = sizeof (name->machine);
+  if (__sysctl (request, 2, name->machine, &len, NULL, 0) >= 0)
+    {
+      if (len < sizeof (name->machine))
+        name->machine[len] = '\0';
+    }
+
   return 0;
 }
 libc_hidden_def (__uname)
-
 weak_alias (__uname, uname)
 libc_hidden_def (uname)



Reply to: