--- xmms-1.2.10.orig/libxmms/configfile.c 2003-05-19 23:22:07.000000000 +0200 +++ xmms-1.2.10/libxmms/configfile.c 2006-07-07 11:30:49.000000000 +0200 @@ -43,15 +43,15 @@ ConfigFile *xmms_cfg_new(void) return cfg; } -ConfigFile *xmms_cfg_open_file(gchar * filename) +static +ConfigFile *xmms_cfg_open_or_merge_file(ConfigFile *cfg, gchar * filename) { - ConfigFile *cfg; - FILE *file; char *buffer, **lines, *tmp; int i; struct stat stats; ConfigSection *section = NULL; + ConfigLine *line; g_return_val_if_fail(filename != NULL, FALSE); @@ -70,7 +70,9 @@ ConfigFile *xmms_cfg_open_file(gchar * f fclose(file); buffer[stats.st_size] = '\0'; - cfg = g_malloc0(sizeof (ConfigFile)); + if (!cfg) + cfg = g_malloc0(sizeof (ConfigFile)); + lines = g_strsplit(buffer, "\n", 0); g_free(buffer); i = 0; @@ -81,7 +83,9 @@ ConfigFile *xmms_cfg_open_file(gchar * f if ((tmp = strchr(lines[i], ']'))) { *tmp = '\0'; - section = xmms_cfg_create_section(cfg, &lines[i][1]); + section = xmms_cfg_find_section(cfg, &lines[i][1]); + if (!section) + section = xmms_cfg_create_section(cfg, &lines[i][1]); } } else if (lines[i][0] != '#' && section) @@ -90,7 +94,13 @@ ConfigFile *xmms_cfg_open_file(gchar * f { *tmp = '\0'; tmp++; - xmms_cfg_create_string(section, lines[i], tmp); + if ((line = xmms_cfg_find_string(section, lines[i]))) + { + g_free(line->value); + line->value = g_strchug(g_strchomp(g_strdup(tmp))); + } + else + xmms_cfg_create_string(section, lines[i], tmp); } } i++; @@ -99,6 +109,20 @@ ConfigFile *xmms_cfg_open_file(gchar * f return cfg; } +static gchar *custom_filename = NULL; +ConfigFile *xmms_cfg_open_file(gchar *filename) +{ + ConfigFile *cfg = xmms_cfg_open_or_merge_file(NULL, filename); + if (cfg && custom_filename) + xmms_cfg_open_or_merge_file(cfg, custom_filename); + return cfg; +} + +void xmms_cfg_set_custom_filename(gchar *filename) +{ + custom_filename = filename; +} + gchar * xmms_cfg_get_default_filename(void) { static char *filename = NULL; --- xmms-1.2.10.orig/libxmms/configfile.h 2000-02-16 22:05:54.000000000 +0100 +++ xmms-1.2.10/libxmms/configfile.h 2006-07-07 11:30:49.000000000 +0200 @@ -65,6 +65,8 @@ void xmms_cfg_write_double(ConfigFile * void xmms_cfg_remove_key(ConfigFile * cfg, gchar * section, gchar * key); +void xmms_cfg_set_custom_filename(gchar *filename); + #ifdef __cplusplus }; #endif --- xmms-1.2.10.orig/xmms/main.c 2004-02-23 21:31:43.000000000 +0100 +++ xmms-1.2.10/xmms/main.c 2006-07-07 11:31:10.000000000 +0200 @@ -3212,6 +3212,7 @@ static struct option long_options[] = {"show-main-window", 0, NULL, 'm'}, {"version", 0, NULL, 'v'}, {"sm-client-id", 1, NULL, 'i'}, + {"config", 1, NULL, 'c'}, {0, 0, 0, 0} }; @@ -3275,7 +3276,7 @@ void parse_cmd_line(int argc, char **arg memset(opt, 0, sizeof(struct cmdlineopt)); opt->session = -1; - while ((c = getopt_long(argc, argv, "hn:rpusfemvt", long_options, NULL)) != -1) + while ((c = getopt_long(argc, argv, "hn:rpusfemvtc", long_options, NULL)) != -1) { switch (c) { @@ -3285,6 +3286,9 @@ void parse_cmd_line(int argc, char **arg case 'n': opt->session = atoi(optarg); break; + case 'c': + xmms_cfg_set_custom_filename(g_strdup(optarg)); + break; case 'r': opt->rew = TRUE; break;