int ast_find_ourip(struct in_addr *ourip, struct sockaddr_in bindaddr)
{
- char ourhost[256];
+ char ourhost[MAXHOSTNAMELEN]="";
struct ast_hostent ahp;
struct hostent *hp;
struct in_addr saddr;
return 0;
}
/* try to use our hostname */
- if (gethostname(ourhost, sizeof(ourhost))) {
+ if (gethostname(ourhost, sizeof(ourhost)-1)) {
ast_log(LOG_WARNING, "Unable to get hostname\n");
} else {
hp = ast_gethostbyname(ourhost, &ahp);
FILE *p=NULL;
int pfd;
char date[256];
- char host[256];
+ char host[MAXHOSTNAMELEN] = "";
char who[256];
char bound[256];
char fname[256];
}
}
if (p) {
- gethostname(host, sizeof(host));
+ gethostname(host, sizeof(host)-1);
if (strchr(srcemail, '@'))
strncpy(who, srcemail, sizeof(who)-1);
else {
FILE *p=NULL;
int pfd;
char date[256];
- char host[256];
+ char host[MAXHOSTNAMELEN]="";
char who[256];
char dur[256];
char tmp[80] = "/tmp/astmail-XXXXXX";
}
if (p) {
- gethostname(host, sizeof(host));
+ gethostname(host, sizeof(host)-1);
if (strchr(srcemail, '@'))
strncpy(who, srcemail, sizeof(who)-1);
else {
static void *netconsole(void *vconsole)
{
struct console *con = vconsole;
- char hostname[256];
+ char hostname[MAXHOSTNAMELEN]="";
char tmp[512];
int res;
struct pollfd fds[2];
- if (gethostname(hostname, sizeof(hostname)))
+ if (gethostname(hostname, sizeof(hostname)-1))
strncpy(hostname, "<Unknown>", sizeof(hostname)-1);
snprintf(tmp, sizeof(tmp), "%s/%d/%s\n", hostname, ast_mainpid, ASTERISK_VERSION);
fdprint(con->fd, tmp);
memset(prompt, 0, sizeof(prompt));
while (*t != '\0' && *p < sizeof(prompt)) {
if (*t == '%') {
- char hostname[256];
+ char hostname[MAXHOSTNAMELEN]="";
int i;
struct timeval tv;
struct tm tm;
{
int c;
char filename[80] = "";
- char hostname[256];
+ char hostname[MAXHOSTNAMELEN]="";
char tmp[80];
char * xarg = NULL;
int x;
option_remote++;
option_nofork++;
}
- if (gethostname(hostname, sizeof(hostname)))
+ if (gethostname(hostname, sizeof(hostname)-1))
strncpy(hostname, "<Unknown>", sizeof(hostname)-1);
ast_mainpid = getpid();
ast_ulaw_init();
static int capability = AST_FORMAT_ULAW;
static int nonCodecCapability = AST_RTP_DTMF;
-static char ourhost[256];
+static char ourhost[MAXHOSTNAMELEN];
static struct in_addr __ourip;
static int ourport;
struct ast_hostent ahp; struct hostent *hp;
int format;
- if (gethostname(ourhost, sizeof(ourhost))) {
+ if (gethostname(ourhost, sizeof(ourhost)-1)) {
ast_log(LOG_WARNING, "Unable to get hostname, MGCP disabled\n");
return 0;
}
static int global_promiscredir;
static char global_musicclass[MAX_LANGUAGE] = ""; /* Global music on hold class */
-static char global_realm[AST_MAX_EXTENSION] = "asterisk"; /* Default realm */
+static char global_realm[MAXHOSTNAMELEN] = "asterisk"; /* Default realm */
static char regcontext[AST_MAX_EXTENSION] = "";
/* Expire slowly */
char from[256]; /* The From: header */
char useragent[256]; /* User agent in SIP request */
char context[AST_MAX_EXTENSION]; /* Context for this call */
- char fromdomain[AST_MAX_EXTENSION]; /* Domain to show in the from field */
+ char fromdomain[MAXHOSTNAMELEN]; /* Domain to show in the from field */
char fromuser[AST_MAX_EXTENSION]; /* User to show in the user field */
char fromname[AST_MAX_EXTENSION]; /* Name to show in the user field */
- char tohost[AST_MAX_EXTENSION]; /* Host we should put in the "to" field */
+ char tohost[MAXHOSTNAMELEN]; /* Host we should put in the "to" field */
char language[MAX_LANGUAGE]; /* Default language for this call */
char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
char rdnis[256]; /* Referring DNIS */
char callerid[256]; /* Caller*ID */
int restrictcid; /* hide presentation from remote user */
char via[256];
- char fullcontact[128]; /* Extra parameters to go in the "To" header */
+ char fullcontact[128]; /* Extra parameters to go in the "To" header */
char accountcode[20]; /* Account code */
char our_contact[256]; /* Our contact header */
- char realm[256]; /* Authorization realm */
+ char realm[MAXHOSTNAMELEN]; /* Authorization realm */
char nonce[256]; /* Authorization nonce */
char opaque[256]; /* Opaque nonsense */
char qop[80]; /* Quality of Protection, since SIP wasn't complicated enough yet. */
- char domain[256]; /* Authorization domain */
+ char domain[MAXHOSTNAMELEN]; /* Authorization domain */
char lastmsg[256]; /* Last Message sent/received */
int amaflags; /* AMA Flags */
int pendinginvite; /* Any pending invite */
char name[80];
char secret[80];
char md5secret[80];
- char context[80];
+ char context[AST_MAX_EXTENSION];
char callerid[80];
char accountcode[20];
char language[MAX_LANGUAGE];
char name[80];
char secret[80];
char md5secret[80];
- char context[80]; /* JK02: peers need context too to allow parking etc */
+ char context[AST_MAX_EXTENSION]; /* JK02: peers need context too to allow parking etc */
char username[80];
- char tohost[80];
+ char tohost[MAXHOSTNAMELEN];
char regexten[AST_MAX_EXTENSION]; /* Extension to register (if regcontext is used) */
char fromuser[80];
- char fromdomain[80];
- char fullcontact[128];
+ char fromdomain[MAXHOSTNAMELEN];
+ char fullcontact[256];
char mailbox[AST_MAX_EXTENSION];
char language[MAX_LANGUAGE];
char musicclass[MAX_LANGUAGE]; /* Music on Hold class */
int portno; /* Optional port override */
char username[80]; /* Who we are registering as */
char authuser[80]; /* Who we *authenticate* as */
- char hostname[80];
+ char hostname[MAXHOSTNAMELEN];
char secret[80]; /* Password or key name in []'s */
char md5secret[80];
- char contact[80]; /* Contact extension */
+ char contact[256]; /* Contact extension */
char random[80];
int expire; /* Sched ID of expiration */
int timeout; /* sched id of sip_reg_timeout */
struct sockaddr_in us; /* Who the server thinks we are */
/* Saved headers */
- char realm[256]; /* Authorization realm */
+ char realm[MAXHOSTNAMELEN]; /* Authorization realm */
char nonce[256]; /* Authorization nonce */
- char domain[256]; /* Authorization domain */
+ char domain[MAXHOSTNAMELEN]; /* Authorization domain */
char opaque[256]; /* Opaque nonsense */
char qop[80]; /* Quality of Protection. */
char *port;
char *callhost;
int portno;
- char host[256], *hostn;
+ char host[MAXHOSTNAMELEN], *hostn;
char peer[256]="";
strncpy(peer, opeer, sizeof(peer) - 1);
else
portno = DEFAULT_SIP_PORT;
if (srvlookup) {
- char service[256];
+ char service[MAXHOSTNAMELEN];
int tportno;
int ret;
snprintf(service, sizeof(service), "_sip._udp.%s", peer);
struct msglist *next;
} *list = NULL, *last = NULL;
-static char hostname[256];
+static char hostname[MAXHOSTNAMELEN];
struct logchannel {
int logmask;
ast_mutex_lock(&loglock);
if ((s = ast_variable_retrieve(cfg, "general", "appendhostname"))) {
if(ast_true(s)) {
- if(gethostname(hostname, sizeof(hostname))) {
+ if(gethostname(hostname, sizeof(hostname)-1)) {
strncpy(hostname, "unknown", sizeof(hostname)-1);
ast_log(LOG_WARNING, "What box has no hostname???\n");
}
/* Context for which parking is made accessible */
static char parking_con[AST_MAX_EXTENSION] = "parkedcalls";
+/* Context for dialback for parking (KLUDGE) */
+static char parking_con_dial[AST_MAX_EXTENSION] = "park-dial";
+
/* Extension you type to park the call */
static char parking_ext[AST_MAX_EXTENSION] = "700";
int priority;
int parkingtime;
int notquiteyet;
+ char peername[1024];
unsigned char moh_trys;
struct parkeduser *next;
};
pu->parkingtime = parkingtime;
if (extout)
*extout = x;
+ if (peer)
+ strncpy(pu->peername, peer->name, sizeof(pu->peername) - 1);
/* Remember what had been dialed, so that if the parking
expires, we try to come back to the same place */
if (!ast_strlen_zero(chan->macrocontext))
struct timeval tv;
struct ast_frame *f;
char exten[AST_MAX_EXTENSION];
+ char *peername,*cp;
+ char returnexten[AST_MAX_EXTENSION];
struct ast_context *con;
int x;
fd_set rfds, efds;
fd_set nrfds, nefds;
FD_ZERO(&rfds);
FD_ZERO(&efds);
+
for (;;) {
ms = -1;
max = -1;
ast_mutex_lock(&parking_lock);
pl = NULL;
pu = parkinglot;
- gettimeofday(&tv, NULL);
FD_ZERO(&nrfds);
FD_ZERO(&nefds);
while(pu) {
pu = pu->next;
continue;
}
+ gettimeofday(&tv, NULL);
tms = (tv.tv_sec - pu->start.tv_sec) * 1000 + (tv.tv_usec - pu->start.tv_usec) / 1000;
if (tms > pu->parkingtime) {
- /* They've been waiting too long, send them back to where they came. Theoretically they
- should have their original extensions and such, but we copy to be on the safe side */
- strncpy(pu->chan->exten, pu->exten, sizeof(pu->chan->exten)-1);
- strncpy(pu->chan->context, pu->context, sizeof(pu->chan->context)-1);
- pu->chan->priority = pu->priority;
- if (option_verbose > 1)
- ast_verbose(VERBOSE_PREFIX_2 "Timeout for %s parked on %d. Returning to %s,%s,%d\n", pu->chan->name, pu->parkingnum, pu->chan->context, pu->chan->exten, pu->chan->priority);
/* Stop music on hold */
ast_moh_stop(pu->chan);
+ /* Get chan, exten from derived kludge */
+ if (pu->peername[0]) {
+ peername = ast_strdupa(pu->peername);
+ cp = strrchr(peername, '-');
+ if (cp)
+ *cp = 0;
+ con = ast_context_find(parking_con_dial);
+ if (!con) {
+ con = ast_context_create(NULL, parking_con_dial, registrar);
+ if (!con) {
+ ast_log(LOG_ERROR, "Parking dial context '%s' does not exist and unable to create\n", parking_con_dial);
+ }
+ }
+ if (con) {
+ snprintf(returnexten, sizeof(returnexten), "%s||t", peername);
+ ast_add_extension2(con, 1, peername, 1, NULL, "Dial", strdup(returnexten), free, registrar);
+ }
+ strncpy(pu->chan->exten, peername, sizeof(pu->chan->exten) - 1);
+ strncpy(pu->chan->context, parking_con_dial, sizeof(pu->chan->context) - 1);
+ pu->chan->priority = 1;
+
+ } else {
+ /* They've been waiting too long, send them back to where they came. Theoretically they
+ should have their original extensions and such, but we copy to be on the safe side */
+ strncpy(pu->chan->exten, pu->exten, sizeof(pu->chan->exten)-1);
+ strncpy(pu->chan->context, pu->context, sizeof(pu->chan->context)-1);
+ pu->chan->priority = pu->priority;
+ }
+
+ if (option_verbose > 1)
+ ast_verbose(VERBOSE_PREFIX_2 "Timeout for %s parked on %d. Returning to %s,%s,%d\n", pu->chan->name, pu->parkingnum, pu->chan->context, pu->chan->exten, pu->chan->priority);
/* Start up the PBX, or hang them up */
if (ast_pbx_start(pu->chan)) {
ast_log(LOG_WARNING, "Unable to restart the PBX for user on '%s', hanging them up...\n", pu->chan->name);
ast_log(LOG_WARNING, "Whoa, no parking context?\n");
free(pt);
} else {
- for (x=0;x<AST_MAX_FDS;x++) {
+ for (x=0; x<AST_MAX_FDS; x++) {
if ((pu->chan->fds[x] > -1) && (FD_ISSET(pu->chan->fds[x], &rfds) || FD_ISSET(pu->chan->fds[x], &efds))) {
if (FD_ISSET(pu->chan->fds[x], &efds))
pu->chan->exception = 1;
+ else
+ pu->chan->exception = 0;
pu->chan->fdno = x;
/* See if they need servicing */
f = ast_read(pu->chan);
if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) {
+
/* There's a problem, hang them up*/
if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "%s got tired of being parked\n", pu->chan->name);
/* XXX Maybe we could do something with packets, like dial "0" for operator or something XXX */
ast_frfree(f);
if (pu->moh_trys < 3 && !pu->chan->generatordata) {
- ast_log(LOG_DEBUG, "MOH on parked call stopped by outside source. Restarting\n");
+ ast_log(LOG_DEBUG, "MOH on parked call stopped by outside source. Restarting.\n");
ast_moh_start(pu->chan, NULL);
pu->moh_trys++;
}
}
}
if (x >= AST_MAX_FDS) {
-std: for (x=0;x<AST_MAX_FDS;x++) {
+std: for (x=0; x<AST_MAX_FDS; x++) {
/* Keep this one for next one */
if (pu->chan->fds[x] > -1) {
FD_SET(pu->chan->fds[x], &nrfds);