Subject: Re: uname fails with BSDI netscape
To: Thomas Graichen <graichen@omega.physik.fu-berlin.de>
From: Dave Cornejo <dave@dogwood.com>
List: current-users
Date: 01/16/1996 09:21:18
Here is a quick hack of the FreeBSD patch into NetBSD-1.1/current
/sys/compat/common/kern_info_43.c - it's ugly, but it seems to work.
*** kern_info_43.c-dist Fri Oct 13 19:31:11 1995
--- kern_info_43.c Tue Jan 16 09:11:36 1996
***************
*** 108,113 ****
--- 108,159 ----
#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 "FreeBSD\02.0-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;
***************
*** 176,181 ****
--- 222,286 ----
error =
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;
+
+ extern char ostype[], osrelease[], machine[], hostname[];
+
+ 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((caddr_t)&bsdi_si, (caddr_t)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);
--
Dave Cornejo There is nothing so subtle
Dogwood Media as the obvious
Fremont, California