fix seg fault when the parked call that timed out was the last one in the list
[asterisk/asterisk.git] / res / res_clioriginate.c
index a9ebb36..7303d4b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 2005, Digium, Inc.
+ * Copyright (C) 2005 - 2006, Digium, Inc.
  *
  * Russell Bryant <russell@digium.com>
  *
 
 /*! 
  * \file
+ * \author Russell Bryant <russell@digium.com>
  *
  * \brief Originate calls via the CLI
  * 
  */
 
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
 
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
 #include "asterisk/logger.h"
@@ -66,7 +67,7 @@ static char *complete_orig(const char *line, const char *word, int pos, int stat
 
 struct ast_cli_entry cli_orig = { { "originate", NULL }, handle_orig, "Originate a call", orig_help, complete_orig };
 
-static int orig_app(const char *chan, const char *app, const char *appdata)
+static int orig_app(int fd, const char *chan, const char *app, const char *appdata)
 {
        char *chantech;
        char *chandata;
@@ -76,13 +77,10 @@ static int orig_app(const char *chan, const char *app, const char *appdata)
                return RESULT_SHOWUSAGE;
 
        chandata = ast_strdupa(chan);
-       if (!chandata) {
-               ast_log(LOG_ERROR, "Out of Memory!\n");
-               return RESULT_FAILURE;
-       }
+       
        chantech = strsep(&chandata, "/");
        if (!chandata) {
-               ast_log(LOG_ERROR, "No dial string.\n");
+               ast_cli(fd, "*** No data provided after channel type! ***\n");
                return RESULT_SHOWUSAGE;
        }
 
@@ -91,7 +89,7 @@ static int orig_app(const char *chan, const char *app, const char *appdata)
        return RESULT_SUCCESS;
 }
 
-static int orig_exten(const char *chan, const char *data)
+static int orig_exten(int fd, const char *chan, const char *data)
 {
        char *chantech;
        char *chandata;
@@ -100,18 +98,15 @@ static int orig_exten(const char *chan, const char *data)
        int reason = 0;
 
        chandata = ast_strdupa(chan);
+       
+       chantech = strsep(&chandata, "/");
        if (!chandata) {
-               ast_log(LOG_ERROR, "Out of Memory!\n");
-               return RESULT_FAILURE;
+               ast_cli(fd, "*** No data provided after channel type! ***\n");
+               return RESULT_SHOWUSAGE;
        }
-       chantech = strsep(&chandata, "/");
 
        if (!ast_strlen_zero(data)) {
                context = ast_strdupa(data);
-               if (!context) {
-                       ast_log(LOG_ERROR, "Out of Memory!\n");
-                       return RESULT_FAILURE;
-               }
                exten = strsep(&context, "@");
        }
 
@@ -135,9 +130,9 @@ static int handle_orig(int fd, int argc, char *argv[])
        ast_atomic_fetchadd_int(&me->usecnt, +1);
 
        if (!strcasecmp("application", argv[2])) {
-               res = orig_app(argv[1], argv[3], argv[4]);      
+               res = orig_app(fd, argv[1], argv[3], argv[4]);  
        } else if (!strcasecmp("extension", argv[2])) {
-               res = orig_exten(argv[1], argv[3]);
+               res = orig_exten(fd, argv[1], argv[3]);
        } else
                res = RESULT_SHOWUSAGE;