]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - afs.c
Don't let make write the filename into the output
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index fd43d593d1f30c118df472ca3f11f2aa53b02864..b8acb53a9ffa2782e8fc0421a9a01f5642347eed 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2009 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -75,6 +75,7 @@ struct command_task {
        struct task task;
 };
 
+extern int mmd_mutex;
 extern struct misc_meta_data *mmd;
 
 static int server_socket;
@@ -499,7 +500,7 @@ static int pass_afd(int fd, char *buf, size_t size)
  *
  * \sa open_and_update_audio_file().
  */
-int open_next_audio_file(void)
+static int open_next_audio_file(void)
 {
        struct osl_row *aft_row;
        struct audio_file_data afd;
@@ -571,15 +572,15 @@ static int activate_mood_or_playlist(char *arg, int *num_admissible)
                free(current_mop);
                if (arg) {
                        current_mop = para_strdup(arg);
-                       mmd_lock();
+                       mutex_lock(mmd_mutex);
                        strncpy(mmd->afs_mode_string, arg,
                                sizeof(mmd->afs_mode_string));
                        mmd->afs_mode_string[sizeof(mmd->afs_mode_string) - 1] = '\0';
-                       mmd_unlock();
+                       mutex_unlock(mmd_mutex);
                } else {
-                       mmd_lock();
+                       mutex_lock(mmd_mutex);
                        strcpy(mmd->afs_mode_string, "dummy");
-                       mmd_unlock();
+                       mutex_unlock(mmd_mutex);
                        current_mop = NULL;
                }
        }
@@ -757,20 +758,23 @@ static void signal_post_select(struct sched *s, struct task *t)
 {
        struct signal_task *st = container_of(t, struct signal_task, task);
        if (getppid() == 1) {
-               t->error = -E_AFS_PARENT_DIED;
-               return;
+               PARA_EMERG_LOG("para_server died\n");
+               goto shutdown;
        }
        if (!FD_ISSET(st->fd, &s->rfds))
                return;
        st->signum = para_next_signal();
        if (st->signum == SIGHUP) {
                close_afs_tables();
+               parse_config_or_die(1);
                t->error = open_afs_tables();
                if (t->error < 0)
                        return;
                init_admissible_files(current_mop);
                return;
        }
+       PARA_EMERG_LOG("terminating on signal %d\n", st->signum);
+shutdown:
        sched_shutdown();
        t->error = -E_AFS_SIGNAL;
 }
@@ -889,7 +893,7 @@ static int call_callback(int fd, int query_shmid)
        query.data = (char *)query_shm + sizeof(*cq);
        query.size = cq->query_size;
        cq->handler(fd, &query);
-       return 1;
+       return shm_detach(query_shm);
 }
 
 static int execute_server_command(void)
@@ -1020,7 +1024,7 @@ static void register_command_task(uint32_t cookie)
  */
 __noreturn void afs_init(uint32_t cookie, int socket_fd)
 {
-       struct sched s;
+       static struct sched s;
        int i, ret;
 
        register_signal_task();
@@ -1102,7 +1106,7 @@ int com_init(int fd, int argc, char * const * const argv)
                                return -E_BAD_TABLE_NAME;
                }
        }
-       ret = send_callback_request(create_tables_callback, &query, NULL, NULL);
+       ret = send_callback_request(create_tables_callback, &query, &send_result, &fd);
        if (ret < 0)
                return send_va_buffer(fd, "%s\n", para_strerror(-ret));
        return ret;
@@ -1171,6 +1175,16 @@ int com_check(int fd, int argc, char * const * const argv)
        return 1;
 }
 
+/**
+ * The afs event dispatcher.
+ *
+ * \param event Type of the event.
+ * \param pb May be \p NULL.
+ * \param data Type depends on \a event.
+ *
+ * This function calls the table handlers of all tables and passes \a pb and \a
+ * data verbatim. It's up to the handlers to interpret the \a data pointer.
+ */
 void afs_event(enum afs_events event, struct para_buffer *pb,
                void *data)
 {
@@ -1182,7 +1196,8 @@ void afs_event(enum afs_events event, struct para_buffer *pb,
                        continue;
                ret = t->event_handler(event, pb, data);
                if (ret < 0)
-                       PARA_CRIT_LOG("%s\n", para_strerror(-ret));
+                       PARA_CRIT_LOG("table %s, event %d: %s\n", t->name,
+                               event, para_strerror(-ret));
        }
 }