From owner-freebsd-current Mon Jun 26 00:03:26 1995 Return-Path: current-owner Received: (from majordom@localhost) by freefall.cdrom.com (8.6.10/8.6.6) id AAA29008 for current-outgoing; Mon, 26 Jun 1995 00:03:26 -0700 Received: from irz301.inf.tu-dresden.de (irz301.inf.tu-dresden.de [141.76.1.11]) by freefall.cdrom.com (8.6.10/8.6.6) with SMTP id AAA28956 for ; Mon, 26 Jun 1995 00:03:16 -0700 Received: from sax.sax.de by irz301.inf.tu-dresden.de with SMTP (5.67b+/DEC-Ultrix/4.3) id AA19066; Mon, 26 Jun 1995 09:03:11 +0200 Received: by sax.sax.de (8.6.12/8.6.12-s1) with UUCP id JAA08442 for freebsd-current@FreeBSD.org; Mon, 26 Jun 1995 09:03:10 +0200 Received: (from j@localhost) by uriah.heep.sax.de (8.6.11/8.6.9) id IAA22112 for freebsd-current@FreeBSD.org; Mon, 26 Jun 1995 08:48:59 +0200 From: J Wunsch Message-Id: <199506260648.IAA22112@uriah.heep.sax.de> Subject: Re: kern/562: netscape (bsdi executable) can't do a uname (fix provided) To: freebsd-current@FreeBSD.org (FreeBSD-current users) Date: Mon, 26 Jun 1995 08:48:59 +0200 (MET DST) Reply-To: freebsd-current@FreeBSD.org (FreeBSD-current users) In-Reply-To: <199506251830.LAA00912@freefall.cdrom.com> from "peter@haywire.dialix.com" at Jun 25, 95 11:30:01 am Reply-To: joerg_wunsch@uriah.heep.sax.de (Joerg Wunsch) X-Phone: +49-351-2012 669 X-Mailer: ELM [version 2.4 PL23] Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Content-Length: 5698 Sender: current-owner@FreeBSD.org Precedence: bulk Can any brave soul who's actually got Netscape 1.1 try this? As peter@haywire.dialix.com wrote: > > > >Number: 562 > >Category: kern > >Synopsis: netscape (bsdi executable) can't do a uname (fix provided) > >Confidential: no > >Severity: non-critical > >Priority: low > >Responsible: freebsd-bugs (FreeBSD bugs mailing list) > >State: open > >Class: change-request > >Submitter-Id: current-users > >Arrival-Date: Sun Jun 25 11:30:00 1995 > >Originator: Peter Wemm > >Organization: > DIALix Services > >Release: FreeBSD 2.0-BUILT-19950625 i386 > >Environment: > > FreeBSD-current > FreeBSD jhome.DIALix.COM 2.0-BUILT-19950625 FreeBSD 2.0-BUILT-19950625 #4: Sun Jun 25 22:05:25 WST 1995 pwroot@jhome.DIALix.COM:/usr/src/sys/compile/JHOME i386 > > >Description: > > Netscape 1.1N does a uname() at startup to discover the Host OS type. > This information is presented to every server that it connects to, and > is probably logged for statistics, at least on home.netscape.com. > > The problem is, that it identifies itself as (while running on FreeBSD) as > something like this: > > GET / HTTP/1.0 > User-Agent: Mozilla/1.1N (X11; I; BSD/386 uname failed) > Accept: */* > Accept: image/gif > Accept: image/x-xbitmap > Accept: image/jpeg > > This does not do much to help convince Netscape to support FreeBSD in the > future.... :-) > > After applying this patch, it identifies itself like this: (Thanks to > Gary Palmer for the idea on how to see this info) > > 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 > > (BTW: FreeBSD-current is still "2.0-built-nnnnn"????) > > Also, when starting up netscape, there is a very annoying printf > "uname() failed; can't tell what system we're running on" > > >How-To-Repeat: > > Run netscape... > > >Fix: > > Apply this patch to /usr/src/sys/kern/kern_sysctl.c and make sure > COMPAT_43 is defined (netscape is a 4.3BSD-net2 binary, so it should > have COMPAT_43 defined anyway) > > Apologies for the ugly code here.. > > -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); > >Audit-Trail: > >Unformatted: > > > -- cheers, J"org joerg_wunsch@uriah.heep.sax.de -- http://www.sax.de/~joerg/ Never trust an operating system you don't have sources for. ;-)