+ g_ptr_array_add(argv_ptr, stralloc("--exclude-optional"));
+ g_ptr_array_add(argv_ptr, stralloc("yes"));
+ }
+
+ if (bsu->features && amfeatures) {
+ char *feature_string = am_feature_to_string(amfeatures);
+ g_ptr_array_add(argv_ptr, stralloc("--amfeatures"));
+ g_ptr_array_add(argv_ptr, feature_string);
+ }
+
+ if (dle->data_path == DATA_PATH_DIRECTTCP &&
+ bsu->data_path_set & DATA_PATH_DIRECTTCP) {
+ GSList *directtcp;
+
+ g_ptr_array_add(argv_ptr, stralloc("--data-path"));
+ g_ptr_array_add(argv_ptr, stralloc("directtcp"));
+ for (directtcp = dle->directtcp_list; directtcp != NULL;
+ directtcp = directtcp->next) {
+ g_ptr_array_add(argv_ptr, stralloc("--direct-tcp"));
+ g_ptr_array_add(argv_ptr, stralloc(directtcp->data));
+ break; /* XXX temporary; apps only support one ip:port pair */
+ }
+ }
+ }
+
+ property_add_to_argv(argv_ptr, dle->application_property);
+ return;
+}
+
+typedef struct {
+ dle_t *dle;
+ char *name;
+ proplist_t dle_proplist;
+ int verbose;
+ int good;
+} merge_property_t;
+
+static void
+merge_property(
+ gpointer key_p,
+ gpointer value_p,
+ gpointer user_data_p)
+{
+ char *property_s = key_p;
+ property_t *conf_property = value_p;
+ merge_property_t *merge_p = user_data_p;
+ property_t *dle_property = g_hash_table_lookup(merge_p->dle_proplist,
+ property_s);
+ GSList *value;
+ char *qdisk = quote_string(merge_p->dle->disk);
+
+ if (dle_property) {
+ if (dle_property->priority && conf_property->priority) {
+ if (merge_p->verbose) {
+ g_fprintf(stdout,
+ _("ERROR %s (%s) Both server client have priority for property '%s'.\n"),
+ qdisk, merge_p->name, property_s);
+ }
+ g_debug("ERROR %s (%s) Both server client have priority for property '%s'.", qdisk, merge_p->name, property_s);
+ merge_p->good = 0;
+ /* Use client property */
+ g_hash_table_remove(merge_p->dle_proplist, key_p);
+ g_hash_table_insert(merge_p->dle_proplist, key_p, conf_property);
+ } else if (dle_property->priority) {
+ if (merge_p->verbose) {
+ g_fprintf(stdout,
+ _("ERROR %s (%s) Server set priority for property '%s' but client set the property.\n"),
+ qdisk, merge_p->name, property_s);
+ }
+ g_debug("%s (%s) Server set priority for property '%s' but client set the property.", qdisk, merge_p->name, property_s);
+ /* use server property */
+ } else if (conf_property->priority) {
+ if (merge_p->verbose) {
+ g_fprintf(stdout,
+ _("ERROR %s (%s) Client set priority for property '%s' but server set the property.\n"),
+ qdisk, merge_p->name, property_s);
+ }
+ g_debug("%s (%s) Client set priority for property '%s' but server set the property.", qdisk, merge_p->name, property_s);
+ /* Use client property */
+ g_hash_table_remove(merge_p->dle_proplist, key_p);
+ g_hash_table_insert(merge_p->dle_proplist, key_p, conf_property);
+ } else if (!conf_property->append) {
+ if (merge_p->verbose) {
+ g_fprintf(stdout,
+ _("ERROR %s (%s) Both server and client set property '%s', using client value.\n"),
+ qdisk, merge_p->name, property_s);
+ }
+ g_debug("%s (%s) Both server and client set property '%s', using client value.", qdisk, merge_p->name, property_s);
+ /* Use client property */
+ g_hash_table_remove(merge_p->dle_proplist, key_p);
+ g_hash_table_insert(merge_p->dle_proplist, key_p, conf_property);
+ } else { /* merge */
+ for (value = conf_property->values; value != NULL;
+ value = value->next) {
+ dle_property->values = g_slist_append(dle_property->values,
+ value->data);
+ }