-/*
- dispatch any incoming meta requests
-*/
-int handle_incoming_meta_data(conn_list_t *cl)
-{
- int x, l = sizeof(x);
- unsigned char tmp[1600];
- int request;
- int lenin = 0;
-cp
- if(getsockopt(cl->meta_socket, SOL_SOCKET, SO_ERROR, &x, &l) < 0)
- {
- syslog(LOG_ERR, "This is a bug: %s:%d: %d:%m", __FILE__, __LINE__, cl->meta_socket);
- return -1;
- }
- if(x)
- {
- syslog(LOG_ERR, "Metadata socket error: %s", sys_errlist[x]);
- return -1;
- }
-
- if(read(cl->meta_socket, &tmp, 1) <= 0)
- {
- syslog(LOG_ERR, "Receive failed: %m");
- return -1;
- }
-
- request = (int)(tmp[0]);
-
- if(debug_lvl > 3)
- syslog(LOG_DEBUG, "got request %d", request);
-
- /* This is a hack. After an ACK request, multiple ADD_HOSTs can
- follow. So if the request is one of these, only read as much
- bytes as necessary. (Luckily the ADD_HOST request is of fixed
- length) :P -- ivo */
-
- if(request != ACK)
- {
- if(request == ADD_HOST)
- {
- if((lenin = read(cl->meta_socket, &tmp[1], sizeof(add_host_t) - 1)) <= 0)
- {
- syslog(LOG_ERR, "Receive failed for ADD_HOST: %m");
- return -1;
- }
+ xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, myself->name);
+ read_config_file(config_tree, fname);
+ free(fname);
+
+ /* Parse some options that are allowed to be changed while tinc is running */
+
+ setup_myself_reloadable();
+
+ /* If StrictSubnet is set, expire deleted Subnets and read new ones in */
+
+ if(strictsubnets) {
+ for splay_each(subnet_t, subnet, subnet_tree)
+ subnet->expires = 1;
+
+ load_all_subnets();
+
+ for splay_each(subnet_t, subnet, subnet_tree) {
+ if(subnet->expires == 1) {
+ send_del_subnet(everyone, subnet);
+ if(subnet->owner->status.reachable)
+ subnet_update(subnet->owner, subnet, false);
+ subnet_del(subnet->owner, subnet);
+ } else if(subnet->expires == -1) {
+ subnet->expires = 0;
+ } else {
+ send_add_subnet(everyone, subnet);
+ if(subnet->owner->status.reachable)
+ subnet_update(subnet->owner, subnet, true);
+ }
+ }
+ } else { /* Only read our own subnets back in */
+ for splay_each(subnet_t, subnet, myself->subnet_tree)
+ if(!subnet->expires)
+ subnet->expires = 1;
+
+ config_t *cfg = lookup_config(config_tree, "Subnet");
+
+ while(cfg) {
+ subnet_t *subnet, *s2;
+
+ if(!get_config_subnet(cfg, &subnet))
+ continue;
+
+ if((s2 = lookup_subnet(myself, subnet))) {
+ if(s2->expires == 1)
+ s2->expires = 0;
+
+ free_subnet(subnet);
+ } else {
+ subnet_add(myself, subnet);
+ send_add_subnet(everyone, subnet);
+ subnet_update(myself, subnet, true);
+ }
+
+ cfg = lookup_config_next(config_tree, cfg);
+ }
+
+ for splay_each(subnet_t, subnet, myself->subnet_tree) {
+ if(subnet->expires == 1) {
+ send_del_subnet(everyone, subnet);
+ subnet_update(myself, subnet, false);
+ subnet_del(myself, subnet);
+ }
+ }