diff options
Diffstat (limited to 'lib/rcscripts/net.modules.d/tuntap')
-rw-r--r-- | lib/rcscripts/net.modules.d/tuntap | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/lib/rcscripts/net.modules.d/tuntap b/lib/rcscripts/net.modules.d/tuntap new file mode 100644 index 0000000..150b892 --- /dev/null +++ b/lib/rcscripts/net.modules.d/tuntap @@ -0,0 +1,116 @@ +#!/bin/bash +# Copyright (c) 2004-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +# Contributed by Roy Marples (uberlord@gentoo.org) + +# Fix any potential localisation problems +# Note that LC_ALL trumps LC_anything_else according to locale(7) +tunctl() { + LC_ALL=C /usr/bin/tunctl "$@" +} + +# char* tuntap_provides(void) +# +# Returns a string to change module definition for starting up +tuntap_provides() { + echo "tuntap" +} + +# void tuntap_depend(void) +# +# Sets up the dependancies for the module +tuntap_depend() { + after interface + before dhcp +} + +# bool tuntap_check_installed(void) +# +# Returns 1 if tuntap is installed, otherwise 0 +tuntap_check_installed() { + [[ -x /usr/bin/tunctl ]] && return 0 + ${1:-false} && eerror "For TunTap support, emerge sys-apps/usermode-utilities" + return 1 +} + +# bool tuntap_check_depends(void) +# +# Checks to see if we have the needed functions +tuntap_check_depends() { + local f + + for f in interface_exists interface_type; do + [[ $( type -t "${f}" ) == "function" ]] && continue + eerror "tuntap: missing required function ${f}\n" + return 1 + done + + return 0 +} + +# bool tuntap_check_kernel(void) +# +# Checks to see if the tun is present - if not try and load it +# Returns 1 if there is a problem +tuntap_check_kernel() { + [[ -a /dev/net/tun ]] && return 0 + /sbin/modprobe tun && sleep 1 + [[ -a /dev/net/tun ]] && return 0 + eerror "TUN/TAP support is not present in this kernel" + return 1 +} + +# char* tuntap_get_vars(char *interface) +# +# Returns a string spaced with possible user set +# configuration variables +tuntap_get_vars() { + echo "tunctl_$1" +} + +# bool tuntap_pre_start(char *iface) +# +# Create the device, give it the right perms +tuntap_pre_start() { + local iface="$1" opts ifvar=$( bash_variable "$1" ) + local itype=$( interface_type "${iface}" ) + + # Check that we are a valid tun/tap interface + # NOTE - the name can be anything as we define it + # but for simplicity in the config we require either + # tun or tap + [[ ${itype} != "tun" && ${itype} != "tap" ]] && return 0 + + tuntap_check_kernel || return 1 + + # Get our options + eval opts=\"\$\{tunctl_${ifvar}\}\" + + ebegin "Creating Tun/Tap interface ${iface}" + tunctl ${opts} -t "${iface}" + eend "$?" || return 1 + + return 0 +} + +# bool tuntap_stop(char *iface) +# +# Removes the device +tuntap_stop() { + local iface="$1" + + tuntap_check_installed || return 0 + interface_exists "${iface}" || return 0 + + # tunctl doesn't always error on on tun/tap + # interfaces (mainly aliases, etc) + if tunctl -d "${iface}" &>/dev/null ; then + interface_exists "${iface}" \ + || einfo "Destroyed Tun/Tap interface ${iface}" + fi + + return 0 +} + +# vim:ts=4 |