X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=afs.c;h=f9dd7583df42a3b5d8bf48fe36ccdea88020c3d4;hb=501b83a39828c9d3db5498c7352a2e5b60175bba;hp=710670255b2ec1cf67b9ab4e74823bfe19dd3a02;hpb=a79e210f33334b273d11c92a430dd477284ee95a;p=paraslash.git diff --git a/afs.c b/afs.c index 71067025..f9dd7583 100644 --- a/afs.c +++ b/afs.c @@ -24,6 +24,7 @@ #include "afs.h" #include "net.h" #include "server.h" +#include "daemon.h" #include "ipc.h" #include "list.h" #include "sched.h" @@ -33,42 +34,17 @@ #include "sideband.h" #include "command.h" -/** The osl tables used by afs. \sa \ref blob.c. */ -enum afs_table_num { - /** Contains audio file information. See \ref aft.c. */ - TBLNUM_AUDIO_FILES, - /** The table for the paraslash attributes. See \ref attribute.c. */ - TBLNUM_ATTRIBUTES, - /* - * Moods and playlists organize the current set of admissible files in - * an osl table which contains only volatile columns. Each row consists - * of a pointer to an audio file and the score value of this file. - */ - TBLNUM_SCORES, - /** - * A standard blob table containing the mood definitions. For details - * see \ref mood.c. - */ - TBLNUM_MOODS, - /** A blob table containing lyrics on a per-song basis. */ - TBLNUM_LYRICS, - /** Another blob table for images (for example album cover art). */ - TBLNUM_IMAGES, - /** Yet another blob table for storing standard playlists. */ - TBLNUM_PLAYLIST, - /** How many tables are in use? */ - NUM_AFS_TABLES +static struct afs_table afs_tables[] = { + {.init = aft_init, .name = "audio_files"}, + {.init = attribute_init, .name = "attributes"}, + {.init = score_init, .name = "scores"}, + {.init = moods_init, .name = "moods"}, + {.init = lyrics_init, .name = "lyrics"}, + {.init = images_init, .name = "images"}, + {.init = playlists_init, .name = "playlists"}, }; -static struct afs_table afs_tables[NUM_AFS_TABLES] = { - [TBLNUM_AUDIO_FILES] = {.init = aft_init, .name = "audio_files"}, - [TBLNUM_ATTRIBUTES] = {.init = attribute_init, .name = "attributes"}, - [TBLNUM_SCORES] = {.init = score_init, .name = "scores"}, - [TBLNUM_MOODS] = {.init = moods_init, .name = "moods"}, - [TBLNUM_LYRICS] = {.init = lyrics_init, .name = "lyrics"}, - [TBLNUM_IMAGES] = {.init = images_init, .name = "images"}, - [TBLNUM_PLAYLIST] = {.init = playlists_init, .name = "playlists"}, -}; +#define NUM_AFS_TABLES ARRAY_SIZE(afs_tables) struct command_task { /** The file descriptor for the local socket. */ @@ -691,7 +667,7 @@ static int open_afs_tables(void) int i, ret; get_database_dir(); - PARA_NOTICE_LOG("opening %d osl tables in %s\n", NUM_AFS_TABLES, + PARA_NOTICE_LOG("opening %zu osl tables in %s\n", NUM_AFS_TABLES, database_dir); for (i = 0; i < NUM_AFS_TABLES; i++) { ret = afs_tables[i].open(database_dir); @@ -707,7 +683,7 @@ static int open_afs_tables(void) return ret; } -static int afs_signal_post_select(struct sched *s, __a_unused void *context) +static int afs_signal_post_monitor(struct sched *s, __a_unused void *context) { int signum, ret; @@ -715,7 +691,7 @@ static int afs_signal_post_select(struct sched *s, __a_unused void *context) PARA_EMERG_LOG("para_server died\n"); goto shutdown; } - signum = para_next_signal(&s->rfds); + signum = para_next_signal(); if (signum == 0) return 0; if (signum == SIGHUP) { @@ -743,8 +719,8 @@ static void register_signal_task(struct sched *s) signal_task->task = task_register(&(struct task_info) { .name = "signal", - .pre_select = signal_pre_select, - .post_select = afs_signal_post_select, + .pre_monitor = signal_pre_monitor, + .post_monitor = afs_signal_post_monitor, .context = signal_task, }, s); @@ -762,15 +738,15 @@ struct afs_client { struct timeval connect_time; }; -static void command_pre_select(struct sched *s, void *context) +static void command_pre_monitor(struct sched *s, void *context) { struct command_task *ct = context; struct afs_client *client; - para_fd_set(server_socket, &s->rfds, &s->max_fileno); - para_fd_set(ct->fd, &s->rfds, &s->max_fileno); + sched_monitor_readfd(server_socket, s); + sched_monitor_readfd(ct->fd, s); list_for_each_entry(client, &afs_client_list, node) - para_fd_set(client->fd, &s->rfds, &s->max_fileno); + sched_monitor_readfd(client->fd, s); } /** @@ -862,11 +838,11 @@ static int call_callback(int fd, int query_shmid) return ret; } -static int execute_server_command(fd_set *rfds) +static int execute_server_command(void) { char buf[8]; size_t n; - int ret = read_nonblock(server_socket, buf, sizeof(buf) - 1, rfds, &n); + int ret = read_nonblock(server_socket, buf, sizeof(buf) - 1, &n); if (ret < 0 || n == 0) return ret; @@ -877,13 +853,13 @@ static int execute_server_command(fd_set *rfds) } /* returns 0 if no data available, 1 else */ -static int execute_afs_command(int fd, fd_set *rfds) +static int execute_afs_command(int fd) { uint32_t cookie; int query_shmid; char buf[sizeof(cookie) + sizeof(query_shmid)]; size_t n; - int ret = read_nonblock(fd, buf, sizeof(buf), rfds, &n); + int ret = read_nonblock(fd, buf, sizeof(buf), &n); if (ret < 0) goto err; @@ -917,7 +893,7 @@ err: /** Shutdown connection if query has not arrived until this many seconds. */ #define AFS_CLIENT_TIMEOUT 3 -static int command_post_select(struct sched *s, void *context) +static int command_post_monitor(struct sched *s, void *context) { struct command_task *ct = context; struct sockaddr_un unix_addr; @@ -927,7 +903,7 @@ static int command_post_select(struct sched *s, void *context) ret = task_get_notification(ct->task); if (ret < 0) return ret; - ret = execute_server_command(&s->rfds); + ret = execute_server_command(); if (ret < 0) { PARA_EMERG_LOG("%s\n", para_strerror(-ret)); task_notify_all(s, -ret); @@ -935,7 +911,7 @@ static int command_post_select(struct sched *s, void *context) } /* Check the list of connected clients. */ list_for_each_entry_safe(client, tmp, &afs_client_list, node) { - ret = execute_afs_command(client->fd, &s->rfds); + ret = execute_afs_command(client->fd); if (ret == 0) { /* prevent bogus connection flooding */ struct timeval diff; tv_diff(now, &client->connect_time, &diff); @@ -948,7 +924,7 @@ static int command_post_select(struct sched *s, void *context) free(client); } /* Accept connections on the local socket. */ - ret = para_accept(ct->fd, &s->rfds, &unix_addr, sizeof(unix_addr), &fd); + ret = para_accept(ct->fd, &unix_addr, sizeof(unix_addr), &fd); if (ret < 0) PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); if (ret <= 0) @@ -959,7 +935,7 @@ static int command_post_select(struct sched *s, void *context) close(fd); return 0; } - client = para_malloc(sizeof(*client)); + client = alloc(sizeof(*client)); client->fd = fd; client->connect_time = *now; para_list_add(&client->node, &afs_client_list); @@ -973,12 +949,20 @@ static void register_command_task(struct sched *s) ct->task = task_register(&(struct task_info) { .name = "afs command", - .pre_select = command_pre_select, - .post_select = command_post_select, + .pre_monitor = command_pre_monitor, + .post_monitor = command_post_monitor, .context = ct, }, s); } +static int afs_poll(struct pollfd *fds, nfds_t nfds, int timeout) +{ + mutex_lock(mmd_mutex); + daemon_set_loglevel(mmd->loglevel); + mutex_unlock(mmd_mutex); + return xpoll(fds, nfds, timeout); +} + /** * Initialize the audio file selector process. * @@ -1003,8 +987,8 @@ __noreturn void afs_init(int socket_fd) PARA_INFO_LOG("server_socket: %d\n", server_socket); init_admissible_files(OPT_STRING_VAL(AFS_INITIAL_MODE)); register_command_task(&s); - s.default_timeout.tv_sec = 0; - s.default_timeout.tv_usec = 999 * 1000; + s.default_timeout = 1000; + s.poll_function = afs_poll; ret = write(socket_fd, "\0", 1); if (ret != 1) { if (ret == 0)