}
/* 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
- return -E_AFS_SYNTAX;
+ } else {
+ if (errmsg)
+ *errmsg = make_message("%s: parse error", arg);
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
+ }
if (ret < 0)
return ret;
}
strncpy(mmd->afs_mode_string, arg,
sizeof(mmd->afs_mode_string));
mmd->afs_mode_string[sizeof(mmd->afs_mode_string) - 1] = '\0';
+ mmd->events++;
mutex_unlock(mmd_mutex);
} else {
mutex_lock(mmd_mutex);
strcpy(mmd->afs_mode_string, "dummy");
+ mmd->events++;
mutex_unlock(mmd_mutex);
current_mop = NULL;
}
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);
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) {
+ 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);
static void init_admissible_files(const char *arg)
{
- if (activate_mood_or_playlist(arg, NULL) < 0)
- activate_mood_or_playlist(NULL, NULL); /* always successful */
+ 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, NULL);
+ }
}
static int setup_command_socket_or_die(void)