--- res_musiconhold.c 2003-11-04 18:23:00.000000000 -0500 +++ res_musiconhold_mod.c 2003-11-18 15:29:35.000000000 -0500 @@ -70,6 +70,7 @@ char class[80]; char dir[256]; char miscargs[256]; + char customexec[256]; int destroyme; int pid; /* PID of mpg123 */ int quiet; @@ -91,7 +92,7 @@ static struct mohclass *mohclasses; -static ast_mutex_t moh_lock = AST_MUTEX_INITIALIZER; +static ast_mutex_t moh_lock= AST_MUTEX_INITIALIZER; #define LOCAL_MPG_123 "/usr/local/bin/mpg123" #define MPG_123 "/usr/bin/mpg123" @@ -104,55 +105,90 @@ char fns[MAX_MP3S][80]; char *argv[MAX_MP3S + 50]; char xargs[256]; + char *customexec; char *argptr; int argc; DIR *dir; struct dirent *de; - dir = opendir(class->dir); - if (!dir) { - ast_log(LOG_WARNING, "%s is not a valid directory\n", class->dir); - return -1; - } - argv[0] = "mpg123"; - argv[1] = "-q"; - argv[2] = "-s"; - argv[3] = "--mono"; - argv[4] = "-r"; - argv[5] = "8000"; - argv[6] = "-b"; - argv[7] = "2048"; - argc = 8; - if (class->quiet) { - argv[argc++] = "-f"; - argv[argc++] = "8192"; - } - - /* Look for extra arguments and add them to the list */ - strncpy(xargs, class->miscargs, sizeof(xargs) - 1); - argptr = xargs; - while(argptr && strlen(argptr)) { - argv[argc++] = argptr; - argptr = strchr(argptr, ','); - if (argptr) { - *argptr = '\0'; - argptr++; - } - } - files = 0; - while((de = readdir(dir)) && (files < MAX_MP3S)) { - if ((strlen(de->d_name) > 3) && !strcasecmp(de->d_name + strlen(de->d_name) - 4, ".mp3")) { - strncpy(fns[files], de->d_name, sizeof(fns[files])); - argv[argc++] = fns[files]; - files++; - } - } - argv[argc] = NULL; - closedir(dir); - if (pipe(fds)) { - ast_log(LOG_WARNING, "Pipe failed\n"); - return -1; + + + if(class->customexec && strlen(class->customexec)) { + + + argc = 0; + strncpy(xargs, class->customexec, sizeof(xargs) - 1); + argptr = xargs; + + while(argptr && strlen(argptr)) { + argv[argc] = argptr; + argptr = strchr(argptr, ','); + if (argptr) { + *argptr = '\0'; + argptr++; + } + + + argc++; + } + + + + } + else { + dir = opendir(class->dir); + if (!dir) { + ast_log(LOG_WARNING, "%s is not a valid directory\n", class->dir); + return -1; + } + argv[0] = "mpg123"; + argv[1] = "-q"; + argv[2] = "-s"; + argv[3] = "--mono"; + argv[4] = "-r"; + argv[5] = "8000"; + argv[6] = "-b"; + argv[7] = "2048"; + argc = 8; + if (class->quiet) { + argv[argc++] = "-f"; + argv[argc++] = "8192"; + } + + /* Look for extra arguments and add them to the list */ + strncpy(xargs, class->miscargs, sizeof(xargs) - 1); + argptr = xargs; + while(argptr && strlen(argptr)) { + argv[argc++] = argptr; + argptr = strchr(argptr, ','); + if (argptr) { + *argptr = '\0'; + argptr++; + } + } + + + + + files = 0; + while((de = readdir(dir)) && (files < MAX_MP3S)) { + if ((strlen(de->d_name) > 3) && !strcasecmp(de->d_name + strlen(de->d_name) - 4, ".mp3")) { + strncpy(fns[files], de->d_name, sizeof(fns[files])); + argv[argc++] = fns[files]; + files++; + } + } + argv[argc] = NULL; + closedir(dir); + } + + + + if (pipe(fds)) { + ast_log(LOG_WARNING, "Pipe failed\n"); + return -1; + } #if 0 printf("%d files total, %d args total\n", files, argc); { @@ -161,28 +197,47 @@ printf("arg%d: %s\n", x, argv[x]); } #endif - if (!files) { + if (!files && class->customexec && ! strlen(class->customexec)) { ast_log(LOG_WARNING, "Found no files in '%s'\n", class->dir); close(fds[0]); close(fds[1]); return -1; } + + + class->pid = fork(); + if (class->pid < 0) { close(fds[0]); close(fds[1]); ast_log(LOG_WARNING, "Fork failed: %s\n", strerror(errno)); return -1; } + + + + + if (!class->pid) { int x; close(fds[0]); /* Stdout goes to pipe */ + dup2(fds[1], STDOUT_FILENO); - /* Close unused file descriptors */ - for (x=3;x<8192;x++) - close(x); - /* Child */ + + + + + + /* Close unused file descriptors */ + for (x=3;x<8192;x++) + close(x); + /* Child */ + + + /* try custom */ + execv(argv[0], argv); chdir(class->dir); /* Default install is /usr/local/bin */ execv(LOCAL_MPG_123, argv); @@ -223,6 +278,8 @@ for(;/* ever */;) { /* Spawn mp3 player if it's not there */ if (class->srcfd < 0) { + + if ((class->srcfd = spawn_mp3(class)) < 0) { ast_log(LOG_WARNING, "unable to spawn mp3player\n"); /* Try again later */ @@ -474,9 +531,12 @@ generate: moh_generate, }; -static int moh_register(char *classname, char *mode, char *param, char *miscargs) +static int moh_register(char *classname, char *mode, char *param, char *miscargs,char *customexec) { struct mohclass *moh; + char custmode[7] = "custom"; + + custmode[7]=NULL; #ifdef ZAPATA_MOH int x; #endif @@ -493,12 +553,32 @@ memset(moh, 0, sizeof(struct mohclass)); strncpy(moh->class, classname, sizeof(moh->class) - 1); + + if(customexec && strlen(customexec)) { + strncpy(moh->customexec, customexec, sizeof(moh->customexec) - 1); + mode=custmode; + + } + if (miscargs) - strncpy(moh->miscargs, miscargs, sizeof(moh->miscargs) - 1); - if (!strcasecmp(mode, "mp3") || !strcasecmp(mode, "quietmp3") || !strcasecmp(mode, "httpmp3")) { + strncpy(moh->miscargs, miscargs, sizeof(moh->miscargs) - 1); + + + + + + + + + + if (!strcasecmp(mode, "mp3") || !strcasecmp(mode, "quietmp3") || !strcasecmp(mode, "httpmp3") || !strcasecmp(mode, "custom")) { + + + if(! customexec || (customexec && ! strlen(customexec))) { if (!strcasecmp(mode, "quietmp3")) moh->quiet = 1; strncpy(moh->dir, param, sizeof(moh->dir) - 1); + } moh->srcfd = -1; #ifdef ZAPATA_MOH /* It's an MP3 Moh -- Open /dev/zap/pseudo for timing... Is @@ -513,6 +593,9 @@ #else moh->pseudofd = -1; #endif + + + if (pthread_create(&moh->thread, NULL, monmp3thread, moh)) { ast_log(LOG_WARNING, "Unable to create moh...\n"); if (moh->pseudofd > -1) @@ -565,10 +648,20 @@ *args = '\0'; args++; } - moh_register(var->name, var->value, data,args); + moh_register(var->name, var->value, data,args,NULL); } var = var->next; } + + + var = ast_variable_browse(cfg, "custom_exec"); + while(var) { + + moh_register(var->name,NULL,NULL,NULL,var->value); + var = var->next; + } + + ast_destroy(cfg); } }