Annotation of embedaddon/pimd/libite/ifconfig.c, revision 1.1

1.1     ! misho       1: /* Fastinit (finit) ifconfig() implementation.
        !             2:  *
        !             3:  * Copyright (c) 2008 Claudio Matsuoka <http://helllabs.org/finit/>
        !             4:  * Copyright (C) 2009-2014  Joachim Nilsson <joachim.nilsson@westermo.se>
        !             5:  *
        !             6:  * Permission is hereby granted, free of charge, to any person obtaining a copy
        !             7:  * of this software and associated documentation files (the "Software"), to deal
        !             8:  * in the Software without restriction, including without limitation the rights
        !             9:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        !            10:  * copies of the Software, and to permit persons to whom the Software is
        !            11:  * furnished to do so, subject to the following conditions:
        !            12:  *
        !            13:  * The above copyright notice and this permission notice shall be included in
        !            14:  * all copies or substantial portions of the Software.
        !            15:  *
        !            16:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        !            17:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        !            19:  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        !            20:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        !            21:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        !            22:  * THE SOFTWARE.
        !            23:  */
        !            24: 
        !            25: #include <arpa/inet.h>
        !            26: #include <errno.h>
        !            27: #include <net/if.h>
        !            28: #include <netinet/in.h>
        !            29: #include <string.h>
        !            30: #include <sys/ioctl.h>
        !            31: #include <sys/socket.h>
        !            32: #include <unistd.h>
        !            33: 
        !            34: extern size_t strlcpy(char *dst, const char *src, size_t siz);
        !            35: 
        !            36: /**
        !            37:  * ifconfig - Basic ifconfig like operations on an interface
        !            38:  * @ifname: Name of interface to operate on
        !            39:  * @addr:   If @up then set this optional IPv4 address
        !            40:  * @mask:   If @up and @addr, and @addr is not INADDR_ANY, then set netmask
        !            41:  * @up:     Control %IFF_UP flag on interface
        !            42:  *
        !            43:  * Returns:
        !            44:  * POSIX OK(0) on success, or non-zero on error.
        !            45:  */
        !            46: int ifconfig(char *ifname, char *addr, char *mask, int up)
        !            47: {
        !            48:        int sd, ret = -1;
        !            49:        struct ifreq ifr;
        !            50:        struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
        !            51: 
        !            52:        if ((sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0)
        !            53:                return -1;
        !            54: 
        !            55:        memset(&ifr, 0, sizeof (ifr));
        !            56:        strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
        !            57:        ifr.ifr_addr.sa_family = AF_INET;
        !            58: 
        !            59:        if (up) {
        !            60:                if (addr) {
        !            61:                        if (inet_pton(AF_INET, addr, &sin->sin_addr) == 1)
        !            62:                                ret = ioctl(sd, SIOCSIFADDR, &ifr);
        !            63:                }
        !            64: 
        !            65:                /* Non-zero IP address */
        !            66:                if (mask && addr && strcmp(addr, "0.0.0.0")) {
        !            67:                        if (inet_pton(AF_INET, mask, &sin->sin_addr) == -1)
        !            68:                                ret = ioctl(sd, SIOCSIFNETMASK, &ifr);
        !            69:                }
        !            70:        }
        !            71: 
        !            72:        if (!ioctl(sd, SIOCGIFFLAGS, &ifr)) {
        !            73:                if (up)
        !            74:                        ifr.ifr_flags |=  IFF_UP;
        !            75:                else
        !            76:                        ifr.ifr_flags &= ~IFF_UP;
        !            77: 
        !            78:                ret = ioctl(sd, SIOCSIFFLAGS, &ifr);
        !            79:        }
        !            80: 
        !            81:        close(sd);
        !            82: 
        !            83:        return ret;
        !            84: }
        !            85: 
        !            86: /**
        !            87:  * Local Variables:
        !            88:  *  version-control: t
        !            89:  *  indent-tabs-mode: t
        !            90:  *  c-file-style: "linux"
        !            91:  * End:
        !            92:  */

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