+ return 1;
+}
+
+static void com_select_callback(int fd, const struct osl_object *query)
+{
+ struct para_buffer pb = {
+ .max_size = SHMMAX,
+ .private_data = &fd,
+ .max_size_handler = pass_buffer_as_shm
+ };
+ char *arg = query->data;
+ int num_admissible, ret, ret2;
+
+ ret = clear_score_table();
+ if (ret < 0) {
+ ret2 = para_printf(&pb, "%s\n", para_strerror(-ret));
+ goto out;
+ }
+ if (current_play_mode == PLAY_MODE_MOOD)
+ close_current_mood();
+ else
+ playlist_close();
+ ret = activate_mood_or_playlist(arg, &num_admissible);
+ if (ret < 0) {
+ ret2 = para_printf(&pb, "%s\nswitching back to %s\n",
+ para_strerror(-ret), current_mop?
+ current_mop : "dummy");
+ ret = activate_mood_or_playlist(current_mop, &num_admissible);
+ if (ret < 0) {
+ if (ret2 >= 0)
+ ret2 = para_printf(&pb, "failed, switching to dummy\n");
+ activate_mood_or_playlist(NULL, &num_admissible);
+ }
+ } else
+ ret2 = para_printf(&pb, "activated %s (%d admissible files)\n", current_mop?
+ current_mop : "dummy mood", num_admissible);
+out:
+ if (ret2 >= 0 && pb.offset)
+ pass_buffer_as_shm(pb.buf, pb.offset, &fd);
+ free(pb.buf);
+}
+
+/**
+ * Result handler for sending data to the para_client process.
+ *
+ * \param result The data to be sent.
+ * \param private Pointer to rc4 context.
+ *
+ * \return The return value of the underlying call to rc4_send_bin_buffer().
+ *
+ * \sa \ref callback_result_handler, \ref rc4_send_bin_buffer().
+ */
+int rc4_send_result(struct osl_object *result, void *private)
+{
+ struct rc4_context *rc4c = private;
+
+ if (!result->size)
+ return 1;
+ return rc4_send_bin_buffer(rc4c, result->data, result->size);
+}
+
+int com_select(struct rc4_context *rc4c, int argc, char * const * const argv)
+{
+ struct osl_object query;
+
+ if (argc != 2)
+ return -E_AFS_SYNTAX;
+ query.data = argv[1];
+ query.size = strlen(argv[1]) + 1;
+ return send_callback_request(com_select_callback, &query,
+ &rc4_send_result, rc4c);
+}
+
+static void init_admissible_files(char *arg)
+{
+ if (activate_mood_or_playlist(arg, NULL) < 0)
+ activate_mood_or_playlist(NULL, NULL); /* always successful */