From cb6d1dfb9e4067229a4bbde0abd05784d97ef14b Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 8 Sep 2007 13:37:11 +0200 Subject: [PATCH] para_server: Initialize the new afs. --- aac_afh.c | 2 + afs.c | 138 ++++++++++++++++-------------------------- afs.h | 2 +- afs_common.c | 2 + aft.c | 1 + attribute.c | 1 + blob.c | 1 + command.c | 3 + dccp_send.c | 2 + http_send.c | 2 + mood.c | 6 +- mp3_afh.c | 2 + mysql_selector.c | 3 + mysql_selector.cmd | 2 +- ogg_afh.c | 2 + ortp_send.c | 2 + para.h | 6 ++ playlist.c | 1 + playlist_selector.c | 2 + playlist_selector.cmd | 2 +- random_selector.c | 2 + random_selector.cmd | 2 +- score.c | 1 + server.c | 42 ++++++++++++- server.cmd | 2 +- server.h | 2 - vss.c | 2 + 27 files changed, 134 insertions(+), 101 deletions(-) diff --git a/aac_afh.c b/aac_afh.c index be301c5c..9bb4323c 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -10,6 +10,8 @@ /** \file aac_afh.c para_server's aac audio format handler */ +#include "para.h" +#include "afh.h" #include "server.h" #include "error.h" #include "string.h" diff --git a/afs.c b/afs.c index c5673c65..5ccb17f9 100644 --- a/afs.c +++ b/afs.c @@ -1,4 +1,5 @@ #include "para.h" +#include "afh.h" #include "error.h" #include /* readdir() */ #include @@ -12,6 +13,8 @@ /** \file afs.c Paraslash's audio file selector. */ +static uint32_t socket_cookie; + /** * Compare two osl objects of string type. * @@ -365,16 +368,6 @@ int stdin_command(struct osl_object *arg_obj, callback_function *f, return ret; } -static void para_init_random_seed(void) -{ - struct timeval now; - unsigned int seed; - - gettimeofday(&now, NULL); - seed = now.tv_usec; - srand(seed); -} - /** * Open the audio file with highest score. * @@ -416,6 +409,7 @@ int close_audio_file(struct audio_file_data *afd) return para_munmap(afd->map.data, afd->map.size); } +#if 0 static void play_loop(enum play_mode current_play_mode) { int i, ret; @@ -433,6 +427,8 @@ static void play_loop(enum play_mode current_play_mode) close_audio_file(&afd); } } +#endif + static enum play_mode init_admissible_files(void) { @@ -463,18 +459,51 @@ static enum play_mode init_admissible_files(void) return PLAY_MODE_MOOD; } -static int afs_init(void) +int command_socket; + +static void setup_command_socket(void) +{ + int ret; + char *socket_name = "/tmp/afs_command_socket"; + struct sockaddr_un unix_addr; + + unlink(socket_name); + ret = create_local_socket(socket_name, &unix_addr, + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH); + if (ret < 0) + exit(EXIT_FAILURE); + command_socket = ret; + if (listen(command_socket , 5) < 0) { + PARA_EMERG_LOG("%s", "can not listen on socket\n"); + exit(EXIT_FAILURE); + } + PARA_INFO_LOG("listening on command socket %s (fd %d)\n", socket_name, + command_socket); +} + +int server_socket; + +void shed(void) +{ + for (;;) + sleep(1); +} + +__noreturn int afs_init(uint32_t cookie, int socket_fd) { - int ret, shmid; - void *shm_area; + int ret; +// void *shm_area; enum play_mode current_play_mode; - para_init_random_seed(); + server_socket = socket_fd; + socket_cookie = cookie; + PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n", + server_socket, (unsigned) cookie); + setup_command_socket(); ret = attribute_init(&afs_tables[TBLNUM_ATTRIBUTES]); - PARA_DEBUG_LOG("ret %d\n", ret); if (ret < 0) - return ret; + goto attribute_init_error; ret = moods_init(&afs_tables[TBLNUM_MOODS]); if (ret < 0) goto moods_init_error; @@ -495,8 +524,9 @@ static int afs_init(void) goto aft_init_error; current_play_mode = init_admissible_files(); - play_loop(current_play_mode); + shed(); +#if 0 ret = shm_new(sizeof(struct callback_data)); if (ret < 0) return ret; @@ -518,7 +548,7 @@ static int afs_init(void) return ret; result_mutex = ret; mutex_lock(result_mutex); - return 1; +#endif aft_init_error: score_shutdown(OSL_MARK_CLEAN); score_init_error: @@ -531,68 +561,10 @@ playlists_init_error: moods_shutdown(OSL_MARK_CLEAN); moods_init_error: attribute_shutdown(OSL_MARK_CLEAN); - return ret; -} - -static uint32_t afs_socket_cookie; -static int para_random(unsigned max) -{ - return ((max + 0.0) * (rand() / (RAND_MAX + 1.0))); -} - -int setup(void) -{ - int ret, afs_server_socket[2]; - - para_init_random_seed(); - ret = socketpair(PF_UNIX, SOCK_DGRAM, 0, afs_server_socket); - if (ret < 0) - exit(EXIT_FAILURE); - afs_socket_cookie = para_random((uint32_t)-1); - ret = fork(); - if (ret < 0) - exit(EXIT_FAILURE); - if (!ret) { /* child (afs) */ - char *socket_name = "/tmp/afs_command_socket"; - struct sockaddr_un unix_addr; - int fd; - - unlink(socket_name); - ret = create_local_socket(socket_name, &unix_addr, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH); - if (ret < 0) - exit(EXIT_FAILURE); - fd = ret; - if (listen(fd , 5) < 0) { - PARA_EMERG_LOG("%s", "can not listen on socket\n"); - exit(EXIT_FAILURE); - } - ret = afs_init(); - if (ret < 0) - exit(EXIT_FAILURE); - PARA_NOTICE_LOG("accepting\n"); - ret = para_accept(fd, &unix_addr, sizeof(struct sockaddr_un)); - return ret; - } - ret = fork(); - if (ret < 0) - exit(EXIT_FAILURE); - if (!ret) { /* child (handler) */ - PARA_NOTICE_LOG("reading stdin\n"); - for (;;) { - char buf[255]; - read(0, buf, 255); - PARA_NOTICE_LOG("read: %s\n", buf); - } - - } - for (;;) { - sleep(10); - PARA_NOTICE_LOG("sending next requerst\n"); - } +attribute_init_error: + exit(EXIT_FAILURE); } - static int create_all_tables(void) { int i, ret; @@ -816,9 +788,6 @@ out: mutex_unlock(result_mutex); /* wake up child */ } -static void dummy(__a_unused int s) -{} - static void afs_shutdown(enum osl_close_flags flags) { score_shutdown(flags); @@ -832,12 +801,8 @@ static void afs_shutdown(enum osl_close_flags flags) aft_shutdown(flags); } +#if 0 static int got_sigchld; -static void sigchld_handler(__a_unused int s) -{ - got_sigchld = 1; -} - static void server_loop(int child_pid) { // int status; @@ -860,7 +825,6 @@ static void server_loop(int child_pid) } } -#if 0 int main(int argc, const char **argv) { int i, ret = -E_AFS_SYNTAX; diff --git a/afs.h b/afs.h index fdc42f1f..0ba203a6 100644 --- a/afs.h +++ b/afs.h @@ -1,6 +1,5 @@ #include #include "osl.h" -#include "afh.h" #include "hash.h" #define DATABASE_DIR "/home/maan/tmp/osl" /* FIXME */ @@ -94,6 +93,7 @@ struct audio_file_data { /* afs */ typedef int callback_function(const struct osl_object *, struct osl_object *); +__noreturn int afs_init(uint32_t cookie, int socket_fd); int send_callback_request(callback_function *f, struct osl_object *query, struct osl_object *result); int send_standard_callback_request(int argc, const char **argv, diff --git a/afs_common.c b/afs_common.c index 36da960b..72be6a9d 100644 --- a/afs_common.c +++ b/afs_common.c @@ -7,7 +7,9 @@ /** \file afs_common.c Functions common to all audio file selectors. */ +#include "para.h" #include "server.cmdline.h" +#include "afh.h" #include "server.h" #include "vss.h" #include /* readdir() */ diff --git a/aft.c b/aft.c index c2c32746..503105ef 100644 --- a/aft.c +++ b/aft.c @@ -2,6 +2,7 @@ #include "error.h" #include #include +#include "afh.h" #include "afs.h" #include "string.h" diff --git a/attribute.c b/attribute.c index db38fadd..d4a0bfaf 100644 --- a/attribute.c +++ b/attribute.c @@ -1,5 +1,6 @@ #include "para.h" #include "error.h" +#include "afh.h" #include "afs.h" #include "string.h" diff --git a/blob.c b/blob.c index 25dd99e0..b970ab65 100644 --- a/blob.c +++ b/blob.c @@ -1,5 +1,6 @@ #include "para.h" #include "error.h" +#include "afh.h" #include "afs.h" #include "string.h" diff --git a/command.c b/command.c index ae4c700c..ecadfc40 100644 --- a/command.c +++ b/command.c @@ -7,8 +7,11 @@ /** \file command.c does client authentication and executes server commands */ #include /* gettimeofday */ +#include "para.h" /* gettimeofday */ + #include "server.cmdline.h" #include "afs_common.h" +#include "afh.h" #include "server.h" #include "vss.h" #include "send.h" diff --git a/dccp_send.c b/dccp_send.c index 3d2511f7..4394b33b 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -11,6 +11,8 @@ * (C) 2005 Ian McDonald */ +#include "para.h" +#include "afh.h" #include "server.h" #include "net.h" #include "list.h" diff --git a/http_send.c b/http_send.c index e7a9ae2b..8636d10d 100644 --- a/http_send.c +++ b/http_send.c @@ -7,7 +7,9 @@ /** \file http_send.c paraslash's http sender */ +#include "para.h" #include "server.cmdline.h" +#include "afh.h" #include "server.h" #include "http.h" #include "vss.h" diff --git a/mood.c b/mood.c index b65561d5..996b71fa 100644 --- a/mood.c +++ b/mood.c @@ -1,5 +1,6 @@ #include "para.h" #include "error.h" +#include "afh.h" #include "afs.h" #include "list.h" #include "string.h" @@ -235,11 +236,6 @@ static int mm_is_set_score_function(const struct osl_row *row, void *bitnum) return -100; } -static int para_random(unsigned max) -{ - return ((max + 0.0) * (rand() / (RAND_MAX + 1.0))); -} - /* returns 1 if row matches score item, -1 otherwise */ static int add_item_score(const void *row, struct mood_item *item, long *score, long *score_arg_sum) diff --git a/mp3_afh.c b/mp3_afh.c index dde71c50..46fcfbca 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -16,6 +16,8 @@ * Johannes Overmann */ +#include "para.h" +#include "afh.h" #include "server.h" #include "error.h" #include "string.h" diff --git a/mysql_selector.c b/mysql_selector.c index 46fc65b8..702e08d3 100644 --- a/mysql_selector.c +++ b/mysql_selector.c @@ -10,7 +10,10 @@ #define MEDIUM_BLOB_SIZE 16777220 /* (2**24 + 4) */ #define BLOB_SIZE 65539 /* (2**16 + 3) */ /** \endcond */ + +#include "para.h" #include "server.cmdline.h" +#include "afh.h" #include "server.h" #include "vss.h" #include "afs_common.h" diff --git a/mysql_selector.cmd b/mysql_selector.cmd index 6cabd4f1..652ac53a 100644 --- a/mysql_selector.cmd +++ b/mysql_selector.cmd @@ -3,7 +3,7 @@ SF: mysql_selector.c HC: prototypes for the commands of the mysql audio file selector CC: array of commands for the mysql audio file selector AT: server_command -IN: server user_list +IN: para afh server user_list SN: list of mysql selector commands --- N: cam diff --git a/ogg_afh.c b/ogg_afh.c index a9b07a3c..1c0c6323 100644 --- a/ogg_afh.c +++ b/ogg_afh.c @@ -10,6 +10,8 @@ #include #include +#include "para.h" +#include "afh.h" #include "server.h" #include "error.h" #include "string.h" diff --git a/ortp_send.c b/ortp_send.c index 18b5edd3..e17c8474 100644 --- a/ortp_send.c +++ b/ortp_send.c @@ -10,6 +10,8 @@ #include #include "server.cmdline.h" +#include "para.h" +#include "afh.h" #include "server.h" #include "vss.h" #include "send.h" diff --git a/para.h b/para.h index f41e8b67..eb99ec68 100644 --- a/para.h +++ b/para.h @@ -200,3 +200,9 @@ __printf_2_3 void para_log(int, const char*, ...); p = para_realloc(p, size); \ } \ } + +static inline int para_random(unsigned max) +{ + return ((max + 0.0) * (rand() / (RAND_MAX + 1.0))); +} + diff --git a/playlist.c b/playlist.c index 9153bf1f..6f952e65 100644 --- a/playlist.c +++ b/playlist.c @@ -1,5 +1,6 @@ #include "para.h" #include "error.h" +#include "afh.h" #include "afs.h" #include "string.h" diff --git a/playlist_selector.c b/playlist_selector.c index 8372dacc..9eb6305a 100644 --- a/playlist_selector.c +++ b/playlist_selector.c @@ -6,6 +6,8 @@ /** \file playlist_selector.c The playlist audio file selector of paraslash */ +#include "para.h" +#include "afh.h" #include "server.h" #include "afs_common.h" #include "error.h" diff --git a/playlist_selector.cmd b/playlist_selector.cmd index 294adef4..2006647d 100644 --- a/playlist_selector.cmd +++ b/playlist_selector.cmd @@ -3,7 +3,7 @@ SF: playlist_selector.c HC: prototypes for the commands of the playlist audio file selector CC: array of commands for the playlist audio file selector AT: server_command -IN: server user_list +IN: para afh server user_list SN: list of playlist selector commands --- N: ppl diff --git a/random_selector.c b/random_selector.c index c3d7e9b0..36d4d580 100644 --- a/random_selector.c +++ b/random_selector.c @@ -7,7 +7,9 @@ /** \file random_selector.c An audio file selector which chooses files by random */ #include /* gettimeofday */ +#include "para.h" #include "server.cmdline.h" +#include "afh.h" #include "server.h" #include "afs_common.h" #include "error.h" diff --git a/random_selector.cmd b/random_selector.cmd index f1901f88..578c4470 100644 --- a/random_selector.cmd +++ b/random_selector.cmd @@ -3,7 +3,7 @@ SF: random_selector.c HC: prototypes for the commands of the random audio file selector CC: array of commands for the random audio file selector AT: server_command -IN: server user_list +IN: para afh server user_list SN: list of random selector commands --- N: random_info diff --git a/score.c b/score.c index 2cfadf86..6c15a0f5 100644 --- a/score.c +++ b/score.c @@ -7,6 +7,7 @@ /** \file score.c Scoring functions to determine the audio file streaming order. */ #include "para.h" #include "error.h" +#include "afh.h" #include "afs.h" #include "list.h" #include "string.h" diff --git a/server.c b/server.c index e39354e7..94e6564b 100644 --- a/server.c +++ b/server.c @@ -16,9 +16,10 @@ */ - +#include "para.h" #include "server.cmdline.h" #include "afs_common.h" +#include "afh.h" #include "server.h" #include "vss.h" #include "config.h" @@ -32,6 +33,7 @@ #include "fd.h" #include "signal.h" #include "user_list.h" +#include "afs.h" /** define the array of error lists needed by para_server */ INIT_SERVER_ERRLISTS; @@ -344,6 +346,30 @@ out: exit(EXIT_FAILURE); } +static uint32_t afs_socket_cookie; +static int afs_socket; +pid_t afs_pid; + +static void init_afs(void) +{ + int ret, afs_server_socket[2]; + + ret = socketpair(PF_UNIX, SOCK_DGRAM, 0, afs_server_socket); + if (ret < 0) + exit(EXIT_FAILURE); + afs_socket_cookie = para_random((uint32_t)-1); + afs_pid = fork(); + if (afs_pid < 0) + exit(EXIT_FAILURE); + if (!afs_pid) /* child (afs) */ + afs_init(afs_socket_cookie, afs_server_socket[1]); + close(afs_server_socket[1]); + afs_socket = afs_server_socket[0]; + PARA_INFO_LOG("afs_socket: %d, afs_socket_cookie: %u\n", afs_socket, + (unsigned) afs_socket_cookie); +} + + static unsigned do_inits(int argc, char **argv) { /* connector's address information */ @@ -369,6 +395,7 @@ static unsigned do_inits(int argc, char **argv) vss_init(); mmd->server_pid = getpid(); setup_signal_handling(); + init_afs(); mmd_lock(); /* init network socket */ PARA_NOTICE_LOG("%s", "initializing tcp command socket\n"); @@ -492,23 +519,34 @@ repeat: status_refresh(); if (FD_ISSET(signal_pipe, &rfds)) { int sig; + pid_t pid; sig = para_next_signal(); switch (sig) { case SIGHUP: handle_sighup(); break; case SIGCHLD: - para_reap_children(); + for (;;) { + pid = para_reap_child(); + if (pid <= 0) + break; + if (pid != afs_pid) + continue; + PARA_EMERG_LOG("fatal: afs died\n"); + goto genocide; + } break; /* die on sigint/sigterm. Kill all children too. */ case SIGINT: case SIGTERM: PARA_EMERG_LOG("terminating on signal %d\n", sig); +genocide: kill(0, SIGTERM); selectors[mmd->selector_num].shutdown(); mutex_destroy(mmd_mutex); shm_detach(mmd); shm_destroy(mmd_shm_id); + exit(EXIT_FAILURE); } } diff --git a/server.cmd b/server.cmd index d9134693..b3755094 100644 --- a/server.cmd +++ b/server.cmd @@ -3,7 +3,7 @@ SF: command.c HC: prototypes for the server command handlers CC: array of server commands AT: server_command -IN: server user_list +IN: para afh server user_list SN: list of server commands --- N: chs diff --git a/server.h b/server.h index 08fa11b1..0cdd0e60 100644 --- a/server.h +++ b/server.h @@ -6,8 +6,6 @@ /** \file server.h common server data structures */ -#include "para.h" -#include "afh.h" /** size of the selector_info and audio_file info strings of struct misc_meta_data */ #define MMD_INFO_SIZE 16384 diff --git a/vss.c b/vss.c index 859fd611..d0f57aec 100644 --- a/vss.c +++ b/vss.c @@ -11,6 +11,8 @@ * senders. */ +#include "para.h" +#include "afh.h" #include "server.h" #include /* mmap */ #include /* gettimeofday */ -- 2.39.5