diff options
Diffstat (limited to 'lib/libc')
-rw-r--r-- | lib/libc/gen/__xuname.c | 59 | ||||
-rw-r--r-- | lib/libc/gen/uname.c | 59 |
2 files changed, 90 insertions, 28 deletions
diff --git a/lib/libc/gen/__xuname.c b/lib/libc/gen/__xuname.c index 9857b29..1511c1f 100644 --- a/lib/libc/gen/__xuname.c +++ b/lib/libc/gen/__xuname.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,73 @@ 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; + } 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; + } 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; + } /* 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') + oerrno = errno; + if (sysctl(mib, 2, &name->version, &len, NULL, 0) == -1) { + if (errno == ENOMEM) + errno = oerrno; + else + rval = -1; + } else { + 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; + } return (rval); } diff --git a/lib/libc/gen/uname.c b/lib/libc/gen/uname.c index 9857b29..1511c1f 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,73 @@ 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; + } 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; + } 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; + } /* 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') + oerrno = errno; + if (sysctl(mib, 2, &name->version, &len, NULL, 0) == -1) { + if (errno == ENOMEM) + errno = oerrno; + else + rval = -1; + } else { + 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; + } return (rval); } |