X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnet.c;h=4baefe52080fe5e2864596b9e90b1d57ced53e8c;hp=81318e3e446575faf058398dc8745f47f95c7eee;hb=73f7efddd723b25c1477ec1139dc7211307ff660;hpb=fba19c30c92d39e74f5fd5594053793b036f30f4 diff --git a/src/net.c b/src/net.c index 81318e3e..4baefe52 100644 --- a/src/net.c +++ b/src/net.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: net.c,v 1.35.4.41 2000/10/20 15:34:35 guus Exp $ + $Id: net.c,v 1.35.4.42 2000/10/20 19:46:57 guus Exp $ */ #include "config.h" @@ -39,6 +39,7 @@ #ifdef HAVE_TUNTAP #include +#include #include LINUX_IF_TUN_H #endif @@ -333,7 +334,8 @@ int setup_tap_fd(void) int nfd; const char *tapfname; config_t const *cfg; - + char *envvar; + #ifdef HAVE_TUNTAP struct ifreq ifr; #endif @@ -369,12 +371,20 @@ cp { syslog(LOG_INFO, _("%s is a new style tun/tap device"), tapfname); taptype = 1; + if((cfg = get_config_val(config, tapsubnet)) == NULL) syslog(LOG_INFO, _("tun/tap device will be left unconfigured")); else /* Setup inetaddr/netmask etc */; } #endif + + /* Add name of network interface to environment (for scripts) */ + + ioctl(tap_fd, SIOCGIFNAME, (void *) &ifr); + asprintf(&envvar, "IFNAME=%s", ifr.ifr_name); + putenv(envvar); + free(envvar); cp return 0; @@ -743,6 +753,7 @@ cp int setup_network_connections(void) { config_t const *cfg; + char *scriptname; cp if((cfg = get_config_val(config, pingtimeout)) == NULL) timeout = 5; @@ -755,6 +766,23 @@ cp if(setup_myself() < 0) return -1; + /* Run tinc-up script to further initialize the tap interface */ + + asprintf(&scriptname, "%s/tinc-up", confbase); + + if(!fork()) + { + + execl(scriptname, NULL); + + if(errno != ENOENT) + syslog(LOG_WARNING, _("Error while executing %s: %m"), scriptname); + + exit(0); + } + + free(scriptname); + if((cfg = get_next_config_val(config, connectto, upstreamindex++)) == NULL) /* No upstream IP given, we're listen only. */ return 0; @@ -781,6 +809,7 @@ cp void close_network_connections(void) { conn_list_t *p; + char *scriptname; cp for(p = conn_list; p != NULL; p = p->next) { @@ -804,6 +833,22 @@ cp close(myself->socket); } + /* Execute tinc-down script right before shutting down the interface */ + + asprintf(&scriptname, "%s/tinc-down", confbase); + + if(!fork()) + { + execl(scriptname, NULL); + + if(errno != ENOENT) + syslog(LOG_WARNING, _("Error while executing %s: %m"), scriptname); + + exit(0); + } + + free(scriptname); + close(tap_fd); destroy_conn_list();