]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - fade.c
fade: Abort on client command failures.
[paraslash.git] / fade.c
diff --git a/fade.c b/fade.c
index 8eeb79e7d3f335b08ed1d2b8f3606e2fdec4cd6d..36ff1fc1fdc1342f68590b3327a7fcfffe877ac4 100644 (file)
--- a/fade.c
+++ b/fade.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1998-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998-2012 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -8,14 +8,8 @@
 
 #include <regex.h>
 #include <sys/types.h>
-#include <dirent.h>
 #include <sys/ioctl.h>
-#include <ctype.h>
-#include <stdlib.h> /* EXIT_SUCCESS */
-#include <unistd.h>
 #include <signal.h>
-#include <string.h>
-#include <limits.h>
 #include <sys/soundcard.h>
 
 #include "fade.cmdline.h"
 #include "fd.h"
 #include "string.h"
 #include "error.h"
+#include "version.h"
 
 INIT_FADE_ERRLISTS;
 static struct fade_args_info conf;
 
-__printf_2_3 void para_log(__a_unused int ll, const char *fmt, ...)
+__printf_2_3 void date_log(__a_unused int ll, const char *fmt, ...)
 {
        va_list argp;
        time_t t1;
@@ -40,6 +35,7 @@ __printf_2_3 void para_log(__a_unused int ll, const char *fmt, ...)
        vprintf(fmt, argp);
        va_end(argp);
 }
+__printf_2_3 void (*para_log)(int, const char*, ...) = date_log;
 
 /*
  * Open the mixer device.
@@ -125,6 +121,7 @@ static void fixup_mixer_channel_arg(void)
                case mixer_channel_arg_reclev: val = SOUND_MIXER_RECLEV; break;
                case mixer_channel_arg_igain: val = SOUND_MIXER_IGAIN; break;
                case mixer_channel_arg_ogain: val = SOUND_MIXER_OGAIN; break;
+               default: break;
        }
        conf.mixer_channel_arg = val;
 }
@@ -179,7 +176,7 @@ out:
 
 static void client_cmd(const char *cmd)
 {
-       int ret, fds[3] = {0, 0, 0};
+       int ret, status, fds[3] = {0, 0, 0};
        pid_t pid;
        char *cmdline = make_message(BINDIR "/para_client %s", cmd);
 
@@ -187,12 +184,22 @@ static void client_cmd(const char *cmd)
        ret = para_exec_cmdline_pid(&pid, cmdline, fds);
        free(cmdline);
        if (ret < 0) {
-               PARA_EMERG_LOG("%s\n", para_strerror(-ret));
-               exit(EXIT_FAILURE);
+               PARA_ERROR_LOG("%s\n", para_strerror(-ret));
+               goto fail;
        }
        do
-               ret = wait(NULL);
-       while (ret != -1 && errno != ECHILD);
+               pid = waitpid(pid, &status, 0);
+       while (pid == -1 && errno == EINTR);
+       if (pid < 0) {
+               PARA_ERROR_LOG("%s\n", strerror(errno));
+               goto fail;
+       }
+       if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+               goto fail;
+       return;
+fail:
+       PARA_EMERG_LOG("command \"%s\" failed\n", cmd);
+       exit(EXIT_FAILURE);
 }
 
 static void change_afs_mode_and_play(char *afs_mode)
@@ -202,7 +209,7 @@ static void change_afs_mode_and_play(char *afs_mode)
        client_cmd("stop");
        if (!afs_mode)
                return;
-       cmd = make_message("select %s\n", afs_mode);
+       cmd = make_message("select %s", afs_mode);
        client_cmd(cmd);
        free(cmd);
        client_cmd("play");
@@ -286,11 +293,9 @@ static int sweet_dreams(void)
 static int snooze(void)
 {
        int ret;
-       unsigned sleep_time;
 
        if (conf.so_time_arg <= 0)
                return 1;
-       sleep_time = conf.so_time_arg;
        if (open_and_get_mixer_channel() < conf.so_vol_arg)
                ret = open_and_set_mixer_channel(conf.so_vol_arg);
        else
@@ -299,7 +304,7 @@ static int snooze(void)
                return ret;
        client_cmd("pause");
        PARA_NOTICE_LOG("%d seconds snooze time...\n", conf.snooze_time_arg);
-       sleep(sleep_time);
+       sleep(conf.snooze_time_arg);
        client_cmd("play");
        return fade(conf.si_vol_arg, conf.si_time_arg);
 }
@@ -344,15 +349,15 @@ int main(int argc, char *argv[])
        }
        fixup_mixer_channel_arg();
        switch (conf.mode_arg) {
-       case mode_arg_sleep:
-               ret = sweet_dreams();
-               break;
        case mode_arg_fade:
                ret = fade(conf.fade_vol_arg, conf.fade_time_arg);
                break;
        case mode_arg_snooze:
                ret = snooze();
                break;
+       default: /* sleep mode */
+               ret = sweet_dreams();
+               break;
        }
        if (ret < 0)
                PARA_EMERG_LOG("%s\n", para_strerror(-ret));