From e89f4dab17b3712d72c54d6815b0c1aeb2e7b346 Mon Sep 17 00:00:00 2001 From: Mark Spencer <markster@digium.com> Date: Sat, 6 Nov 2004 04:46:06 +0000 Subject: [PATCH] Add dumpchan application (bug #2678) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4165 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/Makefile | 3 +- apps/app_dumpchan.c | 159 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100755 apps/app_dumpchan.c diff --git a/apps/Makefile b/apps/Makefile index 189cc9fa95..449379beee 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -29,7 +29,8 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_mp3.so\ app_nbscat.so app_sendtext.so app_exec.so app_sms.so \ app_groupcount.so app_txtcidname.so app_controlplayback.so \ app_talkdetect.so app_alarmreceiver.so app_userevent.so app_verbose.so \ - app_test.so app_forkcdr.so app_math.so app_realtime.so + app_test.so app_forkcdr.so app_math.so app_realtime.so \ + app_dumpchan.so ifneq (${OSARCH},Darwin) APPS+=app_intercom.so diff --git a/apps/app_dumpchan.c b/apps/app_dumpchan.c new file mode 100755 index 0000000000..814f4522d1 --- /dev/null +++ b/apps/app_dumpchan.c @@ -0,0 +1,159 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Application to dump channel variables + * + * Copyright (C) 2004, Anthony Minessale II. + * + * Anthony Minessale <anthmct@yahoo.com> + * + * This program is free software, distributed under the terms of + * the GNU General Public License (and disclaimed to Digium) + */ + +#include <asterisk/file.h> +#include <asterisk/logger.h> +#include <asterisk/channel.h> +#include <asterisk/pbx.h> +#include <asterisk/module.h> +#include <asterisk/options.h> +#include <asterisk/utils.h> +#include <asterisk/lock.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + +static char *tdesc = "Dump Info About The Calling Channel"; +static char *app = "DumpChan"; +static char *synopsis = "Dump Info About The Calling Channel"; +static char *desc = "Usage: exten => 1,1,DumpChan([<min_verbose_level>])\n\n" +"If optional min_verbose_level is specified, only dump data when that verbose level is set.\n\n"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +static int ast_serialize_showchan(struct ast_channel *c, char *buf, size_t size) +{ + struct timeval now; + long elapsed_seconds=0; + int hour=0, min=0, sec=0; + gettimeofday(&now, NULL); + memset(buf,0,size); + if (!c) + return 0; + + if (c->cdr) { + elapsed_seconds = now.tv_sec - c->cdr->start.tv_sec; + hour = elapsed_seconds / 3600; + min = (elapsed_seconds % 3600) / 60; + sec = elapsed_seconds % 60; + } + + snprintf(buf,size, + "Name=%s\n" + "Type=%s\n" + "UniqueID=%s\n" + "CallerID=%s\n" + "CallerIDName=%s\n" + "DNIDDigits=%s\n" + "State=%s(%d)\n" + "Rings=%d\n" + "NativeFormat=%d\n" + "WriteFormat=%d\n" + "ReadFormat=%d\n" + "1stFileDescriptor=%d\n" + "Framesin=%d%s\n" + "Framesout=%d%s\n" + "TimetoHangup=%ld\n" + "ElapsedTime=%dh%dm%ds\n" + "Context=%s\n" + "Extension=%s\n" + "Priority=%d\n" + "CallGroup=%d\n" + "PickupGroup=%d\n" + "Application=%s\n" + "Data=%s\n" + "Stack=%d\n" + "Blocking_in=%s\n", + c->name, + c->type, + c->uniqueid, + (c->cid.cid_num ? c->cid.cid_num : "(N/A)"), + (c->cid.cid_name ? c->cid.cid_name : "(N/A)"), + (c->cid.cid_dnid ? c->cid.cid_dnid : "(N/A)" ), + ast_state2str(c->_state), + c->_state, + c->rings, + c->nativeformats, + c->writeformat, + c->readformat, + c->fds[0], c->fin & 0x7fffffff, (c->fin & 0x80000000) ? " (DEBUGGED)" : "", + c->fout & 0x7fffffff, (c->fout & 0x80000000) ? " (DEBUGGED)" : "", (long)c->whentohangup, + hour, + min, + sec, + c->context, + c->exten, + c->priority, + c->callgroup, + c->pickupgroup, + ( c->appl ? c->appl : "(N/A)" ), + ( c-> data ? (!ast_strlen_zero(c->data) ? c->data : "(Empty)") : "(None)"), + c->stack, + (c->blocking ? c->blockproc : "(Not Blocking)")); + + return 1; +} + +static int dumpchan_exec(struct ast_channel *chan, void *data) +{ + int res=0; + struct localuser *u; + char vars[1024]; + char info[1024]; + int level = 0; + static char *line = "================================================================================"; + LOCAL_USER_ADD(u); + + if (data) { + level = atoi(data); + } + + pbx_builtin_serialize_variables(chan, vars, sizeof(vars)); + ast_serialize_showchan(chan, info, sizeof(info)); + if (option_verbose >= level) + ast_verbose("\nDumping Info For Channel: %s:\n%s\nInfo:\n%s\nVariables:\n%s%s\n",chan->name,line,info,vars,line); + + LOCAL_USER_REMOVE(u); + return res; +} + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app); +} + +int load_module(void) +{ + return ast_register_application(app, dumpchan_exec, synopsis, desc); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} + +char *key() +{ + return ASTERISK_GPL_KEY; +} + -- GitLab