summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--catsprintf.c20
-rw-r--r--catsprintf.h5
-rw-r--r--dmidecode.c87
-rw-r--r--dmidecodemodule.c117
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;
-}
-*/