114 lines
2.5 KiB
Plaintext
114 lines
2.5 KiB
Plaintext
|
--- 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");
|
||
|
}
|