]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge commit /fml/ag-raetsch/home/maan/tmp/paraslash_meins/paraslash/ of HEAD
authorAndre Noll <maan@congo.fml.local>
Fri, 29 Sep 2006 15:13:09 +0000 (17:13 +0200)
committerAndre Noll <maan@congo.fml.local>
Fri, 29 Sep 2006 15:13:09 +0000 (17:13 +0200)
audiod.c
audiod.ggo
audiod.h
configure.ac
daemon.c
gui_theme.c

index 0629d7c6add39b778b42567d002cdd7e31bdd45c..40c75952570eb60c09ddf7904eda43cc37f90108 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -262,7 +262,12 @@ static void close_stat_pipe(void)
        stat_task->stat_item_values[SI_STATUS_BAR] = make_message(
                "%s:no connection to para_server\n",
                status_item_list[SI_STATUS_BAR]);
-       stat_client_write(stat_task->stat_item_values[SI_STATUS_BAR], SI_STATUS_BAR);
+       stat_client_write(stat_task->stat_item_values[SI_STATUS_BAR],
+               SI_STATUS_BAR);
+       if (stat_task->clock_diff_count) {
+               stat_task->clock_diff_barrier.tv_sec = now->tv_sec + 1;
+               stat_task->clock_diff_barrier.tv_usec = now->tv_usec;
+       }
 }
 
 void __noreturn clean_exit(int status, const char *msg)
@@ -502,7 +507,7 @@ static void compute_time_diff(const struct timeval *status_time)
                count > 10? sign : sign * time_smooth, &diff,
                &tmp);
        stat_task->sa_time_diff = tmp;
-       PARA_DEBUG_LOG("time diff (cur/avg): %s%lums/%s%lums\n",
+       PARA_INFO_LOG("time diff (cur/avg): %s%lums/%s%lums\n",
                sign > 0? "+" : "-",
                tv2ms(&diff),
                sa_time_diff_sign ? "+" : "-",
@@ -525,6 +530,8 @@ static void check_stat_line(char *line)
                PARA_WARNING_LOG("invalid status line: %s\n", line);
                return;
        }
+       if (stat_task->clock_diff_count && itemnum != SI_CURRENT_TIME)
+               return;
        tmp = make_message("%s\n", line);
        stat_client_write(tmp, itemnum);
        free(tmp);
@@ -562,6 +569,8 @@ static void check_stat_line(char *line)
                        struct timeval tv = {sec, usec};
                        compute_time_diff(&tv);
                }
+               if (stat_task->clock_diff_count)
+                       stat_task->clock_diff_count--;
                break;
        }
 }
@@ -992,23 +1001,37 @@ static void status_event_handler(__a_unused struct task *t)
 static void status_pre_select(struct sched *s, struct task *t)
 {
        struct status_task *st = t->private_data;
-       int argc = 2;
-       char *argv[] = {"audiod", "stat", NULL};
+
        t->ret = 1;
        if (st->pcd && (audiod_status == AUDIOD_OFF || st->pcd->eof))
                close_stat_pipe();
-       if (!st->pcd && audiod_status != AUDIOD_OFF
-               && tv_diff(now, &st->restart_barrier, NULL) > 0) {
-               t->ret = client_parse_config(argc, argv, &st->pcd);
-               if (t->ret < 0)
-                       return;
-               t->ret = client_open(st->pcd);
-               if (t->ret < 0)
+       if (st->pcd || audiod_status == AUDIOD_OFF)
+               return;
+       if (!st->clock_diff_count && tv_diff(now, &st->restart_barrier, NULL)
+                       < 0)
+               return;
+       if (st->clock_diff_count) {
+               char *argv[] = {"audiod", "stat", "1", NULL};
+               int argc = 3;
+               if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0)
                        return;
-               st->pcd->task.event_handler = client_task_event_handler;
-               s->timeout.tv_sec = 0;
-               s->timeout.tv_usec = 1;
+               PARA_INFO_LOG("clock diff count: %d\n", st->clock_diff_count);
+               t->ret = client_parse_config(argc, argv, &st->pcd);
+
+       } else {
+               char *argv[] = {"audiod", "stat", NULL};
+               int argc = 2;
+               t->ret = client_parse_config(argc, argv, &st->pcd);
        }
+
+       if (t->ret < 0)
+               return;
+       t->ret = client_open(st->pcd);
+       if (t->ret < 0)
+               return;
+       st->pcd->task.event_handler = client_task_event_handler;
+       s->timeout.tv_sec = 0;
+       s->timeout.tv_usec = 1;
 }
 
 static void status_post_select(__a_unused struct sched *s, struct task *t)
@@ -1040,6 +1063,7 @@ static void init_status_task(struct status_task *st)
        st->task.event_handler = status_event_handler;
        st->task.private_data = st;
        st->sa_time_diff_sign = 1;
+       st->clock_diff_count = conf.clock_diff_count_arg;
        sprintf(st->task.status, "status task");
 }
 
index 21b485fb4dd46c9717e7eb7a21ed98529cd2b59a..66e81a1129ada287f07a1c815ecd507fc9544f54 100644 (file)
@@ -85,6 +85,20 @@ connect."
        multiple
 
 
+option "clock_diff_count" -
+#~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+"check the clock difference between
+server_host (the host running para_server)
+and the local host (running para_audiod)
+that many times before starting any stream
+I/0. Set this to non-zero for non-local
+setups if the clocks of these two hosts are
+not syncronized by ntp or similar."
+
+       int typestr="count"
+       default="0"
+       optional
 
 
 section "stream i/o options."
index 856bc05126dbcb54a24a311a2f0eb19b42060d95..234c67a0d9eb9d09643544a498d96e5be5d69093 100644 (file)
--- a/audiod.h
+++ b/audiod.h
@@ -50,13 +50,14 @@ struct audiod_task {
 };
 
 /**
- * the task for audiod's child (para_client stat)
+ * the task for obtaining para_server's status (para_client stat)
  *
  * \sa struct task, struct sched
  */
 struct status_task {
        /** the associated task structure of audiod */
        struct task task;
+       /** client data associated with the stat task */
        struct private_client_data *pcd;
        /** the array of status items sent by para_server */
        char *stat_item_values[NUM_STAT_ITEMS];
@@ -70,12 +71,16 @@ struct status_task {
        int length_seconds;
        /** the start of the current stream from the view of para_server */
        struct timeval server_stream_start;
-       /** the averaged time deviation between para_server and para_audiod */
+       /** the average time deviation between para_server and para_audiod */
        struct timeval sa_time_diff;
        /** whether client time is ahead of server time */
        int sa_time_diff_sign;
-       /** non-zero if \a af_status is "playing" */
+       /** non-zero if para_server's status is "playing" */
        int playing;
+       /** number of times the clock difference is to be checked */
+       unsigned clock_diff_count;
+       /** when to start the next check for clock difference */
+       struct timeval clock_diff_barrier;
 };
 
 extern struct status_task *stat_task;
index 408851ed27a66032df20a6a5cf74a9096a79adec..ec7f1a931ebfa7537ffbb556333ddb89b1790777 100644 (file)
@@ -414,19 +414,21 @@ fi
 CPPFLAGS="$OLD_CPPFLAGS"
 LDFLAGS="$OLD_LDFLAGS"
 ########################################################################### zmw
-slide="para_slider"
-msg="can not build para_slider"
-CPPFLAGS="$GTK_CFLAGS"
+build_slider="yes"
+OLD_CPPFLAGS="$CPPFLAGS"
+OLD_LD_FLAGS="$LDFLAGS"
+PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.0.4], [], [build_slider="no"])
+CPPFLAGS="$GTK_CFLAGS $GLIB_CFLAGS"
 LDFLAGS="$LDFLAGS $GTK_LIBS"
-AC_CHECK_HEADERS([zmw/zmw.h], [], [
-       AC_MSG_WARN([zero memory widget header files not found, $msg])
-       slide=""
-])
-AC_CHECK_LIB([zmw], [zmw_init], [], [
-       AC_MSG_WARN([zero memory widget library not found, $msg])
-       slide=""
-])
-extras="$extras $slide"
+AC_CHECK_HEADERS([zmw/zmw.h], [], [build_slider="no"])
+AC_CHECK_LIB([zmw], [zmw_init], [], [build_slider="no"])
+if test "$build_slider" = "no"; then
+       AC_MSG_WARN([will not build para_slider])
+else
+       extras="$extras para_slider"
+fi
+CPPFLAGS="$OLD_CPPFLAGS"
+LDFLAGS="$OLD_LDFLAGS"
 
 
 
@@ -521,4 +523,5 @@ senders supported by para_server/para_send: $senders
 receivers supported by para_audiod/para_recv: $receivers
 filters supported by para_audiod/para_filter: $filters
 writers supported by para_audiod/para_write: $writers
+optional executables: $extras
 ])
index edaf7f9c7872dad1808f941d99a9fb416a9c68f4..46eb8f19196acfe37f280eb6650223437acdbf1b 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -109,11 +109,14 @@ void log_welcome(const char *whoami, int loglevel)
 /**
  * give up superuser privileges
  *
+ * \param username the user to switch to
+ * \param groupname the group to switch to
+ *
  * This function returns immediately if not invoked with EUID zero. Otherwise,
  * it tries to obtain the GID of \a groupname and the UID of \a username.  On
  * success, effective and real GID/UID and the saved set-group-ID/set-user-ID
- * are all set accordingly. On errors, an appropriate message is logged and exit()
- * is called to terminate the process.
+ * are all set accordingly. On errors, an appropriate message is logged and
+ * exit() is called to terminate the process.
  *
  * \sa getpwnam(3), getuid(2), setuid(2), getgrnam(2), setgid(2)
  */
@@ -150,7 +153,6 @@ void para_drop_privileges(const char *username, const char *groupname)
        PARA_INFO_LOG("%s", "dropping root privileges\n");
        setuid(p->pw_uid);
        PARA_DEBUG_LOG("uid: %d, euid: %d\n", getuid(), geteuid());
-       setuid(p->pw_uid);
 }
 
 /**
index 1b99a2c3affe37da8991a7900d03202ea7008d89..74d416ec8ea2a13f26116a4fd487bed074389c09 100644 (file)
@@ -155,7 +155,7 @@ static void init_theme_colorful_blackness(struct gui_theme *t)
        d[SI_SELECTOR].align = CENTER;
        d[SI_SELECTOR].x = 21;
        d[SI_SELECTOR].y = 17;
-       d[SI_SELECTOR].len = 20;
+       d[SI_SELECTOR].len = 21;
 
        d[SI_FORMAT].prefix = "format: ";
        d[SI_FORMAT].postfix = "";
@@ -164,8 +164,7 @@ static void init_theme_colorful_blackness(struct gui_theme *t)
        d[SI_FORMAT].align = CENTER;
        d[SI_FORMAT].x = 42;
        d[SI_FORMAT].y = 17;
-       d[SI_FORMAT].len = 14;
-
+       d[SI_FORMAT].len = 18;
 
        d[SI_NUM_PLAYED].prefix = "#";
        d[SI_NUM_PLAYED].postfix = "";