/*
subnet.c -- handle subnet lookups and lists
- Copyright (C) 2000-2012 Guus Sliepen <guus@tinc-vpn.org>,
+ Copyright (C) 2000-2013 Guus Sliepen <guus@tinc-vpn.org>,
2000-2005 Ivo Timmermans
This program is free software; you can redistribute it and/or modify
#include "net.h"
#include "netutl.h"
#include "node.h"
-#include "process.h"
+#include "script.h"
#include "subnet.h"
#include "utils.h"
#include "xalloc.h"
/* Allocating and freeing space for subnets */
subnet_t *new_subnet(void) {
- return xmalloc_and_zero(sizeof(subnet_t));
+ return xzalloc(sizeof(subnet_t));
}
void free_subnet(subnet_t *subnet) {
subnet->owner = n;
splay_insert(subnet_tree, subnet);
- splay_insert(n->subnet_tree, subnet);
+ if (n)
+ splay_insert(n->subnet_tree, subnet);
subnet_cache_flush();
}
void subnet_del(node_t *n, subnet_t *subnet) {
- splay_delete(n->subnet_tree, subnet);
+ if (n)
+ splay_delete(n->subnet_tree, subnet);
splay_delete(subnet_tree, subnet);
subnet_cache_flush();
if(!memcmp(address, &p->net.mac.address, sizeof *address)) {
r = p;
- if(p->owner->status.reachable)
+ if(!p->owner || p->owner->status.reachable)
break;
}
}
if(!maskcmp(address, &p->net.ipv4.address, p->net.ipv4.prefixlength)) {
r = p;
- if(p->owner->status.reachable)
+ if(!p->owner || p->owner->status.reachable)
break;
}
}
if(!maskcmp(address, &p->net.ipv6.address, p->net.ipv6.prefixlength)) {
r = p;
- if(p->owner->status.reachable)
+ if(!p->owner || p->owner->status.reachable)
break;
}
}
// Prepare environment variables to be passed to the script
- char *envp[9] = {NULL};
+ char *envp[10] = {NULL};
xasprintf(&envp[0], "NETNAME=%s", netname ? : "");
xasprintf(&envp[1], "DEVICE=%s", device ? : "");
xasprintf(&envp[2], "INTERFACE=%s", iface ? : "");
free(address);
}
+ xasprintf(&envp[8], "NAME=%s", myself->name);
+
name = up ? "subnet-up" : "subnet-down";
if(!subnet) {
}
}
- for(int i = 0; envp[i] && i < 8; i++)
+ for(int i = 0; envp[i] && i < 9; i++)
free(envp[i]);
}
send_request(c, "%d %d %s %s",
CONTROL, REQ_DUMP_SUBNETS,
- netstr, subnet->owner->name);
+ netstr, subnet->owner ? subnet->owner->name : "(broadcast)");
}
return send_request(c, "%d %d", CONTROL, REQ_DUMP_SUBNETS);