Subject: Re: uname fails with BSDI netscape
To: None <thorpej@nas.nasa.gov>
From: Thomas Graichen <graichen@omega.physik.fu-berlin.de>
List: current-users
Date: 01/16/1996 08:41:20
hasn't Jason Thorpe said ? ...
>
> On Tue, 16 Jan 1996 00:03:09 +0100 (MET)
> Thomas Graichen <graichen@omega.physik.fu-berlin.de> wrote:
>
> > yes - but it's fixed after 2.0.5 - i think i still have the patch for
> > 2.0.5 (and thus maybe NetBSD) in my folders - interest ?
>
> Yah ... forward it on!
>
ok - here is it - it was from peter wemm:
...
This patch should fix the problem..
You can apply this to /usr/src/sys/kern/kern_sysctl.c, and define
"options COMPAT_43" in your kernel config file.
Remember, Netscape is a BSDI1.1 / 4.3BSD-net2 level binary.
Standard disclaimer: This works for me on FreeBSD-current, but your
mileage may vary - use at your own risk. It should go straight into
and of the 2.x releases without too much trouble.
In case you were wondering, this is where the information is used -
this is a dump of the inital HTTP request packet that Netscape sent
when fetching http://home.netscape.com/
GET / HTTP/1.0
User-Agent: Mozilla/1.1N (X11; I; FreeBSD 2.0-BUILT-1995060 i386)
Accept: */*
Accept: image/gif
Accept: image/x-xbitmap
Accept: image/jpeg
Without this patch, it includes this instead:
User-Agent: Mozilla/1.1N (X11; I; BSD/386 uname failed)
(If Netscape are logging this, I'd rather them know which were FreeBSD
users instead of mistakenly counting them as BSD/386 users.)
Cheers,
-Peter
*** kern_sysctl-dist.c Tue May 30 18:58:22 1995
--- kern_sysctl.c Mon Jun 26 02:01:21 1995
***************
*** 767,772 ****
--- 767,818 ----
#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! */
+
struct getkerninfo_args {
int op;
char *where;
***************
*** 829,834 ****
--- 875,937 ----
name[0] = KERN_CLOCKRATE;
error = kern_sysctl(name, 1, 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 (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, 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, uap->where + sizeof(bsdi_si),
+ left);
+ break;
+ }
default:
return (EOPNOTSUPP);
...
hope this helps
t
_______________________________________________________||___________________
__||
Perfection is reached, not when there is no __|| thomas graichen
longer anything to add, but when there __|| freie universitaet berlin
is no longer anything to take away __|| fachbereich physik
__||
- Antoine de Saint-Exupery - __|| graichen@mail.physik.fu-berlin.de
___________________________||__________________graichen@FreeBSD.org_________