mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-21 09:10:36 +00:00
Merge some of Mahmut's patches
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@666 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -156,7 +156,8 @@ static int join_queue(char *queuename, struct queue_ent *qe)
|
|||||||
q->count++;
|
q->count++;
|
||||||
res = 0;
|
res = 0;
|
||||||
manager_event(EVENT_FLAG_CALL, "Join",
|
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);
|
ast_pthread_mutex_unlock(&q->lock);
|
||||||
@@ -212,7 +213,8 @@ static void leave_queue(struct queue_ent *qe)
|
|||||||
ast_pthread_mutex_lock(&q->lock);
|
ast_pthread_mutex_lock(&q->lock);
|
||||||
/* Take us out of the queue */
|
/* Take us out of the queue */
|
||||||
manager_event(EVENT_FLAG_CALL, "Leave",
|
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;
|
prev = NULL;
|
||||||
cur = q->head;
|
cur = q->head;
|
||||||
while(cur) {
|
while(cur) {
|
||||||
|
|||||||
@@ -223,21 +223,36 @@ static int agent_call(struct ast_channel *ast, char *dest, int timeout)
|
|||||||
struct agent_pvt *p = ast->pvt->pvt;
|
struct agent_pvt *p = ast->pvt->pvt;
|
||||||
int res = -1;
|
int res = -1;
|
||||||
ast_pthread_mutex_lock(&p->lock);
|
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);
|
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, "");
|
res = ast_waitstream(p->chan, "");
|
||||||
|
ast_log( LOG_DEBUG, "Waited for stream, result '%d'\n", res);
|
||||||
|
}
|
||||||
if (!res) {
|
if (!res) {
|
||||||
res = ast_set_read_format(p->chan, ast_best_codec(p->chan->nativeformats));
|
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)
|
if (res)
|
||||||
ast_log(LOG_WARNING, "Unable to set read format to %d\n", ast_best_codec(p->chan->nativeformats));
|
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) {
|
if (!res) {
|
||||||
ast_set_write_format(p->chan, ast_best_codec(p->chan->nativeformats));
|
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)
|
if (res)
|
||||||
ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(p->chan->nativeformats));
|
ast_log(LOG_WARNING, "Unable to set write format to %d\n", ast_best_codec(p->chan->nativeformats));
|
||||||
}
|
}
|
||||||
/* Call is immediately up */
|
if( !res )
|
||||||
ast_setstate(ast, AST_STATE_UP);
|
{
|
||||||
|
/* Call is immediately up */
|
||||||
|
ast_setstate(ast, AST_STATE_UP);
|
||||||
|
}
|
||||||
CLEANUP(ast,p);
|
CLEANUP(ast,p);
|
||||||
ast_pthread_mutex_unlock(&p->lock);
|
ast_pthread_mutex_unlock(&p->lock);
|
||||||
return res;
|
return res;
|
||||||
@@ -250,9 +265,6 @@ static int agent_hangup(struct ast_channel *ast)
|
|||||||
p->owner = NULL;
|
p->owner = NULL;
|
||||||
ast->pvt->pvt = NULL;
|
ast->pvt->pvt = NULL;
|
||||||
p->app_sleep_cond = 1;
|
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 (p->chan) {
|
||||||
/* If they're dead, go ahead and hang up on the agent now */
|
/* If they're dead, go ahead and hang up on the agent now */
|
||||||
ast_pthread_mutex_lock(&p->chan->lock);
|
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_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT);
|
||||||
ast_moh_start(p->chan, p->moh);
|
ast_moh_start(p->chan, p->moh);
|
||||||
ast_pthread_mutex_unlock(&p->chan->lock);
|
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 */
|
/* 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);
|
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;
|
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_unlock(&p->lock); /* For other thread to read the condition. */
|
||||||
ast_pthread_mutex_lock(&p->app_lock);
|
ast_pthread_mutex_lock(&p->app_lock);
|
||||||
ast_pthread_mutex_lock(&p->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();
|
p->owning_app = pthread_self();
|
||||||
/* After the above step, there should not be any blockers. */
|
/* 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 *opt_user = NULL;
|
||||||
char *options = NULL;
|
char *options = NULL;
|
||||||
int play_announcement;
|
int play_announcement;
|
||||||
struct timespec required;
|
|
||||||
struct timespec remaining;
|
|
||||||
int delay;
|
|
||||||
|
|
||||||
LOCAL_USER_ADD(u);
|
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(&p->lock);
|
||||||
ast_pthread_mutex_unlock(&agentlock);
|
ast_pthread_mutex_unlock(&agentlock);
|
||||||
while (res >= 0) {
|
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);
|
ast_pthread_mutex_lock(&p->lock);
|
||||||
if (p->chan != chan)
|
if (p->chan != chan)
|
||||||
res = -1;
|
res = -1;
|
||||||
if (p->owner)
|
|
||||||
delay = 1;
|
|
||||||
ast_pthread_mutex_unlock(&p->lock);
|
ast_pthread_mutex_unlock(&p->lock);
|
||||||
if (delay) {
|
/* Yield here so other interested threads can kick in. */
|
||||||
sched_yield();
|
sched_yield();
|
||||||
required.tv_sec = 0;
|
|
||||||
required.tv_nsec = 20 * 1000 * 1000;
|
|
||||||
nanosleep( &required, &remaining );
|
|
||||||
}
|
|
||||||
if (res)
|
if (res)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -603,12 +623,15 @@ static int login_exec(struct ast_channel *chan, void *data)
|
|||||||
res = ast_safe_sleep_conditional( chan, 1000,
|
res = ast_safe_sleep_conditional( chan, 1000,
|
||||||
agent_cont_sleep, p );
|
agent_cont_sleep, p );
|
||||||
pthread_mutex_unlock( &p->app_lock );
|
pthread_mutex_unlock( &p->app_lock );
|
||||||
|
sched_yield();
|
||||||
}
|
}
|
||||||
|
ast_pthread_mutex_lock(&p->lock);
|
||||||
if (res && p->owner)
|
if (res && p->owner)
|
||||||
ast_log(LOG_WARNING, "Huh? We broke out when there was still an owner?\n");
|
ast_log(LOG_WARNING, "Huh? We broke out when there was still an owner?\n");
|
||||||
/* Log us off if appropriate */
|
/* Log us off if appropriate */
|
||||||
if (p->chan == chan)
|
if (p->chan == chan)
|
||||||
p->chan = NULL;
|
p->chan = NULL;
|
||||||
|
ast_pthread_mutex_unlock(&p->lock);
|
||||||
if (option_verbose > 2)
|
if (option_verbose > 2)
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "Agent '%s' logged out\n", p->agent);
|
ast_verbose(VERBOSE_PREFIX_3 "Agent '%s' logged out\n", p->agent);
|
||||||
manager_event(EVENT_FLAG_AGENT, "Agentlogoff",
|
manager_event(EVENT_FLAG_AGENT, "Agentlogoff",
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ static char context[AST_MAX_EXTENSION] = "default";
|
|||||||
|
|
||||||
static char language[MAX_LANGUAGE] = "";
|
static char language[MAX_LANGUAGE] = "";
|
||||||
|
|
||||||
|
static char callerid[AST_MAX_EXTENSION] = "asterisk";
|
||||||
|
|
||||||
static int usecnt =0;
|
static int usecnt =0;
|
||||||
static pthread_mutex_t usecnt_lock = AST_MUTEX_INITIALIZER;
|
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 to[256];
|
||||||
char tmp[80];
|
char tmp[80];
|
||||||
char cid[256];
|
char cid[256];
|
||||||
char *l = "asterisk", *n=NULL;
|
char *l = callerid, *n=NULL;
|
||||||
if (p->owner && p->owner->callerid) {
|
if (p->owner && p->owner->callerid) {
|
||||||
strcpy(cid, p->owner->callerid);
|
strcpy(cid, p->owner->callerid);
|
||||||
ast_callerid_parse(cid, &n, &l);
|
ast_callerid_parse(cid, &n, &l);
|
||||||
if (l)
|
if (l)
|
||||||
ast_shrink_phone_number(l);
|
ast_shrink_phone_number(l);
|
||||||
if (!l || !ast_isphonenumber(l))
|
if (!l || !ast_isphonenumber(l))
|
||||||
l = "asterisk";
|
l = callerid;
|
||||||
}
|
}
|
||||||
if (!n)
|
if (!n)
|
||||||
n = l;
|
n = callerid;
|
||||||
snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%08x", n, l, inet_ntoa(p->ourip), p->tag);
|
snprintf(from, sizeof(from), "\"%s\" <sip:%s@%s>;tag=%08x", n, l, inet_ntoa(p->ourip), p->tag);
|
||||||
if (strlen(p->username)) {
|
if (strlen(p->username)) {
|
||||||
if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
|
if (ntohs(p->sa.sin_port) != DEFAULT_SIP_PORT) {
|
||||||
@@ -4212,6 +4214,8 @@ static int reload_config(void)
|
|||||||
}
|
}
|
||||||
} else if (!strcasecmp(v->name, "language")) {
|
} else if (!strcasecmp(v->name, "language")) {
|
||||||
strncpy(language, v->value, sizeof(language)-1);
|
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")) {
|
} else if (!strcasecmp(v->name, "nat")) {
|
||||||
globalnat = ast_true(v->value);
|
globalnat = ast_true(v->value);
|
||||||
} else if (!strcasecmp(v->name, "maxexpirey")) {
|
} else if (!strcasecmp(v->name, "maxexpirey")) {
|
||||||
|
|||||||
13
manager.c
13
manager.c
@@ -16,8 +16,11 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@@ -432,6 +435,7 @@ static int process_message(struct mansession *s, struct message *m)
|
|||||||
struct manager_action *tmp = first_action;
|
struct manager_action *tmp = first_action;
|
||||||
|
|
||||||
strncpy(action, get_header(m, "Action"), sizeof(action));
|
strncpy(action, get_header(m, "Action"), sizeof(action));
|
||||||
|
ast_log( LOG_DEBUG, "Manager received command '%s'\n", action );
|
||||||
|
|
||||||
if (!strlen(action)) {
|
if (!strlen(action)) {
|
||||||
send_error(s, "Missing action in request");
|
send_error(s, "Missing action in request");
|
||||||
@@ -569,10 +573,13 @@ static void *accept_thread(void *ignore)
|
|||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
int sinlen;
|
int sinlen;
|
||||||
struct mansession *s;
|
struct mansession *s;
|
||||||
|
struct protoent *p;
|
||||||
|
int arg = 1;
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
|
|
||||||
pthread_attr_init(&attr);
|
pthread_attr_init(&attr);
|
||||||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
sinlen = sizeof(sin);
|
sinlen = sizeof(sin);
|
||||||
as = accept(asock, &sin, &sinlen);
|
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));
|
ast_log(LOG_NOTICE, "Accept returned -1: %s\n", strerror(errno));
|
||||||
continue;
|
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));
|
s = malloc(sizeof(struct mansession));
|
||||||
if (!s) {
|
if (!s) {
|
||||||
ast_log(LOG_WARNING, "Failed to allocate management session: %s\n", strerror(errno));
|
ast_log(LOG_WARNING, "Failed to allocate management session: %s\n", strerror(errno));
|
||||||
|
|||||||
Reference in New Issue
Block a user