- char subnetstr[MAX_STRING_SIZE];
- char name[MAX_STRING_SIZE];
- node_t *owner;
- connection_t *other;
- subnet_t *s, *find;
- avl_node_t *node;
-cp
- if(sscanf(c->buffer, "%*d %*x "MAX_STRING" "MAX_STRING, name, subnetstr) != 2)
- {
- syslog(LOG_ERR, _("Got bad %s from %s (%s)"), "DEL_SUBNET", c->name, c->hostname);
- return -1;
- }
-
- /* Check if owner name is a valid */
-
- if(check_id(name))
- {
- syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name, c->hostname, _("invalid name"));
- return -1;
- }
-
- /* Check if the owner of the new subnet is in the connection list */
-
- if(!(owner = lookup_node(name)))
- {
- if(debug_lvl >= DEBUG_PROTOCOL)
- syslog(LOG_WARNING, _("Got %s from %s (%s) for %s which is not in our node tree"),
- "DEL_SUBNET", c->name, c->hostname, name);
- return 0;
- }
-
- /* Check if subnet string is valid */
-
- if(!(s = str2net(subnetstr)))
- {
- syslog(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name, c->hostname, _("invalid subnet string"));
- return -1;
- }
-
- if(seen_request(c->buffer))
- return 0;
-
- /* If everything is correct, delete the subnet from the list of the owner */
-
- s->owner = owner;
-
- find = lookup_subnet(owner, s);
-
- free_subnet(s);
-
- if(!find)
- {
- if(debug_lvl >= DEBUG_PROTOCOL)
- syslog(LOG_WARNING, _("Got %s from %s (%s) for %s which does not appear in his subnet tree"),
- "DEL_SUBNET", c->name, c->hostname, name);
- return 0;
- }
-
- /* If we are the owner of this subnet, retaliate with an ADD_SUBNET */
-
- if(owner == myself)
- {
- if(debug_lvl >= DEBUG_PROTOCOL)
- syslog(LOG_WARNING, _("Got %s from %s (%s) for ourself"), "DEL_SUBNET", c->name, c->hostname);
- send_add_subnet(c, find);
- return 0;
- }
-
- /* Tell the rest */
-
- for(node = connection_tree->head; node; node = node->next)
- {
- other = (connection_t *)node->data;
- if(other->status.active && other != c)
- send_request(other, "%s", c->buffer);
- }
-
- /* Finally, delete it. */
-
- subnet_del(owner, find);
-
-cp
- return 0;
+ char subnetstr[MAX_STRING_SIZE];
+ char name[MAX_STRING_SIZE];
+ node_t *owner;
+ subnet_t s = {0}, *find;
+
+ cp();
+
+ if(sscanf(c->buffer, "%*d %*x " MAX_STRING " " MAX_STRING, name, subnetstr) != 2) {
+ logger(LOG_ERR, _("Got bad %s from %s (%s)"), "DEL_SUBNET", c->name,
+ c->hostname);
+ return false;
+ }
+
+ /* Check if owner name is a valid */
+
+ if(!check_id(name)) {
+ logger(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name,
+ c->hostname, _("invalid name"));
+ return false;
+ }
+
+ /* Check if the owner of the new subnet is in the connection list */
+
+ owner = lookup_node(name);
+
+ if(!owner) {
+ ifdebug(PROTOCOL) logger(LOG_WARNING, _("Got %s from %s (%s) for %s which is not in our node tree"),
+ "DEL_SUBNET", c->name, c->hostname, name);
+ return true;
+ }
+
+ if(tunnelserver && owner != myself && owner != c->node)
+ return false;
+
+ /* Check if subnet string is valid */
+
+ if(!str2net(&s, subnetstr)) {
+ logger(LOG_ERR, _("Got bad %s from %s (%s): %s"), "DEL_SUBNET", c->name,
+ c->hostname, _("invalid subnet string"));
+ return false;
+ }
+
+ if(seen_request(c->buffer))
+ return true;
+
+ /* If everything is correct, delete the subnet from the list of the owner */
+
+ s.owner = owner;
+
+ find = lookup_subnet(owner, &s);
+
+ if(!find) {
+ ifdebug(PROTOCOL) logger(LOG_WARNING, _("Got %s from %s (%s) for %s which does not appear in his subnet tree"),
+ "DEL_SUBNET", c->name, c->hostname, name);
+ return true;
+ }
+
+ /* If we are the owner of this subnet, retaliate with an ADD_SUBNET */
+
+ if(owner == myself) {
+ ifdebug(PROTOCOL) logger(LOG_WARNING, _("Got %s from %s (%s) for ourself"),
+ "DEL_SUBNET", c->name, c->hostname);
+ send_add_subnet(c, find);
+ return true;
+ }
+
+ /* Tell the rest */
+
+ if(!tunnelserver)
+ forward_request(c);
+
+ /* Finally, delete it. */
+
+ if(owner->status.reachable)
+ subnet_update(owner, find, false);
+
+ subnet_del(owner, find);
+
+ return true;