Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Jun 2003 12:42:48 +0200
From:      Dag-Erling Smorgrav <des@ofug.org>
To:        emulation@freebsd.org
Subject:   uname enhancement
Message-ID:  <xzpbrwy1exj.fsf@flood.ping.uio.no>

next in thread | raw e-mail | index | archive | help
--=-=-=

The attached patch fixes two problems in linux_newuname():

 - the entire FreeBSD kernel version was being copied into
   utsname.version.  This string contains newline characters which
   Linux apps do not expect, and is often too long to fit anyway.

 - on i386, utsname.machine was always set to "i386".  Linux normally
   reports the precise CPU class it's running on (e.g. "i686" for
   Pentium Pro, Pentium II, Celeron, Xeon, Athlon, Duron etc.).  This
   causes some applications (such as BEA WebLogic Server) to fail
   because the developers never expected anyone to run their software
   on an i386.

before:

des@meali ~/bea% /compat/linux/bin/uname -a
Linux meali.registrar.no 2.4.2 FreeBSD 5.1-CURRENT #2: Sun Jun 15 17:31:50 CEST 2003
    des@me i386 unknown

after:

des@meali ~/bea% /compat/linux/bin/uname -a
Linux meali.registrar.no 2.4.2 FreeBSD 5.1-CURRENT #2: Sun Jun 15 17:31:50 CEST 2003 i686 unknown

DES
-- 
Dag-Erling Smorgrav - des@ofug.org


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=linux-uname.diff

Index: sys/compat/linux/linux_misc.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/linux/linux_misc.c,v
retrieving revision 1.144
diff -u -r1.144 linux_misc.c
--- sys/compat/linux/linux_misc.c	10 Jun 2003 21:27:39 -0000	1.144
+++ sys/compat/linux/linux_misc.c	16 Jun 2003 10:25:40 -0000
@@ -75,6 +75,10 @@
 #include <compat/linux/linux_mib.h>
 #include <compat/linux/linux_util.h>
 
+#ifdef __i386__
+#include <machine/cputypes.h>
+#endif
+
 #ifdef __alpha__
 #define BSD_TO_LINUX_SIGNAL(sig)       (sig)
 #else
@@ -693,6 +697,7 @@
 	struct l_new_utsname utsname;
 	char osname[LINUX_MAX_UTSNAME];
 	char osrelease[LINUX_MAX_UTSNAME];
+	char *p;
 
 #ifdef DEBUG
 	if (ldebug(newuname))
@@ -707,7 +712,32 @@
 	getcredhostname(td->td_ucred, utsname.nodename, LINUX_MAX_UTSNAME);
 	strlcpy(utsname.release, osrelease, LINUX_MAX_UTSNAME);
 	strlcpy(utsname.version, version, LINUX_MAX_UTSNAME);
+	for (p = utsname.version; *p != '\0'; ++p)
+		if (*p == '\n') {
+			*p = '\0';
+			break;
+		}
+#ifdef __i386__
+	{
+		const char *class;
+		switch (cpu_class) {
+		case CPUCLASS_686:
+			class = "i686";
+			break;
+		case CPUCLASS_586:
+			class = "i586";
+			break;
+		case CPUCLASS_486:
+			class = "i486";
+			break;
+		default:
+			class = "i386";
+		}
+		strlcpy(utsname.machine, class, LINUX_MAX_UTSNAME);
+	}
+#else
 	strlcpy(utsname.machine, machine, LINUX_MAX_UTSNAME);
+#endif
 	strlcpy(utsname.domainname, domainname, LINUX_MAX_UTSNAME);
 
 	return (copyout(&utsname, args->buf, sizeof(utsname)));

--=-=-=--


Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?xzpbrwy1exj.fsf>