+ GNUNET_free (allowed_hosts);
+}
+
+static struct SharedServiceInstance *
+associate_shared_service (struct GNUNET_TESTING_System *system,
+ struct SharedService *ss,
+ struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+ struct SharedServiceInstance *i;
+ struct GNUNET_CONFIGURATION_Handle *temp;
+ char *gnunet_home;
+ uint32_t port;
+
+ ss->n_peers++;
+ if ( ((0 == ss->share) && (NULL == ss->instances))
+ ||
+ ( (0 != ss->share)
+ && (ss->n_instances < ((ss->n_peers + ss->share - 1) / ss->share)) ) )
+ {
+ i = GNUNET_new (struct SharedServiceInstance);
+ i->ss = ss;
+ (void) GNUNET_asprintf (&gnunet_home, "%s/shared/%s/%u",
+ system->tmppath, ss->sname, ss->n_instances);
+ (void) GNUNET_asprintf (&i->unix_sock, "%s/sock", gnunet_home);
+ port = GNUNET_TESTING_reserve_port (system);
+ if (0 == port)
+ {
+ GNUNET_free (gnunet_home);
+ cleanup_shared_service_instance (i);
+ return NULL;
+ }
+ GNUNET_array_append (ss->instances, ss->n_instances, i);
+ temp = GNUNET_CONFIGURATION_dup (ss->cfg);
+ (void) GNUNET_asprintf (&i->port_str, "%u", port);
+ (void) GNUNET_asprintf (&i->cfg_fn, "%s/config", gnunet_home);
+ GNUNET_CONFIGURATION_set_value_string (temp, "PATHS", "GNUNET_HOME",
+ gnunet_home);
+ GNUNET_free (gnunet_home);
+ GNUNET_CONFIGURATION_set_value_string (temp, ss->sname, "UNIXPATH",
+ i->unix_sock);
+ GNUNET_CONFIGURATION_set_value_string (temp, ss->sname, "PORT",
+ i->port_str);
+ if (GNUNET_SYSERR == GNUNET_CONFIGURATION_write (temp, i->cfg_fn))
+ {
+ GNUNET_CONFIGURATION_destroy (temp);
+ cleanup_shared_service_instance (i);
+ return NULL;
+ }
+ GNUNET_CONFIGURATION_destroy (temp);
+ }
+ else
+ {
+ GNUNET_assert (NULL != ss->instances);
+ GNUNET_assert (0 < ss->n_instances);
+ i = ss->instances[ss->n_instances - 1];
+ }
+ GNUNET_CONFIGURATION_iterate_section_values(ss->cfg, ss->sname,
+ &cfg_copy_iterator, cfg);
+ GNUNET_CONFIGURATION_set_value_string (cfg, ss->sname, "UNIXPATH",
+ i->unix_sock);
+ GNUNET_CONFIGURATION_set_value_string (cfg, ss->sname, "PORT", i->port_str);
+ return i;