summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNima Talebi <nima@autonomy.net.au>2009-05-24 00:26:23 +1000
committerNima Talebi <nima@autonomy.net.au>2009-05-24 00:26:23 +1000
commitaf27ba4dd2ffdef8e4ee3abf187475c1b3303f71 (patch)
treee81421584332fb363e7b5ba22fecd585b083226e
parent6b1598c8b98699b115525155b43d19365e79dd08 (diff)
downloadpython-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--Makefile2
-rw-r--r--src/dmidecodemodule.c14
-rw-r--r--src/dmixml.c30
-rw-r--r--src/dmixml.h1
-rw-r--r--src/util.c7
-rw-r--r--src/util.h2
-rw-r--r--src/xmlpythonizer.c35
-rwxr-xr-xunit-tests/unit2
8 files changed, 72 insertions, 21 deletions
diff --git a/Makefile b/Makefile
index 1bd17b4..48f3132 100644
--- a/Makefile
+++ b/Makefile
@@ -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);
diff --git a/src/util.c b/src/util.c
index 58fd5ec..45bbd98 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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;
}
diff --git a/src/util.h b/src/util.h
index e216566..b95bbeb 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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()