ast_module_reload();
}
-
-static void pipe_handler(int num)
+static void child_handler(int sig)
{
- /* Ignore sigpipe */
+ int n, status;
+
+ /*
+ * Reap all dead children -- not just one
+ */
+ for (n = 0; wait4(-1, &status, WNOHANG, NULL) > 0; n++)
+ ;
+ if (n == 0 && option_debug)
+ ast_log(LOG_DEBUG, "Huh? Child handler, but nobody there?\n");
}
+
static void set_title(char *text)
{
/* Set an X-term or screen title */
}
if (option_console && !option_verbose)
ast_verbose("[ Booting...");
+
signal(SIGURG, urg_handler);
signal(SIGINT, __quit_handler);
signal(SIGTERM, __quit_handler);
signal(SIGHUP, hup_handler);
- signal(SIGPIPE, pipe_handler);
+ signal(SIGCHLD, child_handler);
+ signal(SIGPIPE, SIG_IGN);
+
if (set_priority(option_highpriority)) {
printf(term_quit());
exit(1);
static ast_mutex_t moh_lock = AST_MUTEX_INITIALIZER;
+#define LOCAL_MPG_123 "/usr/local/bin/mpg123"
#define MPG_123 "/usr/bin/mpg123"
#define MAX_MP3S 256
-static void child_handler(int sig)
-{
- int status;
- if (wait4(-1,&status, WNOHANG, NULL)<1)
- if (option_debug)
- ast_log(LOG_DEBUG, "Huh? Child handler, but nobody there?\n");
-}
-
static int spawn_mp3(struct mohclass *class)
{
int fds[2];
ast_log(LOG_WARNING, "%s is not a valid directory\n", class->dir);
return -1;
}
- argv[0] = MPG_123;
+ argv[0] = "mpg123";
argv[1] = "-q";
argv[2] = "-s";
argv[3] = "--mono";
close(x);
/* Child */
chdir(class->dir);
+ /* Default install is /usr/local/bin */
+ execv(LOCAL_MPG_123, argv);
+ /* Many places have it in /usr/bin */
execv(MPG_123, argv);
+ /* Check PATH as a last-ditch effort */
+ execvp("mpg123", argv);
ast_log(LOG_WARNING, "Exec failed: %s\n", strerror(errno));
exit(1);
} else {
tv.tv_usec = 0;
error_sec = 0;
error_usec = 0;
- signal(SIGCHLD, child_handler);
for(;/* ever */;) {
/* Spawn mp3 player if it's not there */
if (class->srcfd < 0) {