para_server: Initialize the new afs.
authorAndre Noll <maan@systemlinux.org>
Sat, 8 Sep 2007 11:37:11 +0000 (13:37 +0200)
committerAndre Noll <maan@systemlinux.org>
Sat, 8 Sep 2007 11:37:11 +0000 (13:37 +0200)
27 files changed:
aac_afh.c
afs.c
afs.h
afs_common.c
aft.c
attribute.c
blob.c
command.c
dccp_send.c
http_send.c
mood.c
mp3_afh.c
mysql_selector.c
mysql_selector.cmd
ogg_afh.c
ortp_send.c
para.h
playlist.c
playlist_selector.c
playlist_selector.cmd
random_selector.c
random_selector.cmd
score.c
server.c
server.cmd
server.h
vss.c

index be301c5..9bb4323 100644 (file)
--- 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 c5673c6..5ccb17f 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -1,4 +1,5 @@
 #include "para.h"
+#include "afh.h"
 #include "error.h"
 #include <dirent.h> /* readdir() */
 #include <sys/mman.h>
@@ -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 fdc42f1..0ba203a 100644 (file)
--- a/afs.h
+++ b/afs.h
@@ -1,6 +1,5 @@
 #include <regex.h>
 #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,
index 36da960..72be6a9 100644 (file)
@@ -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 <dirent.h> /* readdir() */
diff --git a/aft.c b/aft.c
index c2c3274..503105e 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -2,6 +2,7 @@
 #include "error.h"
 #include <sys/mman.h>
 #include <fnmatch.h>
+#include "afh.h"
 #include "afs.h"
 #include "string.h"
 
index db38fad..d4a0bfa 100644 (file)
@@ -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 25dd99e..b970ab6 100644 (file)
--- 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"
 
index ae4c700..ecadfc4 100644 (file)
--- a/command.c
+++ b/command.c
@@ -7,8 +7,11 @@
 /** \file command.c does client authentication and executes server commands */
 
 #include <sys/time.h> /* 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"
index 3d2511f..4394b33 100644 (file)
@@ -11,6 +11,8 @@
  * (C) 2005 Ian McDonald <imcdnzl@gmail.com>
  */
 
+#include "para.h"
+#include "afh.h"
 #include "server.h"
 #include "net.h"
 #include "list.h"
index e7a9ae2..8636d10 100644 (file)
@@ -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 b65561d..996b71f 100644 (file)
--- 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)
index dde71c5..46fcfbc 100644 (file)
--- a/mp3_afh.c
+++ b/mp3_afh.c
@@ -16,6 +16,8 @@
  *                      Johannes Overmann <overmann@iname.com>
  */
 
+#include "para.h"
+#include "afh.h"
 #include "server.h"
 #include "error.h"
 #include "string.h"
index 46fc65b..702e08d 100644 (file)
 #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"
index 6cabd4f..652ac53 100644 (file)
@@ -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
index a9b07a3..1c0c632 100644 (file)
--- a/ogg_afh.c
+++ b/ogg_afh.c
@@ -10,6 +10,8 @@
 #include <vorbis/codec.h>
 #include <vorbis/vorbisfile.h>
 
+#include "para.h"
+#include "afh.h"
 #include "server.h"
 #include "error.h"
 #include "string.h"
index 18b5edd..e17c847 100644 (file)
@@ -10,6 +10,8 @@
 #include <ortp/port.h>
 
 #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 f41e8b6..eb99ec6 100644 (file)
--- 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)));
+}
+
index 9153bf1..6f952e6 100644 (file)
@@ -1,5 +1,6 @@
 #include "para.h"
 #include "error.h"
+#include "afh.h"
 #include "afs.h"
 #include "string.h"
 
index 8372dac..9eb6305 100644 (file)
@@ -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"
index 294adef..2006647 100644 (file)
@@ -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
index c3d7e9b..36d4d58 100644 (file)
@@ -7,7 +7,9 @@
 /** \file random_selector.c An audio file selector which chooses files by random */
 
 #include <sys/time.h> /* gettimeofday */
+#include "para.h"
 #include "server.cmdline.h"
+#include "afh.h"
 #include "server.h"
 #include "afs_common.h"
 #include "error.h"
index f1901f8..578c447 100644 (file)
@@ -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 2cfadf8..6c15a0f 100644 (file)
--- 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"
index e39354e..94e6564 100644 (file)
--- a/server.c
+++ b/server.c
  */
 
 
-
+#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);
                }
        }
index d913469..b375509 100644 (file)
@@ -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
index 08fa11b..0cdd0e6 100644 (file)
--- 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 859fd61..d0f57ae 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -11,6 +11,8 @@
  * senders.
  */
 
+#include "para.h"
+#include "afh.h"
 #include "server.h"
 #include <sys/mman.h> /* mmap */
 #include <sys/time.h> /* gettimeofday */