Annotation of embedaddon/miniupnpd/getifaddr.c, revision 1.1

1.1     ! misho       1: /* $Id: getifaddr.c,v 1.9 2008/10/15 10:16:28 nanard Exp $ */
        !             2: /* MiniUPnP project
        !             3:  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
        !             4:  * (c) 2006-2008 Thomas Bernard 
        !             5:  * This software is subject to the conditions detailed
        !             6:  * in the LICENCE file provided within the distribution */
        !             7: 
        !             8: #include <string.h>
        !             9: #include <syslog.h>
        !            10: #include <unistd.h>
        !            11: #include <sys/ioctl.h>
        !            12: #include <sys/types.h>
        !            13: #include <sys/socket.h>
        !            14: #include <net/if.h>
        !            15: #include <arpa/inet.h>
        !            16: #include <netinet/in.h>
        !            17: #if defined(sun)
        !            18: #include <sys/sockio.h>
        !            19: #endif
        !            20: 
        !            21: #include "getifaddr.h"
        !            22: 
        !            23: int
        !            24: getifaddr(const char * ifname, char * buf, int len)
        !            25: {
        !            26:        /* SIOCGIFADDR struct ifreq *  */
        !            27:        int s;
        !            28:        struct ifreq ifr;
        !            29:        int ifrlen;
        !            30:        struct sockaddr_in * addr;
        !            31:        ifrlen = sizeof(ifr);
        !            32:        if(!ifname || ifname[0]=='\0')
        !            33:                return -1;
        !            34:        s = socket(PF_INET, SOCK_DGRAM, 0);
        !            35:        if(s < 0)
        !            36:        {
        !            37:                syslog(LOG_ERR, "socket(PF_INET, SOCK_DGRAM): %m");
        !            38:                return -1;
        !            39:        }
        !            40:        strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
        !            41:        if(ioctl(s, SIOCGIFADDR, &ifr, &ifrlen) < 0)
        !            42:        {
        !            43:                syslog(LOG_ERR, "ioctl(s, SIOCGIFADDR, ...): %m");
        !            44:                close(s);
        !            45:                return -1;
        !            46:        }
        !            47:        addr = (struct sockaddr_in *)&ifr.ifr_addr;
        !            48:        if(!inet_ntop(AF_INET, &addr->sin_addr, buf, len))
        !            49:        {
        !            50:                syslog(LOG_ERR, "inet_ntop(): %m");
        !            51:                close(s);
        !            52:                return -1;
        !            53:        }
        !            54:        close(s);
        !            55:        return 0;
        !            56: }
        !            57: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>