ifconfig C module

David N. Welton dwelton at linuxcare.com
Thu Aug 12 21:44:59 CEST 1999


I got permission to publish the results of my 'ifconfig' module.

Since it's rather small, I thought I would post the whole thing here.

I realize it's not perfect, but it does what I need.  I'll accept
patches to make it better.  I'm sure the license could be changed to
the Python one if there is interest in including it in the main
distribution.

-------------------------------

/* $Id: ifmodule.c,v 1.2 1999/08/12 19:43:42 dwelton Exp $ */

/* 
   Copyright (C) 1999 Linuxcare Inc.

   By David N. Welton <davidw at linuxcare.com>

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
   USA
 */

/* 
 To build under Debian GNU/Linux:

 gcc -shared -Wl,-soname,pyifconfig.so -o pyifconfig.so ifmodule.c
 */


#include <python1.5/Python.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>

static PyObject *pyifconfig(PyObject *self, PyObject *args)
{
    int fd;

    struct ifreq ifreq;
    unsigned char *hw;
    struct sockaddr_in *sin;
    char *itf;

    char pyhwaddr[40];
    char pyaddr[20];
    char pybrdaddr[20];
    char pynetmask[20];

    if (!PyArg_ParseTuple(args, "s", &itf))
	return NULL;

    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

    strcpy(ifreq.ifr_name, itf);

    /* hardware address */
    ioctl(fd, SIOCGIFHWADDR, &ifreq);
    hw = ifreq.ifr_hwaddr.sa_data;
    sprintf(pyhwaddr, "%02x:%02x:%02x:%02x:%02x:%02x", 
	    *hw, *(hw + 1), *(hw + 2), *(hw + 3), *(hw + 4), *(hw + 5));
    
    /* address */
    ioctl(fd, SIOCGIFADDR, &ifreq);
    sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; 
    sprintf(pyaddr, "%s", inet_ntoa(sin->sin_addr));

    /* broadcast */
    ioctl(fd, SIOCGIFBRDADDR, &ifreq);
    sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; 
    sprintf(pybrdaddr, "%s", inet_ntoa(sin->sin_addr));

    /* netmask */
    ioctl(fd, SIOCGIFNETMASK, &ifreq);
    sin = (struct sockaddr_in *)&ifreq.ifr_broadaddr; 
    sprintf(pynetmask, "%s", inet_ntoa(sin->sin_addr));

    close(fd);
    return Py_BuildValue("{s:s,s:s,s:s,s:s}", 
			 "hwaddr", pyhwaddr, 
			 "addr", pyaddr, 
			 "brdaddr", pybrdaddr, 
			 "netmask", pynetmask);
}

/* The command pyifconfig.pyifconfig(interface_name), where
   interface_name is the name of the interface, such as 'eth0' or 'lo'
   returns a dictionary with the following keys:

   hwaddr: hardware address
   addr: ip address
   brdaddr: broadcast address
   netmask: netmask
 */

static struct PyMethodDef pyifmethods[] = {
    {"pyifconfig", pyifconfig, METH_VARARGS},
    {NULL, NULL}
};

void initpyifconfig()
{
    Py_InitModule("pyifconfig", pyifmethods);	
}


------------------------------

Have fun,
-- 
David N. Welton, Web Engineer, Linuxcare, Inc.
415.354.4878 x241 tel, 415.701.7457 fax
dwelton at linuxcare.com, http://www.linuxcare.com/
Linuxcare. At the center of Linux.




More information about the Python-list mailing list