]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - afs.c
string.c: Use $HOME to get the home directory.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 5e9bd118c41574fd7feaf110c0ee0673e8247dc4..d89406f36bfaaf89652d0407e03533d6d7ebf8cc 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -524,11 +524,13 @@ static int setup_command_socket_or_die(void)
 }
 
 static int server_socket;
+static struct command_task command_task_struct;
+static struct signal_task signal_task_struct;
 
-void loop(void)
+static void unregister_tasks(void)
 {
-       for (;;)
-               sleep(1);
+       unregister_task(&command_task_struct.task);
+       unregister_task(&signal_task_struct.task);
 }
 
 static void afs_shutdown(enum osl_close_flags flags)
@@ -563,13 +565,12 @@ static void signal_post_select(struct sched *s, struct task *t)
        t->ret = 1;
        if (st->signum == SIGUSR1)
                return; /* ignore SIGUSR1 */
-       afs_shutdown(OSL_MARK_CLEAN);
        t->ret = -E_SIGNAL_CAUGHT;
+       unregister_tasks();
 }
 
 static void register_signal_task(void)
 {
-       static struct signal_task signal_task_struct;
        struct signal_task *st = &signal_task_struct;
        st->fd = para_signal_init();
        PARA_INFO_LOG("signal pipe: fd %d\n", st->fd);
@@ -705,7 +706,6 @@ out:
 
 static void register_command_task(uint32_t cookie)
 {
-       static struct command_task command_task_struct;
        struct command_task *ct = &command_task_struct;
        ct->fd = setup_command_socket_or_die();
        ct->cookie = cookie;
@@ -723,43 +723,46 @@ void register_tasks(uint32_t cookie)
        register_command_task(cookie);
 }
 
-__noreturn int afs_init(uint32_t cookie, int socket_fd)
+static int open_afs_tables(void)
 {
        int ret;
-       enum play_mode current_play_mode;
-       struct sched s;
-
-       server_socket = socket_fd;
-       PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
-               server_socket, (unsigned) cookie);
-
-       ret = attribute_init(&afs_tables[TBLNUM_ATTRIBUTES]);
+       char *db;
+
+       if (conf.afs_database_dir_given)
+               db = conf.afs_database_dir_arg;
+       else {
+               char *home = para_homedir();
+               db = make_message("%s/.paraslash/afs_database", home);
+               free(home);
+       }
+       PARA_INFO_LOG("afs_database dir %s\n", db);
+       ret = para_mkdir(db, 0777);
+       if (ret < 0 && ret != -E_EXIST)
+               goto err;
+       ret = attribute_init(&afs_tables[TBLNUM_ATTRIBUTES], db);
        if (ret < 0)
-               goto attribute_init_error;
-       ret = moods_init(&afs_tables[TBLNUM_MOODS]);
+               goto err;
+       ret = moods_init(&afs_tables[TBLNUM_MOODS], db);
        if (ret < 0)
                goto moods_init_error;
-       ret = playlists_init(&afs_tables[TBLNUM_PLAYLIST]);
+       ret = playlists_init(&afs_tables[TBLNUM_PLAYLIST], db);
        if (ret < 0)
                goto playlists_init_error;
-       ret = lyrics_init(&afs_tables[TBLNUM_LYRICS]);
+       ret = lyrics_init(&afs_tables[TBLNUM_LYRICS], db);
        if (ret < 0)
                goto lyrics_init_error;
-       ret = images_init(&afs_tables[TBLNUM_IMAGES]);
+       ret = images_init(&afs_tables[TBLNUM_IMAGES], db);
        if (ret < 0)
                goto images_init_error;
-       ret = score_init(&afs_tables[TBLNUM_SCORES]);
+       ret = score_init(&afs_tables[TBLNUM_SCORES], db);
        if (ret < 0)
                goto score_init_error;
-       ret = aft_init(&afs_tables[TBLNUM_AUDIO_FILES]);
+       ret = aft_init(&afs_tables[TBLNUM_AUDIO_FILES], db);
        if (ret < 0)
                goto aft_init_error;
-
-       current_play_mode = init_admissible_files();
-       register_tasks(cookie);
-       s.default_timeout.tv_sec = 0;
-       s.default_timeout.tv_usec = 99 * 1000;
-       sched(&s);
+       if (!conf.afs_database_dir_given)
+               free(db);
+       return 1;
 
 aft_init_error:
        score_shutdown(OSL_MARK_CLEAN);
@@ -773,7 +776,33 @@ playlists_init_error:
        moods_shutdown(OSL_MARK_CLEAN);
 moods_init_error:
        attribute_shutdown(OSL_MARK_CLEAN);
-attribute_init_error:
+err:
+       if (!conf.afs_database_dir_given)
+               free(db);
+       return ret;
+}
+
+__noreturn int afs_init(uint32_t cookie, int socket_fd)
+{
+       enum play_mode current_play_mode;
+       struct sched s;
+       int ret = open_afs_tables();
+
+       if (ret < 0) {
+               PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
+               exit(EXIT_FAILURE);
+       }
+       server_socket = socket_fd;
+       PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
+               server_socket, (unsigned) cookie);
+       current_play_mode = init_admissible_files();
+       register_tasks(cookie);
+       s.default_timeout.tv_sec = 0;
+       s.default_timeout.tv_usec = 99 * 1000;
+       ret = sched(&s);
+       if (ret < 0)
+               PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
+       afs_shutdown(OSL_MARK_CLEAN);
        exit(EXIT_FAILURE);
 }
 
@@ -793,12 +822,16 @@ static int create_all_tables(void)
        return 1;
 }
 
-/* TODO load tables after init */
-int com_init(__a_unused int fd, int argc, char * const * const argv)
+int com_init(int fd, int argc, char * const * const argv)
 {
        int i, j, ret;
-       if (argc == 1)
-               return create_all_tables();
+
+       if (argc == 1) {
+               ret = create_all_tables();
+               if (ret < 0)
+                       return ret;
+               return open_afs_tables();
+       }
        for (i = 1; i < argc; i++) {
                for (j = 0; j < NUM_AFS_TABLES; j++) {
                        struct table_info *ti = afs_tables + j;
@@ -807,7 +840,9 @@ int com_init(__a_unused int fd, int argc, char * const * const argv)
                                continue;
                        if (strcmp(argv[i], ti->desc->name))
                                continue;
-                       PARA_NOTICE_LOG("creating table %s\n", argv[i]);
+                       ret = send_va_buffer(fd, "creating table %s\n", argv[i]);
+                       if (ret < 0)
+                               return ret;
                        ret = osl_create_table(ti->desc);
                        if (ret < 0)
                                return ret;
@@ -816,5 +851,5 @@ int com_init(__a_unused int fd, int argc, char * const * const argv)
                if (j == NUM_AFS_TABLES)
                        return -E_BAD_TABLE_NAME;
        }
-       return 1;
+       return open_afs_tables();
 }