ksh/ksh93-uname.dif

114 lines
2.5 KiB
Plaintext
Raw Normal View History

--- src/lib/libcmd/uname.c
+++ src/lib/libcmd/uname.c 2006-05-29 13:11:43.000000000 +0000
@@ -75,6 +75,7 @@
#include <cmdlib.h>
#include <ctype.h>
+#include <stdio.h>
#include <proc.h>
#include "FEATURE/utsname"
@@ -82,9 +83,11 @@
#define MAXHOSTNAME 64
#if _lib_uname && _sys_utsname
+# include <sys/utsname.h>
+#endif
-#include <sys/utsname.h>
-
+#ifdef __linux__
+# include <sys/sysctl.h>
#endif
#if defined(__STDPP__directive) && defined(__STDPP__hide)
@@ -186,7 +189,11 @@
#define OPT_version (1<<3)
#define OPT_machine (1<<4)
-#define OPT_ALL 5
+#ifdef __linux__
+# define OPT_ALL 6
+#else
+# define OPT_ALL 5
+#endif
#define OPT_processor (1<<5)
#define OPT_hostid (1<<6)
@@ -258,6 +265,9 @@
{
case 'a':
flags |= OPT_all|((1L<<OPT_ALL)-1);
+#ifdef __linux__
+ flags |= OPT_implementation;
+#endif
continue;
case 'b':
flags |= OPT_base;
@@ -311,7 +321,11 @@
sethost = opt_info.arg;
continue;
case ':':
+#ifdef __linux__
+ s = "/bin/uname";
+#else
s = "/usr/bin/uname";
+#endif
if (!streq(argv[0], s) && (!eaccess(s, X_OK) || !eaccess(s+=4, X_OK)))
{
argv[0] = s;
@@ -380,7 +394,35 @@
output(OPT_machine, ut.machine, "machine");
if (flags & OPT_processor)
{
- if (!*(s = astconf("ARCHITECTURE", NiL, NiL)))
+ s = NULL;
+#ifdef __linux__
+# ifdef UNAME_PROCESSOR
+ if (!s) {
+ size_t len = sizeof(buf) - 1;
+ int ctl[] = {CTL_HW, UNAME_PROCESSOR};
+ if (sysctl(ctl, 2, buf, &len, 0, 0) == 0)
+ s = buf;
+ }
+# endif
+ if (!s) {
+ strcpy((s = buf), ut.machine);
+ if (strcmp(s, "i686") == 0) {
+ char line[1024];
+ Sfio_t *io = sfopen((Sfio_t*)0, "/proc/cpuinfo", "r");
+ if (io) {
+ while (fgets(line, sizeof(line), io) > 0) {
+ if (strncmp(line, "vendor_id", 9) == 0) {
+ if (strstr(line, "AuthenticAMD"))
+ s = "athlon";
+ break;
+ }
+ }
+ sfclose(io);
+ }
+ }
+ }
+#endif
+ if (!s && !*(s = astconf("ARCHITECTURE", NiL, NiL)))
{
if (t = strchr(hosttype, '.'))
t++;
@@ -392,7 +434,15 @@
}
if (flags & OPT_implementation)
{
- if (!*(s = astconf("PLATFORM", NiL, NiL)))
+ s = NULL;
+#ifdef __linux__
+ if (!s) {
+ strcpy((s = buf), ut.machine);
+ if (s[0] == 'i' && s[2] == '8' && s[3] == '6' && s[4] == '\0')
+ s[1] = '3';
+ }
+#endif
+ if (!s && !*(s = astconf("PLATFORM", NiL, NiL)))
s = astconf("HW_NAME", NiL, NiL);
output(OPT_implementation, s, "implementation");
}