Skip to content

Commit 8626bbd

Browse files
author
nima
committed
Removed "detected" from appearing in every single function call. TODO: An ivar
should be implemented to return this string, so further cleanup is still required; as it stands, there is no access to this information anymore! Updated test case. Further general cleanup. git-svn-id: svn://svn.autonomy.net.au/python-dmidecode@133 abc39116-655e-4be6-ad55-d661dc543056
1 parent f5397d9 commit 8626bbd

6 files changed

Lines changed: 54 additions & 39 deletions

File tree

src/dmidecode.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4658,30 +4658,30 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, P
46584658
}
46594659

46604660

4661-
int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata) {
4661+
int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata, PyObject* pydata_ver) {
46624662
if(pydata == NULL) return -1; //. TODO: Raise Exception
46634663

46644664
if(!checksum(buf, buf[0x05]) || !memcmp(buf+0x10, "_DMI_", 5)==0 || !checksum(buf+0x10, 0x0F)) return 0;
46654665

46664666
u16 ver = (buf[0x06] << 8) + buf[0x07];
46674667
/* Some BIOS attempt to encode version 2.3.1 as 2.31, fix it up */
4668-
if(ver == 0x021F) {
4669-
printf("SMBIOS version fixup (2.31 -> 2.3).\n");
4670-
ver = 0x0203;
4671-
}
4672-
dmiSetItem(pydata, "detected", "SMBIOS %i.%i present.", ver>>8, ver&0xFF);
4668+
if(ver == 0x021F) { fprintf(stderr, "SMBIOS version fixup (2.31 -> 2.3).\n"); ver = 0x0203; }
4669+
if(pydata_ver) { Py_DECREF(pydata_ver); }
4670+
pydata_ver = PyString_FromFormat("SMBIOS %i.%i present.", ver>>8, ver&0xFF);
4671+
Py_INCREF(pydata_ver);
46734672
dmi_table(DWORD(buf+0x18), WORD(buf+0x16), WORD(buf+0x1C), ver, devmem, pydata);
46744673
return 1;
46754674
}
46764675

46774676

4678-
int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata) {
4677+
int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata, PyObject* pydata_ver) {
46794678
if(pydata == NULL) return -1; //. TODO: Raise Exception
46804679

46814680
if(!checksum(buf, 0x0F)) return 0;
46824681

4683-
printf("Legacy DMI %u.%u present.\n", buf[0x0E]>>4, buf[0x0E]&0x0F);
4684-
dmiSetItem(pydata, "detected", "Legacy DMI %i.%i present.", buf[0x0E]>>4, buf[0x0E]&0x0F);
4682+
if(pydata_ver) { Py_DECREF(pydata_ver); }
4683+
pydata_ver = PyString_FromFormat("Legacy DMI %i.%i present.", buf[0x0E]>>4, buf[0x0E]&0x0F);
4684+
Py_INCREF(pydata_ver);
46854685
dmi_table(DWORD(buf+0x08), WORD(buf+0x06), WORD(buf+0x0C), ((buf[0x0E]&0xF0)<<4)+(buf[0x0E]&0x0F), devmem, pydata);
46864686
return 1;
46874687
}

src/dmidecode.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ PyObject *dmi_dump(struct dmi_header *h);
3030
PyObject* dmi_decode(struct dmi_header *h, u16 ver);
3131
int address_from_efi(size_t *address);
3232
void to_dmi_header(struct dmi_header *h, u8 *data);
33-
int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata);
34-
int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata);
33+
int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata, PyObject* pydata_ver);
34+
int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata, PyObject* pydata_ver);
3535

3636
const char *dmi_string(const struct dmi_header *dm, u8 s);
3737
const char *dmi_system_uuid(u8 *p);

src/dmidecodemodule.c

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ static PyObject* dmidecode_get(PyObject *self, const char* section) {
8989
if(opt.type==NULL) return NULL;
9090

9191
PyObject* pydata = PyDict_New();
92+
PyObject* pydata_ver;
9293

9394
/***********************************/
9495
/* Read from dump if so instructed */
@@ -97,9 +98,9 @@ static PyObject* dmidecode_get(PyObject *self, const char* section) {
9798
//. printf("Reading SMBIOS/DMI data from file %s.\n", dumpfile);
9899
if((buf = mem_chunk(0, 0x20, dumpfile))!=NULL) {
99100
if(memcmp(buf, "_SM_", 4)==0) {
100-
if(smbios_decode(buf, dumpfile, pydata)) found++;
101+
if(smbios_decode(buf, dumpfile, pydata, pydata_ver)) found++;
101102
} else if (memcmp(buf, "_DMI_", 5)==0) {
102-
if(legacy_decode(buf, dumpfile, pydata)) found++;
103+
if(legacy_decode(buf, dumpfile, pydata, pydata_ver)) found++;
103104
}
104105
} else ret = 1;
105106
} else { /* Read from /dev/mem */
@@ -110,27 +111,30 @@ static PyObject* dmidecode_get(PyObject *self, const char* section) {
110111
if((buf=mem_chunk(0xF0000, 0x10000, opt.devmem))!=NULL) {
111112
for(fp=0; fp<=0xFFF0; fp+=16) {
112113
if(memcmp(buf+fp, "_SM_", 4)==0 && fp<=0xFFE0) {
113-
if(smbios_decode(buf+fp, opt.devmem, pydata)) found++;
114+
if(smbios_decode(buf+fp, opt.devmem, pydata, pydata_ver)) found++;
114115
fp+=16;
115116
} else if(memcmp(buf+fp, "_DMI_", 5)==0) {
116-
if(legacy_decode(buf+fp, opt.devmem, pydata)) found++;
117+
if(legacy_decode(buf+fp, opt.devmem, pydata, pydata_ver)) found++;
117118
}
118119
}
119120
} else ret = 1;
120121
} else if(efi == EFI_NO_SMBIOS) {
121122
ret = 1;
122123
} else {
123124
if((buf=mem_chunk(fp, 0x20, opt.devmem))==NULL) ret = 1;
124-
else if(smbios_decode(buf, opt.devmem, pydata)) found++;
125+
else if(smbios_decode(buf, opt.devmem, pydata, pydata_ver)) found++;
125126
//. TODO: dmiSetItem(pydata, "efi_address", efiAddress);
126127
}
127128
}
128129

129130
if(ret==0) {
130131
free(buf);
131-
132-
if(!found)
133-
dmiSetItem(pydata, "detect", "No SMBIOS nor DMI entry point found, sorry G.");
132+
if(!found) {
133+
if(!pydata_ver) {
134+
pydata_ver = PyString_FromString("No SMBIOS nor DMI entry point found, sorry G.");
135+
Py_INCREF(pydata_ver);
136+
}
137+
}
134138
}
135139
free(opt.type);
136140

@@ -184,9 +188,16 @@ static PyObject* dmidecode_set_dev(PyObject *self, PyObject *arg) {
184188
struct stat buf;
185189
char *f = PyString_AsString(arg);
186190
stat(f, &buf);
187-
if(!S_ISDIR(buf.st_mode)) {
188-
if(opt.dumpfile)
189-
Py_DECREF(opt.dumpfile);
191+
if(opt.dumpfile) { Py_DECREF(opt.dumpfile); }
192+
193+
if(S_ISCHR(buf.st_mode)) {
194+
if(memcmp(PyString_AsString(arg), "/dev/mem", 8)==0) {
195+
opt.dumpfile = NULL;
196+
Py_RETURN_TRUE;
197+
} else {
198+
Py_RETURN_FALSE;
199+
}
200+
} else if(!S_ISDIR(buf.st_mode)) {
190201
opt.dumpfile = arg;
191202
Py_INCREF(opt.dumpfile);
192203
Py_RETURN_TRUE;
@@ -196,9 +207,18 @@ static PyObject* dmidecode_set_dev(PyObject *self, PyObject *arg) {
196207
//PyErr_Occurred();
197208
}
198209

210+
/* TODO
211+
typedef struct {
212+
PyObject_HEAD char *version;
213+
} ivars;
199214
215+
static PyMemberDef DMIDataMembers[] = {
216+
{ (char *)"fred", T_STRING, offsetof(ivars, version), 0, "2.10" },
217+
{ NULL }
218+
};
219+
*/
200220

201-
PyMethodDef DMIDataMethods[] = {
221+
static PyMethodDef DMIDataMethods[] = {
202222
{ (char *)"dump", dmidecode_dump, METH_NOARGS, (char *)"Dump dmidata to set file" },
203223
{ (char *)"get_dev", dmidecode_get_dev, METH_NOARGS, (char *)"Get an alternative memory device file" },
204224
{ (char *)"set_dev", dmidecode_set_dev, METH_O, (char *)"Set an alternative memory device file" },
@@ -214,10 +234,10 @@ PyMethodDef DMIDataMethods[] = {
214234
{ (char *)"slot", dmidecode_get_slot, METH_VARARGS, (char *)"Slot Data" },
215235

216236
{ (char *)"type", dmidecode_get_type, METH_VARARGS, (char *)"By Type" },
237+
217238
{ NULL, NULL, 0, NULL }
218239
};
219240

220-
221241
PyMODINIT_FUNC initdmidecode(void) {
222242
init();
223243
(void)Py_InitModule((char *)"dmidecode", DMIDataMethods);

src/dmidecodemodule.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <Python.h>
2+
#include <structmember.h>
23

34
#include <stdio.h>
45
#include <string.h>
@@ -26,8 +27,8 @@ extern PyObject* dmi_decode(struct dmi_header *h, u16 ver);
2627
extern int address_from_efi(size_t *address);
2728
extern void to_dmi_header(struct dmi_header *h, u8 *data);
2829
extern void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem);
29-
extern int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata);
30-
extern int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata);
30+
extern int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata, PyObject* pydata_ver);
31+
extern int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata, PyObject* pydata_ver);
3132
extern void *mem_chunk(size_t base, size_t len, const char *devmem);
3233

3334
extern u8 *parse_opt_type(u8 *p, const char *arg);

src/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from distutils.core import setup, Extension
22

33
setup(
4-
name = "python-dmidecode",
4+
name = "dmidecode",
55
version = "2.10",
66
description = "Python extension module for dmidecode",
77
author = "Nima Talebi",

test.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,16 @@
5050
sys.stdout.write("...\n")
5151
for i in types:
5252
sys.stdout.write(" * Testing type %i..."%i); sys.stdout.flush()
53-
output = len(dmidecode.type(i))
53+
output = dmidecode.type(i).keys()
5454
total += 1
55-
if output:
56-
sys.stdout.write("Done\n")
57-
success += 1
58-
else:
59-
sys.stdout.write("FAILED\n")
55+
sys.stdout.write("Done (%s)\n"%output)
56+
success += 1
6057
for section in sections:
6158
total += 1
6259
sys.stdout.write(" * Testing %s..."%section); sys.stdout.flush()
63-
output = getattr(dmidecode, section)
64-
if output:
65-
sys.stdout.write("Done\n")
66-
success += 1
67-
else:
68-
sys.stdout.write("FAILED\n")
60+
output = getattr(dmidecode, section)().keys()
61+
sys.stdout.write("Done (%s)\n"%output)
62+
success += 1
6963
else:
7064
sys.stdout.write("FAILED\n")
7165

0 commit comments

Comments
 (0)