summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libc/gen/Makefile.inc2
-rw-r--r--lib/libc/gen/__xuname.c11
-rw-r--r--lib/libc/gen/uname.c82
-rw-r--r--sys/kern/kern_xxx.c8
-rw-r--r--sys/sys/utsname.h16
5 files changed, 36 insertions, 83 deletions
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index 93d62a1..9bc51fd 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -4,7 +4,7 @@
# machine-independent gen sources
.PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/gen ${.CURDIR}/../libc/gen
-SRCS+= _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \
+SRCS+= __xuname.c _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \
alarm.c arc4random.c assert.c basename.c \
clock.c closedir.c confstr.c \
crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \
diff --git a/lib/libc/gen/__xuname.c b/lib/libc/gen/__xuname.c
index 944c2dc..d97c4ad 100644
--- a/lib/libc/gen/__xuname.c
+++ b/lib/libc/gen/__xuname.c
@@ -43,14 +43,21 @@ static const char rcsid[] =
#include <errno.h>
int
-uname(name)
- struct utsname *name;
+__xuname(int namesize, void *namebuf)
{
int mib[2], rval;
size_t len;
char *p;
int oerrno;
+ struct xutsname {
+ char sysname[namesize]; /* Name of this OS. */
+ char nodename[namesize]; /* Name of this network node. */
+ char release[namesize]; /* Release level. */
+ char version[namesize]; /* Version level. */
+ char machine[namesize]; /* Hardware type. */
+ } *name;
+ name = (struct xutsname *)namebuf;
rval = 0;
mib[0] = CTL_KERN;
diff --git a/lib/libc/gen/uname.c b/lib/libc/gen/uname.c
index 944c2dc..75a3f189 100644
--- a/lib/libc/gen/uname.c
+++ b/lib/libc/gen/uname.c
@@ -37,89 +37,15 @@ static const char rcsid[] =
"$FreeBSD$";
#endif /* LIBC_SCCS and not lint */
+#define uname wrapped_uname
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/utsname.h>
#include <errno.h>
+#undef uname
int
-uname(name)
- struct utsname *name;
+uname(struct utsname *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);
- 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);
- 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);
- 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);
- 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);
- 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);
+ return __xuname(32, name);
}
diff --git a/sys/kern/kern_xxx.c b/sys/kern/kern_xxx.c
index 5009db2..4738aa1 100644
--- a/sys/kern/kern_xxx.c
+++ b/sys/kern/kern_xxx.c
@@ -138,6 +138,14 @@ oquota(p, uap)
}
#endif /* COMPAT_43 */
+/*
+ * This is the FreeBSD-1.1 compatable uname(2) interface. These
+ * days it is done in libc as a wrapper around a bunch of sysctl's.
+ * This must maintain the old 1.1 binary ABI.
+ */
+#if SYS_NMLN != 32
+#error "FreeBSD-1.1 uname syscall has been broken"
+#endif
#ifndef _SYS_SYSPROTO_H_
struct uname_args {
struct utsname *name;
diff --git a/sys/sys/utsname.h b/sys/sys/utsname.h
index 7c8b9b8..b32bdfa 100644
--- a/sys/sys/utsname.h
+++ b/sys/sys/utsname.h
@@ -40,7 +40,13 @@
#ifndef _SYS_UTSNAME_H
#define _SYS_UTSNAME_H
-#define SYS_NMLN 32
+#ifdef _KERNEL
+#define SYS_NMLN 32 /* uname(2) is FreeBSD 1.1 compatable */
+#endif
+
+#ifndef SYS_NMLN
+#define SYS_NMLN 256 /* Ask and ye shall receive */
+#endif
struct utsname {
char sysname[SYS_NMLN]; /* Name of this OS. */
@@ -54,8 +60,14 @@ struct utsname {
#ifndef _KERNEL
__BEGIN_DECLS
-int uname __P((struct utsname *));
+int __xuname(int, void *); /* Variable record size */
__END_DECLS
+
+static __inline int
+uname(struct utsname *name)
+{
+ return __xuname(SYS_NMLN, (void *)name);
+}
#endif /* _KERNEL */
#endif /* !_SYS_UTSNAME_H */
OpenPOWER on IntegriCloud