]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Backport TCP-related timeouts to IMAP voicemail in 1.4
authorMark Michelson <mmichelson@digium.com>
Tue, 8 Jul 2008 21:09:10 +0000 (21:09 +0000)
committerMark Michelson <mmichelson@digium.com>
Tue, 8 Jul 2008 21:09:10 +0000 (21:09 +0000)
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

apps/app_voicemail.c
doc/imapstorage.txt

index b60390ce7f2ab27c00e97f5638d3e53b6cf331d4..9773dd37329d4c6d705f98ad87bc5130d846a47b 100644 (file)
@@ -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 */
                
index f1803bf1e9cffe56e84d60f09d179ba83ee91a5d..315e905a1b3e343b9d4e7a8c9eceb2bbafa0e813 100644 (file)
@@ -105,6 +105,10 @@ imapflags=<IMAP flags, "novalidate-cert" for example>
 expungeonhangup=<yes or no>
 authuser=<username>
 authpassword=<password>
+opentimeout=<TCP open timeout in seconds>
+closetimeout=<TCP close timeout in seconds>
+readtimeout=<TCP read timeout in seconds>
+writetimeout=<TCP write timeout in seconds>
 
 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.