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.62 2000/11/04 14:16:46 zarq Exp $
+ $Id: net.c,v 1.35.4.66 2000/11/04 20:44:26 guus Exp $
*/
#include "config.h"
pid_t pid;
char *s;
- asprintf(&scriptname, "%s/%s", confbase, name);
-
if((pid = fork()) < 0)
{
syslog(LOG_ERR, _("System call `%s' failed: %m"),
if(pid)
{
- free(scriptname);
return 0;
}
/* Child here */
+ asprintf(&scriptname, "%s/%s", confbase, name);
asprintf(&s, "IFNAME=%s", interface_name);
putenv(s);
+ free(s);
+
+ if(netname)
+ {
+ asprintf(&s, "NETNAME=%s", netname);
+ putenv(s);
+ free(s);
+ }
+ else
+ {
+ unsetenv("NETNAME");
+ }
+
+ if(chdir(confbase) < 0)
+ {
+ syslog(LOG_ERR, _("Couldn't chdir to `%s': %m"),
+ confbase);
+ }
+
execl(scriptname, NULL);
/* No return on success */
total_socket_out += outlen;
- cl->want_ping = 1;
-
if((send(cl->socket, (char *) &(outpkt.len), outlen, 0)) < 0)
{
syslog(LOG_ERR, _("Error sending packet to %s (%s): %m"),
}
return -1;
- }
+ }
cl = subnet->owner;
+ if(cl == myself)
+ {
+ if(debug_lvl >= DEBUG_TRAFFIC)
+ {
+ syslog(LOG_NOTICE, _("Packet with destination %d.%d.%d.%d is looping back to us!"),
+ IP_ADDR_V(to));
+ }
+
+ return -1;
+ }
+
/* If we ourselves have indirectdata flag set, we should send only to our uplink! */
/* FIXME - check for indirection and reprogram it The Right Way(tm) this time. */
ncn->buffer = xmalloc(MAXBUFSIZE);
ncn->buflen = 0;
ncn->last_ping_time = time(NULL);
- ncn->want_ping = 0;
conn_list_add(ncn);
config_t const *cfg;
cp
if((cfg = get_config_val(config, pingtimeout)) == NULL)
- timeout = 5;
+ timeout = 60;
else
- timeout = cfg->data.val;
+ {
+ timeout = cfg->data.val;
+ if(timeout < 1)
+ {
+ timeout = 86400;
+ }
+ }
if(setup_tap_fd() < 0)
return -1;
p->buffer = xmalloc(MAXBUFSIZE);
p->buflen = 0;
p->last_ping_time = time(NULL);
- p->want_ping = 0;
if(debug_lvl >= DEBUG_CONNECTIONS)
syslog(LOG_NOTICE, _("Connection from %s port %d"),
{
if(p->last_ping_time + timeout < now)
{
- if(p->status.pinged && !p->status.got_pong)
+ if(p->status.pinged)
{
if(debug_lvl >= DEBUG_PROTOCOL)
syslog(LOG_INFO, _("%s (%s) didn't respond to PING"),
p->status.timeout = 1;
terminate_connection(p);
}
- else if(p->want_ping)
+ else
{
send_ping(p);
- p->last_ping_time = now;
- p->status.pinged = 1;
- p->status.got_pong = 0;
}
}
}