Merged revisions 73316 via svnmerge from
[asterisk/asterisk.git] / apps / app_softhangup.c
old mode 100755 (executable)
new mode 100644 (file)
index 7340895..018edc0
@@ -1,68 +1,85 @@
 /*
- * Asterisk -- A telephony toolkit for Linux.
+ * Asterisk -- An open source telephony toolkit.
  *
- * SoftHangup application
- * 
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999 - 2005, Digium, Inc.
+ *
+ * Mark Spencer <markster@digium.com>
  *
- * Mark Spencer <markster@linux-support.net>
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
  *
  * This program is free software, distributed under the terms of
- * the GNU General Public License
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
  */
 
-#include <sys/types.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>
+/*! \file
+ *
+ * \brief SoftHangup application
+ *
+ * \author Mark Spencer <markster@digium.com>
+ * 
+ * \ingroup applications
+ */
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
 #include <stdlib.h>
-#include <unistd.h>
+#include <stdio.h>
 #include <string.h>
-#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
 
-static char *synopsis = "Soft Hangup Application";
+#include "asterisk/file.h"
+#include "asterisk/logger.h"
+#include "asterisk/channel.h"
+#include "asterisk/pbx.h"
+#include "asterisk/module.h"
+#include "asterisk/lock.h"
 
-static char *tdesc = "Hangs up the requested channel";
+static char *synopsis = "Soft Hangup Application";
 
 static char *desc = "  SoftHangup(Technology/resource|options)\n"
-"Hangs up the requested channel.  Always returns 0\n"
+"Hangs up the requested channel.  If there are no channels to hangup,\n"
+"the application will report it.\n"
 "- 'options' may contain the following letter:\n"
 "     'a' : hang up all channels on a specified device instead of a single resource\n";
 
 static char *app = "SoftHangup";
 
-STANDARD_LOCAL_USER;
-
-LOCAL_USER_DECL;
 
 static int softhangup_exec(struct ast_channel *chan, void *data)
 {
-       struct localuser *u;
+       struct ast_module_user *u;
        struct ast_channel *c=NULL;
        char *options, *cut, *cdata, *match;
        char name[AST_CHANNEL_NAME] = "";
        int all = 0;
-
-       if (!data) {
+       
+       if (ast_strlen_zero(data)) {
                 ast_log(LOG_WARNING, "SoftHangup requires an argument (Technology/resource)\n");
                return 0;
        }
        
+       u = ast_module_user_add(chan);
+
        cdata = ast_strdupa(data);
        match = strsep(&cdata, "|");
        options = strsep(&cdata, "|");
        all = options && strchr(options,'a');
-       LOCAL_USER_ADD(u);
        c = ast_channel_walk_locked(NULL);
        while (c) {
-               strncpy(name, c->name, sizeof(name)-1);
+               ast_copy_string(name, c->name, sizeof(name));
                ast_mutex_unlock(&c->lock);
+               /* XXX watch out, i think it is wrong to access c-> after unlocking! */
                if (all) {
                        /* CAPI is set up like CAPI[foo/bar]/clcnt */ 
-                       if (!strcmp(c->type,"CAPI")) 
+                       if (!strcmp(c->tech->type, "CAPI")) 
                                cut = strrchr(name,'/');
                        /* Basically everything else is Foo/Bar-Z */
                        else
@@ -79,35 +96,26 @@ static int softhangup_exec(struct ast_channel *chan, void *data)
                }
                c = ast_channel_walk_locked(c);
        }
-       LOCAL_USER_REMOVE(u);
+       
+       ast_module_user_remove(u);
 
        return 0;
 }
 
-int unload_module(void)
+static int unload_module(void)
 {
-       STANDARD_HANGUP_LOCALUSERS;
-       return ast_unregister_application(app);
-}
+       int res;
 
-int load_module(void)
-{
-       return ast_register_application(app, softhangup_exec, synopsis, desc);
-}
+       res = ast_unregister_application(app);
 
-char *description(void)
-{
-       return tdesc;
-}
+       ast_module_user_hangup_all();
 
-int usecount(void)
-{
-       int res;
-       STANDARD_USECOUNT(res);
-       return res;
+       return res;     
 }
 
-char *key()
+static int load_module(void)
 {
-       return ASTERISK_GPL_KEY;
+       return ast_register_application(app, softhangup_exec, synopsis, desc);
 }
+
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Hangs up the requested channel");