summaryrefslogblamecommitdiffstats
path: root/source/a/coreutils/coreutils.uname.diff
blob: 3aec5e5f6c82c2979b8f1ed9ebe47a9ad9105cf2 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12



                                                           







                                 
                 
                   
                     

















                                                        









                                                 



                                                          
                 
 



































                                                                    
 

                                                           
 
















                                                                                     
 




                                              
 
                  






                                                                    



                           

                                                                         


                                      
                          
                                                                                       
      

                                                                           
       

                                 
       
                    
                              

                                              
                          
                                                                                                              
      


                                                                  
       

                                         
       
--- ./src/uname.c.orig	2022-04-08 06:22:18.000000000 -0500
+++ ./src/uname.c	2022-04-17 13:30:46.550023254 -0500
@@ -44,6 +44,11 @@
 # endif
 #endif
 
+#if defined (__linux__)
+# define USE_PROCINFO
+# define UNAME_HARDWARE_PLATFORM
+#endif
+
 #include "system.h"
 #include "die.h"
 #include "error.h"
@@ -149,6 +154,106 @@
   exit (status);
 }
 
+#if defined(USE_PROCINFO)
+
+# if defined(__s390__) || defined(__s390x__)
+#  define CPUINFO_FILE    "/proc/sysinfo"
+#  define CPUINFO_FORMAT  "%64[^\t :]%*[ :]%256[^\n]%c"
+# else
+#  define CPUINFO_FILE    "/proc/cpuinfo"
+#  define CPUINFO_FORMAT  "%64[^\t:]\t:%256[^\n]%c"
+# endif
+
+# define PROCINFO_PROCESSOR      0
+# define PROCINFO_HARDWARE_PLATFORM 1
+
+static void __eat_cpuinfo_space(char *buf)
+{
+       /* first eat trailing space */
+       char *tmp = buf + strlen(buf) - 1;
+       while (tmp > buf && isspace(*tmp))
+               *tmp-- = '\0';
+       /* then eat leading space */
+       tmp = buf;
+       while (*tmp && isspace(*tmp))
+               tmp++;
+       if (tmp != buf)
+               memmove(buf, tmp, strlen(tmp)+1);
+}
+
+static int __linux_procinfo (int x, char *fstr, size_t s)
+{
+       FILE *fp;
+
+       char *procinfo_keys[] = {
+               /* --processor --hardware-platform */
+               #if defined(__alpha__)
+                       "cpu model", "system type"
+               #elif defined(__arm__)
+                       "Processor", "Hardware"
+               #elif defined(bfin)
+                       "CPU", "BOARD Name"
+               #elif defined(__cris__)
+                       "cpu", "cpu model"
+               #elif defined(__frv__)
+                       "CPU-Core", "System"
+               #elif defined(__i386__) || defined(__x86_64__)
+                       "model name", "vendor_id"
+               #elif defined(__ia64__)
+                       "family", "vendor"
+               #elif defined(__hppa__)
+                       "cpu", "model"
+               #elif defined(__m68k__)
+                       "CPU", "MMU"
+               #elif defined(__mips__)
+                       "cpu model", "system type"
+               #elif defined(__powerpc__) || defined(__powerpc64__)
+                       "cpu", "machine"
+               #elif defined(__s390__) || defined(__s390x__)
+                       "Type", "Manufacturer"
+               #elif defined(__sh__)
+                       "cpu type", "machine"
+               #elif defined(sparc) || defined(__sparc__)
+                       "type", "cpu"
+               #elif defined(__vax__)
+                       "cpu type", "cpu"
+               #else
+                       "unknown", "unknown"
+               #endif
+       };
+
+       if ((fp = fopen(CPUINFO_FILE, "r")) != NULL) {
+               char key[65], value[257], eol, *ret = NULL;
+
+               while (fscanf(fp, CPUINFO_FORMAT, key, value, &eol) != EOF) {
+                       __eat_cpuinfo_space(key);
+                       if (!strcmp(key, procinfo_keys[x])) {
+                               __eat_cpuinfo_space(value);
+                               ret = value;
+                               break;
+                       }
+                       if (eol != '\n') {
+                               /* we need two fscanf's here in case the previous
+                                * length limit caused us to read right up to the
+                                * newline ... doing "%*[^\n]\n" wont eat the newline
+                                */
+                               fscanf(fp, "%*[^\n]");
+                               fscanf(fp, "\n");
+                       }
+               }
+               fclose(fp);
+
+               if (ret) {
+                       strncpy(fstr, ret, s);
+                       return 0;
+               }
+       }
+
+       return -1;
+}
+
+#endif
+
 /* Print ELEMENT, preceded by a space if something has already been
    printed.  */
 
@@ -323,11 +428,16 @@
       element = "powerpc";
 # endif
 #endif
-#if HAVE_SYSINFO && defined SI_ARCHITECTURE
+#if ( HAVE_SYSINFO && defined SI_ARCHITECTURE ) || defined(USE_PROCINFO)
       if (element == unknown)
         {
           static char processor[257];
+#if defined(USE_PROCINFO)
+          if (0 <= __linux_procinfo (PROCINFO_PROCESSOR, processor, sizeof processor))
+#else
+
           if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
+#endif
             element = processor;
         }
 #endif
@@ -360,9 +470,13 @@
       if (element == unknown)
         {
           static char hardware_platform[257];
+#if defined(USE_PROCINFO)
+         if (0 <= __linux_procinfo (PROCINFO_HARDWARE_PLATFORM, hardware_platform, sizeof hardware_platform))
+#else
           size_t s = sizeof hardware_platform;
           static int mib[] = { CTL_HW, UNAME_HARDWARE_PLATFORM };
           if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0)
+#endif
             element = hardware_platform;
         }
 #endif