diff options
author | Nima Talebi <nima@autonomy.net.au> | 2009-05-24 00:26:23 +1000 |
---|---|---|
committer | Nima Talebi <nima@autonomy.net.au> | 2009-05-24 00:26:23 +1000 |
commit | af27ba4dd2ffdef8e4ee3abf187475c1b3303f71 (patch) | |
tree | e81421584332fb363e7b5ba22fecd585b083226e | |
parent | 6b1598c8b98699b115525155b43d19365e79dd08 (diff) | |
download | python-dmidecode-af27ba4dd2ffdef8e4ee3abf187475c1b3303f71.tar.gz python-dmidecode-af27ba4dd2ffdef8e4ee3abf187475c1b3303f71.tar.xz python-dmidecode-af27ba4dd2ffdef8e4ee3abf187475c1b3303f71.zip |
Completed preliminary reimplementation of type()
Updated test unit to match.
Throw an exception instead of returning None/False in some
functions.
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/dmidecodemodule.c | 14 | ||||
-rw-r--r-- | src/dmixml.c | 30 | ||||
-rw-r--r-- | src/dmixml.h | 1 | ||||
-rw-r--r-- | src/util.c | 7 | ||||
-rw-r--r-- | src/util.h | 2 | ||||
-rw-r--r-- | src/xmlpythonizer.c | 35 | ||||
-rwxr-xr-x | unit-tests/unit | 2 |
8 files changed, 72 insertions, 21 deletions
@@ -39,7 +39,7 @@ vpath % $(OBJ_D) ifeq (0,1) TEMP: sudo make install - sudo python -c 'import dmidecode; print "-"*80; print dmidecode.slot(); print "-"*80; print dmidecode.type(1)' + sudo python -c 'import dmidecode; print "-"*80; print dmidecode.slot(); print "-"*80; print dmidecode.type(9)' endif ############################################################################### diff --git a/src/dmidecodemodule.c b/src/dmidecodemodule.c index 1b56837..82f2de7 100644 --- a/src/dmidecodemodule.c +++ b/src/dmidecodemodule.c @@ -360,6 +360,8 @@ static PyObject *dmidecode_get_slot(PyObject * self, PyObject * args) static PyObject *dmidecode_get_type(PyObject * self, PyObject * args) { long unsigned int lu; + char msg[8194]; + int e = 0; if(PyArg_ParseTuple(args, (char *)"i", &lu)) { if(lu < 256) { @@ -368,9 +370,17 @@ static PyObject *dmidecode_get_type(PyObject * self, PyObject * args) sprintf(s, "%lu", lu); return dmidecode_get(self, s); } - return Py_False; + e = 1; + //return Py_False; } - return Py_None; + e = 2; + //return Py_None; + + if(e == 1) snprintf(msg, 8193, "Types are bound between 0 and 255 (inclusive)%c", 0); + else snprintf(msg, 8193, "Invalid type identifier%c", 0); + + PyErr_SetString(PyExc_SystemError, msg); + return NULL; } static PyObject *dmidecode_dump(PyObject * self, PyObject * null) diff --git a/src/dmixml.c b/src/dmixml.c index dbca0c3..f98c338 100644 --- a/src/dmixml.c +++ b/src/dmixml.c @@ -179,6 +179,36 @@ char *dmixml_GetAttrValue(xmlNode *node, const char *key) { return NULL; } +xmlNode *dmixml_FindNodeByAttr(xmlNode *node, const char *key, const char *val) { + xmlNode *ptr_n = NULL; + xmlChar *key_s = NULL; + xmlChar *val_s = NULL; + xmlChar *_val_s = NULL; + + if( node->children == NULL ) { + return NULL; + } + + key_s = xmlCharStrdup(key); + assert( key_s != NULL ); + val_s = xmlCharStrdup(val); + assert( val_s != NULL ); + + for( ptr_n = node->children; ptr_n != NULL; ptr_n = ptr_n->next ) { + _val_s = xmlCharStrdup(dmixml_GetAttrValue(ptr_n, (const char *)key_s)); + if( (ptr_n->type == XML_ELEMENT_NODE) + && (xmlStrcmp(val_s, _val_s) == 0) ) { + free(val_s); val_s = NULL; + free(key_s); key_s = NULL; + return ptr_n; + } + free(_val_s); + } + free(key_s); key_s = NULL; + free(val_s); val_s = NULL; + return NULL; +} + xmlNode *dmixml_FindNode(xmlNode *node, const char *key) { xmlNode *ptr_n = NULL; xmlChar *key_s = NULL; diff --git a/src/dmixml.h b/src/dmixml.h index b1d86c6..b1ca6d9 100644 --- a/src/dmixml.h +++ b/src/dmixml.h @@ -35,6 +35,7 @@ xmlNode *dmixml_AddTextChild(xmlNode *node, const char *tagname, const char *fmt xmlNode *dmixml_AddTextContent(xmlNode *node, const char *fmt, ...); char *dmixml_GetAttrValue(xmlNode *node, const char *key); +xmlNode *dmixml_FindNodeByAttr(xmlNode *node, const char *key, const char *val); xmlNode *dmixml_FindNode(xmlNode *, const char *key); inline char *dmixml_GetContent(xmlNode *node); inline char *dmixml_GetNodeContent(xmlNode *node, const char *key); @@ -190,11 +190,12 @@ int write_dump(size_t base, size_t len, const void *data, const char *dumpfile, return -1; } -int is_int(const char *s) +long is_int(const char *s) { + long i = strtol(s, (char **)NULL, 10); char _s[3]; - snprintf(_s, 3, "%ld", strtol(s, (char **)NULL, 10)); - return !strcmp(s, _s); + snprintf(_s, 3, "%ld", i); + return strcmp(s, _s)==0 ? i : -1; } @@ -28,4 +28,4 @@ int checksum(const u8 * buf, size_t len); void *mem_chunk(size_t base, size_t len, const char *devmem); int write_dump(size_t base, size_t len, const void *data, const char *dumpfile, int add); -int is_int(const char *s); +long is_int(const char *s); diff --git a/src/xmlpythonizer.c b/src/xmlpythonizer.c index ea78b94..836e4da 100644 --- a/src/xmlpythonizer.c +++ b/src/xmlpythonizer.c @@ -339,22 +339,29 @@ ptzMAP *dmiMAP_ParseMappingXML(xmlDoc *xmlmap, const char *mapname) { return NULL; } - if(!is_int(mapname)) { - // Find the <Mapping> section matching our request (mapname) - for( node = node->children->next; node != NULL; node = node->next ) { - if( xmlStrcmp(node->name, (xmlChar *) "Mapping") == 0) { - char *name = dmixml_GetAttrValue(node, "name"); - if( (name != NULL) && (strcmp(name, mapname) == 0) ) { - break; - } + int type_id = is_int(mapname); + if(type_id > -1) { + //FIXME + char *python_xml_typemap = strdup(PYTHON_XML_TYPEMAP); + xmlDoc *typemappingxml = xmlReadFile(python_xml_typemap, NULL, 0); + xmlNode *node = xmlDocGetRootElement(typemappingxml); + xmlNode *wally; + char type_id_hex[5]; + snprintf(type_id_hex, 5, "0x%02x", type_id); + wally = dmixml_FindNodeByAttr(node, "id", type_id_hex); + if(wally) { + mapname = dmixml_GetAttrValue(wally, "value"); + } + } + + // Find the <Mapping> section matching our request (mapname) + for( node = node->children->next; node != NULL; node = node->next ) { + if( xmlStrcmp(node->name, (xmlChar *) "Mapping") == 0) { + char *name = dmixml_GetAttrValue(node, "name"); + if( (name != NULL) && (strcmp(name, mapname) == 0) ) { + break; } } - } else { - //. FIXME - char msg[8194]; - snprintf(msg, 8193, "Not (yet) implemented%c", 0); - PyErr_SetString(PyExc_SystemError, msg); - return NULL; } if( node == NULL ) { diff --git a/unit-tests/unit b/unit-tests/unit index 160641a..61a194c 100755 --- a/unit-tests/unit +++ b/unit-tests/unit @@ -161,6 +161,8 @@ try: sys.stdout.write(" * %s\n"%output.keys()) except IOError, e: failed(e, 2) + except LookupError, e: + failed(e, 2) except IOError: skipped() |