aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-07-08 21:09:10 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-07-08 21:09:10 +0000
commit61d8122de7a5b1b518a2459522c41724a428047a (patch)
tree0818133393b3d767afa3403bcf23654fedbd7c0e /apps
parentb8d7b380dde83ecca6e5993ab79a50889cd4f8a0 (diff)
Backport TCP-related timeouts to IMAP voicemail in 1.4
since it should solve bugs people are experiencing. Specifically, there are times where communication with the IMAP server causes system calls to block forever. If this should happen when querying the mailbox so that chan_sip's do_monitor thread can send MWI to a phone, it means that SIP calls cannot be processed any more. The timeout options are outlined in doc/imapstorage.txt. Defaults for the timeouts are sixty seconds. (closes issue #12987) Reported by: mthomasslo git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@129158 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_voicemail.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index b60390ce7..9773dd373 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -109,7 +109,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#ifdef IMAP_STORAGE
AST_MUTEX_DEFINE_STATIC(imaptemp_lock);
static char imaptemp[1024];
-
static char imapserver[48];
static char imapport[8];
static char imapflags[128];
@@ -119,6 +118,7 @@ static char authpassword[42];
static int expungeonhangup = 1;
static char delimiter = '\0';
+static const long DEFAULT_IMAP_TCP_TIMEOUT = 60L;
struct vm_state;
struct ast_vm_user;
@@ -7456,6 +7456,7 @@ static int load_config(void)
const char *auth_user;
const char *auth_password;
const char *expunge_on_hangup;
+ const char *imap_timeout;
#endif
const char *astcallop;
const char *astreview;
@@ -7603,6 +7604,36 @@ static int load_config(void)
} else {
ast_copy_string(imapfolder,"INBOX", sizeof(imapfolder));
}
+
+ /* There is some very unorthodox casting done here. This is due
+ * to the way c-client handles the argument passed in. It expects a
+ * void pointer and casts the pointer directly to a long without
+ * first dereferencing it. */
+
+ if ((imap_timeout = ast_variable_retrieve(cfg, "general", "imapreadtimeout"))) {
+ mail_parameters(NIL, SET_READTIMEOUT, (void *) (atol(imap_timeout)));
+ } else {
+ mail_parameters(NIL, SET_READTIMEOUT, (void *) DEFAULT_IMAP_TCP_TIMEOUT);
+ }
+
+ if ((imap_timeout = ast_variable_retrieve(cfg, "general", "imapwritetimeout"))) {
+ mail_parameters(NIL, SET_WRITETIMEOUT, (void *) (atol(imap_timeout)));
+ } else {
+ mail_parameters(NIL, SET_WRITETIMEOUT, (void *) DEFAULT_IMAP_TCP_TIMEOUT);
+ }
+
+ if ((imap_timeout = ast_variable_retrieve(cfg, "general", "imapopentimeout"))) {
+ mail_parameters(NIL, SET_OPENTIMEOUT, (void *) (atol(imap_timeout)));
+ } else {
+ mail_parameters(NIL, SET_OPENTIMEOUT, (void *) DEFAULT_IMAP_TCP_TIMEOUT);
+ }
+
+ if ((imap_timeout = ast_variable_retrieve(cfg, "general", "imapclosetimeout"))) {
+ mail_parameters(NIL, SET_CLOSETIMEOUT, (void *) (atol(imap_timeout)));
+ } else {
+ mail_parameters(NIL, SET_CLOSETIMEOUT, (void *) DEFAULT_IMAP_TCP_TIMEOUT);
+ }
+
#endif
/* External voicemail notify application */