Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/npf/ext_log auto-create the log interface and bring it up.
details: https://anonhg.NetBSD.org/src/rev/0876decefa91
branches: trunk
changeset: 785371:0876decefa91
user: christos <christos%NetBSD.org@localhost>
date: Mon Mar 11 00:03:18 2013 +0000
description:
auto-create the log interface and bring it up.
diffstat:
lib/npf/ext_log/npfext_log.c | 45 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 42 insertions(+), 3 deletions(-)
diffs (73 lines):
diff -r bc54d9e17dd8 -r 0876decefa91 lib/npf/ext_log/npfext_log.c
--- a/lib/npf/ext_log/npfext_log.c Sun Mar 10 23:59:00 2013 +0000
+++ b/lib/npf/ext_log/npfext_log.c Mon Mar 11 00:03:18 2013 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: npfext_log.c,v 1.1 2012/09/16 13:47:42 rmind Exp $ */
+/* $NetBSD: npfext_log.c,v 1.2 2013/03/11 00:03:18 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,14 +30,18 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: npfext_log.c,v 1.1 2012/09/16 13:47:42 rmind Exp $");
+__RCSID("$NetBSD: npfext_log.c,v 1.2 2013/03/11 00:03:18 christos Exp $");
#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
#include <net/if.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
+#include <err.h>
+#include <unistd.h>
#include <npf.h>
@@ -68,7 +72,42 @@
if_idx = if_nametoindex(param);
if (if_idx == 0) {
- return EINVAL;
+ int s;
+ struct ifreq ifr;
+ struct ifconf ifc;
+
+ if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
+ warn("Can't create datagram socket for `%s'", param);
+ return errno;
+ }
+
+ memset(&ifr, 0, sizeof(ifr));
+ strlcpy(ifr.ifr_name, param, sizeof(ifr.ifr_name));
+ if (ioctl(s, SIOCIFCREATE, &ifr) == -1) {
+ warn("Can't SIOCIFCREATE `%s'", param);
+ close(s);
+ return errno;
+ }
+
+ memset(&ifc, 0, sizeof(ifc));
+ strlcpy(ifr.ifr_name, param, sizeof(ifr.ifr_name));
+ if (ioctl(s, SIOCGIFFLAGS, &ifr) == -1) {
+ warn("Can't SIOCGIFFLAGS `%s'", param);
+ close(s);
+ return errno;
+ }
+
+ ifr.ifr_flags |= IFF_UP;
+ if (ioctl(s, SIOCSIFFLAGS, &ifr) == -1) {
+ warn("Can't SIOSGIFFLAGS `%s'", param);
+ close(s);
+ return errno;
+ }
+ close(s);
+
+ if_idx = if_nametoindex(param);
+ if (if_idx == 0)
+ return EINVAL;
}
npf_ext_param_u32(ext, "log-interface", if_idx);
return 0;
Home |
Main Index |
Thread Index |
Old Index