#include "system.h" #include #include #include "debug.h" #define _PROC_CPUINFO "/proc/cpuinfo" static const char * cpuinfo = _PROC_CPUINFO; #define _isspace(_c) \ ((_c) == ' ' || (_c) == '\t' || (_c) == '\r' || (_c) == '\n') /* * processor : 0 * vendor_id : GenuineIntel * cpu family : 6 * model : 8 * model name : Pentium III (Coppermine) * stepping : 1 * cpu MHz : 664.597 * cache size : 256 KB * physical id : 0 * siblings : 1 * fdiv_bug : no * hlt_bug : no * f00f_bug : no * coma_bug : no * fpu : yes * fpu_exception : yes * cpuid level : 2 * wp : yes * flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse * bogomips : 1327.10 */ struct cpuinfo_s { const char *name; int done; int flags; }; struct cpuinfo_s ctags[] = { { "processor", 0, 0 }, { "vendor_id", 0, 0 }, { "cpu_family", 0, 1 }, { "model", 0, 1 }, { "model_name", 0, 2 }, { "stepping", 0, 1 }, { "cpu_MHz", 0, 0 }, { "cache_size", 0, 2 }, { "physical_id", 0, 0 }, { "siblings", 0, 0 }, { "fdiv_bug", 0, 3 }, { "hlt_bug", 0, 3 }, { "f00f_bug", 0, 3 }, { "coma_bug", 0, 3 }, { "fpu", 0, 0 }, /* XXX flags attribute instead. */ { "fpu_exception", 0, 3 }, { "cpuid_level", 0, 0 }, { "wp", 0, 3 }, { "flags", 0, 4 }, { "bogomips", 0, 0 }, { NULL, 0, -1 } }; static int rpmCtagFlags(char * name) { struct cpuinfo_s * ct; int flags = -1; for (ct = ctags; ct->name != NULL; ct++) { if (strcmp(ct->name, name)) continue; if (ct->done) continue; ct->done = 1; flags = ct->flags; break; } return flags; } static int rpmCpuinfo(void) { char buf[BUFSIZ]; char * f, * fe; char * g, * ge; char * t; FD_t fd = NULL; FILE * fp; int rc = -1; fd = Fopen(cpuinfo, "r.fpio"); if (fd == NULL || Ferror(fd)) goto exit; fp = fdGetFILE(fd); while((f = fgets(buf, sizeof(buf), fp)) != NULL) { /* rtrim on line. */ ge = f + strlen(f); while (--ge > f && _isspace(*ge)) *ge = '\0'; /* ltrim on line. */ while (*f && _isspace(*f)) f++; /* split on ':' */ fe = f; while (*fe && *fe != ':') fe++; if (*fe == '\0') continue; g = fe + 1; /* rtrim on field 1. */ *fe = '\0'; while (--fe > f && _isspace(*fe)) *fe = '\0'; if (*f == '\0') continue; /* ltrim on field 2. */ while (*g && _isspace(*g)) g++; if (*g == '\0') continue; for (t = f; *t != '\0'; t++) { if (_isspace(*t)) *t = '_'; } switch (rpmCtagFlags(f)) { case -1: /* not found */ case 0: /* ignore */ default: continue; break; case 1: /* Provides: cpuinfo(f) = g */ fprintf(stderr, "Provides: cpuinfo(%s) = %s\n", f, g); break; case 2: /* Provides: cpuinfo(g) */ for (t = g; *t != '\0'; t++) { if (_isspace(*t) || *t == '(' || *t == ')') *t = '_'; } fprintf(stderr, "Provides: cpuinfo(%s)\n", g); break; case 3: /* if ("yes") Provides: cpuinfo(f) */ if (strcmp(g, "yes")) break; fprintf(stderr, "Provides: cpuinfo(%s)\n", f); break; case 4: /* Provides: cpuinfo(g[i]) */ { char ** av = NULL; rc = poptParseArgvString(g, NULL, (const char ***)&av); if (!rc && av != NULL) while ((f = *av++) != NULL) { fprintf(stderr, "Provides: cpuinfo(%s)\n", f); } if (av != NULL) free(av); } break; } } exit: if (fd) (void) Fclose(fd); return rc; } int main (int argc, char *argv[]) { int rc; rc = rpmCpuinfo(); return rc; }