--- xmms-1.2.10.orig/xmms/controlsocket.c 2004-02-23 21:31:43.000000000 +0100 +++ xmms-1.2.10/xmms/controlsocket.c 2006-07-07 11:25:36.000000000 +0200 @@ -50,13 +50,18 @@ static pthread_cond_t start_cond = PTHRE gboolean setup_ctrlsocket(void) { + return setup_ctrlsocket_internal(-1); +} + +gboolean setup_ctrlsocket_internal(gint session_id) +{ struct sockaddr_un saddr; gboolean retval = FALSE; gint i; if ((ctrl_fd = socket(AF_UNIX, SOCK_STREAM, 0)) != -1) { - for (i = 0;; i++) + for (i = ((session_id >= 0) ? session_id : 0); (session_id < 0 || i == session_id); i++) { saddr.sun_family = AF_UNIX; g_snprintf(saddr.sun_path, 108, "%s/xmms_%s.%d", @@ -72,10 +77,17 @@ gboolean setup_ctrlsocket(void) } else { + if (session_id >= 0 && session_id != i) + { + g_log(NULL, G_LOG_LEVEL_CRITICAL, + "setup_ctrlsocket(): Session %d already running!", session_id); + break; + } if (cfg.allow_multiple_instances) continue; break; } + if (bind(ctrl_fd, (struct sockaddr *) &saddr, sizeof (saddr)) != -1) { session_id = i; @@ -95,6 +107,7 @@ gboolean setup_ctrlsocket(void) break; } } + } else g_log(NULL, G_LOG_LEVEL_CRITICAL, --- xmms-1.2.10.orig/xmms/controlsocket.h 2003-06-11 20:44:17.000000000 +0200 +++ xmms-1.2.10/xmms/controlsocket.h 2006-07-07 11:25:36.000000000 +0200 @@ -23,6 +23,7 @@ #define XMMS_PROTOCOL_VERSION 1 gboolean setup_ctrlsocket(void); +gboolean setup_ctrlsocket_internal(gint session_id); void cleanup_ctrlsocket(void); void start_ctrlsocket(void); void check_ctrlsocket(void); --- 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:27:53.000000000 +0200 @@ -1,3 +1,4 @@ + /* XMMS - Cross-platform multimedia player * Copyright (C) 1998-2003 Peter Alm, Mikael Alm, Olle Hallnas, * Thomas Nilsson and 4Front Technologies @@ -3202,6 +3203,7 @@ static struct option long_options[] = { {"help", 0, NULL, 'h'}, {"session", 1, NULL, 'n'}, + {"force-session", 0, NULL, 'N' }, {"rew", 0, NULL, 'r'}, {"play", 0, NULL, 'p'}, {"pause", 0, NULL, 'u'}, @@ -3224,8 +3226,11 @@ void display_usage(void) /* -h, --help switch */ fprintf(stderr, _("Display this text and exit.")); fprintf(stderr, "\n-n, --session "); - /* -n, --session switch */ + /* -n, --session option */ fprintf(stderr, _("Select XMMS session (Default: 0)")); + fprintf(stderr, "\n-N, --force-session "); + /* -N, -force-session switch */ + fprintf(stderr, _("Force XMMS session")); fprintf(stderr, "\n-r, --rew "); /* -r, --rew switch */ fprintf(stderr, _("Skip backwards in playlist")); @@ -3263,6 +3268,7 @@ void display_usage(void) struct cmdlineopt { GList *filenames; int session; + gboolean force_session; gboolean play, stop, pause, fwd, rew, play_pause; gboolean enqueue, mainwin, remote; char *previous_session_id; @@ -3275,7 +3281,8 @@ 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) + opt->force_session = FALSE; + while ((c = getopt_long(argc, argv, "hn:rpusfemvtN", long_options, NULL)) != -1) { switch (c) { @@ -3285,6 +3292,9 @@ void parse_cmd_line(int argc, char **arg case 'n': opt->session = atoi(optarg); break; + case 'N': + opt->force_session = TRUE; + break; case 'r': opt->rew = TRUE; break; @@ -3557,7 +3567,9 @@ int main(int argc, char **argv) } make_xmms_dir(); - if (options.session != -1 || !setup_ctrlsocket()) + if (options.force_session + ? !setup_ctrlsocket_internal(options.session) + : (options.session != -1 || !setup_ctrlsocket())) { handle_cmd_line_options(&options, TRUE); exit(0);