From 866d5ed1bfb2540570f791e269fd97ba0b9f2d11 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 14 Mar 2009 07:37:37 -0400 Subject: Fix some bugs and add more debugging output --- lssbus.py | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/lssbus.py b/lssbus.py index d148e1e..f2bba44 100644 --- a/lssbus.py +++ b/lssbus.py @@ -48,15 +48,25 @@ MAX_VAL = 4096-128-4 # #openpromio = OpenPromIO() +from decorator import decorator + +@decorator +def trace(f, *args, **kw): + r = None + try: + r = f(*args, **kw) + finally: + print "%s(%s, %s) = %s" % (f.func_name, str(args[1:])[1:-2], kw, r) + return r + class OpenProm(object): dev = '/dev/openprom' - current_node = None - def __init__(self): self.promfd = open(self.dev) + @trace def get_sibling(self, node): """ static int prom_getsibling(int node) @@ -72,28 +82,18 @@ class OpenProm(object): } """ if node == -1: + print "Invalid sibling requested" return 0 - # trying the struct method... - #args = struct.pack('Is', sizeof(c_int), '') - #args = struct.pack('Is', sizeof(c_int), buffer(c_int(node))[:]) - #args = struct.pack('Is', sizeof(c_int), struct.pack('I', 0)) - - # lets try the ctypes Structure method - #openpromio.oprom_size = sizeof(c_int) - #openpromio.oprom_array = pointer(c_int(0)) - #args = buffer(openpromio)[:] - - args = struct.pack('II', 4, node) - #print "ioctl(%r, %r, %r)" % (self.promfd, OPROMNEXT, args) + args = struct.pack('II', sizeof(c_int), node) + print "ioctl(%r, %s, %r)" % (self.promfd, 'OPROMNEXT', args) result = fcntl.ioctl(self.promfd, OPROMNEXT, args) oprom_size, oprom_array = struct.unpack('II', result) assert oprom_size == 4 assert oprom_array - print "oprom_array = ", oprom_array - self.current_node = oprom_array return oprom_array + @trace def get_property(self, prop): """ static char *prom_getproperty(char *prop, int *lenp) @@ -107,29 +107,28 @@ class OpenProm(object): return op->oprom_array; } """ - print "get_property(%s)" % prop args = struct.pack('I%ds' % len(prop), MAX_VAL, prop) - #print "ioctl(%r, %r, %r)" % (self.promfd, OPROMGETPROP, args) + print "ioctl(%r, %s, %r)" % (self.promfd, 'OPROMGETPROP', args) results = fcntl.ioctl(self.promfd, OPROMGETPROP, args) + print "results = %r" % results oprom_size, oprom_array = struct.unpack('I%ds' % len(prop), results) - #print "oprom_size =", oprom_size - print "oprom_array =", oprom_array return oprom_size, oprom_array + @trace def get_child(self, node): - print "get_child(%s)" % node if node in (None, -1): + print "Invalid child requested" return None args = struct.pack('II', sizeof(c_int), node) - print "ioctl(%r, %r, %r)" % (self.promfd, OPROMCHILD, args) + print "ioctl(%r, %s, %r)" % (self.promfd, 'OPROMCHILD', args) results = fcntl.ioctl(self.promfd, OPROMCHILD, args) oprom_size, oprom_array = struct.unpack('II', results) print "oprom_size =", oprom_size print "oprom_array =", oprom_array - self.current_node = oprom_array return oprom_array + @trace def walk(self, node, sbus, ebus, probe_class, devlist): nsbus = sbus nebus = ebus @@ -144,6 +143,8 @@ class OpenProm(object): sense = -1 size, prop = self.get_property('device_type') + print "size = %r, prop = %r" % (size, prop) + if size <= 0: prop = None @@ -158,7 +159,7 @@ class OpenProm(object): # umm, do we need to do this?? # while ((*prop >= 'A' && *prop <= 'Z') || *prop == ',') prop++; if not sbus: - print "no sbus" + print "no sbus; skipping..." size, prop = self.get_property('device_type') break if prop == 'hme': @@ -495,6 +496,7 @@ class LsBus(object): print "No prom_root_node found!" return devlist + print "Walking root_node: %r" % prom_root_node devlist = prom.walk(prom_root_node, 0, 0, probe_class, devlist) return devlist -- cgit