More mood cleanups.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 6d51d4f58ad9f35a3a79b03d41cbd90b6a85b418..d5da1e557ee3d2df242ced8fff3c2991e803967c 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -144,11 +144,12 @@ int send_callback_request(callback_function *f, struct osl_object *query,
        int ret, fd = -1, query_shmid, result_shmid;
        void *query_shm, *result_shm;
        char buf[sizeof(afs_socket_cookie) + sizeof(int)];
-//     char *tmpsocket_name;
        struct sockaddr_un unix_addr;
+       size_t query_shm_size = sizeof(*cq);
 
-       assert(query->data && query->size);
-       ret = shm_new(query->size + sizeof(*cq));
+       if (query)
+               query_shm_size += query->size;
+       ret = shm_new(query_shm_size);
        if (ret < 0)
                return ret;
        query_shmid = ret;
@@ -157,9 +158,10 @@ int send_callback_request(callback_function *f, struct osl_object *query,
                goto out;
        cq = query_shm;
        cq->handler = f;
-       cq->query_size = query->size;
+       cq->query_size = query_shm_size - sizeof(*cq);
 
-       memcpy(query_shm + sizeof(*cq), query->data, query->size);
+       if (query)
+               memcpy(query_shm + sizeof(*cq), query->data, query->size);
        ret = shm_detach(query_shm);
        if (ret < 0)
                goto out;
@@ -364,8 +366,9 @@ static int fd2buf(int fd, unsigned max_size, struct osl_object *obj)
 }
 
 /**
- * Read from stdin, and send the result to the parent process.
+ * Read data from a file descriptor, and send it to the afs process.
  *
+ * \param fd File descriptor to read data from.
  * \param arg_obj Pointer to the arguments to \a f.
  * \param f The callback function.
  * \param max_len Don't read more than that many bytes from stdin.
@@ -373,7 +376,7 @@ static int fd2buf(int fd, unsigned max_size, struct osl_object *obj)
  *
  * This function is used by commands that wish to let para_server store
  * arbitrary data specified by the user (for instance the add_blob family of
- * commands). First, at most \a max_len bytes are read from stdin, the result
+ * commands). First, at most \a max_len bytes are read from \a fd, the result
  * is concatenated with the buffer given by \a arg_obj, and the combined buffer
  * is made available to the parent process via shared memory.
  *
@@ -473,7 +476,7 @@ static enum play_mode init_admissible_files(void)
        given_playlist = "given_playlist";
 
        if (given_mood) {
-               ret = mood_open(given_mood);
+               ret = change_current_mood(given_mood);
                if (ret >= 0) {
                        if (given_playlist)
                                PARA_WARNING_LOG("ignoring playlist %s\n",
@@ -486,10 +489,10 @@ static enum play_mode init_admissible_files(void)
                if (ret >= 0)
                        return PLAY_MODE_PLAYLIST;
        }
-       ret = mood_open(NULL); /* open first available mood */
+       ret = change_current_mood(NULL); /* open first available mood */
        if (ret >= 0)
                return PLAY_MODE_MOOD;
-       mood_open(""); /* open dummy mood, always successful */
+       change_current_mood(""); /* open dummy mood, always successful */
        return PLAY_MODE_MOOD;
 }
 
@@ -530,7 +533,7 @@ static void close_afs_tables(enum osl_close_flags flags)
        PARA_NOTICE_LOG("closing afs_tables\n");
        score_shutdown(flags);
        attribute_shutdown(flags);
-       mood_close();
+       close_current_mood();
        playlist_close();
        moods_shutdown(flags);
        playlists_shutdown(flags);
@@ -553,10 +556,10 @@ static void signal_post_select(struct sched *s, struct task *t)
        if (!FD_ISSET(st->fd, &s->rfds))
                return;
        st->signum = para_next_signal();
-       PARA_NOTICE_LOG("caught signal %d\n", st->signum);
        t->ret = 1;
        if (st->signum == SIGUSR1)
                return; /* ignore SIGUSR1 */
+       PARA_NOTICE_LOG("caught signal %d\n", st->signum);
        t->ret = -E_SIGNAL_CAUGHT;
        unregister_tasks();
 }
@@ -855,3 +858,66 @@ int com_init(int fd, int argc, char * const * const argv)
                return ret;
        return send_va_buffer(fd, "successfully created afs table(s)\n");
 }
+
+enum com_check_flags {
+       CHECK_AFT = 1,
+       CHECK_MOODS = 2,
+       CHECK_PLAYLISTS = 4
+};
+
+int com_check(int fd, int argc, char * const * const argv)
+{
+       unsigned flags = 0;
+       int i, ret;
+       struct osl_object result;
+
+       for (i = 1; i < argc; i++) {
+               const char *arg = argv[i];
+               if (arg[0] != '-')
+                       break;
+               if (!strcmp(arg, "--")) {
+                       i++;
+                       break;
+               }
+               if (!strcmp(arg, "-a")) {
+                       flags |= CHECK_AFT;
+                       continue;
+               }
+               if (!strcmp(arg, "-p")) {
+                       flags |= CHECK_PLAYLISTS;
+                       continue;
+               }
+               if (!strcmp(arg, "-m")) {
+                       flags |= CHECK_MOODS;
+                       continue;
+               }
+               return -E_AFS_SYNTAX;
+       }
+       if (i < argc)
+               return -E_AFS_SYNTAX;
+       if (!flags)
+               flags = ~0U;
+       if (flags & CHECK_AFT) {
+               ret = send_callback_request(aft_check_callback, NULL, &result);
+               if (ret < 0)
+                       return ret;
+               if (ret > 0) {
+                       ret = send_buffer(fd, (char *) result.data);
+                       free(result.data);
+                       if (ret < 0)
+                               return ret;
+               }
+       }
+       if (flags & CHECK_PLAYLISTS) {
+               ret = send_callback_request(playlist_check_callback, NULL, &result);
+               if (ret < 0)
+                       return ret;
+               if (ret > 0) {
+                       ret = send_buffer(fd, (char *) result.data);
+                       free(result.data);
+                       if (ret < 0)
+                               return ret;
+               }
+       }
+       return 1;
+}