revert my pass through the tree to remove checks of the result of ast_strdupa
[asterisk/asterisk.git] / apps / app_externalivr.c
old mode 100755 (executable)
new mode 100644 (file)
index c3e3c56..1023204
 /*! \file
  *
  * \brief External IVR application interface
- * 
+ *
+ * \author Kevin P. Fleming <kpfleming@digium.com>
+ *
+ * \note Portions taken from the file-based music-on-hold work
+ * created by Anthony Minessale II in res_musiconhold.c
+ *
  * \ingroup applications
  */
 
 #include <stdlib.h>
-#include <unistd.h>
+#include <stdio.h>
 #include <string.h>
-#include <stdlib.h>
+#include <unistd.h>
 #include <errno.h>
 
 #include "asterisk.h"
@@ -43,6 +48,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
 #include "asterisk/linkedlists.h"
+#include "asterisk/app.h"
+#include "asterisk/utils.h"
 
 static const char *tdesc = "External IVR Interface Application";
 
@@ -93,9 +100,9 @@ static void send_child_event(FILE *handle, const char event, const char *data,
        char tmp[256];
 
        if (!data) {
-               snprintf(tmp, sizeof(tmp), "%c,%10ld", event, time(NULL));
+               snprintf(tmp, sizeof(tmp), "%c,%10d", event, (int)time(NULL));
        } else {
-               snprintf(tmp, sizeof(tmp), "%c,%10ld,%s", event, time(NULL), data);
+               snprintf(tmp, sizeof(tmp), "%c,%10d,%s", event, (int)time(NULL), data);
        }
 
        fprintf(handle, "%s\n", tmp);
@@ -106,10 +113,8 @@ static void *gen_alloc(struct ast_channel *chan, void *params)
 {
        struct localuser *u = params;
        struct gen_state *state;
-
-       state = calloc(1, sizeof(*state));
-
-       if (!state)
+       
+       if (!(state = ast_calloc(1, sizeof(*state))))
                return NULL;
 
        state->u = u;
@@ -228,10 +233,8 @@ static struct ast_generator gen =
 static struct playlist_entry *make_entry(const char *filename)
 {
        struct playlist_entry *entry;
-
-       entry = calloc(1, sizeof(*entry) + strlen(filename) + 10);
-
-       if (!entry)
+       
+       if (!(entry = ast_calloc(1, sizeof(*entry) + strlen(filename) + 10)))
                return NULL;
 
        strcpy(entry->filename, filename);
@@ -250,10 +253,9 @@ static int app_exec(struct ast_channel *chan, void *data)
        int res = -1;
        int gen_active = 0;
        int pid;
-       char *command;
        char *argv[32];
        int argc = 1;
-       char *buf;
+       char *buf, *command;
        FILE *child_commands = NULL;
        FILE *child_errors = NULL;
        FILE *child_events = NULL;
@@ -270,11 +272,13 @@ static int app_exec(struct ast_channel *chan, void *data)
        }
 
        buf = ast_strdupa(data);
-       command = strsep(&buf, "|");
-       memset(argv, 0, sizeof(argv) / sizeof(argv[0]));
-       argv[0] = command;
-       while ((argc < 31) && (argv[argc++] = strsep(&buf, "|")));
-       argv[argc] = NULL;
+       if (!buf) {
+               ast_log(LOG_ERROR, "Out of memory!\n");
+               LOCAL_USER_REMOVE(u);
+               return -1;
+       }
+
+       argc = ast_app_separate_args(buf, '|', argv, sizeof(argv) / sizeof(argv[0]));
 
        if (pipe(child_stdin)) {
                ast_chan_log(LOG_WARNING, chan, "Could not create pipe for child input: %s\n", strerror(errno));
@@ -316,8 +320,8 @@ static int app_exec(struct ast_channel *chan, void *data)
                dup2(child_stderr[1], STDERR_FILENO);
                for (i = STDERR_FILENO + 1; i < 1024; i++)
                        close(i);
-               execv(command, argv);
-               fprintf(stderr, "Failed to execute '%s': %s\n", command, strerror(errno));
+               execv(argv[0], argv);
+               fprintf(stderr, "Failed to execute '%s': %s\n", argv[0], strerror(errno));
                exit(1);
        } else {
                /* parent process */
@@ -343,8 +347,6 @@ static int app_exec(struct ast_channel *chan, void *data)
                        goto exit;
                }
 
-               setvbuf(child_events, NULL, _IONBF, 0);
-
                if (!(child_commands = fdopen(child_commands_fd, "r"))) {
                        ast_chan_log(LOG_WARNING, chan, "Could not open stream for child commands\n");
                        goto exit;
@@ -355,6 +357,10 @@ static int app_exec(struct ast_channel *chan, void *data)
                        goto exit;
                }
 
+               setvbuf(child_events, NULL, _IONBF, 0);
+               setvbuf(child_commands, NULL, _IONBF, 0);
+               setvbuf(child_errors, NULL, _IONBF, 0);
+
                res = 0;
 
                while (1) {