static int mp3play(const char *filename, unsigned int sampling_rate, int fd) { int res; char sampling_rate_str[8]; res = ast_safe_fork(0); if (res < 0) ast_log(LOG_WARNING, "Fork failed\n"); if (res) { return res; } if (ast_opt_high_priority) ast_set_priority(0); dup2(fd, STDOUT_FILENO); ast_close_fds_above_n(STDERR_FILENO); snprintf(sampling_rate_str, 8, "%u", sampling_rate); /* Execute mpg123, but buffer if it's a net connection */ if (!strncasecmp(filename, "http://", 7) && strstr(filename, ".m3u")) { char buffer_size_str[8]; snprintf(buffer_size_str, 8, "%u", (int) 0.5*2*sampling_rate/1000); // 0.5 seconds for a live stream /* Most commonly installed in /usr/local/bin */ execl(LOCAL_MPG_123, "mpg123", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL); /* But many places has it in /usr/bin */ execl(MPG_123, "mpg123", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL); /* As a last-ditch effort, try to use PATH */ execlp("mpg123", "mpg123", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL); } else if (!strncasecmp(filename, "http://", 7)) { char buffer_size_str[8]; snprintf(buffer_size_str, 8, "%u", 6*2*sampling_rate/1000); // 6 seconds for a remote MP3 file /* Most commonly installed in /usr/local/bin */ execl(LOCAL_MPG_123, "mpg123", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL); /* But many places has it in /usr/bin */ execl(MPG_123, "mpg123", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL); /* As a last-ditch effort, try to use PATH */ execlp("mpg123", "mpg123", "-q", "-s", "-b", buffer_size_str, "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL); } else if (strstr(filename, ".m3u")) { /* Most commonly installed in /usr/local/bin */ execl(LOCAL_MPG_123, "mpg123", "-q", "-z", "-s", "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL); /* But many places has it in /usr/bin */ execl(MPG_123, "mpg123", "-q", "-z", "-s", "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL); /* As a last-ditch effort, try to use PATH */ execlp("mpg123", "mpg123", "-q", "-z", "-s", "-f", "8192", "--mono", "-r", sampling_rate_str, "-@", filename, (char *)NULL); } else { /* Most commonly installed in /usr/local/bin */ execl(MPG_123, "mpg123", "-q", "-s", "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL); /* But many places has it in /usr/bin */ execl(LOCAL_MPG_123, "mpg123", "-q", "-s", "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL); /* As a last-ditch effort, try to use PATH */ execlp("mpg123", "mpg123", "-q", "-s", "-f", "8192", "--mono", "-r", sampling_rate_str, filename, (char *)NULL); } /* Can't use ast_log since FD's are closed */ fprintf(stderr, "Execute of mpg123 failed\n"); _exit(0); }
static int send_waveform_to_fd(char *waveform, int length, int fd) { int res; #if __BYTE_ORDER == __BIG_ENDIAN int x; char c; #endif res = ast_safe_fork(0); if (res < 0) ast_log(LOG_WARNING, "Fork failed\n"); if (res) { return res; } dup2(fd, 0); ast_close_fds_above_n(0); if (ast_opt_high_priority) ast_set_priority(0); #if __BYTE_ORDER == __BIG_ENDIAN for (x = 0; x < length; x += 2) { c = *(waveform + x + 1); *(waveform + x + 1) = *(waveform + x); *(waveform + x) = c; } #endif if (write(0, waveform, length) < 0) { /* Cannot log -- all FDs are already closed */ } close(fd); _exit(0); }
static int icesencode(char *filename, int fd) { int res; res = ast_safe_fork(0); if (res < 0) ast_log(LOG_WARNING, "Fork failed\n"); if (res) { return res; } if (ast_opt_high_priority) ast_set_priority(0); dup2(fd, STDIN_FILENO); ast_close_fds_above_n(STDERR_FILENO); /* Most commonly installed in /usr/local/bin * But many places has it in /usr/bin * As a last-ditch effort, try to use PATH */ execl(path_LOCAL "ices2", "ices", filename, SENTINEL); execl(path_BIN "ices2", "ices", filename, SENTINEL); execlp("ices2", "ices", filename, SENTINEL); ast_debug(1, "Couldn't find ices version 2, attempting to use ices version 1."); execl(path_LOCAL "ices", "ices", filename, SENTINEL); execl(path_BIN "ices", "ices", filename, SENTINEL); execlp("ices", "ices", filename, SENTINEL); ast_log(LOG_WARNING, "Execute of ices failed, could not find command.\n"); close(fd); _exit(0); }
static pid_t spawn_ras(struct ast_channel *chan, char *args) { pid_t pid; char *c; char *argv[PPP_MAX_ARGS]; int argc = 0; char *stringp=NULL; /* Start by forking */ pid = ast_safe_fork(1); if (pid) { return pid; } /* Execute RAS on File handles */ dup2(ast_channel_fd(chan, 0), STDIN_FILENO); /* Drop high priority */ if (ast_opt_high_priority) ast_set_priority(0); /* Close other file descriptors */ ast_close_fds_above_n(STDERR_FILENO); /* Reset all arguments */ memset(argv, 0, sizeof(argv)); /* First argument is executable, followed by standard arguments for DAHDI PPP */ argv[argc++] = PPP_EXEC; argv[argc++] = "nodetach"; /* And all the other arguments */ stringp=args; c = strsep(&stringp, ","); while(c && strlen(c) && (argc < (PPP_MAX_ARGS - 4))) { argv[argc++] = c; c = strsep(&stringp, ","); } argv[argc++] = "plugin"; argv[argc++] = "dahdi.so"; argv[argc++] = "stdin"; /* Finally launch PPP */ execv(PPP_EXEC, argv); fprintf(stderr, "Failed to exec PPPD!\n"); exit(1); }
static int mp3play(const char *filename, int fd) { int res; res = ast_safe_fork(0); if (res < 0) ast_log(LOG_WARNING, "Fork failed\n"); if (res) { return res; } if (ast_opt_high_priority) ast_set_priority(0); dup2(fd, STDOUT_FILENO); ast_close_fds_above_n(STDERR_FILENO); /* Execute mpg123, but buffer if it's a net connection */ if (!strncasecmp(filename, "http://", 7)) { /* Most commonly installed in /usr/local/bin */ execl(LOCAL_MPG_123, "mpg123", "-q", "-s", "-b", "1024", "-f", "8192", "--mono", "-r", "8000", filename, (char *)NULL); /* But many places has it in /usr/bin */ execl(MPG_123, "mpg123", "-q", "-s", "-b", "1024","-f", "8192", "--mono", "-r", "8000", filename, (char *)NULL); /* As a last-ditch effort, try to use PATH */ execlp("mpg123", "mpg123", "-q", "-s", "-b", "1024", "-f", "8192", "--mono", "-r", "8000", filename, (char *)NULL); } else if (strstr(filename, ".m3u")) { /* Most commonly installed in /usr/local/bin */ execl(LOCAL_MPG_123, "mpg123", "-q", "-z", "-s", "-b", "1024", "-f", "8192", "--mono", "-r", "8000", "-@", filename, (char *)NULL); /* But many places has it in /usr/bin */ execl(MPG_123, "mpg123", "-q", "-z", "-s", "-b", "1024","-f", "8192", "--mono", "-r", "8000", "-@", filename, (char *)NULL); /* As a last-ditch effort, try to use PATH */ execlp("mpg123", "mpg123", "-q", "-z", "-s", "-b", "1024", "-f", "8192", "--mono", "-r", "8000", "-@", filename, (char *)NULL); } else { /* Most commonly installed in /usr/local/bin */ execl(MPG_123, "mpg123", "-q", "-s", "-f", "8192", "--mono", "-r", "8000", filename, (char *)NULL); /* But many places has it in /usr/bin */ execl(LOCAL_MPG_123, "mpg123", "-q", "-s", "-f", "8192", "--mono", "-r", "8000", filename, (char *)NULL); /* As a last-ditch effort, try to use PATH */ execlp("mpg123", "mpg123", "-q", "-s", "-f", "8192", "--mono", "-r", "8000", filename, (char *)NULL); } /* Can't use ast_log since FD's are closed */ fprintf(stderr, "Execute of mpg123 failed\n"); _exit(0); }
static int NBScatplay(int fd) { int res; res = ast_safe_fork(0); if (res < 0) { ast_log(LOG_WARNING, "Fork failed\n"); } if (res) { return res; } if (ast_opt_high_priority) ast_set_priority(0); dup2(fd, STDOUT_FILENO); ast_close_fds_above_n(STDERR_FILENO); /* Most commonly installed in /usr/local/bin */ execl(NBSCAT, "nbscat8k", "-d", (char *)NULL); execl(LOCAL_NBSCAT, "nbscat8k", "-d", (char *)NULL); fprintf(stderr, "Execute of nbscat8k failed\n"); _exit(0); }