diff options
-rw-r--r-- | catsprintf.c | 20 | ||||
-rw-r--r-- | catsprintf.h | 5 | ||||
-rw-r--r-- | dmidecode.c | 87 | ||||
-rw-r--r-- | dmidecodemodule.c | 117 |
4 files changed, 97 insertions, 132 deletions
diff --git a/catsprintf.c b/catsprintf.c index 3ca8afb..c7c02e4 100644 --- a/catsprintf.c +++ b/catsprintf.c @@ -54,28 +54,36 @@ static const dmi_codes_major dmiCodesMajor[] = { }; dmi_minor* dmiAppendObject(long code, char const *key, const char *format, ...) { - static dmi_minor* next = NULL; + static dmi_minor* last = NULL; //. int minor = code&0x00FF; //. int major = code>>8; va_list arg; va_start(arg, format); - printf("\nstart: %d\n", sizeof(dmi_minor)); dmi_minor *o = (dmi_minor *)malloc(sizeof(dmi_minor)); - printf("stop\n"); o->id = code; - o->major = &(dmiCodesMajor[map_maj[code>>8]]); + o->major = &dmiCodesMajor[map_maj[code>>8]]; o->key = key; vsprintf(o->value, format, arg); - o->last = next; + o->next = last; va_end(arg); /* cleanup */ - next = o; + last = o; return o; } +int dmiSetItem(PyObject* dict, const char *key, const char *format, ...) { + va_list arg; + va_start(arg, format); + char buffer[2048]; + vsprintf(buffer, format, arg); + va_end(arg); + PyDict_SetItem(pydata, key, Py_BuildValue("s", buffer)); + return 0; +} + int catsprintf(char *buf, const char *format, ...) { if(format == NULL) { bzero(buf, strlen(buf)); diff --git a/catsprintf.h b/catsprintf.h index 46ac8e2..b4060e6 100644 --- a/catsprintf.h +++ b/catsprintf.h @@ -1,6 +1,8 @@ #ifndef CAT #define CAT 1 +#include <Python.h> + #include <stdarg.h> #include <string.h> #include <stdio.h> @@ -18,10 +20,11 @@ typedef struct _dmi_minor { dmi_codes_major* major; char *key; char value[512]; - struct _dmi_minor* last; + struct _dmi_minor* next; } dmi_minor; int catsprintf(char *buf, const char *format, ...); dmi_minor* dmiAppendObject(long code, char const *key, const char *format, ...); +int dmiSetItem(PyObject* dict, const char *key, const char *format, ...); #endif diff --git a/dmidecode.c b/dmidecode.c index df08e33..339cdc3 100644 --- a/dmidecode.c +++ b/dmidecode.c @@ -3317,11 +3317,10 @@ static char *dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, return _; } -int smbios_decode(u8 *buf, const char *devmem, char *_) { +int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata) { if(checksum(buf, buf[0x05]) && memcmp(buf+0x10, "_DMI_", 5)==0 && checksum(buf+0x10, 0x0F)) { - if(_ == NULL) return 1; if(!(opt.flags & FLAG_QUIET)) - sprintf(_, "SMBIOS %u.%u present.", buf[0x06], buf[0x07]); + dmiSetItem(pydata, "detected", "SMBIOS %u.%u present.", buf[0x06], buf[0x07]); dmi_table(DWORD(buf+0x18), WORD(buf+0x16), WORD(buf+0x1C), (buf[0x06]<<8)+buf[0x07], devmem, _); return 1; } @@ -3329,11 +3328,10 @@ int smbios_decode(u8 *buf, const char *devmem, char *_) { return 0; } -int legacy_decode(u8 *buf, const char *devmem, char *_) { +int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata) { if(checksum(buf, 0x0F)) { - if(_ == NULL) return 1; if(!(opt.flags & FLAG_QUIET)) - catsprintf(buffer, "Legacy DMI %u.%u present.", buf[0x0E]>>4, buf[0x0E]&0x0F); + dmiSetItem(pydata, "detected", "Legacy DMI %u.%u present.", buf[0x0E]>>4, buf[0x0E]&0x0F); dmi_table(DWORD(buf+0x08), WORD(buf+0x06), WORD(buf+0x0C), ((buf[0x0E]&0xF0)<<4)+(buf[0x0E]&0x0F), devmem, _); return 1; } @@ -3346,46 +3344,45 @@ int legacy_decode(u8 *buf, const char *devmem, char *_) { */ #define EFI_NOT_FOUND (-1) #define EFI_NO_SMBIOS (-2) -int address_from_efi(size_t *address) -{ - FILE *efi_systab; - const char *filename; - char linebuf[64]; - int ret; - - *address=0; /* Prevent compiler warning */ - - /* - * Linux up to 2.6.6: /proc/efi/systab - * Linux 2.6.7 and up: /sys/firmware/efi/systab - */ - if((efi_systab=fopen(filename="/sys/firmware/efi/systab", "r"))==NULL - && (efi_systab=fopen(filename="/proc/efi/systab", "r"))==NULL) - { - /* No EFI interface, fallback to memory scan */ - return EFI_NOT_FOUND; - } - ret=EFI_NO_SMBIOS; - while((fgets(linebuf, sizeof(linebuf)-1, efi_systab))!=NULL) - { - char *addrp=strchr(linebuf, '='); - *(addrp++)='\0'; - if(strcmp(linebuf, "SMBIOS")==0) - { - *address=strtoul(addrp, NULL, 0); - if(!(opt.flags & FLAG_QUIET)) - catsprintf(buffer, "# SMBIOS entry point at 0x%08lx\n", - (unsigned long)*address); - ret=0; - break; - } - } - if(fclose(efi_systab)!=0) - perror(filename); +int address_from_efi(size_t *address, char *buffer) { + FILE *efi_systab; + const char *filename; + char linebuf[64]; + int ret; - if(ret==EFI_NO_SMBIOS) - fprintf(stderr, "%s: SMBIOS entry point missing\n", filename); - return ret; + *address = 0; /* Prevent compiler warning */ + + /* + ** Linux <= 2.6.6: /proc/efi/systab + ** Linux >= 2.6.7: /sys/firmware/efi/systab + */ + if((efi_systab=fopen(filename="/sys/firmware/efi/systab", "r"))==NULL + && (efi_systab=fopen(filename="/proc/efi/systab", "r"))==NULL) { + /* No EFI interface, fallback to memory scan */ + return EFI_NOT_FOUND; + } + ret=EFI_NO_SMBIOS; + while((fgets(linebuf, sizeof(linebuf)-1, efi_systab))!=NULL) { + char *addrp=strchr(linebuf, '='); + *(addrp++)='\0'; + if(strcmp(linebuf, "SMBIOS")==0) { + *address=strtoul(addrp, NULL, 0); + if(!(opt.flags & FLAG_QUIET)) { + sprintf(buffer, "0x%08lx", (unsigned long)*address); + //printf("# SMBIOS entry point at 0x%08lx\n", (unsigned long)*address); + } + ret=0; + break; + } + } + if(fclose(efi_systab)!=0) + perror(filename); + + if(ret==EFI_NO_SMBIOS) { + //fprintf(stderr, "%s: SMBIOS entry point missing\n", filename); + sprintf(buffer, "missing"); + } + return ret; } int submain(int argc, char * const argv[]) diff --git a/dmidecodemodule.c b/dmidecodemodule.c index 36b4b04..0e77fae 100644 --- a/dmidecodemodule.c +++ b/dmidecodemodule.c @@ -6,9 +6,8 @@ static PyObject* dmidecode_get(PyObject *self, char* section) { bzero(buffer, 50000); - //Py_Initialize(); - //if(!Py_IsInitialized()) - // return NULL; + Py_Initialize(); + if(!Py_IsInitialized()) return NULL; /* int argc = 3; @@ -19,7 +18,7 @@ static PyObject* dmidecode_get(PyObject *self, char* section) { argv[3] = NULL; */ - int ret=0; /* Returned value */ + int ret=0; int found=0; size_t fp; int efi; @@ -27,7 +26,8 @@ static PyObject* dmidecode_get(PyObject *self, char* section) { if(sizeof(u8)!=1 || sizeof(u16)!=2 || sizeof(u32)!=4 || '\0'!=0) { fprintf(stderr, "%s: compiler incompatibility\n", "dmidecodemodule"); - exit(255); + //exit(255); + return NULL; } /* Set default option values */ @@ -37,52 +37,45 @@ static PyObject* dmidecode_get(PyObject *self, char* section) { opt.type=parse_opt_type(opt.type, section); if(opt.type==NULL) return NULL; + PyObject* pydata = PyDict_New(); + /* First try EFI (ia64, Intel-based Mac) */ - efi = address_from_efi(&fp); - switch(efi) { - case EFI_NOT_FOUND: - //. XXX - goto memory_scan; - case EFI_NO_SMBIOS: + char efiAddress[32]; + efi = address_from_efi(&fp, efiAddress); + dmiSetItem(pydata, "efi_address", efiAddress); + if(efi == EFI_NOT_FOUND) { + /* Fallback to memory scan (x86, x86_64) */ + if((buf=mem_chunk(0xF0000, 0x10000, opt.devmem))==NULL) { ret = 1; - goto exit_free; - } - - if((buf=mem_chunk(fp, 0x20, opt.devmem))==NULL) { - ret = 1; - goto exit_free; - } - - if(smbios_decode(buf, opt.devmem, NULL)) found++; - - goto done; - -memory_scan: - /* Fallback to memory scan (x86, x86_64) */ - if((buf=mem_chunk(0xF0000, 0x10000, opt.devmem))==NULL) { + } else { + for(fp=0; fp<=0xFFF0; fp+=16) { + if(memcmp(buf+fp, "_SM_", 4)==0 && fp<=0xFFE0) { + if(smbios_decode(buf+fp, opt.devmem, pydata)) found++; + fp+=16; + } else if(memcmp(buf+fp, "_DMI_", 5)==0) { + if(legacy_decode(buf+fp, opt.devmem, pydata)) found++; + } + } + } + } else if(efi == EFI_NO_SMBIOS) { ret = 1; - goto exit_free; - } - - for(fp=0; fp<=0xFFF0; fp+=16) { - if(memcmp(buf+fp, "_SM_", 4)==0 && fp<=0xFFE0) { - if(smbios_decode(buf+fp, opt.devmem, NULL)) found++; - fp+=16; - } else if(memcmp(buf+fp, "_DMI_", 5)==0) { - if(legacy_decode(buf+fp, opt.devmem, NULL)) found++; + } else { + if((buf=mem_chunk(fp, 0x20, opt.devmem))==NULL) { + ret = 1; + } else { + if(smbios_decode(buf, opt.devmem, pydata)) found++; } } -done: - free(buf); + if(ret==0) { + free(buf); - if(!found && !(opt.flags & FLAG_QUIET)) - catsprintf(buffer, -1, "# No SMBIOS nor DMI entry point found, sorry.\n"); + if(!found && !(opt.flags & FLAG_QUIET)) + dmiSetItem(pydata, "detect", "No SMBIOS nor DMI entry point found, sorry G."); + } -exit_free: - //Py_Finalize(); + Py_Finalize(); - //. FIXME: Why does this cause crash? free(opt.type); /* @@ -98,6 +91,8 @@ exit_free: } }*/ + if(ret == 1) return NULL; + PyObject* data = PyDict_New(); char *nextLine = strtok(buffer, "\n"); @@ -147,41 +142,3 @@ PyMethodDef DMIDataMethods[] = { PyMODINIT_FUNC initdmidecode(void) { (void) Py_InitModule("dmidecode", DMIDataMethods); } - - -/* -static PyObject* dmidecode_xget(PyObject *self, PyObject *args) { - bzero(buffer, 50000); - - PyObject *list = PyList_New(0); - - //const char *command; - //if(!PyArg_ParseTuple(args, "s", &command)) - // return NULL; - - //for(i=0; i<len(args); i++) - // PyList_Append(list, Py_BuildValue("s", args[i])); - // PyList_Append(list, PyInt_FromLong(3)); - // PyList_Append(list, PyInt_FromLong(4)); - //PyList_Append(list, Py_BuildValue("s", command)); - - int i; - int argc = PySequence_Size(args) + 1; //. 1 for $0, 1 for trailing NULL - char *argv[argc+1]; - argv[0] = "dmidecode"; - for(i=1; i<argc; i++) { - argv[i] = PyString_AS_STRING(PySequence_ITEM(args, i-1)); - PyList_Append(list, PySequence_ITEM(args, i-1)); - } - argv[argc] = NULL; - - for(i=0; i<argc; i++) printf(">>> %d: %s\n", i, argv[i]); - submain(buffer, argc, argv); - PyList_Append(list, PyUnicode_Splitlines(Py_BuildValue("s", buffer), 1)); - - //PyList_Append(list, PySequence_List(args)); - //PyList_Append(list, Py_BuildValue("i", PySequence_Size(args))); - - return list; -} -*/ |