summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@abc39116-655e-4be6-ad55-d661dc543056>2008-07-25 12:27:26 +0000
committerroot <root@abc39116-655e-4be6-ad55-d661dc543056>2008-07-25 12:27:26 +0000
commit91a850b6d91e76c5450781b1e029c1611ef9f2e7 (patch)
tree9f93174317fd89a756eda3b3a9b597a0bae1ace1
parentdfcf0bfff41f31fd7f75df43e37e2ba7db70b362 (diff)
downloadpython-dmidecode-91a850b6d91e76c5450781b1e029c1611ef9f2e7.tar.gz
python-dmidecode-91a850b6d91e76c5450781b1e029c1611ef9f2e7.tar.xz
python-dmidecode-91a850b6d91e76c5450781b1e029c1611ef9f2e7.zip
Next phase is to start converting all pure C functions returning `char *' and
such to new Pythonized functions returning `PyObject *', to save from having to `PyString_FromString()' and similar, and more importantly, some functions return a long string that could better be represented by a PyDict, PyList etc. This is the first commit of many more to come, converting a `case XX:' at a time, making sure that each commit can actually compile and run. git-svn-id: svn://svn.autonomy.net.au/python-dmidecode@21 abc39116-655e-4be6-ad55-d661dc543056
-rw-r--r--catsprintf.c99
-rw-r--r--catsprintf.h54
-rw-r--r--dmidecode.c304
-rw-r--r--dmidecode.h5
-rw-r--r--dmiopt.h15
-rwxr-xr-xexample.py4
6 files changed, 302 insertions, 179 deletions
diff --git a/catsprintf.c b/catsprintf.c
index c8f74fc..aee5cdf 100644
--- a/catsprintf.c
+++ b/catsprintf.c
@@ -1,59 +1,6 @@
#include <stdio.h>
#include "catsprintf.h"
-static const int map_maj[] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
- 126, 127
-};
-
-static const dmi_codes_major dmiCodesMajor[] = {
- { 0, "3.3.1", "BIOS Information" },
- { 1, "3.3.2", "System Information" },
- { 2, "3.3.3", "Base Board Information" },
- { 3, "3.3.4", "Chassis Information" },
- { 4, "3.3.5", "Processor Information" },
- { 5, "3.3.6", "Memory Controller Information" },
- { 6, "3.3.7", "Memory Module Information" },
- { 7, "3.3.8", "Cache Information" },
- { 8, "3.3.9", "Port Connector Information" },
- { 9, "3.3.10", "System Slots" },
- { 10, "3.3.11", "On Board Devices Information" },
- { 11, "3.3.12", "OEM Strings" },
- { 12, "3.3.13", "System Configuration Options" },
- { 13, "3.3.14", "BIOS Language Information" },
- { 14, "3.3.15", "Group Associations" },
- { 15, "3.3.16", "System Event Log" },
- { 16, "3.3.17", "Physical Memory Array" },
- { 17, "3.3.18", "Memory Device" },
- { 18, "3.3.19", "32-bit Memory Error Information" },
- { 19, "3.3.20", "Memory Array Mapped Address" },
- { 20, "3.3.21", "Memory Device Mapped Address" },
- { 21, "3.3.22", "Built-in Pointing Device" },
- { 22, "3.3.23", "Portable Battery" },
- { 23, "3.3.24", "System Reset" },
- { 24, "3.3.25", "Hardware Security" },
- { 25, "3.3.26", "System Power Controls" },
- { 26, "3.3.27", "Voltage Probe" },
- { 27, "3.3.28", "Cooling Device" },
- { 28, "3.3.29", "Temperature Probe" },
- { 29, "3.3.30", "Electrical Current Probe" },
- { 30, "3.3.31", "Out-of-band Remote Access" },
- { 31, "3.3.32", "Boot Integrity Services Entry Point" },
- { 32, "3.3.33", "System Boot Information" },
- { 33, "3.3.34", "64-bit Memory Error Information" },
- { 34, "3.3.35", "Management Device" },
- { 35, "3.3.36", "Management Device Component" },
- { 36, "3.3.37", "Management Device Threshold Data" },
- { 37, "3.3.38", "Memory Channel" },
- { 38, "3.3.39", "IPMI Device Information" },
- { 39, "3.3.40", "System Power Supply" },
- { 126, "3.3.41", "Inactive" },
- { 127, "3.3.42", "End Of Table" },
-};
-
dmi_minor* dmiAppendObject(long code, char const *key, const char *format, ...) {
static dmi_minor* last = NULL;
@@ -83,6 +30,52 @@ dmi_minor* dmiAppendObject(long code, char const *key, const char *format, ...)
return o;
}
+void dmiAppendData(PyObject *pydata, const int count) {
+ dmi_minor* last = dmiAppendObject(count, "JUNK", "NODATA");
+
+ const char *id = last->major->id;
+ PyObject *_key, *_val;
+
+ PyObject *pymajor = PyDict_New();
+
+ _key = PyString_FromString("code");
+ _val = PyInt_FromLong((long)last->major->code);
+ PyDict_SetItem(pymajor, _key, _val);
+ Py_DECREF(_key);
+ Py_DECREF(_val);
+
+ _key = PyString_FromString("id");
+ _val = PyString_FromString(last->major->id);
+ PyDict_SetItem(pymajor, _key, _val);
+ Py_DECREF(_key);
+ Py_DECREF(_val);
+
+ _key = PyString_FromString("name");
+ _val = PyString_FromString(last->major->desc);
+ PyDict_SetItem(pymajor, _key, _val);
+ Py_DECREF(_key);
+ Py_DECREF(_val);
+
+ PyObject *pyminor = PyDict_New();
+ while((last = last->next)) {
+ //printf("%d:<%s, %s> | %ld:[%s => %s]\n", last->major->code, last->major->id, last->major->desc, last->id, last->key, last->value);
+ _key = PyString_FromString(last->key);
+ _val = PyString_FromString(last->value);
+ PyDict_SetItem(pyminor, _key, _val);
+ Py_DECREF(_key);
+ Py_DECREF(_val);
+ }
+ _key = PyString_FromString("data");
+ PyDict_SetItem(pymajor, _key, pyminor);
+ Py_DECREF(_key);
+ Py_DECREF(pyminor);
+
+ _key = PyString_FromString(id);
+ PyDict_SetItem(pydata, _key, pymajor);
+ Py_DECREF(_key);
+ Py_DECREF(pymajor);
+}
+
int dmiSetItem(PyObject* dict, const char *key, const char *format, ...) {
va_list arg;
va_start(arg, format);
diff --git a/catsprintf.h b/catsprintf.h
index bab2e2c..0ca5065 100644
--- a/catsprintf.h
+++ b/catsprintf.h
@@ -11,12 +11,65 @@
#define MAXVAL 1024
+static const int map_maj[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 126, 127
+};
+
typedef struct _dmi_codes_major {
const unsigned short code;
const char *id;
const char *desc;
} dmi_codes_major;
+static const dmi_codes_major dmiCodesMajor[] = {
+ { 0, "3.3.1", "BIOS Information" },
+ { 1, "3.3.2", "System Information" },
+ { 2, "3.3.3", "Base Board Information" },
+ { 3, "3.3.4", "Chassis Information" },
+ { 4, "3.3.5", "Processor Information" },
+ { 5, "3.3.6", "Memory Controller Information" },
+ { 6, "3.3.7", "Memory Module Information" },
+ { 7, "3.3.8", "Cache Information" },
+ { 8, "3.3.9", "Port Connector Information" },
+ { 9, "3.3.10", "System Slots" },
+ { 10, "3.3.11", "On Board Devices Information" },
+ { 11, "3.3.12", "OEM Strings" },
+ { 12, "3.3.13", "System Configuration Options" },
+ { 13, "3.3.14", "BIOS Language Information" },
+ { 14, "3.3.15", "Group Associations" },
+ { 15, "3.3.16", "System Event Log" },
+ { 16, "3.3.17", "Physical Memory Array" },
+ { 17, "3.3.18", "Memory Device" },
+ { 18, "3.3.19", "32-bit Memory Error Information" },
+ { 19, "3.3.20", "Memory Array Mapped Address" },
+ { 20, "3.3.21", "Memory Device Mapped Address" },
+ { 21, "3.3.22", "Built-in Pointing Device" },
+ { 22, "3.3.23", "Portable Battery" },
+ { 23, "3.3.24", "System Reset" },
+ { 24, "3.3.25", "Hardware Security" },
+ { 25, "3.3.26", "System Power Controls" },
+ { 26, "3.3.27", "Voltage Probe" },
+ { 27, "3.3.28", "Cooling Device" },
+ { 28, "3.3.29", "Temperature Probe" },
+ { 29, "3.3.30", "Electrical Current Probe" },
+ { 30, "3.3.31", "Out-of-band Remote Access" },
+ { 31, "3.3.32", "Boot Integrity Services Entry Point" },
+ { 32, "3.3.33", "System Boot Information" },
+ { 33, "3.3.34", "64-bit Memory Error Information" },
+ { 34, "3.3.35", "Management Device" },
+ { 35, "3.3.36", "Management Device Component" },
+ { 36, "3.3.37", "Management Device Threshold Data" },
+ { 37, "3.3.38", "Memory Channel" },
+ { 38, "3.3.39", "IPMI Device Information" },
+ { 39, "3.3.40", "System Power Supply" },
+ { 126, "3.3.41", "Inactive" },
+ { 127, "3.3.42", "End Of Table" },
+};
+
typedef struct _dmi_minor {
long id;
dmi_codes_major* major;
@@ -26,6 +79,7 @@ typedef struct _dmi_minor {
} dmi_minor;
int catsprintf(char *buf, const char *format, ...);
+void dmiAppendData(PyObject *pydata, const int count);
dmi_minor* dmiAppendObject(long code, char const *key, const char *format, ...);
int dmiSetItem(PyObject* dict, const char *key, const char *format, ...);
diff --git a/dmidecode.c b/dmidecode.c
index d81662a..28614d6 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -47,6 +47,8 @@
* http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25481.pdf
*/
+#include <Python.h>
+
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -70,6 +72,30 @@ static const char *bad_index = "<BAD INDEX>";
** Type-independant Stuff
*/
+PyObject *dmi_string_py(struct dmi_header *dm, u8 s) {
+ char *bp=(char *)dm->data;
+ size_t i, len;
+
+ if(s==0) return PyString_FromString("Not Specified");
+
+ bp += dm->length;
+ while(s>1 && *bp) {
+ bp += strlen(bp);
+ bp++;
+ s--;
+ }
+
+ if(!*bp) return PyString_FromString(bad_index);
+
+ /* ASCII filtering */
+ len=strlen(bp);
+ for(i=0; i<len; i++)
+ if(bp[i]<32 || bp[i]==127)
+ bp[i]='.';
+
+ return PyString_FromString(bp);
+}
+
const char *dmi_string(struct dmi_header *dm, u8 s) {
char *bp=(char *)dm->data;
size_t i, len;
@@ -94,6 +120,9 @@ const char *dmi_string(struct dmi_header *dm, u8 s) {
return bp;
}
+
+
+
static const char *dmi_smbios_structure_type(u8 code) {
static const char *type[]={
"BIOS", /* 0 */
@@ -424,17 +453,21 @@ const char *dmi_chassis_type(u8 code) {
return out_of_spec;
}
-static const char *dmi_chassis_lock(u8 code) {
- static const char *lock[]={
+PyObject *dmi_chassis_type_py(u8 code) {
+ return PyString_FromString(dmi_chassis_type(code));
+}
+
+static PyObject *dmi_chassis_lock(u8 code) {
+ static const char *lock[] = {
"Not Present", /* 0x00 */
"Present" /* 0x01 */
};
- return lock[code];
+ return PyString_FromString(lock[code]);
}
/* 3.3.4.2 */
-static const char *dmi_chassis_state(u8 code) {
+PyObject *dmi_chassis_state(u8 code) {
static const char *state[]={
"Other", /* 0x01 */
"Unknown",
@@ -445,8 +478,8 @@ static const char *dmi_chassis_state(u8 code) {
};
if(code>=0x01 && code<=0x06)
- return(state[code-0x01]);
- return out_of_spec;
+ return PyString_FromString(state[code-0x01]);
+ return PyString_FromString(out_of_spec);
}
/* 3.3.4.3 */
@@ -464,16 +497,14 @@ static const char *dmi_chassis_security_status(u8 code) {
return out_of_spec;
}
-static const char *dmi_chassis_height(u8 code, char *_) {
- if(code==0x00) sprintf(_, "Unspecified");
- else sprintf(_, "%u U", code);
- return _;
+PyObject *dmi_chassis_height(u8 code) {
+ if(code==0x00) return PyString_FromString("Unspecified");
+ else return PyString_FromFormat("%u U", code);
}
-static const char *dmi_chassis_power_cords(u8 code, char *_) {
- if(code==0x00) sprintf(_, "Unspecified");
- else sprintf(_, "%u", code);
- return _;
+PyObject *dmi_chassis_power_cords(u8 code) {
+ if(code==0x00) return PyString_FromString("Unspecified");
+ else return PyString_FromFormat("%u", code);
}
static const char *dmi_chassis_elements(u8 count, u8 len, u8 *p, char *_) {
@@ -1561,21 +1592,36 @@ static const char *dmi_on_board_devices_type(u8 code) {
return out_of_spec;
}
-static const char *dmi_on_board_devices(struct dmi_header *h, char *_) {
- u8 *p=h->data+4;
- u8 count=(h->length-0x04)/2;
+static PyObject *dmi_on_board_devices(struct dmi_header *h) {
+ PyObject *data = NULL;
+ u8 *p = h->data+4;
+ u8 count = (h->length-0x04)/2;
int i;
- for(i=0; i<count; i++) {
- if(count==1) sprintf(_, "On Board Device Information|");
- else sprintf(_, "On Board Device %d Information|", i+1);
- catsprintf(_, "Type: %s|", dmi_on_board_devices_type(p[2*i]&0x7F));
- catsprintf(_, "Status: %s|", p[2*i]&0x80?"Enabled":"Disabled");
- catsprintf(_, "Description: %s|", dmi_string(h, p[2*i+1]));
+ if((data = PyList_New(count))) {
+ PyObject *_pydict;
+ PyObject *_val;
+ for(i=0; i<count; i++) {
+ _pydict = PyDict_New();
+
+ _val = PyString_FromString(dmi_on_board_devices_type(p[2*i]&0x7F));
+ PyDict_SetItemString(_pydict, "Type", _val);
+ Py_DECREF(_val);
+
+ _val = p[2*i]&0x80?Py_True:Py_False;
+ PyDict_SetItemString(_pydict, "Enabled", _val);
+ Py_DECREF(_val);
+
+ _val = PyString_FromString(dmi_string(h, p[2*i+1]));
+ PyDict_SetItemString(_pydict, "Description", _val);
+ Py_DECREF(_val);
+
+ PyList_SET_ITEM(data, i, _pydict);
+ }
}
- return _;
-}
+ return data;
+}
/*******************************************************************************
* 3.3.12 OEM Strings (Type 11)
*/
@@ -2597,6 +2643,8 @@ void dmi_decode(struct dmi_header *h, u16 ver, PyObject* pydata) {
//. 0xF1 --> 0xF100
int minor = h->type<<8;
char _[2048]; bzero(_, 2048);
+ int NEW_METHOD = 0;
+ dmi_codes_major *dmiMajor = (dmi_codes_major *)&dmiCodesMajor[map_maj[h->type]];
/* TODO: DMI types 37 and 39 are untested */
@@ -2605,88 +2653,37 @@ void dmi_decode(struct dmi_header *h, u16 ver, PyObject* pydata) {
dmiAppendObject(++minor, "BIOS Information", NULL);
- while(1) {
-
- if(h->length<0x12) break;
-
- dmiAppendObject(++minor, "Vendor", dmi_string(h, data[0x04]));
- dmiAppendObject(++minor, "Version", dmi_string(h, data[0x05]));
- dmiAppendObject(++minor, "Release Date", dmi_string(h, data[0x08]));
-
- /*
- * On IA-64, the BIOS base address will read 0 because
- * there is no BIOS. Skip the base address and the
- * runtime size in this case.
- */
-
- if(WORD(data+0x06)!=0) {
- dmiAppendObject(++minor, "Address", "0x%04X0", WORD(data+0x06));
- dmiAppendObject(++minor, "Runtime Size", dmi_bios_runtime_size((0x10000-WORD(data+0x06))<<4, _));
- }
-
- dmiAppendObject(++minor, "ROM Size", "%u kB", (data[0x09]+1)<<6);
- dmiAppendObject(++minor, "Characteristics", dmi_bios_characteristics(QWORD(data+0x0A), _));
-
- if(h->length<0x13) break;
- dmiAppendObject(++minor, "Characteristics x1", dmi_bios_characteristics_x1(data[0x12], _));
+ if(h->length<0x12) break;
- if(h->length<0x14) break;
- dmiAppendObject(++minor, "Characteristics x2", dmi_bios_characteristics_x2(data[0x13], _));
+ dmiAppendObject(++minor, "Vendor", dmi_string(h, data[0x04]));
+ dmiAppendObject(++minor, "Version", dmi_string(h, data[0x05]));
+ dmiAppendObject(++minor, "Release Date", dmi_string(h, data[0x08]));
- if(h->length<0x18) break;
- if(data[0x14]!=0xFF && data[0x15]!=0xFF)
- dmiAppendObject(++minor, "BIOS Revision", "%u.%u", data[0x14], data[0x15]);
- if(data[0x16]!=0xFF && data[0x17]!=0xFF)
- dmiAppendObject(++minor, "Firmware Revision", "%u.%u", data[0x16], data[0x17]);
+ /*
+ * On IA-64, the BIOS base address will read 0 because
+ * there is no BIOS. Skip the base address and the
+ * runtime size in this case.
+ */
+
+ if(WORD(data+0x06)!=0) {
+ dmiAppendObject(++minor, "Address", "0x%04X0", WORD(data+0x06));
+ dmiAppendObject(++minor, "Runtime Size", dmi_bios_runtime_size((0x10000-WORD(data+0x06))<<4, _));
}
+ dmiAppendObject(++minor, "ROM Size", "%u kB", (data[0x09]+1)<<6);
+ dmiAppendObject(++minor, "Characteristics", dmi_bios_characteristics(QWORD(data+0x0A), _));
- /********************************************************************************/
- dmi_minor* last = dmiAppendObject(++minor, "JUNK", "NODATA");
-
- const char *id = last->major->id;
- PyObject *_key, *_val;
-
- PyObject *pymajor = PyDict_New();
-
- _key = PyString_FromString("code");
- _val = PyInt_FromLong((long)last->major->code);
- PyDict_SetItem(pymajor, _key, _val);
- Py_DECREF(_key);
- Py_DECREF(_val);
-
- _key = PyString_FromString("id");
- _val = PyString_FromString(last->major->id);
- PyDict_SetItem(pymajor, _key, _val);
- Py_DECREF(_key);
- Py_DECREF(_val);
-
- _key = PyString_FromString("name");
- _val = PyString_FromString(last->major->desc);
- PyDict_SetItem(pymajor, _key, _val);
- Py_DECREF(_key);
- Py_DECREF(_val);
-
- PyObject *pyminor = PyDict_New();
- while((last = last->next)) {
- //printf("%d:<%s, %s> | %ld:[%s => %s]\n", last->major->code, last->major->id, last->major->desc, last->id, last->key, last->value);
- _key = PyString_FromString(last->key);
- _val = PyString_FromString(last->value);
- PyDict_SetItem(pyminor, _key, _val);
- Py_DECREF(_key);
- Py_DECREF(_val);
- }
- _key = PyString_FromString("data");
- PyDict_SetItem(pymajor, _key, pyminor);
- Py_DECREF(_key);
- Py_DECREF(pyminor);
+ if(h->length<0x13) break;
+ dmiAppendObject(++minor, "Characteristics x1", dmi_bios_characteristics_x1(data[0x12], _));
- _key = PyString_FromString(id);
- PyDict_SetItem(pydata, _key, pymajor);
- Py_DECREF(_key);
- Py_DECREF(pymajor);
+ if(h->length<0x14) break;
+ dmiAppendObject(++minor, "Characteristics x2", dmi_bios_characteristics_x2(data[0x13], _));
- /********************************************************************************/
+ if(h->length<0x18) break;
+ if(data[0x14]!=0xFF && data[0x15]!=0xFF)
+ dmiAppendObject(++minor, "BIOS Revision", "%u.%u", data[0x14], data[0x15]);
+ if(data[0x16]!=0xFF && data[0x17]!=0xFF)
+ dmiAppendObject(++minor, "Firmware Revision", "%u.%u", data[0x16], data[0x17]);
break;
@@ -2725,28 +2722,86 @@ void dmi_decode(struct dmi_header *h, u16 ver, PyObject* pydata) {
break;
case 3: /* 3.3.4 Chassis Information */
- dmiAppendObject(++minor, "Chassis Information", NULL);
+ NEW_METHOD = 1;
+
+ PyObject *_pylist3 = PyList_New(3);
+ PyList_SET_ITEM(_pylist3, 0, PyString_FromString(dmiMajor->id));
+ PyList_SET_ITEM(_pylist3, 1, PyString_FromString(dmiMajor->desc));
+
+ PyObject *_pydict = PyDict_New();
+ PyObject *_val;
+
if(h->length<0x09) break;
- dmiAppendObject(++minor, "Manufacturer", dmi_string(h, data[0x04]));
- dmiAppendObject(++minor, "Type", dmi_chassis_type(data[0x05]&0x7F));
- dmiAppendObject(++minor, "Lock", dmi_chassis_lock(data[0x05]>>7));
- dmiAppendObject(++minor, "Version", dmi_string(h, data[0x06]));
- dmiAppendObject(++minor, "Serial Number", dmi_string(h, data[0x07]));
- dmiAppendObject(++minor, "Asset Tag", dmi_string(h, data[0x08]));
+ _val = dmi_string_py(h, data[0x04]);
+ PyDict_SetItemString(_pydict, "Manufacturer", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_chassis_type_py(data[0x05]&0x7F);
+ PyDict_SetItemString(_pydict, "Type", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_chassis_lock(data[0x05]>>7);
+ PyDict_SetItemString(_pydict, "Lock", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_string_py(h, data[0x06]);
+ PyDict_SetItemString(_pydict, "Version", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_string_py(h, data[0x07]);
+ PyDict_SetItemString(_pydict, "Serial Number", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_string_py(h, data[0x08]);
+ PyDict_SetItemString(_pydict, "Asset Tag", _val);
+ Py_DECREF(_val);
+
if(h->length<0x0D) break;
- dmiAppendObject(++minor, "Boot-up State", dmi_chassis_state(data[0x09]));
- dmiAppendObject(++minor, "Power Supply State", dmi_chassis_state(data[0x0A]));
- dmiAppendObject(++minor, "Thermal State", dmi_chassis_state(data[0x0B]));
- dmiAppendObject(++minor, "Security Status", dmi_chassis_security_status(data[0x0C]));
+ _val = dmi_chassis_state(data[0x09]);
+ PyDict_SetItemString(_pydict, "Boot-Up State", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_string_py(h, data[0x09]);
+ PyDict_SetItemString(_pydict, "", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_chassis_state(data[0x0A]);
+ PyDict_SetItemString(_pydict, "Power Supply State", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_chassis_state(data[0x0B]);
+ PyDict_SetItemString(_pydict, "Thermal State", _val);
+ Py_DECREF(_val);
+
+ _val = PyString_FromString(dmi_chassis_security_status(data[0x0C]));
+ PyDict_SetItemString(_pydict, "Security Status", _val);
+ Py_DECREF(_val);
+
if(h->length<0x11) break;
- dmiAppendObject(++minor, "OEM Information", "0x%08X", DWORD(data+0x0D));
+ _val = PyString_FromFormat("0x%08X", DWORD(data+0x0D));
+ PyDict_SetItemString(_pydict, "OEM Information", _val);
+ Py_DECREF(_val);
+
if(h->length<0x15) break;
- dmiAppendObject(++minor, "Height", dmi_chassis_height(data[0x11], _));
- dmiAppendObject(++minor, "Number Of Power Cords", dmi_chassis_power_cords(data[0x12], _));
+ _val = dmi_chassis_height(data[0x11]);
+ PyDict_SetItemString(_pydict, "Height", _val);
+ Py_DECREF(_val);
+
+ _val = dmi_chassis_power_cords(data[0x12]);
+ PyDict_SetItemString(_pydict, "Number Of Power Cords", _val);
+ Py_DECREF(_val);
+
+ //. FIXME: Clean this block - Elements is not quite right, also
+ //. FIXME: dmi_chassis_elements should return PyObject when we know
+ //. FIXME: what the hell it is doing.
if(h->length<0x15+data[0x13]*data[0x14]) break;
- dmiAppendObject(++minor, ">>Number Of Power Cords", dmi_chassis_elements(data[0x13], data[0x14], data+0x15, _));
+ _val = PyString_FromString(dmi_chassis_elements(data[0x13], data[0x14], data+0x15, _));
+ PyDict_SetItemString(_pydict, "Elements", _val);
+ Py_DECREF(_val);
+
break;
+
case 4: /* 3.3.5 Processor Information */
dmiAppendObject(++minor, "Processor Information", NULL);
if(h->length<0x1A) break;
@@ -2857,7 +2912,18 @@ void dmi_decode(struct dmi_header *h, u16 ver, PyObject* pydata) {
break;
case 10: /* 3.3.11 On Board Devices Information */
- dmiAppendObject(++minor, "On Board Devices Information", dmi_on_board_devices(h, _));
+ NEW_METHOD = 1;
+
+ PyObject *_pylist10 = PyList_New(3);
+
+ PyList_SET_ITEM(_pylist10, 0, PyString_FromString(dmiMajor->id));
+ PyList_SET_ITEM(_pylist10, 1, PyString_FromString(dmiMajor->desc));
+ PyList_SET_ITEM(_pylist10, 2, dmi_on_board_devices(h));
+
+ PyObject *_key = PyInt_FromLong(h->type);
+ PyDict_SetItem(pydata, _key, _pylist10);
+ Py_DECREF(_key);
+
break;
case 11: /* 3.3.12 OEM Strings */
@@ -3255,6 +3321,10 @@ void dmi_decode(struct dmi_header *h, u16 ver, PyObject* pydata) {
catsprintf(_, "%s Type", h->type>=128?"OEM-specific":"Unknown");
catsprintf(_, "%s", dmi_dump(h, _));
}
+
+ //. All the magic of python dict additions happens here...
+ if(!NEW_METHOD)
+ dmiAppendData(pydata, ++minor);
}
void to_dmi_header(struct dmi_header *h, u8 *data) {
@@ -3357,7 +3427,7 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, P
}
}
- PyDict_SetItem(pydata, PyString_FromString(hid), hDict);
+ //. TODO: PyDict_SetItem(pydata, PyString_FromString(hid), hDict);
data=next;
i++;
diff --git a/dmidecode.h b/dmidecode.h
index 7aea58c..2479728 100644
--- a/dmidecode.h
+++ b/dmidecode.h
@@ -35,7 +35,12 @@ int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata);
const char *dmi_string(struct dmi_header *dm, u8 s);
const char *dmi_system_uuid(u8 *p, char *_);
+PyObject *dmi_chassis_height(u8 code);
+PyObject *dmi_string_py(struct dmi_header *dm, u8 s);
+PyObject *dmi_chassis_state(u8 code);
const char *dmi_chassis_type(u8 code);
+PyObject *dmi_chassis_type_py(u8 code);
+PyObject *dmi_chassis_power_cords(u8 code);
const char *dmi_processor_family(u8 code);
const char *dmi_processor_frequency(u8 *p, char *_);
diff --git a/dmiopt.h b/dmiopt.h
index af4cbe4..667ff9a 100644
--- a/dmiopt.h
+++ b/dmiopt.h
@@ -19,13 +19,14 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-struct string_keyword
-{
- const char *keyword;
- u8 type;
- u8 offset;
- const char *(*lookup)(u8);
- const char *(*print)(u8 *, char *);
+#include <Python.h>
+
+struct string_keyword {
+ const char *keyword;
+ u8 type;
+ u8 offset;
+ const char *(*lookup)(u8);
+ const char *(*print)(u8 *, char *);
};
struct opt
diff --git a/example.py b/example.py
index f39b2d1..d6f5669 100755
--- a/example.py
+++ b/example.py
@@ -10,8 +10,8 @@ def l(x):
import dmidecode, time
#print(dir(dmidecode))
-print "bios\n", l(dmidecode.bios())
-#print "proc\n", l(dmidecode.processor())
+print "bios\n", l(dmidecode.bios()['3.3.1']['data'])
+print "proc\n", l(dmidecode.processor())
#print "sys\n", l(dmidecode.system())
#print "bios\n", l(dmidecode.bios())