diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-07-26 23:14:27 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-07-26 23:14:27 +0000 |
commit | 70e86c19a5f1b1ac89db9a04daaf27997fbec648 (patch) | |
tree | 43cf23a2cb2fb3cf5bc186dfca9935d92f5e1715 /channels/chan_sip.c | |
parent | 98ce1b4f881a7c7af55d053f6666a5da8b45ae90 (diff) |
Revision to SIP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1225 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_sip.c')
-rwxr-xr-x | channels/chan_sip.c | 65 |
1 files changed, 53 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 27a5225c1..66fed8dda 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -885,21 +885,32 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner) } } -static int find_user(struct sip_pvt *p, int event) +static int find_user(struct sip_pvt *fup, int event) { char name[256] = ""; + int isfound = 1; struct sip_user *u; - strncpy(name, p->username, sizeof(name) - 1); + strncpy(name, fup->username, sizeof(name) - 1); ast_pthread_mutex_lock(&userl.lock); u = userl.users; while(u) { if (!strcasecmp(u->name, name)) { + isfound = 0; break; } u = u->next; } + if ( isfound ) { + ast_log(LOG_DEBUG, "%s is not a local user\n", name); + ast_pthread_mutex_unlock(&userl.lock); + return 1; + } if(event == 0) { - u->inUse--; + if ( u->inUse > 0 ) { + u->inUse = u->inUse - 1; + } else { + u->inUse = 0; + } } else { if (u->incominglimit > 0 ) { if (u->inUse >= u->incominglimit) { @@ -937,7 +948,8 @@ static int sip_hangup(struct ast_channel *ast) return 0; } ast_pthread_mutex_lock(&p->lock); - /* find_user(p,0); */ + ast_log(LOG_DEBUG, "find_user(%s)\n", p->username); + find_user(p, 0); /* Determine how to disconnect */ if (p->owner != ast) { ast_log(LOG_WARNING, "Huh? We aren't the owner?\n"); @@ -3699,24 +3711,47 @@ static void receive_message(struct sip_pvt *p, struct sip_request *req) } } +static int sip_show_inuse(int fd, int argc, char *argv[]) { +#define FORMAT "%-15.15s %-15.15s %-15.15s\n" +#define FORMAT2 "%-15.15s %-15.15s %-15.15s\n" + struct sip_user *user; + char limits[80]; + char used[80]; + if (argc != 3) + return RESULT_SHOWUSAGE; + ast_pthread_mutex_lock(&userl.lock); + user = userl.users; + ast_cli(fd, FORMAT, "Username", "inUse", "Limit"); + for(user=userl.users;user;user=user->next) { + if (user->incominglimit) + snprintf(limits, sizeof(limits), "%d", user->incominglimit); + else + strcpy(limits, "N/A"); + snprintf(used, sizeof(used), "%d", user->inUse); + ast_cli(fd, FORMAT2, user->name, used, limits); + } + ast_pthread_mutex_unlock(&userl.lock); + return RESULT_SUCCESS; +#undef FORMAT +#undef FORMAT2 +} + + static int sip_show_users(int fd, int argc, char *argv[]) { -#define FORMAT "%-15.15s %-10.15s %-10.10s %-10.15s %-5.5s %-5.15s\n" -#define FORMAT2 "%-15.15s %-10.15s %-10.10s %-11.15s %-6.5s %d/%d\n" +#define FORMAT "%-15.15s %-15.15s %-15.15s %-15.15s %-5.5s\n" struct sip_user *user; if (argc != 3) return RESULT_SHOWUSAGE; ast_pthread_mutex_lock(&userl.lock); - ast_cli(fd, FORMAT, "Username", "Secret", "Authen", "Def.Context", "A/C", "inUse/Limit"); + ast_cli(fd, FORMAT, "Username", "Secret", "Authen", "Def.Context", "A/C"); for(user=userl.users;user;user=user->next) { - ast_cli(fd, FORMAT2, user->name, user->secret, user->methods, - user->context,user->ha ? "Yes" : "No", - user->inUse,user->incominglimit); + ast_cli(fd, FORMAT, user->name, user->secret, user->methods, + user->context,user->ha ? "Yes" : "No"); } ast_pthread_mutex_unlock(&userl.lock); return RESULT_SUCCESS; #undef FORMAT -#undef FORMAT2 } static int sip_show_peers(int fd, int argc, char *argv[]) @@ -4060,6 +4095,10 @@ static char show_users_usage[] = "Usage: sip show users\n" " Lists all users known to the SIP (Session Initiation Protocol) subsystem.\n"; +static char show_inuse_usage[] = +"Usage: sip show inuse\n" +" List all users known to the SIP (Session Initiation Protocol) subsystem inUse counters and their incominglimit.\n"; + static char show_channels_usage[] = "Usage: sip show channels\n" " Lists all currently active SIP channels.\n"; @@ -4092,6 +4131,8 @@ static struct ast_cli_entry cli_show_channel = { { "sip", "show", "channel", NULL }, sip_show_channel, "Show detailed SIP channel info", show_channel_usage, complete_sipch }; static struct ast_cli_entry cli_show_peers = { { "sip", "show", "peers", NULL }, sip_show_peers, "Show defined SIP peers", show_peers_usage }; +static struct ast_cli_entry cli_inuse_show = + { { "sip", "show", "inuse", NULL }, sip_show_inuse, "List all inuse/limit", show_inuse_usage }; static struct ast_cli_entry cli_show_registry = { { "sip", "show", "registry", NULL }, sip_show_registry, "Show SIP registration status", show_reg_usage }; static struct ast_cli_entry cli_debug = @@ -4675,7 +4716,6 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc transmit_response(p, "200 OK", req); transmit_response_reliable(p, "487 Request Terminated", &p->initreq); } else if (!strcasecmp(cmd, "BYE")) { - find_user(p,0); copy_request(&p->initreq, req); check_via(p, req); p->alreadygone = 1; @@ -5696,6 +5736,7 @@ int load_module() ast_cli_register(&cli_show_registry); ast_cli_register(&cli_debug); ast_cli_register(&cli_no_debug); + ast_cli_register(&cli_inuse_show); sip_rtp.type = type; ast_rtp_proto_register(&sip_rtp); sched = sched_context_create(); |