svn commit: trunk/busybox: include networking
vda at busybox.net
vda at busybox.net
Fri Jan 23 02:07:15 UTC 2009
Author: vda
Date: 2009-01-23 02:07:14 +0000 (Fri, 23 Jan 2009)
New Revision: 24978
Log:
tunctl: new applet by Vladimir
function old new delta
tunctl_main - 371 +371
packed_usage 25669 25799 +130
applet_names 1981 1988 +7
applet_main 1192 1196 +4
applet_nameofs 596 598 +2
applet_install_loc 149 150 +1
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 5/0 up/down: 515/0) Total: 515 bytes
Added:
trunk/busybox/networking/tunctl.c
Modified:
trunk/busybox/include/applets.h
trunk/busybox/include/usage.h
trunk/busybox/networking/Config.in
trunk/busybox/networking/Kbuild
Changeset:
Modified: trunk/busybox/include/applets.h
===================================================================
--- trunk/busybox/include/applets.h 2009-01-23 00:54:23 UTC (rev 24977)
+++ trunk/busybox/include/applets.h 2009-01-23 02:07:14 UTC (rev 24978)
@@ -382,6 +382,7 @@
USE_TRUE(APPLET_NOFORK(true, true, _BB_DIR_BIN, _BB_SUID_NEVER, true))
USE_TTY(APPLET(tty, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
USE_TTYSIZE(APPLET(ttysize, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
+USE_TUNCTL(APPLET(tunctl, _BB_DIR_SBIN, _BB_SUID_NEVER))
//USE_TUNE2FS(APPLET(tune2fs, _BB_DIR_SBIN, _BB_SUID_NEVER))
USE_APP_UDHCPC(APPLET(udhcpc, _BB_DIR_SBIN, _BB_SUID_NEVER))
USE_APP_UDHCPD(APPLET(udhcpd, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
Modified: trunk/busybox/include/usage.h
===================================================================
--- trunk/busybox/include/usage.h 2009-01-23 00:54:23 UTC (rev 24977)
+++ trunk/busybox/include/usage.h 2009-01-23 02:07:14 UTC (rev 24978)
@@ -4457,6 +4457,23 @@
#define ttysize_full_usage "\n\n" \
"Print dimension(s) of standard input's terminal, on error return 80x25"
+#define tunctl_trivial_usage \
+ "[-f device] ([-t name] | -d name)" USE_FEATURE_TUNCTL_UG(" [-u owner] [-g group] [-b]")
+#define tunctl_full_usage "\n\n" \
+ "Create or delete tun interfaces" \
+ "\nOptions:" \
+ "\n -f name tun device (/dev/net/tun)" \
+ "\n -t name Create iface 'name'" \
+ "\n -d name Delete iface 'name'" \
+USE_FEATURE_TUNCTL_UG( \
+ "\n -u owner Set iface owner" \
+ "\n -g group Set iface group" \
+ "\n -b Brief output" \
+)
+#define tunctl_example_usage \
+ "# tunctl\n" \
+ "# tunctl -d tun0\n"
+
#define tune2fs_trivial_usage \
"[-c max-mounts-count] [-e errors-behavior] [-g group] " \
"[-i interval[d|m|w]] [-j] [-J journal-options] [-l] [-s sparse-flag] " \
Modified: trunk/busybox/networking/Config.in
===================================================================
--- trunk/busybox/networking/Config.in 2009-01-23 00:54:23 UTC (rev 24977)
+++ trunk/busybox/networking/Config.in 2009-01-23 02:07:14 UTC (rev 24978)
@@ -920,6 +920,20 @@
tcpsvd listens on a TCP port and runs a program for each new
connection.
+config TUNCTL
+ bool "tunctl"
+ default n
+ help
+ tunctl creates or deletes tun devices.
+
+config FEATURE_TUNCTL_UG
+ bool "Support owner:group assignment"
+ default n
+ depends on TUNCTL
+ help
+ Allow to specify owner and group of newly created interface.
+ 340 bytes of pure bloat. Say no here.
+
config UDPSVD
bool "udpsvd"
default n
Modified: trunk/busybox/networking/Kbuild
===================================================================
--- trunk/busybox/networking/Kbuild 2009-01-23 00:54:23 UTC (rev 24977)
+++ trunk/busybox/networking/Kbuild 2009-01-23 02:07:14 UTC (rev 24978)
@@ -36,6 +36,7 @@
lib-$(CONFIG_TFTP) += tftp.o
lib-$(CONFIG_TFTPD) += tftp.o
lib-$(CONFIG_TRACEROUTE) += traceroute.o
+lib-$(CONFIG_TUNCTL) += tunctl.o
lib-$(CONFIG_VCONFIG) += vconfig.o
lib-$(CONFIG_WGET) += wget.o
lib-$(CONFIG_ZCIP) += zcip.o
Added: trunk/busybox/networking/tunctl.c
===================================================================
--- trunk/busybox/networking/tunctl.c (rev 0)
+++ trunk/busybox/networking/tunctl.c 2009-01-23 02:07:14 UTC (rev 24978)
@@ -0,0 +1,139 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * tun devices controller
+ *
+ * Copyright (C) 2008 by Vladimir Dronnikov <dronnikov at gmail.com>
+ *
+ * Original code:
+ * Jeff Dike
+ *
+ * Licensed under GPLv2, see file LICENSE in this tarball for details.
+ */
+#include <netinet/in.h>
+#include <net/if.h>
+#include <linux/if_tun.h>
+#include "libbb.h"
+
+/* TUNSETGROUP appeared in 2.6.23 */
+#ifndef TUNSETGROUP
+#define TUNSETGROUP _IOW('T', 206, int)
+#endif
+
+#define IOCTL(a, b, c) ioctl_or_perror_and_die(a, b, c, NULL)
+
+#if 1
+
+int tunctl_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int tunctl_main(int argc UNUSED_PARAM, char **argv)
+{
+ struct ifreq ifr;
+ int fd;
+ const char *opt_name = "tap%d";
+ const char *opt_device = "/dev/net/tun";
+#if ENABLE_FEATURE_TUNCTL_UG
+ const char *opt_user, *opt_group;
+ long user = -1, group = -1;
+#endif
+ unsigned opts;
+
+ enum {
+ OPT_f = 1 << 0, // control device name (/dev/net/tun)
+ OPT_t = 1 << 1, // create named interface
+ OPT_d = 1 << 2, // delete named interface
+#if ENABLE_FEATURE_TUNCTL_UG
+ OPT_u = 1 << 3, // set new interface owner
+ OPT_g = 1 << 4, // set new interface group
+ OPT_b = 1 << 5, // brief output
+#endif
+ };
+
+ opt_complementary = "=0:t--d:d--t"; // no arguments; t ^ d
+ opts = getopt32(argv, "f:t:d:" USE_FEATURE_TUNCTL_UG("u:g:b"),
+ &opt_device, &opt_name, &opt_name
+ USE_FEATURE_TUNCTL_UG(, &opt_user, &opt_group));
+
+ // select device
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
+ strncpy_IFNAMSIZ(ifr.ifr_name, opt_name);
+
+ // open device
+ fd = xopen(opt_device, O_RDWR);
+ IOCTL(fd, TUNSETIFF, (void *)&ifr);
+
+ // delete?
+ if (opts & OPT_d) {
+ IOCTL(fd, TUNSETPERSIST, (void *)(uintptr_t)0);
+ bb_info_msg("Set '%s' %spersistent", ifr.ifr_name, "non");
+ return EXIT_SUCCESS;
+ }
+
+ // create
+#if ENABLE_FEATURE_TUNCTL_UG
+ if (opts & OPT_g) {
+ group = xgroup2gid(opt_group);
+ IOCTL(fd, TUNSETGROUP, (void *)(uintptr_t)group);
+ } else
+ user = geteuid();
+ if (opts & OPT_u)
+ user = xuname2uid(opt_user);
+ IOCTL(fd, TUNSETOWNER, (void *)(uintptr_t)user);
+#endif
+ IOCTL(fd, TUNSETPERSIST, (void *)(uintptr_t)1);
+
+ // show info
+#if ENABLE_FEATURE_TUNCTL_UG
+ if (opts & OPT_b) {
+ puts(ifr.ifr_name);
+ } else {
+ printf("Set '%s' %spersistent", ifr.ifr_name, "");
+ printf(" and owned by uid %ld", user);
+ if (group != -1)
+ printf(" gid %ld", group);
+ bb_putchar('\n');
+ }
+#else
+ puts(ifr.ifr_name);
+#endif
+ return EXIT_SUCCESS;
+}
+
+#else
+
+/* -210 bytes: */
+
+int tunctl_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int tunctl_main(int argc UNUSED_PARAM, char **argv)
+{
+ struct ifreq ifr;
+ int fd;
+ const char *opt_name = "tap%d";
+ const char *opt_device = "/dev/net/tun";
+ unsigned opts;
+
+ enum {
+ OPT_f = 1 << 0, // control device name (/dev/net/tun)
+ OPT_t = 1 << 1, // create named interface
+ OPT_d = 1 << 2, // delete named interface
+ };
+
+ opt_complementary = "=0:t--d:d--t"; // no arguments; t ^ d
+ opts = getopt32(argv, "f:t:d:u:g:b", // u, g, b accepted and ignored
+ &opt_device, &opt_name, &opt_name, NULL, NULL);
+
+ // set interface name
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
+ strncpy_IFNAMSIZ(ifr.ifr_name, opt_name);
+
+ // open device
+ fd = xopen(opt_device, O_RDWR);
+ IOCTL(fd, TUNSETIFF, (void *)&ifr);
+
+ // create or delete interface
+ IOCTL(fd, TUNSETPERSIST, (void *)(uintptr_t)(0 == (opts & OPT_d)));
+
+ return EXIT_SUCCESS;
+}
+
+#endif
More information about the busybox-cvs
mailing list