aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorqwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-10-19 18:01:00 +0000
committerqwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b>2007-10-19 18:01:00 +0000
commit4723d35127a1da861d28ce2ae2ee0e8bbd7c3e7b (patch)
treef7b900279b3959d2cc8feddc22a7d8643eb60f95 /channels
parent4c11437602461608f71405d14e49493187123ed9 (diff)
More changes to NEW_CLI.
Also fixes a few cli messages and some minor formatting. (closes issue #11001) Reported by: seanbright Patches: newcli.1.patch uploaded by seanbright (license 71) newcli.2.patch uploaded by seanbright (license 71) newcli.4.patch uploaded by seanbright (license 71) newcli.5.patch uploaded by seanbright (license 71) newcli.6.patch uploaded by seanbright (license 71) newcli.7.patch uploaded by seanbright (license 71) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@86534 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_h323.c265
-rw-r--r--channels/chan_iax2.c889
-rw-r--r--channels/chan_misdn.c800
-rw-r--r--channels/chan_usbradio.c312
4 files changed, 1326 insertions, 940 deletions
diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index c9b86f0a9..7e50afc12 100644
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -2623,51 +2623,71 @@ static int restart_monitor(void)
return 0;
}
-static int h323_do_trace(int fd, int argc, char *argv[])
-{
- if (argc != 4) {
- return RESULT_SHOWUSAGE;
+static char *handle_cli_h323_set_trace(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "h323 set trace [off]";
+ e->usage =
+ "Usage: h323 set trace (off|<trace level>)\n"
+ " Enable/Disable H.323 stack tracing for debugging purposes\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
}
- h323_debug(1, atoi(argv[3]));
- ast_cli(fd, "H.323 trace set to level %s\n", argv[2]);
- return RESULT_SUCCESS;
-}
-static int h323_no_trace(int fd, int argc, char *argv[])
-{
- if (argc < 3 || argc > 4) {
- return RESULT_SHOWUSAGE;
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+ if (!strcasecmp(a->argv[3], "off")) {
+ h323_debug(0, 0);
+ ast_cli(a->fd, "H.323 Trace Disabled\n");
+ } else {
+ int tracelevel = atoi(a->argv[3]);
+ h323_debug(1, tracelevel);
+ ast_cli(a->fd, "H.323 Trace Enabled (Trace Level: %d)\n", tracelevel);
}
- h323_debug(0,0);
- ast_cli(fd, "H.323 trace disabled\n");
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
-static int h323_do_debug(int fd, int argc, char *argv[])
+static char *handle_cli_h323_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 2 || argc > 3) {
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "h323 set debug [off]";
+ e->usage =
+ "Usage: h323 set debug [off]\n"
+ " Enable/Disable H.323 debugging output\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
}
- h323debug = 1;
- ast_cli(fd, "H.323 debug enabled\n");
- return RESULT_SUCCESS;
-}
-static int h323_no_debug(int fd, int argc, char *argv[])
-{
- if (argc < 3 || argc > 4) {
- return RESULT_SHOWUSAGE;
- }
- h323debug = 0;
- ast_cli(fd, "H.323 debug disabled\n");
- return RESULT_SUCCESS;
+ if (a->argc < 3 || a->argc > 4)
+ return CLI_SHOWUSAGE;
+ if (a->argc == 4 && strcasecmp(a->argv[3], "off"))
+ return CLI_SHOWUSAGE;
+
+ h323debug = (a->argc == 3) ? 1 : 0;
+ ast_cli(a->fd, "H.323 Debugging %s\n", h323debug ? "Enabled" : "Disabled");
+ return CLI_SUCCESS;
}
-static int h323_gk_cycle(int fd, int argc, char *argv[])
+static char *handle_cli_h323_cycle_gk(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc != 3) {
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "h323 cycle gk";
+ e->usage =
+ "Usage: h323 cycle gk\n"
+ " Manually re-register with the Gatekeper (Currently Disabled)\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
}
+
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+
h323_gk_urq();
/* Possibly register with a GK */
@@ -2676,126 +2696,59 @@ static int h323_gk_cycle(int fd, int argc, char *argv[])
ast_log(LOG_ERROR, "Gatekeeper registration failed.\n");
}
}
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
-static int h323_ep_hangup(int fd, int argc, char *argv[])
+static char *handle_cli_h323_hangup(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc != 3) {
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "h323 hangup";
+ e->usage =
+ "Usage: h323 hangup <token>\n"
+ " Manually try to hang up the call identified by <token>\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
}
- if (h323_soft_hangup(argv[2])) {
- ast_verb(3, "Hangup succeeded on %s\n", argv[2]);
+
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+ if (h323_soft_hangup(a->argv[2])) {
+ ast_verb(3, "Hangup succeeded on %s\n", a->argv[2]);
} else {
- ast_verb(3, "Hangup failed for %s\n", argv[2]);
+ ast_verb(3, "Hangup failed for %s\n", a->argv[2]);
}
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
-static int h323_tokens_show(int fd, int argc, char *argv[])
+static char *handle_cli_h323_show_tokens(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc != 3) {
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "h323 show tokens";
+ e->usage =
+ "Usage: h323 show tokens\n"
+ " Print out all active call tokens\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
}
- h323_show_tokens();
- return RESULT_SUCCESS;
-}
-
-static char trace_usage[] =
-"Usage: h323 trace <level num>\n"
-" Enables H.323 stack tracing for debugging purposes\n";
-
-static char no_trace_usage[] =
-"Usage: h323 no trace\n"
-" Disables H.323 stack tracing for debugging purposes\n";
-
-static char debug_usage[] =
-"Usage: h323 debug\n"
-" Enables H.323 debug output\n";
-
-static char no_debug_usage[] =
-"Usage: h323 no debug\n"
-" Disables H.323 debug output\n";
-static char show_cycle_usage[] =
-"Usage: h323 gk cycle\n"
-" Manually re-register with the Gatekeper (Currently Disabled)\n";
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
-static char show_hangup_usage[] =
-"Usage: h323 hangup <token>\n"
-" Manually try to hang up call identified by <token>\n";
-
-static char show_tokens_usage[] =
-"Usage: h323 show tokens\n"
-" Print out all active call tokens\n";
-
-static char h323_reload_usage[] =
-"Usage: h323 reload\n"
-" Reloads H.323 configuration from h323.conf\n";
-
-static struct ast_cli_entry cli_h323_trace_deprecated =
- { { "h.323", "trace", NULL },
- h323_do_trace, "Enable H.323 Stack Tracing",
- trace_usage };
-
-static struct ast_cli_entry cli_h323_no_trace_deprecated =
- { { "h.323", "no", "trace", NULL },
- h323_no_trace, "Disable H.323 Stack Tracing",
- no_trace_usage };
-
-static struct ast_cli_entry cli_h323_debug_deprecated =
- { { "h.323", "debug", NULL },
- h323_do_debug, "Enable H.323 debug",
- debug_usage };
-
-static struct ast_cli_entry cli_h323_no_debug_deprecated =
- { { "h.323", "no", "debug", NULL },
- h323_no_debug, "Disable H.323 debug",
- no_debug_usage };
-
-static struct ast_cli_entry cli_h323_gk_cycle_deprecated =
- { { "h.323", "gk", "cycle", NULL },
- h323_gk_cycle, "Manually re-register with the Gatekeper",
- show_cycle_usage };
-
-static struct ast_cli_entry cli_h323_hangup_deprecated =
- { { "h.323", "hangup", NULL },
- h323_ep_hangup, "Manually try to hang up a call",
- show_hangup_usage };
+ h323_show_tokens();
-static struct ast_cli_entry cli_h323_show_tokens_deprecated =
- { { "h.323", "show", "tokens", NULL },
- h323_tokens_show, "Show all active call tokens",
- show_tokens_usage };
+ return CLI_SUCCESS;
+}
static struct ast_cli_entry cli_h323[] = {
- { { "h323", "set", "trace", NULL },
- h323_do_trace, "Enable H.323 Stack Tracing",
- trace_usage, NULL, &cli_h323_trace_deprecated },
-
- { { "h323", "set", "trace", "off", NULL },
- h323_no_trace, "Disable H.323 Stack Tracing",
- no_trace_usage, NULL, &cli_h323_no_trace_deprecated },
-
- { { "h323", "set", "debug", NULL },
- h323_do_debug, "Enable H.323 debug",
- debug_usage, NULL, &cli_h323_debug_deprecated },
-
- { { "h323", "set", "debug", "off", NULL },
- h323_no_debug, "Disable H.323 debug",
- no_debug_usage, NULL, &cli_h323_no_debug_deprecated },
-
- { { "h323", "cycle", "gk", NULL },
- h323_gk_cycle, "Manually re-register with the Gatekeper",
- show_cycle_usage, NULL, &cli_h323_gk_cycle_deprecated },
-
- { { "h323", "hangup", NULL },
- h323_ep_hangup, "Manually try to hang up a call",
- show_hangup_usage, NULL, &cli_h323_hangup_deprecated },
-
- { { "h323", "show", "tokens", NULL },
- h323_tokens_show, "Show all active call tokens",
- show_tokens_usage, NULL, &cli_h323_show_tokens_deprecated },
+ NEW_CLI(handle_cli_h323_set_trace, "Enable/Disable H.323 Stack Tracing"),
+ NEW_CLI(handle_cli_h323_set_debug, "Enable/Disable H.323 Debugging"),
+ NEW_CLI(handle_cli_h323_cycle_gk, "Manually re-register with the Gatekeper"),
+ NEW_CLI(handle_cli_h323_hangup, "Manually try to hang up a call"),
+ NEW_CLI(handle_cli_h323_show_tokens, "Show all active call tokens"),
};
static int reload_config(int is_reload)
@@ -3075,7 +3028,7 @@ static void prune_peers(void)
ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer);
}
-static int h323_reload(int fd, int argc, char *argv[])
+static int h323_reload(void)
{
ast_mutex_lock(&h323_reload_lock);
if (h323_reloading) {
@@ -3088,6 +3041,27 @@ static int h323_reload(int fd, int argc, char *argv[])
return 0;
}
+static char *handle_cli_h323_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "h323 reload";
+ e->usage =
+ "Usage: h323 reload\n"
+ " Reloads H.323 configuration from h323.conf\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 2)
+ return CLI_SHOWUSAGE;
+
+ h323_reload();
+
+ return CLI_SUCCESS;
+}
+
static int h323_do_reload(void)
{
reload_config(1);
@@ -3100,20 +3074,11 @@ static int reload(void)
ast_log(LOG_NOTICE, "Unload and load chan_h323.so again in order to receive configuration changes.\n");
return 0;
}
- return h323_reload(0, 0, NULL);
+ return h323_reload();
}
-static struct ast_cli_entry cli_h323_reload_deprecated =
- { { "h.323", "reload", NULL },
- h323_reload, "Reload H.323 configuration",
- h323_reload_usage
-};
-
static struct ast_cli_entry cli_h323_reload =
- { { "h323", "reload", NULL },
- h323_reload, "Reload H.323 configuration",
- h323_reload_usage, NULL, &cli_h323_reload_deprecated
-};
+ NEW_CLI(handle_cli_h323_reload, "Reload H.323 configuration");
static enum ast_rtp_get_result oh323_get_rtp_peer(struct ast_channel *chan, struct ast_rtp **rtp)
{
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 7c62f7af7..30af97a9d 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -292,8 +292,6 @@ enum iax2_flags {
static int global_rtautoclear = 120;
static int reload_config(void);
-static int iax2_reload(int fd, int argc, char *argv[]);
-
struct iax2_user {
AST_DECLARE_STRING_FIELDS(
@@ -711,6 +709,8 @@ static void reg_source_db(struct iax2_peer *p);
static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt);
+static char *complete_iax2_show_peer(const char *line, const char *word, int pos, int state);
+static char *complete_iax2_unregister(const char *line, const char *word, int pos, int state);
enum iax2_thread_iostate {
IAX_IOSTATE_IDLE,
@@ -2265,72 +2265,128 @@ static int attempt_transmit(const void *data)
return 0;
}
-static int iax2_prune_realtime(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct iax2_peer *peer;
- if (argc != 4)
- return RESULT_SHOWUSAGE;
- if (!strcmp(argv[3],"all")) {
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 prune realtime";
+ e->usage =
+ "Usage: iax2 prune realtime [<peername>|all]\n"
+ " Prunes object(s) from the cache\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_iax2_show_peer(a->line, a->word, a->pos, a->n);
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+ if (!strcmp(a->argv[3], "all")) {
reload_config();
- ast_cli(fd, "OK cache is flushed.\n");
- } else if ((peer = find_peer(argv[3], 0))) {
+ ast_cli(a->fd, "Cache flushed successfully.\n");
+ } else if ((peer = find_peer(a->argv[3], 0))) {
if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
ast_set_flag(peer, IAX_RTAUTOCLEAR);
- expire_registry((const void *)peer->name);
- ast_cli(fd, "OK peer %s was removed from the cache.\n", argv[3]);
+ expire_registry((const void *) peer->name);
+ ast_cli(a->fd, "Peer %s was removed from the cache.\n", a->argv[3]);
} else {
- ast_cli(fd, "SORRY peer %s is not eligible for this operation.\n", argv[3]);
+ ast_cli(a->fd, "Peer %s is not eligible for this operation.\n", a->argv[3]);
}
peer_unref(peer);
} else {
- ast_cli(fd, "SORRY peer %s was not found in the cache.\n", argv[3]);
+ ast_cli(a->fd, "Peer %s was not found in the cache.\n", a->argv[3]);
}
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
-static int iax2_test_losspct(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_test_losspct(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc != 4)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 test losspct";
+ e->usage =
+ "Usage: iax2 test losspct <percentage>\n"
+ " For testing, throws away <percentage> percent of incoming packets\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
- test_losspct = atoi(argv[3]);
+ test_losspct = atoi(a->argv[3]);
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
#ifdef IAXTESTS
-static int iax2_test_late(int fd, int argc, char *argv[])
-{
- if (argc != 4)
- return RESULT_SHOWUSAGE;
+static char *handle_cli_iax2_test_late(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 test late";
+ e->usage =
+ "Usage: iax2 test late <ms>\n"
+ " For testing, count the next frame as <ms> ms late\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- test_late = atoi(argv[3]);
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
- return RESULT_SUCCESS;
+ test_late = atoi(a->argv[3]);
+
+ return CLI_SUCCESS;
}
-static int iax2_test_resync(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_test_resync(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc != 4)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 test resync";
+ e->usage =
+ "Usage: iax2 test resync <ms>\n"
+ " For testing, adjust all future frames by <ms> ms\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- test_resync = atoi(argv[3]);
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
- return RESULT_SUCCESS;
+ test_resync = atoi(a->argv[3]);
+
+ return CLI_SUCCESS;
}
-static int iax2_test_jitter(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_test_jitter(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 4 || argc > 5)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 test jitter";
+ e->usage =
+ "Usage: iax2 test jitter <ms> <pct>\n"
+ " For testing, simulate maximum jitter of +/- <ms> on <pct>\n"
+ " percentage of packets. If <pct> is not specified, adds\n"
+ " jitter to all packets.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- test_jit = atoi(argv[3]);
- if (argc == 5)
- test_jitpct = atoi(argv[4]);
+ if (a->argc < 4 || a->argc > 5)
+ return CLI_SHOWUSAGE;
- return RESULT_SUCCESS;
+ test_jit = atoi(a->argv[3]);
+ if (a->argc == 5)
+ test_jitpct = atoi(a->argv[4]);
+
+ return CLI_SUCCESS;
}
#endif /* IAXTESTS */
@@ -2359,7 +2415,7 @@ static int peer_status(struct iax2_peer *peer, char *status, int statuslen)
}
/*! \brief Show one peer in detail */
-static int iax2_show_peer(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_peer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
char status[30];
char cbuf[256];
@@ -2367,55 +2423,66 @@ static int iax2_show_peer(int fd, int argc, char *argv[])
char codec_buf[512];
int x = 0, codec = 0, load_realtime = 0;
- if (argc < 4)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show peer";
+ e->usage =
+ "Usage: iax2 show peer <name>\n"
+ " Display details on specific IAX peer\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_iax2_show_peer(a->line, a->word, a->pos, a->n);
+ }
+
+ if (a->argc < 4)
+ return CLI_SHOWUSAGE;
- load_realtime = (argc == 5 && !strcmp(argv[4], "load")) ? 1 : 0;
+ load_realtime = (a->argc == 5 && !strcmp(a->argv[4], "load")) ? 1 : 0;
- peer = find_peer(argv[3], load_realtime);
+ peer = find_peer(a->argv[3], load_realtime);
if (peer) {
- ast_cli(fd,"\n\n");
- ast_cli(fd, " * Name : %s\n", peer->name);
- ast_cli(fd, " Secret : %s\n", ast_strlen_zero(peer->secret)?"<Not set>":"<Set>");
- ast_cli(fd, " Context : %s\n", peer->context);
- ast_cli(fd, " Mailbox : %s\n", peer->mailbox);
- ast_cli(fd, " Dynamic : %s\n", ast_test_flag(peer, IAX_DYNAMIC) ? "Yes":"No");
- ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
- ast_cli(fd, " Expire : %d\n", peer->expire);
- ast_cli(fd, " ACL : %s\n", (peer->ha?"Yes":"No"));
- ast_cli(fd, " Addr->IP : %s Port %d\n", peer->addr.sin_addr.s_addr ? ast_inet_ntoa(peer->addr.sin_addr) : "(Unspecified)", ntohs(peer->addr.sin_port));
- ast_cli(fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port));
- ast_cli(fd, " Username : %s\n", peer->username);
- ast_cli(fd, " Codecs : ");
+ ast_cli(a->fd, "\n\n");
+ ast_cli(a->fd, " * Name : %s\n", peer->name);
+ ast_cli(a->fd, " Secret : %s\n", ast_strlen_zero(peer->secret) ? "<Not set>" : "<Set>");
+ ast_cli(a->fd, " Context : %s\n", peer->context);
+ ast_cli(a->fd, " Mailbox : %s\n", peer->mailbox);
+ ast_cli(a->fd, " Dynamic : %s\n", ast_test_flag(peer, IAX_DYNAMIC) ? "Yes" : "No");
+ ast_cli(a->fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
+ ast_cli(a->fd, " Expire : %d\n", peer->expire);
+ ast_cli(a->fd, " ACL : %s\n", (peer->ha ? "Yes" : "No"));
+ ast_cli(a->fd, " Addr->IP : %s Port %d\n", peer->addr.sin_addr.s_addr ? ast_inet_ntoa(peer->addr.sin_addr) : "(Unspecified)", ntohs(peer->addr.sin_port));
+ ast_cli(a->fd, " Defaddr->IP : %s Port %d\n", ast_inet_ntoa(peer->defaddr.sin_addr), ntohs(peer->defaddr.sin_port));
+ ast_cli(a->fd, " Username : %s\n", peer->username);
+ ast_cli(a->fd, " Codecs : ");
ast_getformatname_multiple(codec_buf, sizeof(codec_buf) -1, peer->capability);
- ast_cli(fd, "%s\n", codec_buf);
+ ast_cli(a->fd, "%s\n", codec_buf);
- ast_cli(fd, " Codec Order : (");
+ ast_cli(a->fd, " Codec Order : (");
for(x = 0; x < 32 ; x++) {
codec = ast_codec_pref_index(&peer->prefs,x);
if(!codec)
break;
- ast_cli(fd, "%s", ast_getformatname(codec));
+ ast_cli(a->fd, "%s", ast_getformatname(codec));
if(x < 31 && ast_codec_pref_index(&peer->prefs,x+1))
- ast_cli(fd, "|");
+ ast_cli(a->fd, "|");
}
if (!x)
- ast_cli(fd, "none");
- ast_cli(fd, ")\n");
+ ast_cli(a->fd, "none");
+ ast_cli(a->fd, ")\n");
- ast_cli(fd, " Status : ");
+ ast_cli(a->fd, " Status : ");
peer_status(peer, status, sizeof(status));
- ast_cli(fd, "%s\n",status);
- ast_cli(fd, " Qualify : every %dms when OK, every %dms when UNREACHABLE (sample smoothing %s)\n", peer->pokefreqok, peer->pokefreqnotok, peer->smoothing ? "On" : "Off");
- ast_cli(fd,"\n");
+ ast_cli(a->fd, "%s\n",status);
+ ast_cli(a->fd, " Qualify : every %dms when OK, every %dms when UNREACHABLE (sample smoothing %s)\n", peer->pokefreqok, peer->pokefreqnotok, peer->smoothing ? "On" : "Off");
+ ast_cli(a->fd, "\n");
peer_unref(peer);
} else {
- ast_cli(fd,"Peer %s not found.\n", argv[3]);
- ast_cli(fd,"\n");
+ ast_cli(a->fd, "Peer %s not found.\n", a->argv[3]);
+ ast_cli(a->fd, "\n");
}
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
static char *complete_iax2_show_peer(const char *line, const char *word, int pos, int state)
@@ -2443,13 +2510,24 @@ static char *complete_iax2_show_peer(const char *line, const char *word, int pos
return res;
}
-static int iax2_show_stats(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct iax_frame *cur;
- int cnt = 0, dead=0, final=0;
+ int cnt = 0, dead = 0, final = 0;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show stats";
+ e->usage =
+ "Usage: iax2 show stats\n"
+ " Display statistics on IAX channel driver.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- if (argc != 3)
- return RESULT_SHOWUSAGE;
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
AST_LIST_LOCK(&frame_queue);
AST_LIST_TRAVERSE(&frame_queue, cur, list) {
@@ -2461,57 +2539,83 @@ static int iax2_show_stats(int fd, int argc, char *argv[])
}
AST_LIST_UNLOCK(&frame_queue);
- ast_cli(fd, " IAX Statistics\n");
- ast_cli(fd, "---------------------\n");
- ast_cli(fd, "Outstanding frames: %d (%d ingress, %d egress)\n", iax_get_frames(), iax_get_iframes(), iax_get_oframes());
- ast_cli(fd, "%d timed and %d untimed transmits; MTU %d/%d/%d\n", trunk_timed, trunk_untimed,
+ ast_cli(a->fd, " IAX Statistics\n");
+ ast_cli(a->fd, "---------------------\n");
+ ast_cli(a->fd, "Outstanding frames: %d (%d ingress, %d egress)\n", iax_get_frames(), iax_get_iframes(), iax_get_oframes());
+ ast_cli(a->fd, "%d timed and %d untimed transmits; MTU %d/%d/%d\n", trunk_timed, trunk_untimed,
trunk_maxmtu, trunk_nmaxmtu, global_max_trunk_mtu);
-
- ast_cli(fd, "Packets in transmit queue: %d dead, %d final, %d total\n\n", dead, final, cnt);
+ ast_cli(a->fd, "Packets in transmit queue: %d dead, %d final, %d total\n\n", dead, final, cnt);
trunk_timed = trunk_untimed = 0;
if (trunk_maxmtu > trunk_nmaxmtu)
trunk_nmaxmtu = trunk_maxmtu;
-
- return RESULT_SUCCESS;
+
+ return CLI_SUCCESS;
}
/*! \brief Set trunk MTU from CLI */
-static int iax2_set_mtu(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_set_mtu(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
int mtuv;
- if (argc != 4)
- return RESULT_SHOWUSAGE;
- if (strncasecmp(argv[3], "default", strlen(argv[3])) == 0)
- mtuv = MAX_TRUNK_MTU;
- else
- mtuv = atoi(argv[3]);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 set mtu";
+ e->usage =
+ "Usage: iax2 set mtu <value>\n"
+ " Set the system-wide IAX IP mtu to <value> bytes net or\n"
+ " zero to disable. Disabling means that the operating system\n"
+ " must handle fragmentation of UDP packets when the IAX2 trunk\n"
+ " packet exceeds the UDP payload size. This is substantially\n"
+ " below the IP mtu. Try 1240 on ethernets. Must be 172 or\n"
+ " greater for G.711 samples.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+ if (strncasecmp(a->argv[3], "default", strlen(a->argv[3])) == 0)
+ mtuv = MAX_TRUNK_MTU;
+ else
+ mtuv = atoi(a->argv[3]);
if (mtuv == 0) {
- ast_cli(fd, "Trunk MTU control disabled (mtu was %d)\n", global_max_trunk_mtu);
+ ast_cli(a->fd, "Trunk MTU control disabled (mtu was %d)\n", global_max_trunk_mtu);
global_max_trunk_mtu = 0;
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
if (mtuv < 172 || mtuv > 4000) {
- ast_cli(fd, "Trunk MTU must be between 172 and 4000\n");
- return RESULT_SHOWUSAGE;
+ ast_cli(a->fd, "Trunk MTU must be between 172 and 4000\n");
+ return CLI_SHOWUSAGE;
}
- ast_cli(fd, "Trunk MTU changed from %d to %d\n", global_max_trunk_mtu, mtuv);
+ ast_cli(a->fd, "Trunk MTU changed from %d to %d\n", global_max_trunk_mtu, mtuv);
global_max_trunk_mtu = mtuv;
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
-static int iax2_show_cache(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_cache(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct iax2_dpcache *dp = NULL;
char tmp[1024], *pc = NULL;
int s, x, y;
struct timeval tv = ast_tvnow();
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show cache";
+ e->usage =
+ "Usage: iax2 show cache\n"
+ " Display currently cached IAX Dialplan results.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
AST_LIST_LOCK(&dpcache);
- ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
+ ast_cli(a->fd, "%-20.20s %-12.12s %-9.9s %-8.8s %s\n", "Peer/Context", "Exten", "Exp.", "Wait.", "Flags");
AST_LIST_TRAVERSE(&dpcache, dp, cache_list) {
s = dp->expiry.tv_sec - tv.tv_sec;
@@ -2537,24 +2641,24 @@ static int iax2_show_cache(int fd, int argc, char *argv[])
tmp[strlen(tmp) - 1] = '\0';
else
ast_copy_string(tmp, "(none)", sizeof(tmp));
- y=0;
+ y = 0;
pc = strchr(dp->peercontext, '@');
if (!pc)
pc = dp->peercontext;
else
pc++;
- for (x=0;x<sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
+ for (x = 0; x < sizeof(dp->waiters) / sizeof(dp->waiters[0]); x++)
if (dp->waiters[x] > -1)
y++;
if (s > 0)
- ast_cli(fd, "%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->exten, s, y, tmp);
+ ast_cli(a->fd, "%-20.20s %-12.12s %-9d %-8d %s\n", pc, dp->exten, s, y, tmp);
else
- ast_cli(fd, "%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->exten, "(expired)", y, tmp);
+ ast_cli(a->fd, "%-20.20s %-12.12s %-9.9s %-8d %s\n", pc, dp->exten, "(expired)", y, tmp);
}
AST_LIST_LOCK(&dpcache);
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
static unsigned int calc_rxstamp(struct chan_iax2_pvt *p, unsigned int offset);
@@ -4424,7 +4528,7 @@ static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned in
return res;
}
-static int iax2_show_users(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
regex_t regexbuf;
int havepattern = 0;
@@ -4437,21 +4541,33 @@ static int iax2_show_users(int fd, int argc, char *argv[])
char *pstr = "";
struct ao2_iterator i;
- switch (argc) {
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show users [like]";
+ e->usage =
+ "Usage: iax2 show users [like <pattern>]\n"
+ " Lists all known IAX2 users.\n"
+ " Optional regular expression pattern is used to filter the user list.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ switch (a->argc) {
case 5:
- if (!strcasecmp(argv[3], "like")) {
- if (regcomp(&regexbuf, argv[4], REG_EXTENDED | REG_NOSUB))
- return RESULT_SHOWUSAGE;
+ if (!strcasecmp(a->argv[3], "like")) {
+ if (regcomp(&regexbuf, a->argv[4], REG_EXTENDED | REG_NOSUB))
+ return CLI_SHOWUSAGE;
havepattern = 1;
} else
- return RESULT_SHOWUSAGE;
+ return CLI_SHOWUSAGE;
case 3:
break;
default:
- return RESULT_SHOWUSAGE;
+ return CLI_SHOWUSAGE;
}
- ast_cli(fd, FORMAT, "Username", "Secret", "Authen", "Def.Context", "A/C","Codec Pref");
+ ast_cli(a->fd, FORMAT, "Username", "Secret", "Authen", "Def.Context", "A/C","Codec Pref");
i = ao2_iterator_init(users, 0);
for (user = ao2_iterator_next(&i); user;
user_unref(user), user = ao2_iterator_next(&i)) {
@@ -4459,7 +4575,7 @@ static int iax2_show_users(int fd, int argc, char *argv[])
continue;
if (!ast_strlen_zero(user->secret)) {
- ast_copy_string(auth,user->secret,sizeof(auth));
+ ast_copy_string(auth,user->secret, sizeof(auth));
} else if (!ast_strlen_zero(user->inkeys)) {
snprintf(auth, sizeof(auth), "Key: %-15.15s ", user->inkeys);
} else
@@ -4472,7 +4588,7 @@ static int iax2_show_users(int fd, int argc, char *argv[])
else
pstr = ast_test_flag(user,IAX_CODEC_USER_FIRST) ? "Caller" : "Host";
- ast_cli(fd, FORMAT2, user->name, auth, user->authmethods,
+ ast_cli(a->fd, FORMAT2, user->name, auth, user->authmethods,
user->contexts ? user->contexts->context : context,
user->ha ? "Yes" : "No", pstr);
}
@@ -4480,7 +4596,7 @@ static int iax2_show_users(int fd, int argc, char *argv[])
if (havepattern)
regfree(&regexbuf);
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
#undef FORMAT
#undef FORMAT2
}
@@ -4612,32 +4728,42 @@ static int __iax2_show_peers(int manager, int fd, struct mansession *s, int argc
#undef FORMAT2
}
-static int iax2_show_threads(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_threads(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct iax2_thread *thread = NULL;
time_t t;
int threadcount = 0, dynamiccount = 0;
char type;
- if (argc != 3)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show threads";
+ e->usage =
+ "Usage: iax2 show threads\n"
+ " Lists status of IAX helper threads\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
- ast_cli(fd, "IAX2 Thread Information\n");
+ ast_cli(a->fd, "IAX2 Thread Information\n");
time(&t);
- ast_cli(fd, "Idle Threads:\n");
+ ast_cli(a->fd, "Idle Threads:\n");
AST_LIST_LOCK(&idle_list);
AST_LIST_TRAVERSE(&idle_list, thread, list) {
#ifdef DEBUG_SCHED_MULTITHREAD
- ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, func ='%s'\n",
+ ast_cli(a->fd, "Thread %d: state=%d, update=%d, actions=%d, func='%s'\n",
thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions, thread->curfunc);
#else
- ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d\n",
+ ast_cli(a->fd, "Thread %d: state=%d, update=%d, actions=%d\n",
thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions);
#endif
threadcount++;
}
AST_LIST_UNLOCK(&idle_list);
- ast_cli(fd, "Active Threads:\n");
+ ast_cli(a->fd, "Active Threads:\n");
AST_LIST_LOCK(&active_list);
AST_LIST_TRAVERSE(&active_list, thread, list) {
if (thread->type == IAX_THREAD_TYPE_DYNAMIC)
@@ -4645,50 +4771,62 @@ static int iax2_show_threads(int fd, int argc, char *argv[])
else
type = 'P';
#ifdef DEBUG_SCHED_MULTITHREAD
- ast_cli(fd, "Thread %c%d: state=%d, update=%d, actions=%d, func ='%s'\n",
+ ast_cli(a->fd, "Thread %c%d: state=%d, update=%d, actions=%d, func='%s'\n",
type, thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions, thread->curfunc);
#else
- ast_cli(fd, "Thread %c%d: state=%d, update=%d, actions=%d\n",
+ ast_cli(a->fd, "Thread %c%d: state=%d, update=%d, actions=%d\n",
type, thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions);
#endif
threadcount++;
}
AST_LIST_UNLOCK(&active_list);
- ast_cli(fd, "Dynamic Threads:\n");
+ ast_cli(a->fd, "Dynamic Threads:\n");
AST_LIST_LOCK(&dynamic_list);
AST_LIST_TRAVERSE(&dynamic_list, thread, list) {
#ifdef DEBUG_SCHED_MULTITHREAD
- ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d, func ='%s'\n",
+ ast_cli(a->fd, "Thread %d: state=%d, update=%d, actions=%d, func='%s'\n",
thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions, thread->curfunc);
#else
- ast_cli(fd, "Thread %d: state=%d, update=%d, actions=%d\n",
+ ast_cli(a->fd, "Thread %d: state=%d, update=%d, actions=%d\n",
thread->threadnum, thread->iostate, (int)(t - thread->checktime), thread->actions);
#endif
dynamiccount++;
}
AST_LIST_UNLOCK(&dynamic_list);
- ast_cli(fd, "%d of %d threads accounted for with %d dynamic threads\n", threadcount, iaxthreadcount, dynamiccount);
- return RESULT_SUCCESS;
+ ast_cli(a->fd, "%d of %d threads accounted for with %d dynamic threads\n", threadcount, iaxthreadcount, dynamiccount);
+ return CLI_SUCCESS;
}
-static int iax2_unregister(int fd, int argc, char *argv[]) {
+static char *handle_cli_iax2_unregister(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
struct iax2_peer *p;
- if (argc != 3)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 unregister";
+ e->usage =
+ "Usage: iax2 unregister <peername>\n"
+ " Unregister (force expiration) an IAX2 peer from the registry.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_iax2_unregister(a->line, a->word, a->pos, a->n);
+ }
- p = find_peer(argv[2], 1);
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+
+ p = find_peer(a->argv[2], 1);
if (p) {
if (p->expire > 0) {
- expire_registry(argv[2]);
- ast_cli(fd, "Peer %s unregistered\n", argv[2]);
+ expire_registry(a->argv[2]);
+ ast_cli(a->fd, "Peer %s unregistered\n", a->argv[2]);
} else {
- ast_cli(fd, "Peer %s not registered\n", argv[2]);
+ ast_cli(a->fd, "Peer %s not registered\n", a->argv[2]);
}
} else {
- ast_cli(fd, "Peer unknown: %s. Not unregistered\n", argv[2]);
+ ast_cli(a->fd, "Peer unknown: %s. Not unregistered\n", a->argv[2]);
}
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
static char *complete_iax2_unregister(const char *line, const char *word, int pos, int state)
@@ -4715,10 +4853,31 @@ static char *complete_iax2_unregister(const char *line, const char *word, int po
return res;
}
-static int iax2_show_peers(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- return __iax2_show_peers(0, fd, NULL, argc, argv);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show peers";
+ e->usage =
+ "Usage: iax2 show peers [registered] [like <pattern>]\n"
+ " Lists all known IAX2 peers.\n"
+ " Optional 'registered' argument lists only peers with known addresses.\n"
+ " Optional regular expression pattern is used to filter the peer list.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ switch (__iax2_show_peers(0, a->fd, NULL, a->argc, a->argv)) {
+ case RESULT_SHOWUSAGE:
+ return CLI_SHOWUSAGE;
+ case RESULT_FAILURE:
+ return CLI_FAILURE;
+ default:
+ return CLI_SUCCESS;
+ }
}
+
static int manager_iax2_show_netstats(struct mansession *s, const struct message *m)
{
ast_cli_netstats(s, -1, 0);
@@ -4726,24 +4885,35 @@ static int manager_iax2_show_netstats(struct mansession *s, const struct message
return RESULT_SUCCESS;
}
-static int iax2_show_firmware(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_firmware(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct iax_firmware *cur = NULL;
- if ((argc != 3) && (argc != 4))
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show firmware";
+ e->usage =
+ "Usage: iax2 show firmware\n"
+ " Lists all known IAX firmware images.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 3 && a->argc != 4)
+ return CLI_SHOWUSAGE;
- ast_cli(fd, "%-15.15s %-15.15s %-15.15s\n", "Device", "Version", "Size");
+ ast_cli(a->fd, "%-15.15s %-15.15s %-15.15s\n", "Device", "Version", "Size");
AST_LIST_LOCK(&firmwares);
AST_LIST_TRAVERSE(&firmwares, cur, list) {
- if ((argc == 3) || (!strcasecmp(argv[3], (char *)cur->fwh->devname))) {
- ast_cli(fd, "%-15.15s %-15d %-15d\n", cur->fwh->devname,
+ if ((a->argc == 3) || (!strcasecmp(a->argv[3], (char *) cur->fwh->devname))) {
+ ast_cli(a->fd, "%-15.15s %-15d %-15d\n", cur->fwh->devname,
ntohs(cur->fwh->version), (int)ntohl(cur->fwh->datalen));
}
}
AST_LIST_UNLOCK(&firmwares);
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
/* JDG: callback to display iax peers in manager */
@@ -4781,18 +4951,28 @@ static char *regstate2str(int regstate)
}
}
-static int iax2_show_registry(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_registry(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
#define FORMAT2 "%-20.20s %-6.6s %-10.10s %-20.20s %8.8s %s\n"
#define FORMAT "%-20.20s %-6.6s %-10.10s %-20.20s %8d %s\n"
struct iax2_registry *reg = NULL;
-
char host[80];
char perceived[80];
int counter = 0;
- if (argc != 3)
- return RESULT_SHOWUSAGE;
- ast_cli(fd, FORMAT2, "Host", "dnsmgr", "Username", "Perceived", "Refresh", "State");
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show registry";
+ e->usage =
+ "Usage: iax2 show registry\n"
+ " Lists all registration requests and status.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+ ast_cli(a->fd, FORMAT2, "Host", "dnsmgr", "Username", "Perceived", "Refresh", "State");
AST_LIST_LOCK(&registrations);
AST_LIST_TRAVERSE(&registrations, reg, entry) {
snprintf(host, sizeof(host), "%s:%d", ast_inet_ntoa(reg->addr.sin_addr), ntohs(reg->addr.sin_port));
@@ -4800,19 +4980,19 @@ static int iax2_show_registry(int fd, int argc, char *argv[])
snprintf(perceived, sizeof(perceived), "%s:%d", ast_inet_ntoa(reg->us.sin_addr), ntohs(reg->us.sin_port));
else
ast_copy_string(perceived, "<Unregistered>", sizeof(perceived));
- ast_cli(fd, FORMAT, host,
+ ast_cli(a->fd, FORMAT, host,
(reg->dnsmgr) ? "Y" : "N",
reg->username, perceived, reg->refresh, regstate2str(reg->regstate));
counter++;
}
AST_LIST_UNLOCK(&registrations);
- ast_cli(fd, "%d IAX2 registrations.\n", counter);
- return RESULT_SUCCESS;
+ ast_cli(a->fd, "%d IAX2 registrations.\n", counter);
+ return CLI_SUCCESS;
#undef FORMAT
#undef FORMAT2
}
-static int iax2_show_channels(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
#define FORMAT2 "%-20.20s %-15.15s %-10.10s %-11.11s %-11.11s %-7.7s %-6.6s %-6.6s %s\n"
#define FORMAT "%-20.20s %-15.15s %-10.10s %5.5d/%5.5d %5.5d/%5.5d %-5.5dms %-4.4dms %-4.4dms %-6.6s\n"
@@ -4820,16 +5000,27 @@ static int iax2_show_channels(int fd, int argc, char *argv[])
int x;
int numchans = 0;
- if (argc != 3)
- return RESULT_SHOWUSAGE;
- ast_cli(fd, FORMAT2, "Channel", "Peer", "Username", "ID (Lo/Rem)", "Seq (Tx/Rx)", "Lag", "Jitter", "JitBuf", "Format");
- for (x=0;x<IAX_MAX_CALLS;x++) {
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show channels";
+ e->usage =
+ "Usage: iax2 show channels\n"
+ " Lists all currently active IAX channels.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+ ast_cli(a->fd, FORMAT2, "Channel", "Peer", "Username", "ID (Lo/Rem)", "Seq (Tx/Rx)", "Lag", "Jitter", "JitBuf", "Format");
+ for (x = 0; x < IAX_MAX_CALLS; x++) {
ast_mutex_lock(&iaxsl[x]);
if (iaxs[x]) {
int lag, jitter, localdelay;
jb_info jbinfo;
- if(ast_test_flag(iaxs[x], IAX_USEJITTERBUF)) {
+ if (ast_test_flag(iaxs[x], IAX_USEJITTERBUF)) {
jb_getinfo(iaxs[x]->jb, &jbinfo);
jitter = jbinfo.jitter;
localdelay = jbinfo.current - jbinfo.min;
@@ -4838,7 +5029,7 @@ static int iax2_show_channels(int fd, int argc, char *argv[])
localdelay = 0;
}
lag = iaxs[x]->remote_rr.delay;
- ast_cli(fd, FORMAT,
+ ast_cli(a->fd, FORMAT,
iaxs[x]->owner ? iaxs[x]->owner->name : "(None)",
ast_inet_ntoa(iaxs[x]->addr.sin_addr),
S_OR(iaxs[x]->username, "(None)"),
@@ -4852,8 +5043,8 @@ static int iax2_show_channels(int fd, int argc, char *argv[])
}
ast_mutex_unlock(&iaxsl[x]);
}
- ast_cli(fd, "%d active IAX channel%s\n", numchans, (numchans != 1) ? "s" : "");
- return RESULT_SUCCESS;
+ ast_cli(a->fd, "%d active IAX channel%s\n", numchans, (numchans != 1) ? "s" : "");
+ return CLI_SUCCESS;
#undef FORMAT
#undef FORMAT2
#undef FORMATB
@@ -4935,70 +5126,141 @@ static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt)
return numchans;
}
-static int iax2_show_netstats(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_show_netstats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
int numchans = 0;
- if (argc != 3)
- return RESULT_SHOWUSAGE;
- ast_cli(fd, " -------- LOCAL --------------------- -------- REMOTE --------------------\n");
- ast_cli(fd, "Channel RTT Jit Del Lost %% Drop OOO Kpkts Jit Del Lost %% Drop OOO Kpkts\n");
- numchans = ast_cli_netstats(NULL, fd, 1);
- ast_cli(fd, "%d active IAX channel%s\n", numchans, (numchans != 1) ? "s" : "");
- return RESULT_SUCCESS;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 show netstats";
+ e->usage =
+ "Usage: iax2 show netstats\n"
+ " Lists network status for all currently active IAX channels.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+ ast_cli(a->fd, " -------- LOCAL --------------------- -------- REMOTE --------------------\n");
+ ast_cli(a->fd, "Channel RTT Jit Del Lost %% Drop OOO Kpkts Jit Del Lost %% Drop OOO Kpkts\n");
+ numchans = ast_cli_netstats(NULL, a->fd, 1);
+ ast_cli(a->fd, "%d active IAX channel%s\n", numchans, (numchans != 1) ? "s" : "");
+ return CLI_SUCCESS;
}
-static int iax2_do_debug(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 2 || argc > 3)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 set debug";
+ e->usage =
+ "Usage: iax2 set debug\n"
+ " Enables dumping of IAX packets for debugging purposes.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc < 2 || a->argc > 3)
+ return CLI_SHOWUSAGE;
iaxdebug = 1;
- ast_cli(fd, "IAX2 Debugging Enabled\n");
- return RESULT_SUCCESS;
+ ast_cli(a->fd, "IAX2 Debugging Enabled\n");
+ return CLI_SUCCESS;
}
-static int iax2_do_trunk_debug(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_set_debug_off(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 3 || argc > 4)
- return RESULT_SHOWUSAGE;
- iaxtrunkdebug = 1;
- ast_cli(fd, "IAX2 Trunk Debug Requested\n");
- return RESULT_SUCCESS;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 set debug off";
+ e->usage =
+ "Usage: iax2 set debug off\n"
+ " Disables dumping of IAX packets for debugging purposes.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc < 3 || a->argc > 4)
+ return CLI_SHOWUSAGE;
+ iaxdebug = 0;
+ ast_cli(a->fd, "IAX2 Debugging Disabled\n");
+ return CLI_SUCCESS;
}
-static int iax2_do_jb_debug(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_set_debug_trunk(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 3 || argc > 4)
- return RESULT_SHOWUSAGE;
- jb_setoutput(jb_error_output, jb_warning_output, jb_debug_output);
- ast_cli(fd, "IAX2 Jitterbuffer Debugging Enabled\n");
- return RESULT_SUCCESS;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 set debug trunk";
+ e->usage =
+ "Usage: iax2 set debug trunk\n"
+ " Requests current status of IAX trunking\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc < 3 || a->argc > 4)
+ return CLI_SHOWUSAGE;
+ iaxtrunkdebug = 1;
+ ast_cli(a->fd, "IAX2 Trunk Debugging Requested\n");
+ return CLI_SUCCESS;
}
-static int iax2_no_debug(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_set_debug_trunk_off(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 3 || argc > 4)
- return RESULT_SHOWUSAGE;
- iaxdebug = 0;
- ast_cli(fd, "IAX2 Debugging Disabled\n");
- return RESULT_SUCCESS;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 set debug trunk off";
+ e->usage =
+ "Usage: iax2 set debug trunk off\n"
+ " Disables debugging of IAX trunking\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc < 4 || a->argc > 5)
+ return CLI_SHOWUSAGE;
+ iaxtrunkdebug = 0;
+ ast_cli(a->fd, "IAX2 Trunk Debugging Disabled\n");
+ return CLI_SUCCESS;
}
-static int iax2_no_trunk_debug(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_set_debug_jb(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 4 || argc > 5)
- return RESULT_SHOWUSAGE;
- iaxtrunkdebug = 0;
- ast_cli(fd, "IAX2 Trunk Debugging Disabled\n");
- return RESULT_SUCCESS;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 set debug jb";
+ e->usage =
+ "Usage: iax2 set debug jb\n"
+ " Enables jitterbuffer debugging information\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc < 3 || a->argc > 4)
+ return CLI_SHOWUSAGE;
+ jb_setoutput(jb_error_output, jb_warning_output, jb_debug_output);
+ ast_cli(a->fd, "IAX2 Jitterbuffer Debugging Enabled\n");
+ return CLI_SUCCESS;
}
-static int iax2_no_jb_debug(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_set_debug_jb_off(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc < 4 || argc > 5)
- return RESULT_SHOWUSAGE;
- iaxtrunkdebug = 0;
- ast_cli(fd, "IAX2 Trunk Debugging Disabled\n");
- return RESULT_SUCCESS;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 set debug jb off";
+ e->usage =
+ "Usage: iax2 set debug jb off\n"
+ " Disables jitterbuffer debugging information\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc < 4 || a->argc > 5)
+ return CLI_SHOWUSAGE;
+ jb_setoutput(jb_error_output, jb_warning_output, NULL);
+ ast_cli(a->fd, "IAX2 Jitterbuffer Debugging Disabled\n");
+ return CLI_SUCCESS;
}
static int iax2_write(struct ast_channel *c, struct ast_frame *f)
@@ -8841,13 +9103,6 @@ static int iax2_do_register(struct iax2_registry *reg)
return 0;
}
-static char *iax2_prov_complete_template_3rd(const char *line, const char *word, int pos, int state)
-{
- if (pos != 3)
- return NULL;
- return iax_prov_complete_template(line, word, pos, state);
-}
-
static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const char *template, int force)
{
/* Returns 1 if provisioned, -1 if not able to find destination, or 0 if no provisioning
@@ -8935,27 +9190,43 @@ static int iax2_prov_app(struct ast_channel *chan, void *data)
return res;
}
-
-static int iax2_prov_cmd(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_provision(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
int force = 0;
int res;
- if (argc < 4)
- return RESULT_SHOWUSAGE;
- if ((argc > 4)) {
- if (!strcasecmp(argv[4], "forced"))
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 provision";
+ e->usage =
+ "Usage: iax2 provision <host> <template> [forced]\n"
+ " Provisions the given peer or IP address using a template\n"
+ " matching either 'template' or '*' if the template is not\n"
+ " found. If 'forced' is specified, even empty provisioning\n"
+ " fields will be provisioned as empty fields.\n";
+ return NULL;
+ case CLI_GENERATE:
+ if (a->pos == 3)
+ return iax_prov_complete_template(a->line, a->word, a->pos, a->n);
+ return NULL;
+ }
+
+ if (a->argc < 4)
+ return CLI_SHOWUSAGE;
+ if (a->argc > 4) {
+ if (!strcasecmp(a->argv[4], "forced"))
force = 1;
else
- return RESULT_SHOWUSAGE;
+ return CLI_SHOWUSAGE;
}
- res = iax2_provision(NULL, -1, argv[2], argv[3], force);
+ res = iax2_provision(NULL, -1, a->argv[2], a->argv[3], force);
if (res < 0)
- ast_cli(fd, "Unable to find peer/address '%s'\n", argv[2]);
+ ast_cli(a->fd, "Unable to find peer/address '%s'\n", a->argv[2]);
else if (res < 1)
- ast_cli(fd, "No template (including wildcard) matching '%s'\n", argv[3]);
+ ast_cli(a->fd, "No template (including wildcard) matching '%s'\n", a->argv[3]);
else
- ast_cli(fd, "Provisioning '%s' with template '%s'%s\n", argv[2], argv[3], force ? ", forced" : "");
- return RESULT_SUCCESS;
+ ast_cli(a->fd, "Provisioning '%s' with template '%s'%s\n", a->argv[2], a->argv[3], force ? ", forced" : "");
+ return CLI_SUCCESS;
}
static void __iax2_poke_noanswer(const void *data)
@@ -10402,9 +10673,22 @@ static int reload_config(void)
return 0;
}
-static int iax2_reload(int fd, int argc, char *argv[])
+static char *handle_cli_iax2_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- return reload_config();
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "iax2 reload";
+ e->usage =
+ "Usage: iax2 reload\n"
+ " Reloads IAX configuration from iax.conf\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ reload_config();
+
+ return CLI_SUCCESS;
}
static int reload(void)
@@ -10908,126 +11192,15 @@ static int iax2_devicestate(void *data)
static struct ast_switch iax2_switch =
{
- name: "IAX2",
- description: "IAX Remote Dialplan Switch",
- exists: iax2_exists,
- canmatch: iax2_canmatch,
- exec: iax2_exec,
- matchmore: iax2_matchmore,
+ name: "IAX2",
+ description: "IAX Remote Dialplan Switch",
+ exists: iax2_exists,
+ canmatch: iax2_canmatch,
+ exec: iax2_exec,
+ matchmore: iax2_matchmore,
};
-static const char show_stats_usage[] =
-"Usage: iax2 show stats\n"
-" Display statistics on IAX channel driver.\n";
-
-static const char set_mtu_usage[] =
-"Usage: iax2 set mtu <value>\n"
-" Set the system-wide IAX IP mtu to <value> bytes net or zero to disable.\n"
-" Disabling means that the operating system must handle fragmentation of UDP packets\n"
-" when the IAX2 trunk packet exceeds the UDP payload size.\n"
-" This is substantially below the IP mtu. Try 1240 on ethernets.\n"
-" Must be 172 or greater for G.711 samples.\n";
-static const char show_cache_usage[] =
-"Usage: iax2 show cache\n"
-" Display currently cached IAX Dialplan results.\n";
-
-static const char show_peer_usage[] =
-"Usage: iax2 show peer <name>\n"
-" Display details on specific IAX peer\n";
-
-static const char prune_realtime_usage[] =
-"Usage: iax2 prune realtime [<peername>|all]\n"
-" Prunes object(s) from the cache\n";
-
-static const char iax2_reload_usage[] =
-"Usage: iax2 reload\n"
-" Reloads IAX configuration from iax.conf\n";
-
-static const char show_prov_usage[] =
-"Usage: iax2 provision <host> <template> [forced]\n"
-" Provisions the given peer or IP address using a template\n"
-" matching either 'template' or '*' if the template is not\n"
-" found. If 'forced' is specified, even empty provisioning\n"
-" fields will be provisioned as empty fields.\n";
-
-static const char show_users_usage[] =
-"Usage: iax2 show users [like <pattern>]\n"
-" Lists all known IAX2 users.\n"
-" Optional regular expression pattern is used to filter the user list.\n";
-
-static const char show_channels_usage[] =
-"Usage: iax2 show channels\n"
-" Lists all currently active IAX channels.\n";
-
-static const char show_netstats_usage[] =
-"Usage: iax2 show netstats\n"
-" Lists network status for all currently active IAX channels.\n";
-
-static const char show_threads_usage[] =
-"Usage: iax2 show threads\n"
-" Lists status of IAX helper threads\n";
-
-static const char unregister_usage[] =
-"Usage: iax2 unregister <peername>\n"
-" Unregister (force expiration) an IAX2 peer from the registry.\n";
-
-static const char show_peers_usage[] =
-"Usage: iax2 show peers [registered] [like <pattern>]\n"
-" Lists all known IAX2 peers.\n"
-" Optional 'registered' argument lists only peers with known addresses.\n"
-" Optional regular expression pattern is used to filter the peer list.\n";
-
-static const char show_firmware_usage[] =
-"Usage: iax2 show firmware\n"
-" Lists all known IAX firmware images.\n";
-
-static const char show_reg_usage[] =
-"Usage: iax2 show registry\n"
-" Lists all registration requests and status.\n";
-
-static const char debug_usage[] =
-"Usage: iax2 set debug\n"
-" Enables dumping of IAX packets for debugging purposes\n";
-
-static const char no_debug_usage[] =
-"Usage: iax2 set debug off\n"
-" Disables dumping of IAX packets for debugging purposes\n";
-
-static const char debug_trunk_usage[] =
-"Usage: iax2 set debug trunk\n"
-" Requests current status of IAX trunking\n";
-
-static const char no_debug_trunk_usage[] =
-"Usage: iax2 set debug trunk off\n"
-" Requests current status of IAX trunking\n";
-
-static const char debug_jb_usage[] =
-"Usage: iax2 set debug jb\n"
-" Enables jitterbuffer debugging information\n";
-
-static const char no_debug_jb_usage[] =
-"Usage: iax2 set debug jb off\n"
-" Disables jitterbuffer debugging information\n";
-
-static const char iax2_test_losspct_usage[] =
-"Usage: iax2 test losspct <percentage>\n"
-" For testing, throws away <percentage> percent of incoming packets\n";
-
-#ifdef IAXTESTS
-static const char iax2_test_late_usage[] =
-"Usage: iax2 test late <ms>\n"
-" For testing, count the next frame as <ms> ms late\n";
-
-static const char iax2_test_resync_usage[] =
-"Usage: iax2 test resync <ms>\n"
-" For testing, adjust all future frames by <ms> ms\n";
-
-static const char iax2_test_jitter_usage[] =
-"Usage: iax2 test jitter <ms> <pct>\n"
-" For testing, simulate maximum jitter of +/- <ms> on <pct> percentage of packets. If <pct> is not specified, adds jitter to all packets.\n";
-#endif /* IAXTESTS */
-
-static struct ast_cli_entry cli_iax2[] = {
+/*
{ { "iax2", "show", "cache", NULL },
iax2_show_cache, "Display IAX cached dialplan",
show_cache_usage },
@@ -11128,6 +11301,36 @@ static struct ast_cli_entry cli_iax2[] = {
{ { "iax2", "test", "jitter", NULL },
iax2_test_jitter, "Simulates jitter for testing",
iax2_test_jitter_usage },
+#endif
+*/
+
+static struct ast_cli_entry cli_iax2[] = {
+ NEW_CLI(handle_cli_iax2_provision, "Provision an IAX device"),
+ NEW_CLI(handle_cli_iax2_prune_realtime, "Prune a cached realtime lookup"),
+ NEW_CLI(handle_cli_iax2_reload, "Reload IAX configuration"),
+ NEW_CLI(handle_cli_iax2_set_mtu, "Set the IAX systemwide trunking MTU"),
+ NEW_CLI(handle_cli_iax2_set_debug, "Enable IAX debugging"),
+ NEW_CLI(handle_cli_iax2_set_debug_trunk, "Enable IAX trunk debugging"),
+ NEW_CLI(handle_cli_iax2_set_debug_jb, "Enable IAX jitterbuffer debugging"),
+ NEW_CLI(handle_cli_iax2_set_debug_off, "Disable IAX debugging"),
+ NEW_CLI(handle_cli_iax2_set_debug_trunk_off, "Disable IAX trunk debugging"),
+ NEW_CLI(handle_cli_iax2_set_debug_jb_off, "Disable IAX jitterbuffer debugging"),
+ NEW_CLI(handle_cli_iax2_show_cache, "Display IAX cached dialplan"),
+ NEW_CLI(handle_cli_iax2_show_channels, "List active IAX channels"),
+ NEW_CLI(handle_cli_iax2_show_firmware, "List available IAX firmware"),
+ NEW_CLI(handle_cli_iax2_show_netstats, "List active IAX channel netstats"),
+ NEW_CLI(handle_cli_iax2_show_peer, "Show details on specific IAX peer"),
+ NEW_CLI(handle_cli_iax2_show_peers, "List defined IAX peers"),
+ NEW_CLI(handle_cli_iax2_show_registry, "Display IAX registration status"),
+ NEW_CLI(handle_cli_iax2_show_stats, "Display IAX statistics"),
+ NEW_CLI(handle_cli_iax2_show_threads, "Display IAX helper thread info"),
+ NEW_CLI(handle_cli_iax2_show_users, "List defined IAX users"),
+ NEW_CLI(handle_cli_iax2_test_losspct, "Set IAX2 incoming frame loss percentage"),
+ NEW_CLI(handle_cli_iax2_unregister, "Unregister (force expiration) an IAX2 peer from the registry"),
+#ifdef IAXTESTS
+ NEW_CLI(handle_cli_iax2_test_jitter, "Simulates jitter for testing"),
+ NEW_CLI(handle_cli_iax2_test_late, "Test the receipt of a late frame"),
+ NEW_CLI(handle_cli_iax2_test_resync, "Test a resync in received timestamps"),
#endif /* IAXTESTS */
};
@@ -11342,4 +11545,4 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Inter Asterisk eXchange
.load = load_module,
.unload = unload_module,
.reload = reload,
- );
+ );
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index 1eaa64084..f9119413f 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -114,6 +114,9 @@ available data is returned and the return value indicates the number
of data. */
int misdn_jb_empty(struct misdn_jb *jb, char *data, int len);
+static char *complete_ch(struct ast_cli_args *a);
+static char *complete_debug_port(struct ast_cli_args *a);
+static char *complete_show_config(struct ast_cli_args *a);
/* BEGIN: chan_misdn.h */
@@ -735,24 +738,36 @@ static void send_digit_to_chan(struct chan_list *cl, char digit )
ast_debug(1, "Unable to handle DTMF tone '%c' for '%s'\n", digit, chan->name);
}
}
+
/*** CLI HANDLING ***/
-static int misdn_set_debug(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
int level;
- if (argc != 4 && argc != 5 && argc != 6 && argc != 7)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn set debug";
+ e->usage =
+ "Usage: misdn set debug <level> [only] | [port <port> [only]]\n"
+ " Set the debug level of the mISDN channel.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_debug_port(a);
+ }
+
+ if (a->argc < 4 || a->argc > 7)
+ return CLI_SHOWUSAGE;
- level = atoi(argv[3]);
+ level = atoi(a->argv[3]);
- switch (argc) {
+ switch (a->argc) {
case 4:
case 5:
{
int only = 0, i;
- if (argc == 5) {
- if (strncasecmp(argv[4], "only", strlen(argv[4])))
- return RESULT_SHOWUSAGE;
+ if (a->argc == 5) {
+ if (strncasecmp(a->argv[4], "only", strlen(a->argv[4])))
+ return CLI_SHOWUSAGE;
else
only = 1;
}
@@ -761,138 +776,193 @@ static int misdn_set_debug(int fd, int argc, char *argv[])
misdn_debug[i] = level;
misdn_debug_only[i] = only;
}
- ast_cli(fd, "changing debug level for all ports to %d%s\n",misdn_debug[0], only?" (only)":"");
+ ast_cli(a->fd, "changing debug level for all ports to %d%s\n",misdn_debug[0], only?" (only)":"");
}
break;
case 6:
case 7:
{
int port;
- if (strncasecmp(argv[4], "port", strlen(argv[4])))
- return RESULT_SHOWUSAGE;
- port = atoi(argv[5]);
+ if (strncasecmp(a->argv[4], "port", strlen(a->argv[4])))
+ return CLI_SHOWUSAGE;
+ port = atoi(a->argv[5]);
if (port <= 0 || port > max_ports) {
switch (max_ports) {
case 0:
- ast_cli(fd, "port number not valid! no ports available so you won't get lucky with any number here...\n");
+ ast_cli(a->fd, "port number not valid! no ports available so you won't get lucky with any number here...\n");
break;
case 1:
- ast_cli(fd, "port number not valid! only port 1 is availble.\n");
+ ast_cli(a->fd, "port number not valid! only port 1 is availble.\n");
break;
default:
- ast_cli(fd, "port number not valid! only ports 1 to %d are available.\n", max_ports);
+ ast_cli(a->fd, "port number not valid! only ports 1 to %d are available.\n", max_ports);
}
return 0;
}
- if (argc == 7) {
- if (strncasecmp(argv[6], "only", strlen(argv[6])))
- return RESULT_SHOWUSAGE;
+ if (a->argc == 7) {
+ if (strncasecmp(a->argv[6], "only", strlen(a->argv[6])))
+ return CLI_SHOWUSAGE;
else
misdn_debug_only[port] = 1;
} else
misdn_debug_only[port] = 0;
misdn_debug[port] = level;
- ast_cli(fd, "changing debug level to %d%s for port %d\n", misdn_debug[port], misdn_debug_only[port]?" (only)":"", port);
+ ast_cli(a->fd, "changing debug level to %d%s for port %d\n", misdn_debug[port], misdn_debug_only[port]?" (only)":"", port);
}
}
- return 0;
+
+ return CLI_SUCCESS;
}
-static int misdn_set_crypt_debug(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_set_crypt_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc != 5)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn set crypt debug";
+ e->usage =
+ "Usage: misdn set crypt debug <level>\n"
+ " Set the crypt debug level of the mISDN channel. Level\n"
+ " must be 1 or 2.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- return 0;
-}
+ if (a->argc != 5)
+ return CLI_SHOWUSAGE;
+ /* Is this supposed to not do anything? */
-static int misdn_port_block(int fd, int argc, char *argv[])
+ return CLI_SUCCESS;
+}
+
+static char *handle_cli_misdn_port_block(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- int port;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn port block";
+ e->usage =
+ "Usage: misdn port block <port>\n"
+ " Block the specified port by <port>.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- port = atoi(argv[3]);
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
- misdn_lib_port_block(port);
+ misdn_lib_port_block(atoi(a->argv[3]));
- return 0;
+ return CLI_SUCCESS;
}
-static int misdn_port_unblock(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_port_unblock(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- int port;
-
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- port = atoi(argv[3]);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn port unblock";
+ e->usage =
+ "Usage: misdn port unblock <port>\n"
+ " Unblock the port specified by <port>.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- misdn_lib_port_unblock(port);
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
- return 0;
-}
+ misdn_lib_port_unblock(atoi(a->argv[3]));
+ return CLI_SUCCESS;
+}
-static int misdn_restart_port (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_restart_port(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- int port;
-
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- port = atoi(argv[3]);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn restart port";
+ e->usage =
+ "Usage: misdn restart port <port>\n"
+ " Restart the given port.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- misdn_lib_port_restart(port);
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
- return 0;
+ misdn_lib_port_restart(atoi(a->argv[3]));
+
+ return CLI_SUCCESS;
}
-static int misdn_restart_pid (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_restart_pid(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- int pid;
-
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- pid = atoi(argv[3]);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn restart pid";
+ e->usage =
+ "Usage: misdn restart pid <pid>\n"
+ " Restart the given pid\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- misdn_lib_pid_restart(pid);
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
- return 0;
+ misdn_lib_pid_restart(atoi(a->argv[3]));
+
+ return CLI_SUCCESS;
}
-static int misdn_port_up (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_port_up(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- int port;
-
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- port = atoi(argv[3]);
-
- misdn_lib_get_port_up(port);
-
- return 0;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn port up";
+ e->usage =
+ "Usage: misdn port up <port>\n"
+ " Try to establish L1 on the given port.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+
+ misdn_lib_get_port_up(atoi(a->argv[3]));
+
+ return CLI_SUCCESS;
}
-static int misdn_port_down (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_port_down(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- int port;
-
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- port = atoi(argv[3]);
-
- misdn_lib_get_port_down(port);
-
- return 0;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn port down";
+ e->usage =
+ "Usage: misdn port down <port>\n"
+ " Try to deacivate the L1 on the given port.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+
+ misdn_lib_get_port_down(atoi(a->argv[3]));
+
+ return CLI_SUCCESS;
}
-static inline void show_config_description (int fd, enum misdn_cfg_elements elem)
+static inline void show_config_description(int fd, enum misdn_cfg_elements elem)
{
char section[BUFFERSIZE];
char name[BUFFERSIZE];
@@ -913,9 +983,11 @@ static inline void show_config_description (int fd, enum misdn_cfg_elements elem
ast_cli(fd, "[%s] %s (Default: %s)\n\t%s\n", section, name, def, desc);
else
ast_cli(fd, "[%s] %s\n\t%s\n", section, name, desc);
+
+ return;
}
-static int misdn_show_config (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_show_config(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
char buffer[BUFFERSIZE];
enum misdn_cfg_elements elem;
@@ -923,75 +995,83 @@ static int misdn_show_config (int fd, int argc, char *argv[])
int onlyport = -1;
int ok = 0;
- if (argc >= 4) {
- if (!strcmp(argv[3], "description")) {
- if (argc == 5) {
- enum misdn_cfg_elements elem = misdn_cfg_get_elem(argv[4]);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn show config";
+ e->usage =
+ "Usage: misdn show config [<port> | description <config element> | descriptions [general|ports]]\n"
+ " Use 0 for <port> to only print the general config.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_show_config(a);
+ }
+
+ if (a->argc >= 4) {
+ if (!strcmp(a->argv[3], "description")) {
+ if (a->argc == 5) {
+ enum misdn_cfg_elements elem = misdn_cfg_get_elem(a->argv[4]);
if (elem == MISDN_CFG_FIRST)
- ast_cli(fd, "Unknown element: %s\n", argv[4]);
+ ast_cli(a->fd, "Unknown element: %s\n", a->argv[4]);
else
- show_config_description(fd, elem);
- return 0;
+ show_config_description(a->fd, elem);
+ return CLI_SUCCESS;
}
- return RESULT_SHOWUSAGE;
- }
- if (!strcmp(argv[3], "descriptions")) {
- if ((argc == 4) || ((argc == 5) && !strcmp(argv[4], "general"))) {
+ return CLI_SHOWUSAGE;
+ } else if (!strcmp(a->argv[3], "descriptions")) {
+ if ((a->argc == 4) || ((a->argc == 5) && !strcmp(a->argv[4], "general"))) {
for (elem = MISDN_GEN_FIRST + 1; elem < MISDN_GEN_LAST; ++elem) {
- show_config_description(fd, elem);
- ast_cli(fd, "\n");
+ show_config_description(a->fd, elem);
+ ast_cli(a->fd, "\n");
}
ok = 1;
}
- if ((argc == 4) || ((argc == 5) && !strcmp(argv[4], "ports"))) {
+ if ((a->argc == 4) || ((a->argc == 5) && !strcmp(a->argv[4], "ports"))) {
for (elem = MISDN_CFG_FIRST + 1; elem < MISDN_CFG_LAST - 1 /* the ptp hack, remove the -1 when ptp is gone */; ++elem) {
- show_config_description(fd, elem);
- ast_cli(fd, "\n");
+ show_config_description(a->fd, elem);
+ ast_cli(a->fd, "\n");
}
ok = 1;
}
- return ok ? 0 : RESULT_SHOWUSAGE;
- }
- if (!sscanf(argv[3], "%d", &onlyport) || onlyport < 0) {
- ast_cli(fd, "Unknown option: %s\n", argv[3]);
- return RESULT_SHOWUSAGE;
+ return ok ? CLI_SUCCESS : CLI_SHOWUSAGE;
+ } else if (!sscanf(a->argv[3], "%d", &onlyport) || onlyport < 0) {
+ ast_cli(a->fd, "Unknown option: %s\n", a->argv[3]);
+ return CLI_SHOWUSAGE;
}
- }
-
- if (argc == 3 || onlyport == 0) {
- ast_cli(fd,"Misdn General-Config: \n");
+ } else if (a->argc == 3 || onlyport == 0) {
+ ast_cli(a->fd, "mISDN General-Config:\n");
for (elem = MISDN_GEN_FIRST + 1, linebreak = 1; elem < MISDN_GEN_LAST; elem++, linebreak++) {
misdn_cfg_get_config_string(0, elem, buffer, sizeof(buffer));
- ast_cli(fd, "%-36s%s", buffer, !(linebreak % 2) ? "\n" : "");
+ ast_cli(a->fd, "%-36s%s", buffer, !(linebreak % 2) ? "\n" : "");
}
- ast_cli(fd, "\n");
+ ast_cli(a->fd, "\n");
}
if (onlyport < 0) {
int port = misdn_cfg_get_next_port(0);
for (; port > 0; port = misdn_cfg_get_next_port(port)) {
- ast_cli(fd, "\n[PORT %d]\n", port);
+ ast_cli(a->fd, "\n[PORT %d]\n", port);
for (elem = MISDN_CFG_FIRST + 1, linebreak = 1; elem < MISDN_CFG_LAST; elem++, linebreak++) {
misdn_cfg_get_config_string(port, elem, buffer, sizeof(buffer));
- ast_cli(fd, "%-36s%s", buffer, !(linebreak % 2) ? "\n" : "");
+ ast_cli(a->fd, "%-36s%s", buffer, !(linebreak % 2) ? "\n" : "");
}
- ast_cli(fd, "\n");
+ ast_cli(a->fd, "\n");
}
}
if (onlyport > 0) {
if (misdn_cfg_is_port_valid(onlyport)) {
- ast_cli(fd, "[PORT %d]\n", onlyport);
+ ast_cli(a->fd, "[PORT %d]\n", onlyport);
for (elem = MISDN_CFG_FIRST + 1, linebreak = 1; elem < MISDN_CFG_LAST; elem++, linebreak++) {
misdn_cfg_get_config_string(onlyport, elem, buffer, sizeof(buffer));
- ast_cli(fd, "%-36s%s", buffer, !(linebreak % 2) ? "\n" : "");
+ ast_cli(a->fd, "%-36s%s", buffer, !(linebreak % 2) ? "\n" : "");
}
- ast_cli(fd, "\n");
+ ast_cli(a->fd, "\n");
} else {
- ast_cli(fd, "Port %d is not active!\n", onlyport);
+ ast_cli(a->fd, "Port %d is not active!\n", onlyport);
}
}
- return 0;
+
+ return CLI_SUCCESS;
}
struct state_struct {
@@ -1064,11 +1144,26 @@ static void reload_config(void)
}
}
-static int misdn_reload (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- ast_cli(fd, "Reloading mISDN Config\n");
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn reload";
+ e->usage =
+ "Usage: misdn reload\n"
+ " Reload internal mISDN config, read from the config\n"
+ " file.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 2)
+ return CLI_SHOWUSAGE;
+
+ ast_cli(a->fd, "Reloading mISDN configuration\n");
reload_config();
- return 0;
+ return CLI_SUCCESS;
}
static void print_bc_info (int fd, struct chan_list *help, struct misdn_bchannel *bc)
@@ -1126,27 +1221,42 @@ static void print_bc_info (int fd, struct chan_list *help, struct misdn_bchannel
}
-static int misdn_show_cls(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- struct chan_list *help = cl_te;
+ struct chan_list *help = NULL;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn show channels";
+ e->usage =
+ "Usage: misdn show channels\n"
+ " Show the internal mISDN channel list\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+
+ help = cl_te;
- ast_cli(fd, "Chan List: %p\n", cl_te);
+ ast_cli(a->fd, "Channel List: %p\n", cl_te);
for (; help; help = help->next) {
struct misdn_bchannel *bc = help->bc;
struct ast_channel *ast = help->ast;
if (misdn_debug[0] > 2)
- ast_cli(fd, "Bc:%p Ast:%p\n", bc, ast);
+ ast_cli(a->fd, "Bc:%p Ast:%p\n", bc, ast);
if (bc) {
- print_bc_info(fd, help, bc);
+ print_bc_info(a->fd, help, bc);
} else {
if (help->state == MISDN_HOLDED) {
- ast_cli(fd, "ITS A HOLDED BC:\n");
- ast_cli(fd, " --> l3_id: %x\n"
+ ast_cli(a->fd, "ITS A HOLDED BC:\n");
+ ast_cli(a->fd, " --> l3_id: %x\n"
" --> dad:%s oad:%s\n"
" --> hold_port: %d\n"
" --> hold_channel: %d\n",
-
help->l3id,
ast->exten,
ast->cid.cid_num,
@@ -1154,178 +1264,261 @@ static int misdn_show_cls(int fd, int argc, char *argv[])
help->hold_info.channel
);
} else {
- ast_cli(fd, "* Channel in unknown STATE !!! Exten:%s, Callerid:%s\n", ast->exten, ast->cid.cid_num);
+ ast_cli(a->fd, "* Channel in unknown STATE !!! Exten:%s, Callerid:%s\n", ast->exten, ast->cid.cid_num);
}
}
}
misdn_dump_chanlist();
- return 0;
+
+ return CLI_SUCCESS;
}
-static int misdn_show_cl (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_show_channel(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- struct chan_list *help=cl_te;
+ struct chan_list *help = NULL;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn show channel";
+ e->usage =
+ "Usage: misdn show channel <channel>\n"
+ " Show an internal mISDN channel\n.";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_ch(a);
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+
+ help = cl_te;
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
for (; help; help = help->next) {
struct misdn_bchannel *bc = help->bc;
struct ast_channel *ast = help->ast;
if (bc && ast) {
- if (!strcasecmp(ast->name, argv[3])) {
- print_bc_info(fd, help, bc);
+ if (!strcasecmp(ast->name, a->argv[3])) {
+ print_bc_info(a->fd, help, bc);
break;
}
}
}
-
-
- return 0;
+
+ return CLI_SUCCESS;
}
ast_mutex_t lock;
int MAXTICS = 8;
-static int misdn_set_tics (int fd, int argc, char *argv[])
+static char *handle_cli_misdn_set_tics(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- MAXTICS = atoi(argv[3]);
-
- return 0;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn set tics";
+ e->usage =
+ "Usage: misdn set tics <value>\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+
+ MAXTICS = atoi(a->argv[3]);
+
+ return CLI_SUCCESS;
}
-static int misdn_show_stacks(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_show_stacks(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
int port;
- ast_cli(fd, "BEGIN STACK_LIST:\n");
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn show stacks";
+ e->usage =
+ "Usage: misdn show stacks\n"
+ " Show internal mISDN stack_list.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 3)
+ return CLI_SHOWUSAGE;
+ ast_cli(a->fd, "BEGIN STACK_LIST:\n");
for (port = misdn_cfg_get_next_port(0); port > 0;
port = misdn_cfg_get_next_port(port)) {
char buf[128];
get_show_stack_details(port, buf);
- ast_cli(fd," %s Debug:%d%s\n", buf, misdn_debug[port], misdn_debug_only[port] ? "(only)" : "");
+ ast_cli(a->fd," %s Debug:%d%s\n", buf, misdn_debug[port], misdn_debug_only[port] ? "(only)" : "");
}
- return 0;
+ return CLI_SUCCESS;
}
-
-static int misdn_show_ports_stats(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_show_ports_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
int port;
- ast_cli(fd, "Port\tin_calls\tout_calls\n");
-
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn show ports stats";
+ e->usage =
+ "Usage: misdn show ports stats\n"
+ " Show mISDNs channel's call statistics per port.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+
+ ast_cli(a->fd, "Port\tin_calls\tout_calls\n");
for (port = misdn_cfg_get_next_port(0); port > 0;
port = misdn_cfg_get_next_port(port)) {
- ast_cli(fd, "%d\t%d\t\t%d\n", port, misdn_in_calls[port], misdn_out_calls[port]);
+ ast_cli(a->fd, "%d\t%d\t\t%d\n", port, misdn_in_calls[port], misdn_out_calls[port]);
}
- ast_cli(fd, "\n");
+ ast_cli(a->fd, "\n");
- return 0;
+ return CLI_SUCCESS;
}
-
-static int misdn_show_port(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_show_port(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
int port;
char buf[128];
-
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- port = atoi(argv[3]);
-
- ast_cli(fd, "BEGIN STACK_LIST:\n");
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn show port";
+ e->usage =
+ "Usage: misdn show port <port>\n"
+ " Show detailed information for given port.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+
+ port = atoi(a->argv[3]);
+
+ ast_cli(a->fd, "BEGIN STACK_LIST:\n");
get_show_stack_details(port, buf);
- ast_cli(fd, " %s Debug:%d%s\n", buf, misdn_debug[port], misdn_debug_only[port] ? "(only)" : "");
+ ast_cli(a->fd, " %s Debug:%d%s\n", buf, misdn_debug[port], misdn_debug_only[port] ? "(only)" : "");
-
- return 0;
+ return CLI_SUCCESS;
}
-static int misdn_send_cd(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_send_calldeflect(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
char *channame;
char *nr;
struct chan_list *tmp;
-
- if (argc != 5)
- return RESULT_SHOWUSAGE;
-
- channame = argv[3];
- nr = argv[4];
- ast_cli(fd, "Sending Calldeflection (%s) to %s\n", nr, channame);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn send calldeflect";
+ e->usage =
+ "Usage: misdn send calldeflect <channel> \"<nr>\"\n"
+ " Send CallDeflection to mISDN Channel.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_ch(a);
+ }
+
+ if (a->argc != 5)
+ return CLI_SHOWUSAGE;
+
+ channame = a->argv[3];
+ nr = a->argv[4];
+
+ ast_cli(a->fd, "Sending Calldeflection (%s) to %s\n", nr, channame);
tmp = get_chan_by_ast_name(channame);
if (!tmp) {
- ast_cli(fd, "Sending CD with nr %s to %s failed: Channel does not exist.\n",nr, channame);
- return 0;
+ ast_cli(a->fd, "Sending CD with nr %s to %s failed: Channel does not exist.\n", nr, channame);
+ return CLI_SUCCESS;
}
if (strlen(nr) >= 15) {
- ast_cli(fd, "Sending CD with nr %s to %s failed: Number too long (up to 15 digits are allowed).\n",nr, channame);
- return 0;
+ ast_cli(a->fd, "Sending CD with nr %s to %s failed: Number too long (up to 15 digits are allowed).\n", nr, channame);
+ return CLI_SUCCESS;
}
tmp->bc->fac_out.Function = Fac_CD;
ast_copy_string((char *)tmp->bc->fac_out.u.CDeflection.DeflectedToNumber, nr, sizeof(tmp->bc->fac_out.u.CDeflection.DeflectedToNumber));
misdn_lib_send_event(tmp->bc, EVENT_FACILITY);
- return 0;
+ return CLI_SUCCESS;
}
-static int misdn_send_restart(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_send_restart(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- int port;
- int channel;
-
- if ( (argc < 4) || (argc > 5) )
- return RESULT_SHOWUSAGE;
-
- port = atoi(argv[3]);
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn send restart";
+ e->usage =
+ "Usage: misdn send restart [port [channel]]\n"
+ " Send a restart for every bchannel on the given port.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- if (argc==5) {
- channel = atoi(argv[4]);
- misdn_lib_send_restart(port, channel);
- } else
- misdn_lib_send_restart(port, -1 );
-
- return 0;
+ if (a->argc < 4 || a->argc > 5)
+ return CLI_SHOWUSAGE;
+
+ if (a->argc == 5)
+ misdn_lib_send_restart(atoi(a->argv[3]), atoi(a->argv[4]));
+ else
+ misdn_lib_send_restart(atoi(a->argv[3]), -1);
+
+ return CLI_SUCCESS;
}
-static int misdn_send_digit(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_send_digit(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
char *channame;
char *msg;
struct chan_list *tmp;
int i, msglen;
- if (argc != 5)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn send digit";
+ e->usage =
+ "Usage: misdn send digit <channel> \"<msg>\" \n"
+ " Send <digit> to <channel> as DTMF Tone\n"
+ " when channel is a mISDN channel\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_ch(a);
+ }
+
+ if (a->argc != 5)
+ return CLI_SHOWUSAGE;
- channame = argv[3];
- msg = argv[4];
+ channame = a->argv[3];
+ msg = a->argv[4];
msglen = strlen(msg);
- ast_cli(fd, "Sending %s to %s\n", msg, channame);
+ ast_cli(a->fd, "Sending %s to %s\n", msg, channame);
tmp = get_chan_by_ast_name(channame);
-
if (!tmp) {
- ast_cli(fd, "Sending %s to %s failed Channel does not exist\n", msg, channame);
- return 0;
+ ast_cli(a->fd, "Sending %s to %s failed Channel does not exist\n", msg, channame);
+ return CLI_SUCCESS;
}
#if 1
for (i = 0; i < msglen; i++) {
- ast_cli(fd, "Sending: %c\n", msg[i]);
+ ast_cli(a->fd, "Sending: %c\n", msg[i]);
send_digit_to_chan(tmp, msg[i]);
/* res = ast_safe_sleep(tmp->ast, 250); */
usleep(250000);
@@ -1335,26 +1528,36 @@ static int misdn_send_digit(int fd, int argc, char *argv[])
ast_dtmf_stream(tmp->ast, NULL, msg, 250);
#endif
- return 0;
+ return CLI_SUCCESS;
}
-static int misdn_toggle_echocancel(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_toggle_echocancel(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
char *channame;
struct chan_list *tmp;
- if (argc != 4)
- return RESULT_SHOWUSAGE;
-
- channame = argv[3];
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn toggle echocancel";
+ e->usage =
+ "Usage: misdn toggle echocancel <channel>\n"
+ " Toggle EchoCancel on mISDN Channel.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_ch(a);
+ }
+
+ if (a->argc != 4)
+ return CLI_SHOWUSAGE;
+
+ channame = a->argv[3];
- ast_cli(fd, "Toggling EchoCancel on %s\n", channame);
+ ast_cli(a->fd, "Toggling EchoCancel on %s\n", channame);
tmp = get_chan_by_ast_name(channame);
-
if (!tmp) {
- ast_cli(fd, "Toggling EchoCancel %s failed Channel does not exist\n", channame);
- return 0;
+ ast_cli(a->fd, "Toggling EchoCancel %s failed Channel does not exist\n", channame);
+ return CLI_SUCCESS;
}
tmp->toggle_ec = tmp->toggle_ec?0:1;
@@ -1370,45 +1573,57 @@ static int misdn_toggle_echocancel(int fd, int argc, char *argv[])
manager_ec_disable(tmp->bc);
}
- return 0;
+ return CLI_SUCCESS;
}
-static int misdn_send_display(int fd, int argc, char *argv[])
+static char *handle_cli_misdn_send_display(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- char *channame;
- char *msg;
+ char *channame;
+ char *msg;
struct chan_list *tmp;
- if (argc != 5)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "misdn send display";
+ e->usage =
+ "Usage: misdn send display <channel> \"<msg>\" \n"
+ " Send <msg> to <channel> as Display Message\n"
+ " when channel is a mISDN channel\n";
+ return NULL;
+ case CLI_GENERATE:
+ return complete_ch(a);
+ }
+
+ if (a->argc != 5)
+ return CLI_SHOWUSAGE;
- channame = argv[3];
- msg = argv[4];
+ channame = a->argv[3];
+ msg = a->argv[4];
- ast_cli(fd, "Sending %s to %s\n", msg, channame);
+ ast_cli(a->fd, "Sending %s to %s\n", msg, channame);
tmp = get_chan_by_ast_name(channame);
if (tmp && tmp->bc) {
ast_copy_string(tmp->bc->display, msg, sizeof(tmp->bc->display));
misdn_lib_send_event(tmp->bc, EVENT_INFORMATION);
} else {
- ast_cli(fd, "No such channel %s\n", channame);
- return RESULT_FAILURE;
+ ast_cli(a->fd, "No such channel %s\n", channame);
+ return CLI_SUCCESS;
}
- return RESULT_SUCCESS ;
+ return CLI_SUCCESS;
}
-static char *complete_ch_helper(const char *line, const char *word, int pos, int state, int rpos)
+static char *complete_ch_helper(struct ast_cli_args *a, int rpos)
{
struct ast_channel *c;
int which = 0;
char *ret;
- if (pos != rpos)
+ if (a->pos != rpos)
return NULL;
for (c = ast_channel_walk_locked(NULL); c; c = ast_channel_walk_locked(c)) {
- if (!strncasecmp(word, c->name, strlen(word))) {
- if (++which > state)
+ if (!strncasecmp(a->word, c->name, strlen(a->word))) {
+ if (++which > a->n)
break;
}
ast_mutex_unlock(&c->lock);
@@ -1421,69 +1636,69 @@ static char *complete_ch_helper(const char *line, const char *word, int pos, int
return ret;
}
-static char *complete_ch(const char *line, const char *word, int pos, int state)
+static char *complete_ch(struct ast_cli_args *a)
{
- return complete_ch_helper(line, word, pos, state, 3);
+ return complete_ch_helper(a, 3);
}
-static char *complete_debug_port (const char *line, const char *word, int pos, int state)
+static char *complete_debug_port (struct ast_cli_args *a)
{
- if (state)
+ if (a->n)
return NULL;
- switch (pos) {
+ switch (a->pos) {
case 4:
- if (*word == 'p')
+ if (a->word[0] == 'p')
return ast_strdup("port");
- else if (*word == 'o')
+ else if (a->word[0] == 'o')
return ast_strdup("only");
break;
case 6:
- if (*word == 'o')
+ if (a->word[0] == 'o')
return ast_strdup("only");
break;
}
return NULL;
}
-static char *complete_show_config (const char *line, const char *word, int pos, int state)
+static char *complete_show_config(struct ast_cli_args *a)
{
char buffer[BUFFERSIZE];
enum misdn_cfg_elements elem;
- int wordlen = strlen(word);
+ int wordlen = strlen(a->word);
int which = 0;
int port = 0;
- switch (pos) {
+ switch (a->pos) {
case 3:
- if ((!strncmp(word, "description", wordlen)) && (++which > state))
+ if ((!strncmp(a->word, "description", wordlen)) && (++which > a->n))
return ast_strdup("description");
- if ((!strncmp(word, "descriptions", wordlen)) && (++which > state))
+ if ((!strncmp(a->word, "descriptions", wordlen)) && (++which > a->n))
return ast_strdup("descriptions");
- if ((!strncmp(word, "0", wordlen)) && (++which > state))
+ if ((!strncmp(a->word, "0", wordlen)) && (++which > a->n))
return ast_strdup("0");
while ((port = misdn_cfg_get_next_port(port)) != -1) {
snprintf(buffer, sizeof(buffer), "%d", port);
- if ((!strncmp(word, buffer, wordlen)) && (++which > state)) {
+ if ((!strncmp(a->word, buffer, wordlen)) && (++which > a->n)) {
return ast_strdup(buffer);
}
}
break;
case 4:
- if (strstr(line, "description ")) {
+ if (strstr(a->line, "description ")) {
for (elem = MISDN_CFG_FIRST + 1; elem < MISDN_GEN_LAST; ++elem) {
if ((elem == MISDN_CFG_LAST) || (elem == MISDN_GEN_FIRST))
continue;
misdn_cfg_get_name(elem, buffer, sizeof(buffer));
- if (!wordlen || !strncmp(word, buffer, wordlen)) {
- if (++which > state)
+ if (!wordlen || !strncmp(a->word, buffer, wordlen)) {
+ if (++which > a->n)
return ast_strdup(buffer);
}
}
- } else if (strstr(line, "descriptions ")) {
- if ((!wordlen || !strncmp(word, "general", wordlen)) && (++which > state))
+ } else if (strstr(a->line, "descriptions ")) {
+ if ((!wordlen || !strncmp(a->word, "general", wordlen)) && (++which > a->n))
return ast_strdup("general");
- if ((!wordlen || !strncmp(word, "ports", wordlen)) && (++which > state))
+ if ((!wordlen || !strncmp(a->word, "ports", wordlen)) && (++which > a->n))
return ast_strdup("ports");
}
break;
@@ -1492,54 +1707,27 @@ static char *complete_show_config (const char *line, const char *word, int pos,
}
static struct ast_cli_entry chan_misdn_clis[] = {
- { {"misdn","send","calldeflect", NULL}, misdn_send_cd, "Sends CallDeflection to mISDN Channel",
- "Usage: misdn send calldeflect <channel> \"<nr>\" \n", complete_ch },
- { {"misdn","send","digit", NULL}, misdn_send_digit, "Sends DTMF Digit to mISDN Channel",
- "Usage: misdn send digit <channel> \"<msg>\" \n"
- " Send <digit> to <channel> as DTMF Tone\n"
- " when channel is a mISDN channel\n", complete_ch },
- { {"misdn","toggle","echocancel", NULL}, misdn_toggle_echocancel, "Toggles EchoCancel on mISDN Channel",
- "Usage: misdn toggle echocancel <channel>\n", complete_ch },
- { {"misdn","send","display", NULL}, misdn_send_display, "Sends Text to mISDN Channel",
- "Usage: misdn send display <channel> \"<msg>\" \n"
- " Send <msg> to <channel> as Display Message\n"
- " when channel is a mISDN channel\n", complete_ch },
- { {"misdn","show","config", NULL}, misdn_show_config, "Shows internal mISDN config, read from cfg-file",
- "Usage: misdn show config [<port> | description <config element> | descriptions [general|ports]]\n"
- " Use 0 for <port> to only print the general config.\n", complete_show_config },
- { {"misdn","reload", NULL}, misdn_reload, "Reloads internal mISDN config, read from cfg-file",
- "Usage: misdn reload\n" },
- { {"misdn","set","tics", NULL}, misdn_set_tics, "",
- "\n" },
- { {"misdn","show","channels", NULL}, misdn_show_cls, "Shows internal mISDN chan_list",
- "Usage: misdn show channels\n" },
- { {"misdn","show","channel", NULL}, misdn_show_cl, "Shows internal mISDN chan_list",
- "Usage: misdn show channels\n", complete_ch },
- { {"misdn","port","block", NULL}, misdn_port_block, "Blocks the given port",
- "Usage: misdn port block\n" },
- { {"misdn","port","unblock", NULL}, misdn_port_unblock, "Unblocks the given port",
- "Usage: misdn port unblock\n" },
- { {"misdn","restart","port", NULL}, misdn_restart_port, "Restarts the given port",
- "Usage: misdn restart port\n" },
- { {"misdn","send","restart", NULL}, misdn_send_restart,
- "Sends a restart for every bchannel on the given port",
- "Usage: misdn send restart <port>\n"},
- { {"misdn","restart","pid", NULL}, misdn_restart_pid, "Restarts the given pid",
- "Usage: misdn restart pid\n" },
- { {"misdn","port","up", NULL}, misdn_port_up, "Tries to establish L1 on the given port",
- "Usage: misdn port up <port>\n" },
- { {"misdn","port","down", NULL}, misdn_port_down, "Tries to deacivate the L1 on the given port",
- "Usage: misdn port down <port>\n" },
- { {"misdn","show","stacks", NULL}, misdn_show_stacks, "Shows internal mISDN stack_list",
- "Usage: misdn show stacks\n" },
- { {"misdn","show","ports","stats", NULL}, misdn_show_ports_stats, "Shows chan_misdns call statistics per port",
- "Usage: misdn show port stats\n" },
- { {"misdn","show","port", NULL}, misdn_show_port, "Shows detailed information for given port",
- "Usage: misdn show port <port>\n" },
- { {"misdn","set","debug", NULL}, misdn_set_debug, "Sets Debuglevel of chan_misdn",
- "Usage: misdn set debug <level> [only] | [port <port> [only]]\n", complete_debug_port },
- { {"misdn","set","crypt","debug", NULL}, misdn_set_crypt_debug, "Sets CryptDebuglevel of chan_misdn, at the moment, level={1,2}",
- "Usage: misdn set crypt debug <level>\n" }
+ NEW_CLI(handle_cli_misdn_port_block, "Block the given port"),
+ NEW_CLI(handle_cli_misdn_port_down, "Try to deacivate the L1 on the given port"),
+ NEW_CLI(handle_cli_misdn_port_unblock, "Unblock the given port"),
+ NEW_CLI(handle_cli_misdn_port_up, "Try to establish L1 on the given port"),
+ NEW_CLI(handle_cli_misdn_reload, "Reload internal mISDN config, read from the config file"),
+ NEW_CLI(handle_cli_misdn_restart_pid, "Restart the given pid"),
+ NEW_CLI(handle_cli_misdn_restart_port, "Restart the given port"),
+ NEW_CLI(handle_cli_misdn_show_channel, "Show an internal mISDN channel"),
+ NEW_CLI(handle_cli_misdn_show_channels, "Show the internal mISDN channel list"),
+ NEW_CLI(handle_cli_misdn_show_config, "Show internal mISDN config, read from the config file"),
+ NEW_CLI(handle_cli_misdn_show_port, "Show detailed information for given port"),
+ NEW_CLI(handle_cli_misdn_show_ports_stats, "Show mISDNs channel's call statistics per port"),
+ NEW_CLI(handle_cli_misdn_show_stacks, "Show internal mISDN stack_list"),
+ NEW_CLI(handle_cli_misdn_send_calldeflect, "Send CallDeflection to mISDN Channel"),
+ NEW_CLI(handle_cli_misdn_send_digit, "Send DTMF digit to mISDN Channel"),
+ NEW_CLI(handle_cli_misdn_send_display, "Send Text to mISDN Channel"),
+ NEW_CLI(handle_cli_misdn_send_restart, "Send a restart for every bchannel on the given port"),
+ NEW_CLI(handle_cli_misdn_set_crypt_debug, "Set CryptDebuglevel of chan_misdn, at the moment, level={1,2}"),
+ NEW_CLI(handle_cli_misdn_set_debug, "Set Debuglevel of chan_misdn"),
+ NEW_CLI(handle_cli_misdn_set_tics, "???"),
+ NEW_CLI(handle_cli_misdn_toggle_echocancel, "Toggle EchoCancel on mISDN Channel"),
};
static int update_config(struct chan_list *ch, int orig)
diff --git a/channels/chan_usbradio.c b/channels/chan_usbradio.c
index 6e26e1e4c..cc1572501 100644
--- a/channels/chan_usbradio.c
+++ b/channels/chan_usbradio.c
@@ -1606,77 +1606,134 @@ static struct ast_channel *usbradio_request(const char *type, int format, void *
return c;
}
-static int console_key(int fd, int argc, char *argv[])
+static char *handle_cli_radio_key(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- struct chan_usbradio_pvt *o = find_desc(usbradio_active);
+ struct chan_usbradio_pvt *o = NULL;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "radio key";
+ e->usage =
+ "Usage: radio key\n"
+ " Simulates COR active.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 2)
+ return CLI_SHOWUSAGE;
- if (argc != 2)
- return RESULT_SHOWUSAGE;
+ o = find_desc(usbradio_active);
o->txtestkey = 1;
- return RESULT_SUCCESS;
+
+ return CLI_SUCCESS;
}
-static int console_unkey(int fd, int argc, char *argv[])
+static char *handle_cli_radio_unkey(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- struct chan_usbradio_pvt *o = find_desc(usbradio_active);
+ struct chan_usbradio_pvt *o = NULL;
- if (argc != 2)
- return RESULT_SHOWUSAGE;
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "radio unkey";
+ e->usage =
+ "Usage: radio unkey\n"
+ " Simulates COR un-active.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 2)
+ return CLI_SHOWUSAGE;
+
+ o = find_desc(usbradio_active);
o->txtestkey = 0;
- return RESULT_SUCCESS;
+ return CLI_SUCCESS;
}
-static int radio_tune(int fd, int argc, char *argv[])
+static char *handle_cli_radio_tune(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- struct chan_usbradio_pvt *o = find_desc(usbradio_active);
- int i=0;
+ struct chan_usbradio_pvt *o = NULL;
+ int i = 0;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "radio tune [rxnoise|rxvoice|rxtone|rxsquelch|rxcap|rxtracecap|"
+ "txvoice|txtone|txcap|txtracecap|auxvoice|nocap|dump|save]";
+ /* radio tune 6 3000 measured tx value */
+ e->usage =
+ "Usage: radio tune <function>\n"
+ " rxnoise\n"
+ " rxvoice\n"
+ " rxtone\n"
+ " rxsquelch [newsetting]\n"
+ " rxcap\n"
+ " rxtracecap\n"
+ " txvoice [newsetting]\n"
+ " txtone [newsetting]\n"
+ " txcap\n"
+ " txtracecap\n"
+ " auxvoice [newsetting]\n"
+ " nocap\n"
+ " dump\n"
+ " save (settings to tuning file)\n"
+ "\n"
+ " All [newsetting]s are values 0-999\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
- if ((argc < 2) || (argc > 4))
- return RESULT_SHOWUSAGE;
+ if ((a->argc < 2) || (a->argc > 4))
+ return CLI_SHOWUSAGE;
- if (argc == 2) /* just show stuff */
+ if (a->argc == 2) /* just show stuff */
{
- ast_cli(fd,"Output A is currently set to ");
- if(o->txmixa==TX_OUT_COMPOSITE)ast_cli(fd,"composite.\n");
- else if (o->txmixa==TX_OUT_VOICE)ast_cli(fd,"voice.\n");
- else if (o->txmixa==TX_OUT_LSD)ast_cli(fd,"tone.\n");
- else if (o->txmixa==TX_OUT_AUX)ast_cli(fd,"auxvoice.\n");
- else ast_cli(fd,"off.\n");
-
- ast_cli(fd,"Output B is currently set to ");
- if(o->txmixb==TX_OUT_COMPOSITE)ast_cli(fd,"composite.\n");
- else if (o->txmixb==TX_OUT_VOICE)ast_cli(fd,"voice.\n");
- else if (o->txmixb==TX_OUT_LSD)ast_cli(fd,"tone.\n");
- else if (o->txmixb==TX_OUT_AUX)ast_cli(fd,"auxvoice.\n");
- else ast_cli(fd,"off.\n");
-
- ast_cli(fd,"Tx Voice Level currently set to %d\n",o->txmixaset);
- ast_cli(fd,"Tx Tone Level currently set to %d\n",o->txctcssadj);
- ast_cli(fd,"Rx Squelch currently set to %d\n",o->rxsquelchadj);
- return RESULT_SHOWUSAGE;
- }
-
- if (!strcasecmp(argv[2],"rxnoise")) tune_rxinput(o);
- else if (!strcasecmp(argv[2],"rxvoice")) tune_rxvoice(o);
- else if (!strcasecmp(argv[2],"rxtone")) tune_rxctcss(o);
- else if (!strcasecmp(argv[2],"rxsquelch"))
+ ast_cli(a->fd,"Output A is currently set to ");
+ if(o->txmixa==TX_OUT_COMPOSITE)ast_cli(a->fd,"composite.\n");
+ else if (o->txmixa==TX_OUT_VOICE)ast_cli(a->fd,"voice.\n");
+ else if (o->txmixa==TX_OUT_LSD)ast_cli(a->fd,"tone.\n");
+ else if (o->txmixa==TX_OUT_AUX)ast_cli(a->fd,"auxvoice.\n");
+ else ast_cli(a->fd,"off.\n");
+
+ ast_cli(a->fd,"Output B is currently set to ");
+ if(o->txmixb==TX_OUT_COMPOSITE)ast_cli(a->fd,"composite.\n");
+ else if (o->txmixb==TX_OUT_VOICE)ast_cli(a->fd,"voice.\n");
+ else if (o->txmixb==TX_OUT_LSD)ast_cli(a->fd,"tone.\n");
+ else if (o->txmixb==TX_OUT_AUX)ast_cli(a->fd,"auxvoice.\n");
+ else ast_cli(a->fd,"off.\n");
+
+ ast_cli(a->fd,"Tx Voice Level currently set to %d\n",o->txmixaset);
+ ast_cli(a->fd,"Tx Tone Level currently set to %d\n",o->txctcssadj);
+ ast_cli(a->fd,"Rx Squelch currently set to %d\n",o->rxsquelchadj);
+ return CLI_SHOWUSAGE;
+ }
+
+ o = find_desc(usbradio_active);
+
+ if (!strcasecmp(a->argv[2],"rxnoise")) tune_rxinput(o);
+ else if (!strcasecmp(a->argv[2],"rxvoice")) tune_rxvoice(o);
+ else if (!strcasecmp(a->argv[2],"rxtone")) tune_rxctcss(o);
+ else if (!strcasecmp(a->argv[2],"rxsquelch"))
{
- if (argc == 3)
+ if (a->argc == 3)
{
- ast_cli(fd,"Current Signal Strength is %d\n",((32767-o->pmrChan->rxRssi)*1000/32767));
- ast_cli(fd,"Current Squelch setting is %d\n",o->rxsquelchadj);
- //ast_cli(fd,"Current Raw RSSI is %d\n",o->pmrChan->rxRssi);
- //ast_cli(fd,"Current (real) Squelch setting is %d\n",*(o->pmrChan->prxSquelchAdjust));
+ ast_cli(a->fd,"Current Signal Strength is %d\n",((32767-o->pmrChan->rxRssi)*1000/32767));
+ ast_cli(a->fd,"Current Squelch setting is %d\n",o->rxsquelchadj);
+ //ast_cli(a->fd,"Current Raw RSSI is %d\n",o->pmrChan->rxRssi);
+ //ast_cli(a->fd,"Current (real) Squelch setting is %d\n",*(o->pmrChan->prxSquelchAdjust));
} else {
- i = atoi(argv[3]);
- if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
- ast_cli(fd,"Changed Squelch setting to %d\n",i);
+ i = atoi(a->argv[3]);
+ if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
+ ast_cli(a->fd,"Changed Squelch setting to %d\n",i);
o->rxsquelchadj = i;
*(o->pmrChan->prxSquelchAdjust)= ((999 - i) * 32767) / 1000;
}
}
- else if (!strcasecmp(argv[2],"txvoice")) {
+ else if (!strcasecmp(a->argv[2],"txvoice")) {
i = 0;
if( (o->txmixa!=TX_OUT_VOICE) && (o->txmixb!=TX_OUT_VOICE) &&
@@ -1685,87 +1742,87 @@ static int radio_tune(int fd, int argc, char *argv[])
{
ast_log(LOG_ERROR,"No txvoice output configured.\n");
}
- else if (argc == 3)
+ else if (a->argc == 3)
{
if((o->txmixa==TX_OUT_VOICE)||(o->txmixa==TX_OUT_COMPOSITE))
- ast_cli(fd,"Current txvoice setting on Channel A is %d\n",o->txmixaset);
+ ast_cli(a->fd,"Current txvoice setting on Channel A is %d\n",o->txmixaset);
else
- ast_cli(fd,"Current txvoice setting on Channel B is %d\n",o->txmixbset);
+ ast_cli(a->fd,"Current txvoice setting on Channel B is %d\n",o->txmixbset);
}
else
{
- i = atoi(argv[3]);
- if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
+ i = atoi(a->argv[3]);
+ if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
if((o->txmixa==TX_OUT_VOICE)||(o->txmixa==TX_OUT_COMPOSITE))
{
o->txmixaset=i;
- ast_cli(fd,"Changed txvoice setting on Channel A to %d\n",o->txmixaset);
+ ast_cli(a->fd,"Changed txvoice setting on Channel A to %d\n",o->txmixaset);
}
else
{
o->txmixbset=i;
- ast_cli(fd,"Changed txvoice setting on Channel B to %d\n",o->txmixbset);
+ ast_cli(a->fd,"Changed txvoice setting on Channel B to %d\n",o->txmixbset);
}
mixer_write(o);
mult_set(o);
- ast_cli(fd,"Changed Tx Voice Output setting to %d\n",i);
+ ast_cli(a->fd,"Changed Tx Voice Output setting to %d\n",i);
}
tune_txoutput(o,i);
}
- else if (!strcasecmp(argv[2],"auxvoice")) {
+ else if (!strcasecmp(a->argv[2],"auxvoice")) {
i = 0;
if( (o->txmixa!=TX_OUT_AUX) && (o->txmixb!=TX_OUT_AUX))
{
ast_log(LOG_WARNING,"No auxvoice output configured.\n");
}
- else if (argc == 3)
+ else if (a->argc == 3)
{
if(o->txmixa==TX_OUT_AUX)
- ast_cli(fd,"Current auxvoice setting on Channel A is %d\n",o->txmixaset);
+ ast_cli(a->fd,"Current auxvoice setting on Channel A is %d\n",o->txmixaset);
else
- ast_cli(fd,"Current auxvoice setting on Channel B is %d\n",o->txmixbset);
+ ast_cli(a->fd,"Current auxvoice setting on Channel B is %d\n",o->txmixbset);
}
else
{
- i = atoi(argv[3]);
- if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
+ i = atoi(a->argv[3]);
+ if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
if(o->txmixa==TX_OUT_AUX)
{
o->txmixbset=i;
- ast_cli(fd,"Changed auxvoice setting on Channel A to %d\n",o->txmixaset);
+ ast_cli(a->fd,"Changed auxvoice setting on Channel A to %d\n",o->txmixaset);
}
else
{
o->txmixbset=i;
- ast_cli(fd,"Changed auxvoice setting on Channel B to %d\n",o->txmixbset);
+ ast_cli(a->fd,"Changed auxvoice setting on Channel B to %d\n",o->txmixbset);
}
mixer_write(o);
mult_set(o);
}
//tune_auxoutput(o,i);
}
- else if (!strcasecmp(argv[2],"txtone"))
+ else if (!strcasecmp(a->argv[2],"txtone"))
{
- if (argc == 3)
- ast_cli(fd,"Current Tx CTCSS modulation setting = %d\n",o->txctcssadj);
+ if (a->argc == 3)
+ ast_cli(a->fd,"Current Tx CTCSS modulation setting = %d\n",o->txctcssadj);
else
{
- i = atoi(argv[3]);
- if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
+ i = atoi(a->argv[3]);
+ if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
o->txctcssadj = i;
set_txctcss_level(o);
- ast_cli(fd,"Changed Tx CTCSS modulation setting to %i\n",i);
+ ast_cli(a->fd,"Changed Tx CTCSS modulation setting to %i\n",i);
}
o->txtestkey=1;
usleep(5000000);
o->txtestkey=0;
}
- else if (!strcasecmp(argv[2],"dump")) pmrdump(o);
- else if (!strcasecmp(argv[2],"nocap"))
+ else if (!strcasecmp(a->argv[2],"dump")) pmrdump(o);
+ else if (!strcasecmp(a->argv[2],"nocap"))
{
- ast_cli(fd,"File capture (trace) was rx=%d tx=%d and now off.\n",o->b.rxcap2,o->b.txcap2);
- ast_cli(fd,"File capture (raw) was rx=%d tx=%d and now off.\n",o->b.rxcapraw,o->b.txcapraw);
+ ast_cli(a->fd,"File capture (trace) was rx=%d tx=%d and now off.\n",o->b.rxcap2,o->b.txcap2);
+ ast_cli(a->fd,"File capture (raw) was rx=%d tx=%d and now off.\n",o->b.rxcapraw,o->b.txcapraw);
o->b.rxcapraw=o->b.txcapraw=o->b.rxcap2=o->b.txcap2=o->pmrChan->b.rxCapture=o->pmrChan->b.txCapture=0;
if (frxcapraw) { fclose(frxcapraw); frxcapraw = NULL; }
if (frxcaptrace) { fclose(frxcaptrace); frxcaptrace = NULL; }
@@ -1774,37 +1831,37 @@ static int radio_tune(int fd, int argc, char *argv[])
if (ftxcaptrace) { fclose(ftxcaptrace); ftxcaptrace = NULL; }
if (ftxoutraw) { fclose(ftxoutraw); ftxoutraw = NULL; }
}
- else if (!strcasecmp(argv[2],"rxtracecap"))
+ else if (!strcasecmp(a->argv[2],"rxtracecap"))
{
if (!frxcaptrace) frxcaptrace= fopen(RX_CAP_TRACE_FILE,"w");
- ast_cli(fd,"Trace rx on.\n");
+ ast_cli(a->fd,"Trace rx on.\n");
o->b.rxcap2=o->pmrChan->b.rxCapture=1;
}
- else if (!strcasecmp(argv[2],"txtracecap"))
+ else if (!strcasecmp(a->argv[2],"txtracecap"))
{
if (!ftxcaptrace) ftxcaptrace= fopen(TX_CAP_TRACE_FILE,"w");
- ast_cli(fd,"Trace tx on.\n");
+ ast_cli(a->fd,"Trace tx on.\n");
o->b.txcap2=o->pmrChan->b.txCapture=1;
}
- else if (!strcasecmp(argv[2],"rxcap"))
+ else if (!strcasecmp(a->argv[2],"rxcap"))
{
if (!frxcapraw) frxcapraw = fopen(RX_CAP_RAW_FILE,"w");
- ast_cli(fd,"cap rx raw on.\n");
+ ast_cli(a->fd,"cap rx raw on.\n");
o->b.rxcapraw=1;
}
- else if (!strcasecmp(argv[2],"txcap"))
+ else if (!strcasecmp(a->argv[2],"txcap"))
{
if (!ftxcapraw) ftxcapraw = fopen(TX_CAP_RAW_FILE,"w");
- ast_cli(fd,"cap tx raw on.\n");
+ ast_cli(a->fd,"cap tx raw on.\n");
o->b.txcapraw=1;
}
- else if (!strcasecmp(argv[2],"save"))
+ else if (!strcasecmp(a->argv[2],"save"))
{
tune_write(o);
- ast_cli(fd,"Saved radio tuning settings to usbradio_tune.conf\n");
+ ast_cli(a->fd,"Saved radio tuning settings to usbradio_tune.conf\n");
}
- else return RESULT_SHOWUSAGE;
- return RESULT_SUCCESS;
+ else return CLI_SHOWUSAGE;
+ return CLI_SUCCESS;
}
/*
@@ -1835,68 +1892,41 @@ static int set_txctcss_level(struct chan_usbradio_pvt *o)
/*
CLI debugging on and off
*/
-static int radio_set_debug(int fd, int argc, char *argv[])
+static char *handle_cli_radio_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
- struct chan_usbradio_pvt *o = find_desc(usbradio_active);
-
- o->debuglevel=1;
- ast_cli(fd,"usbradio debug on.\n");
+ struct chan_usbradio_pvt *o = NULL;
- return RESULT_SUCCESS;
-}
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "radio set debug [off]";
+ e->usage =
+ "Usage: radio set debug [off]\n"
+ " Enable/Disable radio debugging.\n";
+ case CLI_GENERATE:
+ return NULL;
+ }
+ if (a->argc < 3 || a->argc > 4)
+ return CLI_SHOWUSAGE;
+ if (a->argc == 4 && strncasecmp(a->argv[3], "off", 3))
+ return CLI_SHOWUSAGE;
-static int radio_set_debug_off(int fd, int argc, char *argv[])
-{
- struct chan_usbradio_pvt *o = find_desc(usbradio_active);
+ o = find_desc(usbradio_active);
- o->debuglevel=0;
- ast_cli(fd,"usbradio debug off.\n");
- return RESULT_SUCCESS;
-}
+ if (a->argc == 3)
+ o->debuglevel = 1;
+ else
+ o->debuglevel = 0;
-static char key_usage[] =
- "Usage: radio key\n"
- " Simulates COR active.\n";
+ ast_cli(a->fd, "USB Radio debugging %s.\n", o->debuglevel ? "enabled" : "disabled");
-static char unkey_usage[] =
- "Usage: radio unkey\n"
- " Simulates COR un-active.\n";
+ return CLI_SUCCESS;
+}
-/*
-radio tune 6 3000 measured tx value
-*/
-static char radio_tune_usage[] =
- "Usage: radio tune <function>\n"
- " rxnoise\n"
- " rxvoice\n"
- " rxtone\n"
- " rxsquelch [newsetting]\n"
- " txvoice [newsetting]\n"
- " txtone [newsetting]\n"
- " auxvoice [newsetting]\n"
- " save (settings to tuning file)\n"
- "\n All [newsetting]'s are values 0-999\n\n";
-
static struct ast_cli_entry cli_usbradio[] = {
- { { "radio", "key", NULL },
- console_key, "Simulate Rx Signal Present",
- key_usage, NULL, NULL},
-
- { { "radio", "unkey", NULL },
- console_unkey, "Simulate Rx Signal Lusb",
- unkey_usage, NULL, NULL },
-
- { { "radio", "tune", NULL },
- radio_tune, "Radio Tune",
- radio_tune_usage, NULL, NULL },
-
- { { "radio", "set", "debug", NULL },
- radio_set_debug, "Radio Debug",
- radio_tune_usage, NULL, NULL },
-
- { { "radio", "set", "debug", "off", NULL },
- radio_set_debug_off, "Radio Debug",
- radio_tune_usage, NULL, NULL },
+ NEW_CLI(handle_cli_radio_key, "Simulate Rx Signal Present"),
+ NEW_CLI(handle_cli_radio_unkey, "Simulate Rx Signal Lusb"),
+ NEW_CLI(handle_cli_radio_tune, "Radio Tune"),
+ NEW_CLI(handle_cli_radio_set_debug, "Enable/Disable Radio Debugging"),
};
/*