source: clfs-sysroot/patches/coreutils-6.12-uname-1.patch@ ad97072

Last change on this file since ad97072 was 589e899, checked in by Joe Ciccone <jciccone@…>, 16 years ago

Update coreutils patches.

  • Property mode set to 100644
File size: 4.2 KB
  • coreutils-6.12

    Submitted By: Jim Gifford <jim at linuxfromscratch dot org>
    Date: 2006-08-24
    Initial Package Version: 5.97
            Rediffed against 6.12 by Joe Ciccone on 2008-08-30
    Upstream Status: Not Accepted
    Origin: Gentoo - http://sources.gentoo.org/viewcvs.py/gentoo/src/patchsets/coreutils
    Description: Display CPU Information from /proc/cpuinfo or /proc/sysinfo
    
    Original Patch by - Matthew Burgess and Scot McPherson
    
    diff -Naur coreutils-6.12.orig/src/uname.c coreutils-6.12/src/uname.c
    old new  
    5050# include <mach-o/arch.h>
    5151#endif
    5252
     53#if defined (__linux__)
     54# define USE_PROCINFO
     55# define UNAME_HARDWARE_PLATFORM
     56#endif
     57
    5358#include "system.h"
    5459#include "error.h"
    5560#include "quote.h"
     
    158163  exit (status);
    159164}
    160165
     166#if defined(USE_PROCINFO)
     167
     168# if defined(__s390__) || defined(__s390x__)
     169#  define CPUINFO_FILE    "/proc/sysinfo"
     170#  define CPUINFO_FORMAT  "%64[^\t :]%*[ :]%256[^\n]%c"
     171# else
     172#  define CPUINFO_FILE    "/proc/cpuinfo"
     173#  define CPUINFO_FORMAT  "%64[^\t:]\t:%256[^\n]%c"
     174# endif
     175
     176# define PROCINFO_PROCESSOR      0
     177# define PROCINFO_HARDWARE_PLATFORM 1
     178
     179static void __eat_cpuinfo_space(char *buf)
     180{
     181        /* first eat trailing space */
     182        char *tmp = buf + strlen(buf) - 1;
     183        while (tmp > buf && isspace(*tmp))
     184                *tmp-- = '\0';
     185        /* then eat leading space */
     186        tmp = buf;
     187        while (*tmp && isspace(*tmp))
     188                tmp++;
     189        if (tmp != buf)
     190                memmove(buf, tmp, strlen(tmp)+1);
     191}
     192
     193static int __linux_procinfo (int x, char *fstr, size_t s)
     194{
     195        FILE *fp;
     196
     197        char *procinfo_keys[] = {
     198                /* --processor --hardware-platform */
     199                #if defined(__alpha__)
     200                        "cpu model", "system type"
     201                #elif defined(__arm__)
     202                        "Processor", "Hardware"
     203                #elif defined(bfin)
     204                        "CPU", "BOARD Name"
     205                #elif defined(__cris__)
     206                        "cpu", "cpu model"
     207                #elif defined(__frv__)
     208                        "CPU-Core", "System"
     209                #elif defined(__i386__) || defined(__x86_64__)
     210                        "model name", "vendor_id"
     211                #elif defined(__ia64__)
     212                        "family", "vendor"
     213                #elif defined(__hppa__)
     214                        "cpu", "model"
     215                #elif defined(__m68k__)
     216                        "CPU", "MMU"
     217                #elif defined(__mips__)
     218                        "cpu model", "system type"
     219                #elif defined(__powerpc__) || defined(__powerpc64__)
     220                        "cpu", "machine"
     221                #elif defined(__s390__) || defined(__s390x__)
     222                        "Type", "Manufacturer"
     223                #elif defined(__sh__)
     224                        "cpu type", "machine"
     225                #elif defined(sparc) || defined(__sparc__)
     226                        "type", "cpu"
     227                #elif defined(__vax__)
     228                        "cpu type", "cpu"
     229                #else
     230                        "unknown", "unknown"
     231                #endif
     232        };
     233
     234        if ((fp = fopen(CPUINFO_FILE, "r")) != NULL) {
     235                char key[65], value[257], eol, *ret = NULL;
     236
     237                while (fscanf(fp, CPUINFO_FORMAT, key, value, &eol) != EOF) {
     238                        __eat_cpuinfo_space(key);
     239                        if (!strcmp(key, procinfo_keys[x])) {
     240                                __eat_cpuinfo_space(value);
     241                                ret = value;
     242                                break;
     243                        }
     244                        if (eol != '\n') {
     245                                /* we need two fscanf's here in case the previous
     246                                 * length limit caused us to read right up to the
     247                                 * newline ... doing "%*[^\n]\n" wont eat the newline
     248                                 */
     249                                fscanf(fp, "%*[^\n]");
     250                                fscanf(fp, "\n");
     251                        }
     252                }
     253                fclose(fp);
     254
     255                if (ret) {
     256                        strncpy(fstr, ret, s);
     257                        return 0;
     258                }
     259        }
     260
     261        return -1;
     262}
     263
     264#endif
     265
    161266/* Print ELEMENT, preceded by a space if something has already been
    162267   printed.  */
    163268
     
    305410  if (toprint & PRINT_PROCESSOR)
    306411    {
    307412      char const *element = unknown;
    308 #if HAVE_SYSINFO && defined SI_ARCHITECTURE
     413#if ( HAVE_SYSINFO && defined SI_ARCHITECTURE ) || defined(USE_PROCINFO)
    309414      {
    310415        static char processor[257];
     416#if defined(USE_PROCINFO)
     417        if (0 <= __linux_procinfo (PROCINFO_PROCESSOR, processor, sizeof processor))
     418#else
    311419        if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
     420#endif
    312421          element = processor;
    313422      }
    314423#endif
     
    361470      if (element == unknown)
    362471        {
    363472          static char hardware_platform[257];
     473#if defined(USE_PROCINFO)
     474          if (0 <= __linux_procinfo (PROCINFO_HARDWARE_PLATFORM, hardware_platform, sizeof hardware_platform))
     475#else
    364476          size_t s = sizeof hardware_platform;
    365477          static int mib[] = { CTL_HW, UNAME_HARDWARE_PLATFORM };
    366478          if (sysctl (mib, 2, hardware_platform, &s, 0, 0) >= 0)
     479#endif
    367480            element = hardware_platform;
    368481        }
    369482#endif
Note: See TracBrowser for help on using the repository browser.