Index: chan_mobile.c =================================================================== --- chan_mobile.c (revision 473) +++ chan_mobile.c (working copy) @@ -174,26 +174,19 @@ static AST_LIST_HEAD_STATIC(devices, mbl_pvt); /* CLI stuff */ -static const char show_usage[] = -"Usage: mobile show devices\n" -" Shows the state of Bluetooth Cell / Mobile devices.\n"; +static char *handle_cli_mobile_show_devices(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); +static char *handle_cli_mobile_search(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); +static char *handle_cli_mobile_rfcomm(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); -static const char search_usage[] = -"Usage: mobile search\n" -" Searches for Bluetooth Cell / Mobile devices in range.\n"; - -static const char rfcomm_usage[] = -"Usage: mobile rfcomm command\n" -" Send command to the rfcomm port.\n"; - -static int do_show_devices(int, int, char **); -static int do_search_devices(int, int, char **); -static int do_send_rfcomm(int, int, char **); - static struct ast_cli_entry mbl_cli[] = { + AST_CLI(handle_cli_mobile_show_devices, "Show Bluetooth Cell / Mobile devices"), + AST_CLI(handle_cli_mobile_search, "Search for Bluetooth Cell / Mobile devices"), + AST_CLI(handle_cli_mobile_rfcomm, "Send commands to the rfcomm port for debugging"), +/* {{"mobile", "show", "devices", NULL}, do_show_devices, "Show Bluetooth Cell / Mobile devices", show_usage}, {{"mobile", "search", NULL}, do_search_devices, "Search for Bluetooth Cell / Mobile devices", search_usage}, {{"mobile", "rfcomm", NULL}, do_send_rfcomm, "Send commands to the rfcomm port for debugging", rfcomm_usage}, +*/ }; /* App stuff */ @@ -254,35 +247,46 @@ .devicestate = mbl_devicestate }; -/* +/* CLI Commands implementation */ - CLI Commands implementation - -*/ - -static int do_show_devices(int fd, int argc, char **argv) +static char *handle_cli_mobile_show_devices(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - struct mbl_pvt *pvt; char bdaddr[18]; char group[6]; - #define FORMAT "%-15.15s %-17.17s %-5.5s %-15.15s %-9.9s %-5.5s %-3.3s\n" +#define FORMAT1 "%-15.15s %-17.17s %-5.5s %-15.15s %-9.9s %-5.5s %-3.3s\n" - ast_cli(fd, FORMAT, "ID", "Address", "Group", "Adapter", "Connected", "State", "SMS"); + switch (cmd) { + case CLI_INIT: + e->command = "mobile show devices"; + e->usage = + "Usage: mobile show devices\n" + " Shows the state of Bluetooth Cell / Mobile devices.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc != 3) + return CLI_SHOWUSAGE; + + ast_cli(a->fd, FORMAT1, "ID", "Address", "Group", "Adapter", "Connected", "State", "SMS"); AST_LIST_TRAVERSE(&devices, pvt, entry) { ba2str(&pvt->addr, bdaddr); snprintf(group, 5, "%d", pvt->group); - ast_cli(fd, FORMAT, pvt->id, bdaddr, group, pvt->adapter->id, pvt->connected?"Yes":"No", (pvt->state == MBL_STATE_IDLE)?"Free":(pvt->state < MBL_STATE_IDLE)?"Init":"Busy", (pvt->has_sms)?"Yes":"No"); - } + ast_cli(a->fd, FORMAT1, pvt->id, bdaddr, group, pvt->adapter->id, pvt->connected ? "Yes" : "No", + (pvt->state == MBL_STATE_IDLE) ? "Free" : (pvt->state < MBL_STATE_IDLE) ? "Init" : "Busy", + (pvt->has_sms) ? "Yes" : "No"); + } - return RESULT_SUCCESS; +#undef FORMAT1 + return CLI_SUCCESS; } -static int do_search_devices(int fd, int argc, char **argv) +static char *handle_cli_mobile_search(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - struct adapter_pvt *adapter; inquiry_info *ii = NULL; int max_rsp, num_rsp; @@ -291,19 +295,34 @@ char addr[19] = {0}; char name[31] = {0}; - #define FORMAT2 "%-17.17s %-30.30s %-6.6s %-7.7s %-4.4s\n" - #define FORMAT3 "%-17.17s %-30.30s %-6.6s %-7.7s %d\n" +#define FORMAT1 "%-17.17s %-30.30s %-6.6s %-7.7s %-4.4s\n" +#define FORMAT2 "%-17.17s %-30.30s %-6.6s %-7.7s %d\n" + switch (cmd) { + case CLI_INIT: + e->command = "mobile search"; + e->usage = + "Usage: mobile search\n" + " Searches for Bluetooth Cell / Mobile devices in range.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc != 2) + return CLI_SHOWUSAGE; + /* find a free adapter */ AST_LIST_TRAVERSE(&adapters, adapter, entry) { if (!adapter->inuse) break; } + if (!adapter) { - ast_cli(fd, "All Bluetooth adapters are in use at this time.\n"); - return RESULT_SUCCESS; + ast_cli(a->fd, "All Bluetooth adapters are in use at this time.\n"); + return CLI_SUCCESS; } - + len = 8; max_rsp = 255; flags = IREQ_CACHE_FLUSH; @@ -311,52 +330,63 @@ ii = alloca(max_rsp * sizeof(inquiry_info)); num_rsp = hci_inquiry(adapter->dev_id, len, max_rsp, NULL, &ii, flags); if (num_rsp > 0) { - ast_cli(fd, FORMAT2, "Address", "Name", "Usable", "Type", "Port"); + ast_cli(a->fd, FORMAT1, "Address", "Name", "Usable", "Type", "Port"); for (i = 0; i < num_rsp; i++) { - ba2str(&(ii+i)->bdaddr, addr); + ba2str(&(ii + i)->bdaddr, addr); name[0] = 0x00; - if (hci_read_remote_name(adapter->hci_socket, &(ii+i)->bdaddr, sizeof(name)-1, name, 0) < 0) + if (hci_read_remote_name(adapter->hci_socket, &(ii + i)->bdaddr, sizeof(name) - 1, name, 0) < 0) strcpy(name, "[unknown]"); phport = sdp_search(addr, HANDSFREE_AGW_PROFILE_ID); if (!phport) hsport = sdp_search(addr, HEADSET_PROFILE_ID); else hsport = 0; - ast_cli(fd, FORMAT3, addr, name, (phport > 0 || hsport > 0)?"Yes":"No", (phport > 0)?"Phone":"Headset", (phport > 0)?phport:hsport); + ast_cli(a->fd, FORMAT2, addr, name, (phport > 0 || hsport > 0) ? "Yes" : "No", + (phport > 0) ? "Phone" : "Headset", (phport > 0) ? phport : hsport); } } else - ast_cli(fd, "No Bluetooth Cell / Mobile devices found.\n"); + ast_cli(a->fd, "No Bluetooth Cell / Mobile devices found.\n"); - return RESULT_SUCCESS; +#undef FORMAT +#undef FORMAT2 + return CLI_SUCCESS; } -static int do_send_rfcomm(int fd, int argc, char **argv) +static char *handle_cli_mobile_rfcomm(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - - struct mbl_pvt *pvt; char buf[128]; + struct mbl_pvt *pvt = NULL; - if (argc != 4) { - ast_cli(fd, "You must specify the name of the device and command.\n"); - return RESULT_SUCCESS; + switch (cmd) { + case CLI_INIT: + e->command = "mobile rfcomm"; + e->usage = + "Usage: mobile rfcomm \n" + " Send to the rfcomm port on the device\n" + " with the specified .\n"; + return NULL; + case CLI_GENERATE: + return NULL; } + if (a->argc != 4) + return CLI_SHOWUSAGE; + AST_LIST_TRAVERSE(&devices, pvt, entry) { - if (!strcmp(pvt->id, argv[2])) + if (!strcmp(pvt->id, a->argv[2])) break; } if (!pvt || !pvt->connected) { - ast_cli(fd, "Device %s not found.\n", argv[2]); - return RESULT_SUCCESS; + ast_cli(a->fd, "Device %s not found.\n", a->argv[2]); + return CLI_SUCCESS; } - sprintf(buf, "%s\r", argv[3]); + snprintf(buf, sizeof(buf), "%s\r", a->argv[3]); rfcomm_write(pvt, buf); - return RESULT_SUCCESS; - + return CLI_SUCCESS; } /* Index: cdr_addon_mysql.c =================================================================== --- cdr_addon_mysql.c (revision 473) +++ cdr_addon_mysql.c (working copy) @@ -84,12 +84,22 @@ static MYSQL mysql; -static char cdr_mysql_status_help[] = -"Usage: cdr mysql status\n" -" Shows current connection status for cdr_mysql\n"; +static char *handle_cli_cdr_mysql_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + switch (cmd) { + case CLI_INIT: + e->command = "cdr mysql status"; + e->usage = + "Usage: cdr mysql status\n" + " Shows current connection status for cdr_mysql\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } -static int handle_cdr_mysql_status(int fd, int argc, char *argv[]) -{ + if (a->argc != 3) + return CLI_SHOWUSAGE; + if (connected) { char status[256], status2[100] = ""; int ctime = time(NULL) - connect_time; @@ -105,31 +115,30 @@ if (!ast_strlen_zero(dbtable->str)) snprintf(status2, 99, " using table %s", dbtable->str); if (ctime > 31536000) { - ast_cli(fd, "%s%s for %d years, %d days, %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 31536000, (ctime % 31536000) / 86400, (ctime % 86400) / 3600, (ctime % 3600) / 60, ctime % 60); + ast_cli(a->fd, "%s%s for %d years, %d days, %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 31536000, (ctime % 31536000) / 86400, (ctime % 86400) / 3600, (ctime % 3600) / 60, ctime % 60); } else if (ctime > 86400) { - ast_cli(fd, "%s%s for %d days, %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 86400, (ctime % 86400) / 3600, (ctime % 3600) / 60, ctime % 60); + ast_cli(a->fd, "%s%s for %d days, %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 86400, (ctime % 86400) / 3600, (ctime % 3600) / 60, ctime % 60); } else if (ctime > 3600) { - ast_cli(fd, "%s%s for %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 3600, (ctime % 3600) / 60, ctime % 60); + ast_cli(a->fd, "%s%s for %d hours, %d minutes, %d seconds.\n", status, status2, ctime / 3600, (ctime % 3600) / 60, ctime % 60); } else if (ctime > 60) { - ast_cli(fd, "%s%s for %d minutes, %d seconds.\n", status, status2, ctime / 60, ctime % 60); + ast_cli(a->fd, "%s%s for %d minutes, %d seconds.\n", status, status2, ctime / 60, ctime % 60); } else { - ast_cli(fd, "%s%s for %d seconds.\n", status, status2, ctime); + ast_cli(a->fd, "%s%s for %d seconds.\n", status, status2, ctime); } if (records == totalrecords) - ast_cli(fd, " Wrote %d records since last restart.\n", totalrecords); + ast_cli(a->fd, " Wrote %d records since last restart.\n", totalrecords); else - ast_cli(fd, " Wrote %d records since last restart and %d records since last reconnect.\n", totalrecords, records); - return RESULT_SUCCESS; + ast_cli(a->fd, " Wrote %d records since last restart and %d records since last reconnect.\n", totalrecords, records); } else { - ast_cli(fd, "Not currently connected to a MySQL server.\n"); - return RESULT_FAILURE; + ast_cli(a->fd, "Not currently connected to a MySQL server.\n"); } + + return CLI_SUCCESS; } -static struct ast_cli_entry cdr_mysql_status_cli = - { { "cdr", "mysql", "status", NULL }, - handle_cdr_mysql_status, "Show connection status of cdr_mysql", - cdr_mysql_status_help, NULL }; +static struct ast_cli_entry cdr_mysql_status_cli[] = { + AST_CLI(handle_cli_cdr_mysql_status, "Show connection status of cdr_mysql"), +}; static int mysql_log(struct ast_cdr *cdr) { @@ -260,7 +269,7 @@ { struct unload_string *us; - ast_cli_unregister(&cdr_mysql_status_cli); + ast_cli_unregister_multiple(cdr_mysql_status_cli, sizeof(cdr_mysql_status_cli) / sizeof(struct ast_cli_entry)); if (connected) { mysql_close(&mysql); @@ -445,7 +454,7 @@ if (res) { ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n"); } else { - res = ast_cli_register(&cdr_mysql_status_cli); + res = ast_cli_register_multiple(cdr_mysql_status_cli, sizeof(cdr_mysql_status_cli) / sizeof(struct ast_cli_entry)); } return res; Index: res_config_mysql.c =================================================================== --- res_config_mysql.c (revision 473) +++ res_config_mysql.c (working copy) @@ -77,17 +77,16 @@ static int parse_config(void); static int mysql_reconnect(struct mysql_conn *conn); -static int realtime_mysql_status(int fd, int argc, char **argv); +static char *handle_cli_realtime_mysql_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); static int load_mysql_config(struct ast_config *config, const char *category, struct mysql_conn *conn); -static char cli_realtime_mysql_status_usage[] = -"Usage: realtime mysql status\n" -" Shows connection information for the MySQL RealTime driver\n"; - -static struct ast_cli_entry cli_realtime_mysql_status = { +static struct ast_cli_entry cli_realtime_mysql_status[] = { + AST_CLI(handle_cli_realtime_mysql_status, "Shows connection information for the MySQL RealTime driver"), +}; +/* { "realtime", "mysql", "status", NULL }, realtime_mysql_status, "Shows connection information for the MySQL RealTime driver", cli_realtime_mysql_status_usage, NULL }; - +*/ static struct ast_variable *realtime_mysql(const char *database, const char *table, va_list ap) { MYSQL_RES *result; @@ -645,14 +644,14 @@ ast_config_engine_register(&mysql_engine); if (option_verbose > 1) ast_verbose(VERBOSE_PREFIX_2 "MySQL RealTime driver loaded.\n"); - ast_cli_register(&cli_realtime_mysql_status); + ast_cli_register_multiple(cli_realtime_mysql_status, sizeof(cli_realtime_mysql_status) / sizeof(struct ast_cli_entry)); return 0; } static int unload_module(void) { - ast_cli_unregister(&cli_realtime_mysql_status); + ast_cli_unregister_multiple(cli_realtime_mysql_status, sizeof(cli_realtime_mysql_status) / sizeof(struct ast_cli_entry)); ast_config_engine_deregister(&mysql_engine); if (option_verbose > 1) ast_verbose(VERBOSE_PREFIX_2 "MySQL RealTime unloaded.\n"); @@ -869,11 +868,27 @@ } } -static int realtime_mysql_status(int fd, int argc, char **argv) +static char *handle_cli_realtime_mysql_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { char status[256], status2[100] = ""; - int ctime = time(NULL) - dbread.connect_time; + int ctime = 0; + switch (cmd) { + case CLI_INIT: + e->command = "realtime mysql status"; + e->usage = + "Usage: realtime mysql status\n" + " Shows connection information for the MySQL RealTime driver\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc != 3) + return CLI_SHOWUSAGE; + + ctime = time(NULL) - dbread.connect_time; + if (mysql_reconnect(&dbread)) { if (!ast_strlen_zero(dbread.host)) snprintf(status, sizeof(status), "Connected to %s@%s, port %d", dbread.name, dbread.host, dbread.port); @@ -884,21 +899,21 @@ snprintf(status2, sizeof(status2), " with username %s", dbread.user); if (ctime > 31536000) - ast_cli(fd, "%s%s for %.1f years.\n", status, status2, (double)ctime / 31536000.0); + ast_cli(a->fd, "%s%s for %.1f years.\n", status, status2, (double)ctime / 31536000.0); else if (ctime > 86400 * 30) - ast_cli(fd, "%s%s for %d days.\n", status, status2, ctime / 86400); + ast_cli(a->fd, "%s%s for %d days.\n", status, status2, ctime / 86400); else if (ctime > 86400) - ast_cli(fd, "%s%s for %d days, %d hours.\n", status, status2, ctime / 86400, (ctime % 86400) / 3600); + ast_cli(a->fd, "%s%s for %d days, %d hours.\n", status, status2, ctime / 86400, (ctime % 86400) / 3600); else if (ctime > 3600) - ast_cli(fd, "%s%s for %d hours, %d minutes.\n", status, status2, ctime / 3600, (ctime % 3600) / 60); + ast_cli(a->fd, "%s%s for %d hours, %d minutes.\n", status, status2, ctime / 3600, (ctime % 3600) / 60); else if (ctime > 60) - ast_cli(fd, "%s%s for %d minutes.\n", status, status2, ctime / 60); + ast_cli(a->fd, "%s%s for %d minutes.\n", status, status2, ctime / 60); else - ast_cli(fd, "%s%s for %d seconds.\n", status, status2, ctime); + ast_cli(a->fd, "%s%s for %d seconds.\n", status, status2, ctime); - return RESULT_SUCCESS; + return CLI_SUCCESS; } else - return RESULT_FAILURE; + return CLI_FAILURE; } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "MySQL RealTime Configuration Driver", Index: asterisk-ooh323c/src/chan_h323.c =================================================================== --- asterisk-ooh323c/src/chan_h323.c (revision 473) +++ asterisk-ooh323c/src/chan_h323.c (working copy) @@ -2047,98 +2047,115 @@ ast_verbose("+++ reload_config\n"); return 0; - } - -static int ooh323_show_peer(int fd, int argc, char *argv[]) +static char *handle_cli_ooh323_show_peer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - struct ooh323_peer *prev=NULL, *peer=NULL; - char formats[512]; - char ip_port[30]; - if(argc != 4) - return RESULT_SHOWUSAGE; - - - ast_mutex_lock(&peerl.lock); - peer = peerl.peers; - while(peer) - { - ast_mutex_lock(&peer->lock); - if(!strcmp(peer->name, argv[3])) - break; - else{ - prev = peer; - peer = peer->next; - ast_mutex_unlock(&prev->lock); - } - } + char ip_port[30]; + struct ooh323_peer *prev = NULL, *peer = NULL; + + switch (cmd) { + case CLI_INIT: + e->command = "ooh323 show peer"; + e->usage = + "Usage: ooh323 show peer \n" + " List details of specific OOH323 peer.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } - if(peer) - { - sprintf(ip_port, "%s:%d", peer->ip, peer->port); - ast_cli(fd, "%-15.15s%s\n", "Name: ", peer->name); - ast_cli(fd, "%-15.15s%s", "Format Prefs: ", "("); - print_codec_to_cli(fd, &peer->prefs); - ast_cli(fd, ")\n"); - ast_cli(fd, "%-15.15s", "DTMF Mode: "); - if(peer->dtmfmode & H323_DTMF_RFC2833) - ast_cli(fd, "%s\n", "rfc2833"); - else if(peer->dtmfmode & H323_DTMF_Q931) - ast_cli(fd, "%s\n", "q931keypad"); - else if(peer->dtmfmode & H323_DTMF_H245ALPHANUMERIC) - ast_cli(fd, "%s\n", "h245alphanumeric"); - else if(peer->dtmfmode & H323_DTMF_H245SIGNAL) - ast_cli(fd, "%s\n", "h245signal"); - else - ast_cli(fd, "%s\n", "unknown"); - ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", peer->accountcode); - ast_cli(fd, "%-15.15s%s\n", "AMA flags: ", - ast_cdr_flags2str(peer->amaflags)); - ast_cli(fd, "%-15.15s%s\n", "Ip:Port: ", ip_port); - ast_cli(fd, "%-15.15s%d\n", "OutgoingLimit: ", peer->outgoinglimit); - ast_cli(fd, "%-15.15s%d\n", "rtptimeout: ", peer->rtptimeout); - ast_mutex_unlock(&peer->lock); - } - else{ - ast_cli(fd, "Peer %s not found\n", argv[3]); - ast_cli(fd, "\n"); - } - ast_mutex_unlock(&peerl.lock); + if (a->argc != 4) + return CLI_SHOWUSAGE; - return RESULT_SUCCESS; + ast_mutex_lock(&peerl.lock); + peer = peerl.peers; + while (peer) { + ast_mutex_lock(&peer->lock); + if (!strcmp(peer->name, a->argv[3])) + break; + else { + prev = peer; + peer = peer->next; + ast_mutex_unlock(&prev->lock); + } + } + + if (peer) { + snprintf(ip_port, sizeof(ip_port), "%s:%d", peer->ip, peer->port); + ast_cli(a->fd, "%-15.15s%s\n", "Name: ", peer->name); + ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); + print_codec_to_cli(a->fd, &peer->prefs); + ast_cli(a->fd, ")\n"); + ast_cli(a->fd, "%-15.15s", "DTMF Mode: "); + if (peer->dtmfmode & H323_DTMF_RFC2833) + ast_cli(a->fd, "%s\n", "rfc2833"); + else if (peer->dtmfmode & H323_DTMF_Q931) + ast_cli(a->fd, "%s\n", "q931keypad"); + else if (peer->dtmfmode & H323_DTMF_H245ALPHANUMERIC) + ast_cli(a->fd, "%s\n", "h245alphanumeric"); + else if (peer->dtmfmode & H323_DTMF_H245SIGNAL) + ast_cli(a->fd, "%s\n", "h245signal"); + else + ast_cli(a->fd, "%s\n", "unknown"); + ast_cli(a->fd, "%-15.15s%s\n", "AccountCode: ", peer->accountcode); + ast_cli(a->fd, "%-15.15s%s\n", "AMA flags: ", + ast_cdr_flags2str(peer->amaflags)); + ast_cli(a->fd, "%-15.15s%s\n", "Ip:Port: ", ip_port); + ast_cli(a->fd, "%-15.15s%d\n", "OutgoingLimit: ", peer->outgoinglimit); + ast_cli(a->fd, "%-15.15s%d\n", "rtptimeout: ", peer->rtptimeout); + ast_mutex_unlock(&peer->lock); + } else { + ast_cli(a->fd, "Peer %s not found\n", a->argv[3]); + ast_cli(a->fd, "\n"); + } + ast_mutex_unlock(&peerl.lock); + + return CLI_SUCCESS; } -static int ooh323_show_peers(int fd, int argc, char *argv[]) +static char *handle_cli_ooh323_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - struct ooh323_peer *prev = NULL, *peer=NULL; - char formats[512]; - char ip_port[30]; + char ip_port[30]; + char formats[512]; + struct ooh323_peer *prev = NULL, *peer=NULL; + #define FORMAT "%-15.15s %-15.15s %-23.23s %-s\n" - if (argc != 3) - return RESULT_SHOWUSAGE; + switch (cmd) { + case CLI_INIT: + e->command = "ooh323 show peers"; + e->usage = + "Usage: ooh323 show peers\n" + " Lists all known OOH323 peers.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } - ast_cli(fd, FORMAT, "Name", "Accountcode", "ip:port", "Formats"); - - ast_mutex_lock(&peerl.lock); - peer = peerl.peers; - while(peer) - { - ast_mutex_lock(&peer->lock); - sprintf(ip_port, "%s:%d", peer->ip, peer->port); - ast_cli(fd, FORMAT, peer->name, - peer->accountcode, - ip_port, - ast_getformatname_multiple(formats,512,peer->capability)); - prev = peer; - peer = peer->next; - ast_mutex_unlock(&prev->lock); + if (a->argc != 3) + return CLI_SHOWUSAGE; - } - ast_mutex_unlock(&peerl.lock); + ast_cli(a->fd, FORMAT, "Name", "Accountcode", "ip:port", "Formats"); + + ast_mutex_lock(&peerl.lock); + peer = peerl.peers; + while (peer) { + ast_mutex_lock(&peer->lock); + snprintf(ip_port, sizeof(ip_port), "%s:%d", peer->ip, peer->port); + ast_cli(a->fd, FORMAT, peer->name, + peer->accountcode, + ip_port, + ast_getformatname_multiple(formats, 512, peer->capability)); + prev = peer; + peer = peer->next; + ast_mutex_unlock(&prev->lock); + } + ast_mutex_unlock(&peerl.lock); + #undef FORMAT - return RESULT_SUCCESS; + + return CLI_SUCCESS; } /*! \brief Print codec list from preference to CLI/manager */ @@ -2159,112 +2176,131 @@ ast_cli(fd, "none"); } -static int ooh323_show_user(int fd, int argc, char *argv[]) +static char *handle_cli_ooh323_show_user(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - struct ooh323_user *prev=NULL, *user=NULL; - char formats[512]; + struct ooh323_user *prev = NULL, *user = NULL; - if(argc != 4) - return RESULT_SHOWUSAGE; - - - ast_mutex_lock(&userl.lock); - user = userl.users; - while(user) - { - ast_mutex_lock(&user->lock); - if(!strcmp(user->name, argv[3])) { - break; - } - else { - prev = user; - user = user->next; - ast_mutex_unlock(&prev->lock); - } - } + switch (cmd) { + case CLI_INIT: + e->command = "ooh323 show user"; + e->usage = + "Usage: ooh323 show user \n" + " List details of specific OOH323 user.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } - if(user) - { - ast_cli(fd, "%-15.15s%s\n", "Name: ", user->name); - ast_cli(fd, "%-15.15s%s", "Format Prefs: ", "("); - print_codec_to_cli(fd, &user->prefs); - ast_cli(fd, ")\n"); - ast_cli(fd, "%-15.15s", "DTMF Mode: "); - if(user->dtmfmode & H323_DTMF_RFC2833) - ast_cli(fd, "%s\n", "rfc2833"); - else if(user->dtmfmode & H323_DTMF_Q931) - ast_cli(fd, "%s\n", "q931keypad"); - else if(user->dtmfmode & H323_DTMF_H245ALPHANUMERIC) - ast_cli(fd, "%s\n", "h245alphanumeric"); - else if(user->dtmfmode & H323_DTMF_H245SIGNAL) - ast_cli(fd, "%s\n", "h245signal"); - else - ast_cli(fd, "%s\n", "unknown"); - ast_cli(fd, "%-15.15s%s\n", "AccountCode: ", user->accountcode); - ast_cli(fd, "%-15.15s%s\n", "AMA flags: ", - ast_cdr_flags2str(user->amaflags)); - ast_cli(fd, "%-15.15s%s\n", "Context: ", user->context); - ast_cli(fd, "%-15.15s%d\n", "IncomingLimit: ", user->incominglimit); - ast_cli(fd, "%-15.15s%d\n", "rtptimeout: ", user->rtptimeout); - ast_mutex_unlock(&user->lock); - } - else{ - ast_cli(fd, "User %s not found\n", argv[3]); - ast_cli(fd, "\n"); - } - ast_mutex_unlock(&userl.lock); + if (a->argc != 4) + return CLI_SHOWUSAGE; - return RESULT_SUCCESS; + ast_mutex_lock(&userl.lock); + user = userl.users; + while (user) { + ast_mutex_lock(&user->lock); + if (!strcmp(user->name, a->argv[3])) + break; + else { + prev = user; + user = user->next; + ast_mutex_unlock(&prev->lock); + } + } + + if (user) { + ast_cli(a->fd, "%-15.15s%s\n", "Name: ", user->name); + ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); + print_codec_to_cli(a->fd, &user->prefs); + ast_cli(a->fd, ")\n"); + ast_cli(a->fd, "%-15.15s", "DTMF Mode: "); + if (user->dtmfmode & H323_DTMF_RFC2833) + ast_cli(a->fd, "%s\n", "rfc2833"); + else if (user->dtmfmode & H323_DTMF_Q931) + ast_cli(a->fd, "%s\n", "q931keypad"); + else if (user->dtmfmode & H323_DTMF_H245ALPHANUMERIC) + ast_cli(a->fd, "%s\n", "h245alphanumeric"); + else if(user->dtmfmode & H323_DTMF_H245SIGNAL) + ast_cli(a->fd, "%s\n", "h245signal"); + else + ast_cli(a->fd, "%s\n", "unknown"); + ast_cli(a->fd, "%-15.15s%s\n", "AccountCode: ", user->accountcode); + ast_cli(a->fd, "%-15.15s%s\n", "AMA flags: ", ast_cdr_flags2str(user->amaflags)); + ast_cli(a->fd, "%-15.15s%s\n", "Context: ", user->context); + ast_cli(a->fd, "%-15.15s%d\n", "IncomingLimit: ", user->incominglimit); + ast_cli(a->fd, "%-15.15s%d\n", "rtptimeout: ", user->rtptimeout); + ast_mutex_unlock(&user->lock); + } else { + ast_cli(a->fd, "User %s not found\n", a->argv[3]); + ast_cli(a->fd, "\n"); + } + ast_mutex_unlock(&userl.lock); + + return CLI_SUCCESS; } -static int ooh323_show_users(int fd, int argc, char *argv[]) +static char *handle_cli_ooh323_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - struct ooh323_user *prev = NULL, *user=NULL; char formats[512]; + struct ooh323_user *prev = NULL, *user=NULL; + #define FORMAT1 "%-15.15s %-15.15s %-15.15s %-s\n" - if (argc != 3) - return RESULT_SHOWUSAGE; + switch (cmd) { + case CLI_INIT: + e->command = "ooh323 show users"; + e->usage = + "Usage: ooh323 show users \n" + " Lists all known OOH323 users.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } - ast_cli(fd, FORMAT1, "Username", "Accountcode", "Context", "Formats"); - - ast_mutex_lock(&userl.lock); - user = userl.users; - while(user) - { - ast_mutex_lock(&user->lock); - ast_cli(fd, FORMAT1, user->name, - user->accountcode, user->context, - ast_getformatname_multiple(formats,512,user->capability)); - prev = user; - user = user->next; - ast_mutex_unlock(&prev->lock); + if (a->argc != 3) + return CLI_SHOWUSAGE; - } - ast_mutex_unlock(&userl.lock); + ast_cli(a->fd, FORMAT1, "Username", "Accountcode", "Context", "Formats"); + + ast_mutex_lock(&userl.lock); + user = userl.users; + while (user) { + ast_mutex_lock(&user->lock); + ast_cli(a->fd, FORMAT1, user->name, + user->accountcode, user->context, + ast_getformatname_multiple(formats, 512, user->capability)); + prev = user; + user = user->next; + ast_mutex_unlock(&prev->lock); + } + ast_mutex_unlock(&userl.lock); + #undef FORMAT1 - return RESULT_SUCCESS; + return CLI_SUCCESS; } -static int ooh323_do_debug(int fd, int argc, char *argv[]) +static char *handle_cli_ooh323_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - if (argc != 2) - return RESULT_SHOWUSAGE; + switch (cmd) { + case CLI_INIT: + e->command = "ooh323 set debug [off]"; + e->usage = + "Usage: ooh323 set debug [off]\n" + " Enables/Disables debugging of OOH323 channel driver\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } - gH323Debug = TRUE; - ast_cli(fd, "OOH323 Debugging Enabled\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; -static int ooh323_no_debug(int fd, int argc, char *argv[]) + gH323Debug = (a->argc == 4) ? FALSE : TRUE; + ast_cli(a->fd, "OOH323 Debugging %s\n", gH323Debug ? "Enabled" : "Disabled"); -{ - if (argc != 3) - return RESULT_SHOWUSAGE; - gH323Debug = FALSE; - ast_cli(fd, "OOH323 Debugging Disabled\n"); - return RESULT_SUCCESS; + return CLI_SUCCESS; } static int ooh323_show_channels(int fd, int argc, char *argv[]) @@ -2272,137 +2308,98 @@ return RESULT_SUCCESS; } -static int ooh323_show_config(int fd, int argc, char *argv[]) +static char *handle_cli_ooh323_show_config(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - char value[512]; - ooAliases *pAlias = NULL, *pAliasNext=NULL;; + char value[512]; + ooAliases *pAlias = NULL, *pAliasNext=NULL;; - ast_cli(fd, "\nObjective Open H.323 Channel Driver's Config:\n"); - sprintf(value, "%s:%d", gIP, gPort); - ast_cli(fd, "%-20s%s\n", "IP:Port: ", value); - ast_cli(fd, "%-20s%s\n", "FastStart", gFastStart?"yes":"no"); - ast_cli(fd, "%-20s%s\n", "Tunneling", gTunneling?"yes":"no"); - ast_cli(fd, "%-20s%s\n", "CallerId", gCallerID); - ast_cli(fd, "%-20s%s\n", "MediaWaitForConnect", - gMediaWaitForConnect?"yes":"no"); - ast_cli(fd, "%-15s%s\n", "MediaWaitForConnect", - gMediaWaitForConnect?"yes":"no"); + switch (cmd) { + case CLI_INIT: + e->command = "ooh323 show config"; + e->usage = + "Usage: ooh323 show config\n" + " Shows global configuration of H.323 channel driver\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } -#if (0) - extern OOH323EndPoint gH323ep; - ast_cli(fd, "%-20s%s\n", "FASTSTART", - (OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART) != 0) ? "yes" : "no"); - ast_cli(fd, "%-20s%s\n", "TUNNELING", - (OO_TESTFLAG(gH323ep.flags, OO_M_TUNNELING) != 0) ? "yes" : "no"); - ast_cli(fd, "%-20s%s\n", "MEDIAWAITFORCONN", - (OO_TESTFLAG(gH323ep.flags, OO_M_MEDIAWAITFORCONN) != 0) ? "yes" : "no"); -#endif + if (a->argc != 3) + return CLI_SHOWUSAGE; - if(gRasGkMode == RasNoGatekeeper) - sprintf(value, "%s", "No Gatekeeper"); - else if(gRasGkMode == RasDiscoverGatekeeper) - sprintf(value, "%s", "Discover"); - else - sprintf(value, "%s", gGatekeeper); + snprintf(value, sizeof(value), "%s:%d", gIP, gPort); + ast_cli(a->fd, "\nObjective Open H.323 Channel Driver's Config:\n"); + ast_cli(a->fd, "%-20s%s\n", "IP:Port: ", value); + ast_cli(a->fd, "%-20s%s\n", "FastStart", gFastStart?"yes":"no"); + ast_cli(a->fd, "%-20s%s\n", "Tunneling", gTunneling?"yes":"no"); + ast_cli(a->fd, "%-20s%s\n", "CallerId", gCallerID); + ast_cli(a->fd, "%-20s%s\n", "MediaWaitForConnect", gMediaWaitForConnect ? "yes" : "no"); + ast_cli(a->fd, "%-15s%s\n", "MediaWaitForConnect", gMediaWaitForConnect ? "yes" : "no"); - ast_cli(fd, "%-20s%s\n", "Gatekeeper:", value); +#if (0) + { + extern OOH323EndPoint gH323ep; - ast_cli(fd, "%-20s%s\n", "H.323 LogFile:", gLogFile); + ast_cli(a->fd, "%-20s%s\n", "FASTSTART", + (OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART) != 0) ? "yes" : "no"); + ast_cli(a->fd, "%-20s%s\n", "TUNNELING", + (OO_TESTFLAG(gH323ep.flags, OO_M_TUNNELING) != 0) ? "yes" : "no"); + ast_cli(a->fd, "%-20s%s\n", "MEDIAWAITFORCONN", + (OO_TESTFLAG(gH323ep.flags, OO_M_MEDIAWAITFORCONN) != 0) ? "yes" : "no"); + } +#endif - ast_cli(fd, "%-20s%s\n", "Context:", gContext); - - ast_cli(fd, "%-20s%s\n", "Capability:", - ast_getformatname_multiple(value,512,gCapability)); + if (gRasGkMode == RasNoGatekeeper) + snprintf(value, sizeof(value), "%s", "No Gatekeeper"); + else if (gRasGkMode == RasDiscoverGatekeeper) + snprintf(value, sizeof(value), "%s", "Discover"); + else + snprintf(value, sizeof(value), "%s", gGatekeeper); - ast_cli(fd, "%-20s", "DTMF Mode: "); - if(gDTMFMode & H323_DTMF_RFC2833) - ast_cli(fd, "%s\n", "rfc2833"); - else if (gDTMFMode & H323_DTMF_Q931) - ast_cli(fd, "%s\n", "q931keypad"); - else if(gDTMFMode & H323_DTMF_H245ALPHANUMERIC) - ast_cli(fd, "%s\n", "h245alphanumeric"); - else if(gDTMFMode & H323_DTMF_H245SIGNAL) - ast_cli(fd, "%s\n", "h245signal"); - else - ast_cli(fd, "%s\n", "unknown"); + ast_cli(a->fd, "%-20s%s\n", "Gatekeeper:", value); + ast_cli(a->fd, "%-20s%s\n", "H.323 LogFile:", gLogFile); + ast_cli(a->fd, "%-20s%s\n", "Context:", gContext); + ast_cli(a->fd, "%-20s%s\n", "Capability:", ast_getformatname_multiple(value, sizeof(value), gCapability)); + ast_cli(a->fd, "%-20s", "DTMF Mode: "); + if (gDTMFMode & H323_DTMF_RFC2833) + ast_cli(a->fd, "%s\n", "rfc2833"); + else if (gDTMFMode & H323_DTMF_Q931) + ast_cli(a->fd, "%s\n", "q931keypad"); + else if(gDTMFMode & H323_DTMF_H245ALPHANUMERIC) + ast_cli(a->fd, "%s\n", "h245alphanumeric"); + else if(gDTMFMode & H323_DTMF_H245SIGNAL) + ast_cli(a->fd, "%s\n", "h245signal"); + else + ast_cli(a->fd, "%s\n", "unknown"); + ast_cli(a->fd, "%-20s%s\n", "AccountCode: ", gAccountcode); + ast_cli(a->fd, "%-20s%s\n", "AMA flags: ", ast_cdr_flags2str(gAMAFLAGS)); - ast_cli(fd, "%-20s%s\n", "AccountCode: ", gAccountcode); + pAlias = gAliasList; + if (pAlias) + ast_cli(a->fd, "%-20s\n", "Aliases: "); + while(pAlias) { + pAliasNext = pAlias->next; + if (pAliasNext) { + ast_cli(a->fd, "\t%-30s\t%-30s\n", pAlias->value, pAliasNext->value); + pAlias = pAliasNext->next; + } else { + ast_cli(a->fd, "\t%-30s\n", pAlias->value); + pAlias = pAlias->next; + } + } - ast_cli(fd, "%-20s%s\n", "AMA flags: ", ast_cdr_flags2str(gAMAFLAGS)); - - pAlias = gAliasList; - if(pAlias) - { - ast_cli(fd, "%-20s\n", "Aliases: "); - } - while(pAlias) - { - pAliasNext = pAlias->next; - if(pAliasNext) - { - ast_cli(fd,"\t%-30s\t%-30s\n",pAlias->value, pAliasNext->value); - pAlias = pAliasNext->next; - } - else{ - ast_cli(fd,"\t%-30s\n",pAlias->value); - pAlias = pAlias->next; - } - } - return RESULT_SUCCESS; + return CLI_SUCCESS; } -static char show_config_usage[]= -"Usage: ooh323 show config\n" -" Shows global configuration of H.323 channel driver\n"; +static struct ast_cli_entry cli_ooh323[] = { + AST_CLI(handle_cli_ooh323_set_debug, "Enable/Disable OOH323 debugging"), + AST_CLI(handle_cli_ooh323_show_config, "Show details on global configuration of H.323 channel driver"), + AST_CLI(handle_cli_ooh323_show_peer, "Show details on specific OOH323 peer"), + AST_CLI(handle_cli_ooh323_show_peers, "Show defined OOH323 peers"), + AST_CLI(handle_cli_ooh323_show_user, "Show details on specific OOH323 user"), + AST_CLI(handle_cli_ooh323_show_users, "Show defined OOH323 users"), +}; -static char debug_usage[] = -"Usage: ooh323 debug\n" -" Enables debugging of OOH323 channel driver\n"; - -static struct ast_cli_entry cli_debug = - { { "ooh323", "debug", NULL }, ooh323_do_debug, "Enable OOH323 debugging", debug_usage }; - -static char no_debug_usage[] = -"Usage: ooh323 no debug\n" -" Disables debugging of OOH323 channel driver\n"; - -static struct ast_cli_entry cli_no_debug = - { { "ooh323", "no", "debug", NULL }, ooh323_no_debug, "Disable OOH323 debugging", no_debug_usage }; - -static char show_users_usage[] = -"Usage: ooh323 show users \n" -" Lists all known OOH323 users.\n"; - -static struct ast_cli_entry cli_show_users = - { { "ooh323", "show", "users", NULL }, ooh323_show_users, "Show defined OOH323 users", show_users_usage }; - -static char show_user_usage[] = -"Usage: ooh323 show user \n" -" List details of specific OOH323 user.\n"; - -static struct ast_cli_entry cli_show_user = - { { "ooh323", "show", "user", NULL }, ooh323_show_user, "Show details on specific OOH323 user", show_user_usage }; - -static char show_peers_usage[] = -"Usage: ooh323 show peers \n" -" Lists all known OOH323 peers.\n"; - -static struct ast_cli_entry cli_show_peers = - { { "ooh323", "show", "peers", NULL }, ooh323_show_peers, "Show defined OOH323 peers", show_peers_usage }; - -static char show_peer_usage[] = -"Usage: ooh323 show peer \n" -" List details of specific OOH323 peer.\n"; - -static struct ast_cli_entry cli_show_peer = - { { "ooh323", "show", "peer", NULL }, ooh323_show_peer, "Show details on specific OOH323 peer", show_peer_usage }; - -static struct ast_cli_entry cli_show_config = - { { "ooh323", "show", "config", NULL }, ooh323_show_config, "Show details on global configuration of H.323 channel driver", show_config_usage }; - - - - static int load_module(void) { int res; @@ -2448,13 +2445,7 @@ return 0; } ast_rtp_proto_register(&ooh323_rtp); - ast_cli_register(&cli_show_users); - ast_cli_register(&cli_show_user); - ast_cli_register(&cli_show_peers); - ast_cli_register(&cli_show_peer); - ast_cli_register(&cli_show_config); - ast_cli_register(&cli_debug); - ast_cli_register(&cli_no_debug); + ast_cli_register_multiple(cli_ooh323, sizeof(cli_ooh323) / sizeof(struct ast_cli_entry)); /* fire up the H.323 Endpoint */ if(OO_OK != ooH323EpInitialize(OO_CALLMODE_AUDIOCALL, gLogFile)) @@ -2783,13 +2774,7 @@ ast_verbose("--- ooh323 unload_module \n"); } /* First, take us out of the channel loop */ - ast_cli_unregister(&cli_show_users); - ast_cli_unregister(&cli_show_user); - ast_cli_unregister(&cli_show_peers); - ast_cli_unregister(&cli_show_peer); - ast_cli_unregister(&cli_show_config); - ast_cli_unregister(&cli_debug); - ast_cli_unregister(&cli_no_debug); + ast_cli_unregister_multiple(cli_ooh323, sizeof(cli_ooh323) / sizeof(struct ast_cli_entry)); ast_rtp_proto_unregister(&ooh323_rtp); ast_channel_unregister(&ooh323_tech); //ast_unregister_atexit(&ast_ooh323c_exit);