diff options
author | root <root@abc39116-655e-4be6-ad55-d661dc543056> | 2008-07-25 12:27:26 +0000 |
---|---|---|
committer | root <root@abc39116-655e-4be6-ad55-d661dc543056> | 2008-07-25 12:27:26 +0000 |
commit | 91a850b6d91e76c5450781b1e029c1611ef9f2e7 (patch) | |
tree | 9f93174317fd89a756eda3b3a9b597a0bae1ace1 | |
parent | dfcf0bfff41f31fd7f75df43e37e2ba7db70b362 (diff) | |
download | python-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.c | 99 | ||||
-rw-r--r-- | catsprintf.h | 54 | ||||
-rw-r--r-- | dmidecode.c | 304 | ||||
-rw-r--r-- | dmidecode.h | 5 | ||||
-rw-r--r-- | dmiopt.h | 15 | ||||
-rwxr-xr-x | example.py | 4 |
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 *_); @@ -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 @@ -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()) |