mirror of
https://github.com/OpenVPN/openvpn.git
synced 2024-11-23 17:53:49 +08:00
Keep pre-existing tun/tap devices around on *BSD
This amends commit 62c613d46d
to check whether a named tun/tap
device ("--dev tunX" instead of "--dev tun") exists before OpenVPN
started - if yes, keep around at program end. If no, destroy.
Also has a spelling fix, and changes clear_tuntap() to be "static"
(only ever called from within tun.c).
Tested on FreeBSD 7.4, FreeBSD 9.0, NetBSD 5.1, OpenBSD 4.9
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Acked-by: Eric Crist <ecrist@secure-computing.net>
Signed-off-by: David Sommerseth <davids@redhat.com>
This commit is contained in:
parent
7f69654925
commit
3630a7a500
@ -890,7 +890,7 @@ do_ifconfig (struct tuntap *tt,
|
||||
#elif defined(TARGET_OPENBSD)
|
||||
|
||||
/*
|
||||
* On OpenBSD, tun interfaces are persistant if created with
|
||||
* On OpenBSD, tun interfaces are persistent if created with
|
||||
* "ifconfig tunX create", and auto-destroyed if created by
|
||||
* opening "/dev/tunX" (so we just use the /dev/tunX)
|
||||
*/
|
||||
@ -1235,7 +1235,7 @@ do_ifconfig (struct tuntap *tt,
|
||||
gc_free (&gc);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
clear_tuntap (struct tuntap *tuntap)
|
||||
{
|
||||
CLEAR (*tuntap);
|
||||
@ -1344,6 +1344,13 @@ open_tun_generic (const char *dev, const char *dev_type, const char *dev_node,
|
||||
|
||||
if (!dynamic_opened)
|
||||
{
|
||||
/* has named device existed before? if so, don't destroy at end */
|
||||
if ( if_nametoindex( dev ) > 0 )
|
||||
{
|
||||
msg (M_INFO, "TUN/TAP device %s exists previously, keep at program end", dev );
|
||||
tt->persistent_if = true;
|
||||
}
|
||||
|
||||
if ((tt->fd = open (tunname, O_RDWR)) < 0)
|
||||
msg (M_ERR, "Cannot open TUN/TAP dev %s", tunname);
|
||||
}
|
||||
@ -2030,7 +2037,7 @@ close_tun (struct tuntap* tt)
|
||||
{
|
||||
/* only *TAP* devices need destroying, tun devices auto-self-destruct
|
||||
*/
|
||||
if (tt && tt->type == DEV_TYPE_TUN )
|
||||
if (tt && (tt->type == DEV_TYPE_TUN || tt->persistent_if ) )
|
||||
{
|
||||
close_tun_generic (tt);
|
||||
free(tt);
|
||||
@ -2165,7 +2172,7 @@ close_tun (struct tuntap *tt)
|
||||
{
|
||||
/* only tun devices need destroying, tap devices auto-self-destruct
|
||||
*/
|
||||
if (tt && tt->type != DEV_TYPE_TUN )
|
||||
if (tt && ( tt->type != DEV_TYPE_TUN || tt->persistent_if ) )
|
||||
{
|
||||
close_tun_generic (tt);
|
||||
free(tt);
|
||||
@ -2303,7 +2310,12 @@ open_tun (const char *dev, const char *dev_type, const char *dev_node, struct tu
|
||||
void
|
||||
close_tun (struct tuntap *tt)
|
||||
{
|
||||
if (tt)
|
||||
if (tt && tt->persistent_if ) /* keep pre-existing if around */
|
||||
{
|
||||
close_tun_generic (tt);
|
||||
free (tt);
|
||||
}
|
||||
else if (tt) /* close and destroy */
|
||||
{
|
||||
struct gc_arena gc = gc_new ();
|
||||
struct argv argv;
|
||||
|
@ -137,6 +137,8 @@ struct tuntap
|
||||
|
||||
bool ipv6;
|
||||
|
||||
bool persistent_if; /* if existed before, keep on program end */
|
||||
|
||||
struct tuntap_options options; /* options set on command line */
|
||||
|
||||
char *actual_name; /* actual name of TUN/TAP dev, usually including unit number */
|
||||
@ -201,7 +203,7 @@ tuntap_defined (const struct tuntap *tt)
|
||||
* Function prototypes
|
||||
*/
|
||||
|
||||
void clear_tuntap (struct tuntap *tuntap);
|
||||
static void clear_tuntap (struct tuntap *tuntap);
|
||||
|
||||
void open_tun (const char *dev, const char *dev_type, const char *dev_node,
|
||||
struct tuntap *tt);
|
||||
|
Loading…
Reference in New Issue
Block a user