From: Mark Michelson Date: Tue, 8 Jul 2008 21:09:10 +0000 (+0000) Subject: Backport TCP-related timeouts to IMAP voicemail in 1.4 X-Git-Tag: 1.4.22-rc1~136 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7b1c12bcb09e3a4b5258808c48ee5106d8010476;p=thirdparty%2Fasterisk.git 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: https://origsvn.digium.com/svn/asterisk/branches/1.4@129158 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index b60390ce7f..9773dd3732 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 */ diff --git a/doc/imapstorage.txt b/doc/imapstorage.txt index f1803bf1e9..315e905a1b 100644 --- a/doc/imapstorage.txt +++ b/doc/imapstorage.txt @@ -105,6 +105,10 @@ imapflags= expungeonhangup= authuser= authpassword= +opentimeout= +closetimeout= +readtimeout= +writetimeout= The "expungeonhangup" flag is used to determine if the voicemail system should expunge all messages marked for deletion when the user hangs up the phone.