X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=5623d7e995743dccbfa5ddfa782930d7b63c37cb;hp=ef05a473e85a022568a785ecc8da140d2b19d1dc;hb=3d3a2f50;hpb=a61e862450dc1e74394bf5bbf7002d9947f98d31 diff --git a/afs.c b/afs.c index ef05a473..5623d7e9 100644 --- a/afs.c +++ b/afs.c @@ -466,23 +466,30 @@ no_admissible_files: } /* Never fails if arg == NULL */ -static int activate_mood_or_playlist(const char *arg, int *num_admissible) +static int activate_mood_or_playlist(const char *arg, int *num_admissible, + char **errmsg) { enum play_mode mode; int ret; if (!arg) { - ret = change_current_mood(NULL); /* always successful */ + ret = change_current_mood(NULL, NULL); /* always successful */ mode = PLAY_MODE_MOOD; } else { if (!strncmp(arg, "p/", 2)) { ret = playlist_open(arg + 2); + if (ret < 0 && errmsg) + *errmsg = make_message( "could not open %s", + arg); mode = PLAY_MODE_PLAYLIST; } else if (!strncmp(arg, "m/", 2)) { - ret = change_current_mood(arg + 2); + ret = change_current_mood(arg + 2, errmsg); mode = PLAY_MODE_MOOD; - } else + } else { + if (errmsg) + *errmsg = make_message("%s: parse error", arg); return -ERRNO_TO_PARA_ERROR(EINVAL); + } if (ret < 0) return ret; } @@ -564,6 +571,7 @@ static int com_select_callback(struct afs_callback_arg *aca) const struct lls_command *cmd = SERVER_CMD_CMD_PTR(SELECT); const char *arg; int num_admissible, ret; + char *errmsg; ret = lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr); assert(ret >= 0); @@ -577,22 +585,27 @@ static int com_select_callback(struct afs_callback_arg *aca) close_current_mood(); else playlist_close(); - ret = activate_mood_or_playlist(arg, &num_admissible); + ret = activate_mood_or_playlist(arg, &num_admissible, &errmsg); if (ret >= 0) goto out; /* ignore subsequent errors (but log them) */ + para_printf(&aca->pbout, "%s\n", errmsg); + free(errmsg); para_printf(&aca->pbout, "could not activate %s\n", arg); if (current_mop && strcmp(current_mop, arg) != 0) { int ret2; para_printf(&aca->pbout, "switching back to %s\n", current_mop); - ret2 = activate_mood_or_playlist(current_mop, &num_admissible); + ret2 = activate_mood_or_playlist(current_mop, &num_admissible, + &errmsg); if (ret2 >= 0) goto out; + para_printf(&aca->pbout, "%s\n", errmsg); + free(errmsg); para_printf(&aca->pbout, "could not reactivate %s: %s\n", current_mop, para_strerror(-ret2)); } para_printf(&aca->pbout, "activating dummy mood\n"); - activate_mood_or_playlist(NULL, &num_admissible); + activate_mood_or_playlist(NULL, &num_admissible, NULL); out: para_printf(&aca->pbout, "activated %s (%d admissible files)\n", current_mop? current_mop : "dummy mood", num_admissible); @@ -617,12 +630,12 @@ EXPORT_SERVER_CMD_HANDLER(select); static void init_admissible_files(const char *arg) { - int ret = activate_mood_or_playlist(arg, NULL); + int ret = activate_mood_or_playlist(arg, NULL, NULL); if (ret < 0) { assert(arg); PARA_WARNING_LOG("could not activate %s: %s\n", arg, para_strerror(-ret)); - activate_mood_or_playlist(NULL, NULL); /* always successful */ + activate_mood_or_playlist(NULL, NULL, NULL); } }