X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=afs.c;h=143103de98c2e63ab5c76528439e74bfc07edaba;hb=3e21547a6a0984979c396e2ec688fa1d57b0410e;hp=21148f0e7d8aca0cd40708d0f9d536f58769ad20;hpb=191d16070b9511f5b32b1ede7a9d0db1ffb3da54;p=paraslash.git diff --git a/afs.c b/afs.c index 21148f0e..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; @@ -800,8 +802,9 @@ __noreturn int afs_init(uint32_t cookie, int socket_fd) s.default_timeout.tv_sec = 0; s.default_timeout.tv_usec = 99 * 1000; ret = sched(&s); - assert(ret < 0); - PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret)); + if (ret < 0) + PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret)); + afs_shutdown(OSL_MARK_CLEAN); exit(EXIT_FAILURE); }