X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=afs.c;h=143103de98c2e63ab5c76528439e74bfc07edaba;hb=3e21547a6a0984979c396e2ec688fa1d57b0410e;hp=5e9bd118c41574fd7feaf110c0ee0673e8247dc4;hpb=0e8849e41ffaffdc94231568ff0a0a061500e341;p=paraslash.git diff --git a/afs.c b/afs.c index 5e9bd118..143103de 100644 --- a/afs.c +++ b/afs.c @@ -512,8 +512,10 @@ static int setup_command_socket_or_die(void) unlink(socket_name); ret = create_local_socket(socket_name, &unix_addr, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH); - if (ret < 0) + if (ret < 0) { + PARA_EMERG_LOG("%s: %s\n", PARA_STRERROR(-ret), socket_name); exit(EXIT_FAILURE); + } if (listen(ret , 5) < 0) { PARA_EMERG_LOG("%s", "can not listen on socket\n"); exit(EXIT_FAILURE); @@ -524,11 +526,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 +567,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); @@ -674,8 +677,8 @@ static void command_post_select(struct sched *s, struct task *t) goto out; } if (t->ret != sizeof(buf)) { - PARA_NOTICE_LOG("short read (%d bytes, expected %u)\n", - t->ret, sizeof(buf)); + PARA_NOTICE_LOG("short read (%d bytes, expected %lu)\n", + t->ret, (long unsigned) sizeof(buf)); t->ret = 1; goto out; } @@ -705,7 +708,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 +725,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 +778,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 +824,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 +842,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 +853,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(); }