The assertion that peer was not found on final event
[asterisk/asterisk.git] / apps / app_flash.c
old mode 100755 (executable)
new mode 100644 (file)
index 45d1e25..dbbad33
 /*
- * Asterisk -- A telephony toolkit for Linux.
+ * Asterisk -- An open source telephony toolkit.
  *
- * App to flash a zap trunk
- * 
- * 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.
+ */
+
+/*! \file
+ *
+ * \brief App to flash a DAHDI trunk
+ *
+ * \author Mark Spencer <markster@digium.com>
+ * 
+ * \ingroup applications
  */
  
-#include <asterisk/lock.h>
-#include <asterisk/file.h>
-#include <asterisk/logger.h>
-#include <asterisk/channel.h>
-#include <asterisk/pbx.h>
-#include <asterisk/module.h>
-#include <asterisk/translate.h>
-#include <asterisk/image.h>
-#include <asterisk/options.h>
-#include <sys/ioctl.h>
-#ifdef __linux__
-#include <linux/zaptel.h>
-#else
-#include <zaptel.h>
-#endif /* __linux__ */
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <pthread.h>
+/*** MODULEINFO
+       <depend>dahdi</depend>
+       <support_level>core</support_level>
+ ***/
 
-static char *tdesc = "Flash zap trunk application";
+#include "asterisk.h"
 
-static char *app = "Flash";
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
-static char *synopsis = "Flashes a Zap Trunk";
+#include <dahdi/user.h>
 
-static char *descrip = 
-"  Flash(): Sends a flash on a zap trunk.  This is only a hack for\n"
-"people who want to perform transfers and such via AGI and is generally\n"
-"quite useless otherwise.  Returns 0 on success or -1 if this is not\n"
-"a zap trunk\n";
+#include "asterisk/lock.h"
+#include "asterisk/file.h"
+#include "asterisk/channel.h"
+#include "asterisk/pbx.h"
+#include "asterisk/module.h"
+#include "asterisk/translate.h"
+#include "asterisk/image.h"
 
-STANDARD_LOCAL_USER;
+/*** DOCUMENTATION
+       <application name="Flash" language="en_US">
+               <synopsis>
+                       Flashes a DAHDI Trunk.
+               </synopsis>
+               <syntax />
+               <description>
+                       <para>Performs a flash on a DAHDI trunk. This can be used to access features
+                       provided on an incoming analogue circuit such as conference and call waiting.
+                       Use with SendDTMF() to perform external transfers.</para>
+               </description>
+               <see-also>
+                       <ref type="application">SendDTMF</ref>
+               </see-also>
+       </application>
+ ***/
 
-LOCAL_USER_DECL;
+static char *app = "Flash";
 
-static inline int zt_wait_event(int fd)
+static inline int dahdi_wait_event(int fd)
 {
-       /* Avoid the silly zt_waitevent which ignores a bunch of events */
+       /* Avoid the silly dahdi_waitevent which ignores a bunch of events */
        int i,j=0;
-       i = ZT_IOMUX_SIGEVENT;
-       if (ioctl(fd, ZT_IOMUX, &i) == -1) return -1;
-       if (ioctl(fd, ZT_GETEVENT, &j) == -1) return -1;
+       i = DAHDI_IOMUX_SIGEVENT;
+       if (ioctl(fd, DAHDI_IOMUX, &i) == -1) return -1;
+       if (ioctl(fd, DAHDI_GETEVENT, &j) == -1) return -1;
        return j;
 }
 
-static int flash_exec(struct ast_channel *chan, void *data)
+static int flash_exec(struct ast_channel *chan, const char *data)
 {
        int res = -1;
        int x;
-       struct localuser *u;
-       struct zt_params ztp;
-       LOCAL_USER_ADD(u);
-       if (!strcasecmp(chan->type, "Zap")) {
-               memset(&ztp, 0, sizeof(ztp));
-               res = ioctl(chan->fds[0], ZT_GET_PARAMS, &ztp);
-               if (!res) {
-                       if (ztp.sigtype & __ZT_SIG_FXS) {
-                               x = ZT_FLASH;
-                               res = ioctl(chan->fds[0], ZT_HOOK, &x);
-                               if (!res || (errno == EINPROGRESS)) {
-                                       if (res) {
-                                               /* Wait for the event to finish */
-                                               zt_wait_event(chan->fds[0]);
-                                       }
-                                       res = ast_safe_sleep(chan, 1000);
-                                       if (option_verbose > 2)
-                                               ast_verbose(VERBOSE_PREFIX_3 "Flashed channel %s\n", chan->name);
-                               } else
-                                       ast_log(LOG_WARNING, "Unable to flash channel %s: %s\n", chan->name, strerror(errno));
+       struct dahdi_params dahdip;
+
+       if (strcasecmp(ast_channel_tech(chan)->type, "DAHDI")) {
+               ast_log(LOG_WARNING, "%s is not a DAHDI channel\n", ast_channel_name(chan));
+               return -1;
+       }
+       
+       memset(&dahdip, 0, sizeof(dahdip));
+       res = ioctl(ast_channel_fd(chan, 0), DAHDI_GET_PARAMS, &dahdip);
+       if (!res) {
+               if (dahdip.sigtype & __DAHDI_SIG_FXS) {
+                       x = DAHDI_FLASH;
+                       res = ioctl(ast_channel_fd(chan, 0), DAHDI_HOOK, &x);
+                       if (!res || (errno == EINPROGRESS)) {
+                               if (res) {
+                                       /* Wait for the event to finish */
+                                       dahdi_wait_event(ast_channel_fd(chan, 0));
+                               }
+                               res = ast_safe_sleep(chan, 1000);
+                               ast_verb(3, "Flashed channel %s\n", ast_channel_name(chan));
                        } else
-                               ast_log(LOG_WARNING, "%s is not an FXO Channel\n", chan->name);
+                               ast_log(LOG_WARNING, "Unable to flash channel %s: %s\n", ast_channel_name(chan), strerror(errno));
                } else
-                       ast_log(LOG_WARNING, "Unable to get parameters of %s: %s\n", chan->name, strerror(errno));
+                       ast_log(LOG_WARNING, "%s is not an FXO Channel\n", ast_channel_name(chan));
        } else
-               ast_log(LOG_WARNING, "%s is not a Zap channel\n", chan->name);
-       LOCAL_USER_REMOVE(u);
+               ast_log(LOG_WARNING, "Unable to get parameters of %s: %s\n", ast_channel_name(chan), strerror(errno));
+
        return res;
 }
 
-int unload_module(void)
+static int unload_module(void)
 {
-       STANDARD_HANGUP_LOCALUSERS;
        return ast_unregister_application(app);
 }
 
-int load_module(void)
+static int load_module(void)
 {
-       return ast_register_application(app, flash_exec, synopsis, descrip);
+       return ast_register_application_xml(app, flash_exec);
 }
 
-char *description(void)
-{
-       return tdesc;
-}
+AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Flash channel application");
 
-int usecount(void)
-{
-       int res;
-       STANDARD_USECOUNT(res);
-       return res;
-}
-
-char *key()
-{
-       return ASTERISK_GPL_KEY;
-}