summaryrefslogtreecommitdiff
path: root/sys/compat/common/kern_info_43.c
diff options
context:
space:
mode:
authoretheisen <etheisen@cvs.openbsd.org>1996-02-02 22:45:45 +0000
committeretheisen <etheisen@cvs.openbsd.org>1996-02-02 22:45:45 +0000
commit72676c2c3660f875c79a7e1c6369ee5e6f01bb15 (patch)
tree1127d199ceff171613fb6f682dee819d8dfbc62d /sys/compat/common/kern_info_43.c
parentfc615eaa29f4a87d52eecaa866ba77d3cce60f0d (diff)
Added code to handle BSDI's 4.3 net-2 funky uname call. Netscape was using
this to determine system name. Failure of this call caused netscape to print "uname() failed" on app startup. Also affected netscape mail headers and http sysname. Code taken from FreeBSD with minor mods. Good work guys. Let the world, or at the very least, netscape, know that you use OpenBSD. Include COMPAT_43 in kernel config to enable functionality.
Diffstat (limited to 'sys/compat/common/kern_info_43.c')
-rw-r--r--sys/compat/common/kern_info_43.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/sys/compat/common/kern_info_43.c b/sys/compat/common/kern_info_43.c
index c9281661a45..4b9d52138ff 100644
--- a/sys/compat/common/kern_info_43.c
+++ b/sys/compat/common/kern_info_43.c
@@ -1,3 +1,5 @@
+/* $Id: kern_info_43.c,v 1.2 1996/02/02 22:45:44 etheisen Exp $ */
+
/* $NetBSD: kern_info_43.c,v 1.3 1995/10/07 06:26:24 mycroft Exp $ */
/*
@@ -108,6 +110,52 @@ compat_43_sys_gethostname(p, v, retval)
#define KINFO_LOADAVG (5<<8)
#define KINFO_CLOCKRATE (6<<8)
+/* Non-standard BSDI extension - only present on their 4.3 net-2 releases */
+#define KINFO_BSDI_SYSINFO (101<<8)
+
+/*
+ * XXX this is bloat, but I hope it's better here than on the potentially
+ * limited kernel stack... -Peter
+ */
+
+struct {
+ char *bsdi_machine; /* "i386" on BSD/386 */
+ char *pad0;
+ long pad1;
+ long pad2;
+ long pad3;
+ u_long pad4;
+ u_long pad5;
+ u_long pad6;
+
+ char *bsdi_ostype; /* "BSD/386" on BSD/386 */
+ char *bsdi_osrelease; /* "1.1" on BSD/386 */
+ long pad7;
+ long pad8;
+ char *pad9;
+
+ long pad10;
+ long pad11;
+ int pad12;
+ long pad13;
+ quad_t pad14;
+ long pad15;
+
+ struct timeval pad16;
+ /* we dont set this, because BSDI's uname used gethostname() instead */
+ char *bsdi_hostname; /* hostname on BSD/386 */
+
+ /* the actual string data is appended here */
+
+} bsdi_si;
+/*
+ * this data is appended to the end of the bsdi_si structure during copyout.
+ * The "char *" offsets are relative to the base of the bsdi_si struct.
+ * This contains "OpenBSD\01.2-BUILT-nnnnnn\0i386\0", and these strings
+ * should not exceed the length of the buffer here... (or else!! :-)
+ */
+char bsdi_strings[80]; /* It had better be less than this! */
+
int
compat_43_sys_getkerninfo(p, v, retval)
struct proc *p;
@@ -123,6 +171,8 @@ compat_43_sys_getkerninfo(p, v, retval)
int error, name[5];
size_t size;
+ extern char ostype[], osrelease[], version[], machine[];
+
if (SCARG(uap, size) && (error = copyin((caddr_t)SCARG(uap, size),
(caddr_t)&size, sizeof(size))))
return (error);
@@ -177,6 +227,64 @@ compat_43_sys_getkerninfo(p, v, retval)
kern_sysctl(name, 1, SCARG(uap, where), &size, NULL, 0, p);
break;
+ case KINFO_BSDI_SYSINFO: {
+ /*
+ * this is pretty crude, but it's just enough for uname()
+ * from BSDI's 1.x libc to work.
+ */
+
+ u_int needed;
+ u_int left;
+ char *s;
+
+ bzero((char *)&bsdi_si, sizeof(bsdi_si));
+ bzero(bsdi_strings, sizeof(bsdi_strings));
+
+ s = bsdi_strings;
+
+ bsdi_si.bsdi_ostype = ((char *)(s - bsdi_strings)) + sizeof(bsdi_si);
+ strcpy(s, ostype);
+ s += strlen(s) + 1;
+
+ bsdi_si.bsdi_osrelease = ((char *)(s - bsdi_strings)) + sizeof(bsdi_si);
+ strcpy(s, osrelease);
+ s += strlen(s) + 1;
+
+ bsdi_si.bsdi_machine = ((char *)(s - bsdi_strings)) + sizeof(bsdi_si);
+ strcpy(s, machine);
+ s += strlen(s) + 1;
+
+ needed = sizeof(bsdi_si) + (s - bsdi_strings);
+
+ if (SCARG(uap, where) == NULL) {
+ /* process is asking how much buffer to supply.. */
+ size = needed;
+ error = 0;
+ break;
+ }
+
+ /* if too much buffer supplied, trim it down */
+ if (size > needed)
+ size = needed;
+
+ /* how much of the buffer is remaining */
+ left = size;
+
+ if ((error = copyout((char *)&bsdi_si, SCARG(uap, where), left)) != 0)
+ break;
+
+ /* is there any point in continuing? */
+ if (left > sizeof(bsdi_si))
+ left -= sizeof(bsdi_si);
+ else
+ break;
+
+ error = copyout(&bsdi_strings, SCARG(uap, where) + sizeof(bsdi_si),
+ left);
+
+ break;
+ }
+
default:
return (EOPNOTSUPP);
}