[BACK]Return to npfext_log.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / npf / ext_log

Annotation of src/lib/npf/ext_log/npfext_log.c, Revision 1.5

1.5     ! rmind       1: /*     $NetBSD: npfext_log.c,v 1.4 2013/03/11 00:29:09 christos Exp $  */
1.1       rmind       2:
                      3: /*-
                      4:  * Copyright (c) 2012 The NetBSD Foundation, Inc.
                      5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
                      8:  * by Mindaugas Rasiukevicius.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     20:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     21:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     22:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     23:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     24:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     25:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     26:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     27:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     28:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     29:  * POSSIBILITY OF SUCH DAMAGE.
                     30:  */
                     31:
                     32: #include <sys/cdefs.h>
1.5     ! rmind      33: __RCSID("$NetBSD: npfext_log.c,v 1.4 2013/03/11 00:29:09 christos Exp $");
1.1       rmind      34:
                     35: #include <sys/types.h>
1.2       christos   36: #include <sys/socket.h>
                     37: #include <sys/ioctl.h>
1.1       rmind      38: #include <net/if.h>
                     39:
1.4       christos   40: #include <stdio.h>
1.5     ! rmind      41: #include <stdbool.h>
1.1       rmind      42: #include <string.h>
                     43: #include <assert.h>
                     44: #include <errno.h>
1.2       christos   45: #include <err.h>
                     46: #include <unistd.h>
1.1       rmind      47:
                     48: #include <npf.h>
                     49:
                     50: int            npfext_log_init(void);
                     51: nl_ext_t *     npfext_log_construct(const char *);
                     52: int            npfext_log_param(nl_ext_t *, const char *, const char *);
                     53:
                     54: int
                     55: npfext_log_init(void)
                     56: {
                     57:        /* Nothing to initialise. */
                     58:        return 0;
                     59: }
                     60:
                     61: nl_ext_t *
                     62: npfext_log_construct(const char *name)
                     63: {
                     64:        assert(strcmp(name, "log") == 0);
                     65:        return npf_ext_construct(name);
                     66: }
                     67:
                     68: int
                     69: npfext_log_param(nl_ext_t *ext, const char *param, const char *val __unused)
                     70: {
1.4       christos   71:        unsigned int if_idx;
1.1       rmind      72:
                     73:        assert(param != NULL);
                     74:
                     75:        if_idx = if_nametoindex(param);
                     76:        if (if_idx == 0) {
1.2       christos   77:                int s;
                     78:                struct ifreq ifr;
                     79:                struct ifconf ifc;
                     80:
                     81:                if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
                     82:                        warn("Can't create datagram socket for `%s'", param);
                     83:                        return errno;
                     84:                }
                     85:
                     86:                memset(&ifr, 0, sizeof(ifr));
                     87:                strlcpy(ifr.ifr_name, param, sizeof(ifr.ifr_name));
                     88:                if (ioctl(s, SIOCIFCREATE, &ifr) == -1) {
                     89:                        warn("Can't SIOCIFCREATE `%s'", param);
                     90:                        close(s);
                     91:                        return errno;
                     92:                }
                     93:
                     94:                memset(&ifc, 0, sizeof(ifc));
                     95:                strlcpy(ifr.ifr_name, param, sizeof(ifr.ifr_name));
                     96:                if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) {
                     97:                        warn("Can't SIOCGIFFLAGS `%s'", param);
                     98:                        close(s);
                     99:                        return errno;
                    100:                }
                    101:
                    102:                ifr.ifr_flags |= IFF_UP;
                    103:                if (ioctl(s, SIOCSIFFLAGS, &ifr) == -1) {
1.3       christos  104:                        warn("Can't SIOCSIFFLAGS `%s'", param);
1.2       christos  105:                        close(s);
                    106:                        return errno;
                    107:                }
                    108:                close(s);
                    109:
                    110:                if_idx = if_nametoindex(param);
                    111:                if (if_idx == 0)
                    112:                        return EINVAL;
1.1       rmind     113:        }
                    114:        npf_ext_param_u32(ext, "log-interface", if_idx);
                    115:        return 0;
                    116: }

CVSweb <webmaster@jp.NetBSD.org>