summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2003-03-20 17:21:54 +0000
committerMark Spencer <markster@digium.com>2003-03-20 17:21:54 +0000
commitd0d50a4ad760b52f5f479be0b3b5f12db3c67658 (patch)
tree000f12071b6f97c254068faa7c82566df7f986d1
parentd5251a85059488de06ed8eaefe9124416cf9322e (diff)
Merge some of Mahmut's patches
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@666 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rwxr-xr-xapps/app_queue.c6
-rwxr-xr-xchannels/chan_agent.c65
-rwxr-xr-xchannels/chan_sip.c10
-rwxr-xr-xmanager.c13
4 files changed, 68 insertions, 26 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index f2bd0128a..7f748209a 100755
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -156,7 +156,8 @@ static int join_queue(char *queuename, struct queue_ent *qe)
q->count++;
res = 0;
manager_event(EVENT_FLAG_CALL, "Join",
- "Queue: %s\r\nPosition: %d\r\n", q->name, qe->pos );
+ "Channel: %s\r\nQueue: %s\r\nPosition: %d\r\n",
+ qe->chan->name, q->name, qe->pos );
}
ast_pthread_mutex_unlock(&q->lock);
@@ -212,7 +213,8 @@ static void leave_queue(struct queue_ent *qe)
ast_pthread_mutex_lock(&q->lock);
/* Take us out of the queue */
manager_event(EVENT_FLAG_CALL, "Leave",
- "Queue: %s\r\n", q->name );
+ "Channel: %s\r\nQueue: %s\r\n",
+ qe->chan->name, q->name );
prev = NULL;
cur = q->head;
while(cur) {
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 61f5bb29b..0b3d74e84 100755
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -223,21 +223,36 @@ static int agent_call(struct ast_channel *ast, char *dest, int timeout)
struct agent_pvt *p = ast->pvt->pvt;
int res = -1;
ast_pthread_mutex_lock(&p->lock);
+ ast_verbose( VERBOSE_PREFIX_3 "agent_call, call to agent '%s' call on '%s'\n", p->agent, p->chan->name);
+ ast_log( LOG_DEBUG, "Playing beep, lang '%s'\n", p->chan->language);
res = ast_streamfile(p->chan, "beep", p->chan->language);
- if (!res)
+ ast_log( LOG_DEBUG, "Played beep, result '%d'\n", res);
+ if (!res) {
res = ast_waitstream(p->chan, "");
+ ast_log( LOG_DEBUG, "Waited for stream, result '%d'\n", res);
+ }
if (!res) {
res = ast_set_read_format(p->chan, ast_best_codec(p->chan->nativeformats));
+ ast_log( LOG_DEBUG, "Set read format, result '%d'\n", res);
if (res)
ast_log(LOG_WARNING, "Unable to set read format to %d\n", ast_best_codec(p->chan->nativeformats));
}
+ else {
+ // Agent hung-up
+ p->chan = NULL;
+ }
+
if (!res) {
ast_set_write_format(p->chan, ast_best_codec(p->chan->nativeformats));
+ ast_log( LOG_DEBUG, "Set write format, result '%d'\n", res);
if (res)
ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(p->chan->nativeformats));
}
- /* Call is immediately up */
- ast_setstate(ast, AST_STATE_UP);
+ if( !res )
+ {
+ /* Call is immediately up */
+ ast_setstate(ast, AST_STATE_UP);
+ }
CLEANUP(ast,p);
ast_pthread_mutex_unlock(&p->lock);
return res;
@@ -250,9 +265,6 @@ static int agent_hangup(struct ast_channel *ast)
p->owner = NULL;
ast->pvt->pvt = NULL;
p->app_sleep_cond = 1;
- ast_pthread_mutex_unlock(&p->lock);
- /* Release ownership of the agent to other threads (presumably running the login app). */
- ast_pthread_mutex_unlock(&p->app_lock);
if (p->chan) {
/* If they're dead, go ahead and hang up on the agent now */
ast_pthread_mutex_lock(&p->chan->lock);
@@ -260,9 +272,20 @@ static int agent_hangup(struct ast_channel *ast)
ast_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT);
ast_moh_start(p->chan, p->moh);
ast_pthread_mutex_unlock(&p->chan->lock);
- } else if (p->dead)
+ ast_pthread_mutex_unlock(&p->lock);
+ /* Release ownership of the agent to other threads (presumably running the login app). */
+ ast_pthread_mutex_unlock(&p->app_lock);
+ } else if (p->dead) {
/* Go ahead and lose it */
+ ast_pthread_mutex_unlock(&p->lock);
+ /* Release ownership of the agent to other threads (presumably running the login app). */
+ ast_pthread_mutex_unlock(&p->app_lock);
free(p);
+ } else {
+ ast_pthread_mutex_unlock(&p->lock);
+ /* Release ownership of the agent to other threads (presumably running the login app). */
+ ast_pthread_mutex_unlock(&p->app_lock);
+ }
return 0;
}
@@ -333,6 +356,15 @@ static struct ast_channel *agent_new(struct agent_pvt *p, int state)
ast_pthread_mutex_unlock(&p->lock); /* For other thread to read the condition. */
ast_pthread_mutex_lock(&p->app_lock);
ast_pthread_mutex_lock(&p->lock);
+ if( !p->chan )
+ {
+ ast_log(LOG_WARNING, "Agent disconnected while we were connecting the call\n");
+ p->owner = NULL;
+ tmp->pvt->pvt = NULL;
+ p->app_sleep_cond = 1;
+ ast_channel_free( tmp );
+ return NULL;
+ }
}
p->owning_app = pthread_self();
/* After the above step, there should not be any blockers. */
@@ -486,9 +518,6 @@ static int login_exec(struct ast_channel *chan, void *data)
char *opt_user = NULL;
char *options = NULL;
int play_announcement;
- struct timespec required;
- struct timespec remaining;
- int delay;
LOCAL_USER_ADD(u);
@@ -577,21 +606,12 @@ static int login_exec(struct ast_channel *chan, void *data)
ast_pthread_mutex_unlock(&p->lock);
ast_pthread_mutex_unlock(&agentlock);
while (res >= 0) {
- /* If we are not the owner, delay here for a while
- * so other interested threads can kick in. */
- delay = 0;
ast_pthread_mutex_lock(&p->lock);
if (p->chan != chan)
res = -1;
- if (p->owner)
- delay = 1;
ast_pthread_mutex_unlock(&p->lock);
- if (delay) {
- sched_yield();
- required.tv_sec = 0;
- required.tv_nsec = 20 * 1000 * 1000;
- nanosleep( &required, &remaining );
- }
+ /* Yield here so other interested threads can kick in. */
+ sched_yield();
if (res)
break;
@@ -603,12 +623,15 @@ static int login_exec(struct ast_channel *chan, void *data)
res = ast_safe_sleep_conditional( chan, 1000,
agent_cont_sleep, p );
pthread_mutex_unlock( &p->app_lock );
+ sched_yield();
}
+ ast_pthread_mutex_lock(&p->lock);
if (res && p->owner)
ast_log(LOG_WARNING, "Huh? We broke out when there was still an owner?\n");
/* Log us off if appropriate */
if (p->chan == chan)
p->chan = NULL;
+ ast_pthread_mutex_unlock(&p->lock);
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Agent '%s' logged out\n", p->agent);
manager_event(EVENT_FLAG_AGENT, "Agentlogoff",
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 824aa7c8a..d1fa81484 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -77,6 +77,8 @@ static char context[AST_MAX_EXTENSION] = "default";
static char language[MAX_LANGUAGE] = "";
+static char callerid[AST_MAX_EXTENSION] = "asterisk";
+
static int usecnt =0;
static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
@@ -1951,17 +1953,17 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, c
char to[256];
char tmp[80];
char cid[256];
- char *l = "asterisk", *n=NULL;
+ char *l = callerid, *n=NULL;
if (p->owner && p->owner->callerid) {
strcpy(cid, p->owner->callerid);
ast_callerid_parse(cid, &n, &l);
if (l)
ast_shrink_phone_number(l);
if (!l || !ast_isphonenumber(l))
- l = "asterisk";
+ l = callerid;
}
if (!n)
- n = l;
+ n = callerid;
snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%08x", n, l, inet_ntoa(p->ourip), p->tag);
if (strlen(p->username)) {
if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
@@ -4212,6 +4214,8 @@ static int reload_config(void)
}
} else if (!strcasecmp(v->name, "language")) {
strncpy(language, v->value, sizeof(language)-1);
+ } else if (!strcasecmp(v->name, "callerid")) {
+ strncpy(callerid, v->value, sizeof(callerid)-1);
} else if (!strcasecmp(v->name, "nat")) {
globalnat = ast_true(v->value);
} else if (!strcasecmp(v->name, "maxexpirey")) {
diff --git a/manager.c b/manager.c
index be1bb28fb..1b954c845 100755
--- a/manager.c
+++ b/manager.c
@@ -16,8 +16,11 @@
#include <pthread.h>
#include <string.h>
#include <sys/time.h>
+#include <sys/types.h>
+#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <signal.h>
#include <errno.h>
@@ -432,6 +435,7 @@ static int process_message(struct mansession *s, struct message *m)
struct manager_action *tmp = first_action;
strncpy(action, get_header(m, "Action"), sizeof(action));
+ ast_log( LOG_DEBUG, "Manager received command '%s'\n", action );
if (!strlen(action)) {
send_error(s, "Missing action in request");
@@ -569,10 +573,13 @@ static void *accept_thread(void *ignore)
struct sockaddr_in sin;
int sinlen;
struct mansession *s;
+ struct protoent *p;
+ int arg = 1;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
for (;;) {
sinlen = sizeof(sin);
as = accept(asock, &sin, &sinlen);
@@ -580,6 +587,12 @@ static void *accept_thread(void *ignore)
ast_log(LOG_NOTICE, "Accept returned -1: %s\n", strerror(errno));
continue;
}
+ p = getprotobyname("tcp");
+ if( p ) {
+ if( setsockopt(as, p->p_proto, TCP_NODELAY, (char *)&arg, sizeof(arg) ) < 0 ) {
+ ast_log(LOG_WARNING, "Failed to set manager tcp connection to TCP_NODELAY mode: %s\n", strerror(errno));
+ }
+ }
s = malloc(sizeof(struct mansession));
if (!s) {
ast_log(LOG_WARNING, "Failed to allocate management session: %s\n", strerror(errno));