diff options
-rw-r--r-- | lib/libc/gen/Makefile.inc | 2 | ||||
-rw-r--r-- | lib/libc/gen/__xuname.c | 11 | ||||
-rw-r--r-- | lib/libc/gen/uname.c | 82 | ||||
-rw-r--r-- | sys/kern/kern_xxx.c | 8 | ||||
-rw-r--r-- | sys/sys/utsname.h | 16 |
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 */ |