diff options
Diffstat (limited to 'lib/libc/gen/uname.c')
-rw-r--r-- | lib/libc/gen/uname.c | 71 |
1 files changed, 53 insertions, 18 deletions
diff --git a/lib/libc/gen/uname.c b/lib/libc/gen/uname.c index 9857b29..25431d4 100644 --- a/lib/libc/gen/uname.c +++ b/lib/libc/gen/uname.c @@ -32,12 +32,15 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)uname.c 8.1 (Berkeley) 1/4/94"; +/*static char sccsid[] = "From: @(#)uname.c 8.1 (Berkeley) 1/4/94";*/ +static const char rcsid[] = + "$Id$"; #endif /* LIBC_SCCS and not lint */ #include <sys/param.h> #include <sys/sysctl.h> #include <sys/utsname.h> +#include <errno.h> int uname(name) @@ -46,45 +49,77 @@ uname(name) int mib[2], rval; size_t len; char *p; + int oerrno; rval = 0; mib[0] = CTL_KERN; mib[1] = KERN_OSTYPE; len = sizeof(name->sysname); - if (sysctl(mib, 2, &name->sysname, &len, NULL, 0) == -1) - rval = -1; + oerrno = errno; + if (sysctl(mib, 2, &name->sysname, &len, NULL, 0) == -1) { + if(errno == ENOMEM) + errno = oerrno; + else + rval = -1; + } + name->sysname[sizeof(name->sysname) - 1] = '\0'; mib[0] = CTL_KERN; mib[1] = KERN_HOSTNAME; len = sizeof(name->nodename); - if (sysctl(mib, 2, &name->nodename, &len, NULL, 0) == -1) - rval = -1; + oerrno = errno; + if (sysctl(mib, 2, &name->nodename, &len, NULL, 0) == -1) { + if(errno == ENOMEM) + errno = oerrno; + else + rval = -1; + } + name->nodename[sizeof(name->nodename) - 1] = '\0'; mib[0] = CTL_KERN; mib[1] = KERN_OSRELEASE; len = sizeof(name->release); - if (sysctl(mib, 2, &name->release, &len, NULL, 0) == -1) - rval = -1; + oerrno = errno; + if (sysctl(mib, 2, &name->release, &len, NULL, 0) == -1) { + if(errno == ENOMEM) + errno = oerrno; + else + rval = -1; + } + name->release[sizeof(name->release) - 1] = '\0'; /* The version may have newlines in it, turn them into spaces. */ mib[0] = CTL_KERN; mib[1] = KERN_VERSION; len = sizeof(name->version); - if (sysctl(mib, 2, &name->version, &len, NULL, 0) == -1) - rval = -1; - else - for (p = name->version; len--; ++p) - if (*p == '\n' || *p == '\t') - if (len > 1) - *p = ' '; - else - *p = '\0'; + oerrno = errno; + if (sysctl(mib, 2, &name->version, &len, NULL, 0) == -1) { + if (errno == ENOMEM) + errno = oerrno; + else + rval = -1; + } + name->version[sizeof(name->version) - 1] = '\0'; + for (p = name->version; len--; ++p) { + if (*p == '\n' || *p == '\t') { + if (len > 1) + *p = ' '; + else + *p = '\0'; + } + } mib[0] = CTL_HW; mib[1] = HW_MACHINE; len = sizeof(name->machine); - if (sysctl(mib, 2, &name->machine, &len, NULL, 0) == -1) - rval = -1; + oerrno = errno; + if (sysctl(mib, 2, &name->machine, &len, NULL, 0) == -1) { + if (errno == ENOMEM) + errno = oerrno; + else + rval = -1; + } + name->machine[sizeof(name->machine) - 1] = '\0'; return (rval); } |