@@ -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-
221241PyMODINIT_FUNC initdmidecode (void ) {
222242 init ();
223243 (void )Py_InitModule ((char * )"dmidecode" , DMIDataMethods );
0 commit comments