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