On Mar 3, 3:38 pm, Bart Van Loon <[EMAIL PROTECTED]> wrote: > I'm looking for a portable (FreeBSD and Linux) way of getting typical > ifconfig information into Python.
Here's a pure python version of the C extension, based on the recipes you posted. In this version, the 'addr' key will not exist for a non- existent / non-active interface. import socket, fcntl, struct, platform def _ifinfo(sock, addr, ifname): iface = struct.pack('256s', ifname[:15]) info = fcntl.ioctl(sock.fileno(), addr, iface) if addr == 0x8927: hwaddr = [] for char in info[18:24]: hwaddr.append(hex(ord(char))[2:]) return ':'.join(hwaddr) else: return socket.inet_ntoa(info[20:24]) def ifconfig(ifname): ifreq = {'ifname': ifname} infos = {} osys = platform.system() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) if osys == 'Linux': # offsets defined in /usr/include/linux/sockios.h on linux 2.6 infos['addr'] = 0x8915 # SIOCGIFADDR infos['brdaddr'] = 0x8919 # SIOCGIFBRDADDR infos['hwaddr'] = 0x8927 # SIOCSIFHWADDR infos['netmask'] = 0x891b # SIOCGIFNETMASK elif 'BSD' in osys: # ??? infos['addr'] = 0x8915 infos['brdaddr'] = 0x8919 infos['hwaddr'] = 0x8927 infos['netmask'] = 0x891b try: for k,v in infos.items(): ifreq[k] = _ifinfo(sock, v, ifname) except: pass sock.close() return ifreq ifc = ifconfig('ath0') if ifc.has_key('addr'): print ifc I'm pretty sure the offsets would be different for BSD, but I don't have any BSD boxes to test on (looks like from a bit of googling that you might need to look at /compat/linux/linux_ioctl.h for the offsets on BSDs). I'll leave it to you to fill in the BSD stuff. Regards, Jordan -- http://mail.python.org/mailman/listinfo/python-list