portable Python ifconfig

Bart Van Loon bbbart at inGen.be
Sun Mar 4 04:09:20 EST 2007


It was Sun, 4 Mar 2007 02:38:58 +0500, when Bart Van Loon wrote:
> Hi all,
>
> I'm looking for a portable (FreeBSD and Linux) way of getting typical
> ifconfig information into Python.

After lots of trial and error (I'm proficient in C at all), I puzzled
togehter the following. It works (at least on FreeBSD and Linux), but is
still fairly rough, as it returns an empty string when given a non
existing or down interface.

I'll clean it up in due time. :-)

#include "Python.h"

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <ifaddrs.h>
#include <string.h>

// parameters: string (interface name)
// output: string (ip address of interface in decimal notation)
PyObject * ipaddr(PyObject *self, PyObject *args) {

    char ip[ 200 ];
    char *itf;

    if (! PyArg_ParseTuple(args, "s", &itf)) {
            PyErr_SetString(PyExc_Exception, "no interface given!");
            return NULL;
    }
    
  struct ifaddrs *ifa = NULL, *ifp = NULL;

  if (getifaddrs (&ifp) < 0)
    {
      perror ("getifaddrs");
      return NULL;
    }

  for (ifa = ifp; ifa; ifa = ifa->ifa_next)
    {
      socklen_t salen;

      if (ifa->ifa_addr->sa_family == AF_INET)
        salen = sizeof (struct sockaddr_in);
      else if (ifa->ifa_addr->sa_family == AF_INET6)
        salen = sizeof (struct sockaddr_in6);
      else
        continue;

      if (strncmp(ifa->ifa_name, itf, sizeof(itf))) {
         continue;
      }

      if (getnameinfo (ifa->ifa_addr, salen,
                       ip, sizeof (ip), NULL, 0, NI_NUMERICHOST) < 0)
        {
          perror ("getnameinfo");
          continue;
        }
        break;

    }

  freeifaddrs (ifp);

  return Py_BuildValue("s", ip);
}

static PyMethodDef ifconfig_methods[] = {
    {"ipaddr", (PyCFunction)ipaddr, METH_VARARGS, "ipaddr(string)\n"},
    {NULL, NULL, 0, NULL}
};

DL_EXPORT(void) initifconfig(void)
{
    Py_InitModule3("ifconfig", ifconfig_methods, "Provides a function to get an ip address of a certain interface.\n");   
}

Inspiration came from and credit goes to the author of
http://www.hungry.com/~alves/local-ip-in-C.html

-- 
regards,
BBBart

   Hobbes : How is the diorama coming along?  
   Calvin : I'm almost finished.
   Hobbes : I don't see the roadrunner. Weren't you going to put one in?  
   Calvin : See the cotton balls I glued down?  
   Hobbes : Yeah?  
   Calvin : The roadrunner just ran out of the scene leaving behind clouds 
            of dust!



More information about the Python-list mailing list