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

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



Author: ps-guest
Date: 2006-01-19 22:09:38 +0000 (Thu, 19 Jan 2006)
New Revision: 1079

Modified:
   trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c
Log:
* old uname implementation is slower,
  but uname -m and uname -v works -> revert until fixed


Modified: trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c
===================================================================
--- trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c	2006-01-19 17:35:32 UTC (rev 1078)
+++ trunk/glibc-2.3-head/sysdeps/kfreebsd/uname.c	2006-01-19 22:09:38 UTC (rev 1079)
@@ -1,6 +1,6 @@
-/* Copyright (C) 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by Robert Millan <robertmh@gnu.org>
+   Contributed by Bruno Haible <bruno@clisp.org>, 2002.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -17,29 +17,110 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <sys/syscall.h>
 #include <sys/utsname.h>
+#include <sys/sysctl.h>
+#include <errno.h>
 #include <string.h>
-#include <unistd.h>
 
-#define SYSNAME		"GNU/kFreeBSD"
-#define SYSNAME_LEN	13
+/* Dummy values used as a fallback.  */
+#define UNAME_SYSNAME	"GNU/kFreeBSD"
+#define UNAME_RELEASE	"4.0"
+#define UNAME_VERSION	"GENERIC"
+#define UNAME_MACHINE	"mmix"
 
-/* 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 *uname)
+__uname (struct utsname *name)
 {
-  if (syscall (SYS_uname, uname) == -1)
-    return -1;
+  /* 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));
+      }
+  }
 
-  strcpy (uname->sysname, SYSNAME);
+  /* Fill sysname: "uname -s".  Fetch sysctl "kern.ostype".  */
+  {
+    strncpy (name->sysname, UNAME_SYSNAME, sizeof (name->sysname));
+  }
 
+  /* 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));
+      }
+  }
+
+  /* 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.  */
+    {
+      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 = ' ';
+	}
+    }
+  }
+
+  /* Fill machine: "uname -m".  Fetch sysctl "hw.machine".  */
+  {
+    int request[2] = { CTL_HW, HW_MACHINE };
+    size_t len = sizeof (name->machine);
+    if (__sysctl (request, 2, name->machine, &len, NULL, 0) >= 0)
+      {
+	if (len < sizeof (name->machine))
+	  name->machine[len] = '\0';
+      }
+    else
+      {
+	if (errno != ENOMEM)
+	  strncpy (name->machine, UNAME_MACHINE, sizeof (name->machine));
+      }
+  }
+
   return 0;
 }
+libc_hidden_def (__uname)
+
 weak_alias (__uname, uname)
-libc_hidden_def (__uname)
 libc_hidden_def (uname)



Reply to: