include "logger.h" and errno.h from asterisk.h - usage shows that they
[asterisk/asterisk.git] / apps / app_directed_pickup.c
index 60741fc..b823f58 100644 (file)
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
 #include "asterisk/file.h"
-#include "asterisk/logger.h"
 #include "asterisk/channel.h"
 #include "asterisk/pbx.h"
 #include "asterisk/module.h"
 #include "asterisk/lock.h"
 #include "asterisk/app.h"
 #include "asterisk/options.h"
+#include "asterisk/features.h"
 
 #define PICKUPMARK "PICKUPMARK"
 
 static const char *app = "Pickup";
 static const char *synopsis = "Directed Call Pickup";
 static const char *descrip =
-"  Pickup(extension[@context][&extension2@context...]): This application can pickup any ringing channel\n"
-"that is calling the specified extension. If no context is specified, the current\n"
-"context will be used. If you use the special string \"PICKUPMARK\" for the context parameter, for example\n"
-"10@PICKUPMARK, this application tries to find a channel which has defined a channel variable with the same content\n"
-"as \"extension\".";
+"  Pickup([extension[@context][&extension2@[context]...]]):  This application can\n"
+"pickup any ringing channel that is calling the specified extension.  If no\n"
+"context is specified, the current context will be used. If you use the special\n"
+"string \"PICKUPMARK\" for the context parameter, for example 10@PICKUPMARK,\n"
+"this application tries to find a channel which has defined a ${PICKUPMARK}\n"
+"channel variable with the same value as \"extension\" (in this example, \"10\").\n"
+"When no parameter is specified, the application will pickup a channel matching\n"
+"the pickup group of the active channel.";
 
 /* Perform actual pickup between two channels */
 static int pickup_do(struct ast_channel *chan, struct ast_channel *target)
 {
        int res = 0;
 
-       if (option_debug)
-               ast_log(LOG_DEBUG, "Call pickup on '%s' by '%s'\n", target->name, chan->name);
+       ast_debug(1, "Call pickup on '%s' by '%s'\n", target->name, chan->name);
 
        if ((res = ast_answer(chan))) {
                ast_log(LOG_WARNING, "Unable to answer '%s'\n", chan->name);
@@ -96,7 +93,7 @@ static int pickup_by_exten(struct ast_channel *chan, const char *exten, const ch
        struct ast_channel *target = NULL;
 
        while ((target = ast_channel_walk_locked(target))) {
-               if (!strcasecmp(target->exten, exten) &&
+               if ((!strcasecmp(target->macroexten, exten) || !strcasecmp(target->exten, exten)) &&
                    !strcasecmp(target->dialcontext, context) &&
                    can_pickup(target)) {
                        res = pickup_do(chan, target);
@@ -134,16 +131,13 @@ static int pickup_by_mark(struct ast_channel *chan, const char *mark)
 static int pickup_exec(struct ast_channel *chan, void *data)
 {
        int res = 0;
-       struct ast_module_user *u = NULL;
        char *tmp = ast_strdupa(data);
        char *exten = NULL, *context = NULL;
 
        if (ast_strlen_zero(data)) {
-               ast_log(LOG_WARNING, "Pickup requires an argument (extension)!\n");
-               return -1;      
+               res = ast_pickup_call(chan);
+               return res;
        }
-
-       u = ast_module_user_add(chan);
        
        /* Parse extension (and context if there) */
        while (!ast_strlen_zero(tmp) && (exten = strsep(&tmp, "&"))) {
@@ -159,8 +153,6 @@ static int pickup_exec(struct ast_channel *chan, void *data)
                ast_log(LOG_NOTICE, "No target channel found for %s.\n", exten);
        }
 
-       ast_module_user_remove(u);
-
        return res;
 }