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: