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_________