+ const char *arg = aca->query.data;
+ int num_admissible, ret;
+
+ ret = clear_score_table();
+ if (ret < 0) {
+ para_printf(&aca->pbout, "could not clear score table: %s\n",
+ para_strerror(-ret));
+ return ret;
+ }
+ if (current_play_mode == PLAY_MODE_MOOD)
+ close_current_mood();
+ else
+ playlist_close();
+ ret = activate_mood_or_playlist(arg, &num_admissible);
+ if (ret >= 0)
+ goto out;
+ /* ignore subsequent errors (but log them) */
+ para_printf(&aca->pbout, "could not activate %s\n", arg);
+ if (current_mop) {
+ int ret2;
+ para_printf(&aca->pbout, "switching back to %s\n", current_mop);
+ ret2 = activate_mood_or_playlist(current_mop, &num_admissible);
+ if (ret2 >= 0)
+ goto out;
+ 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);
+out:
+ para_printf(&aca->pbout, "activated %s (%d admissible files)\n",
+ current_mop? current_mop : "dummy mood", num_admissible);
+ return ret;
+}
+
+int com_select(struct command_context *cc)
+{
+ struct osl_object query;
+
+ if (cc->argc != 2)
+ return -E_AFS_SYNTAX;
+ query.data = cc->argv[1];
+ query.size = strlen(cc->argv[1]) + 1;
+ return send_callback_request(com_select_callback, &query,
+ &afs_cb_result_handler, cc);
+}
+
+static void init_admissible_files(char *arg)
+{
+ if (activate_mood_or_playlist(arg, NULL) < 0)
+ activate_mood_or_playlist(NULL, NULL); /* always successful */
+}