summaryrefslogtreecommitdiff
path: root/apps/app_voicemail.c
diff options
context:
space:
mode:
authorAlexei Gradinari <alex2grad@gmail.com>2017-06-19 18:21:29 -0400
committerAlexei Gradinari <alex2grad@gmail.com>2017-06-19 18:21:29 -0400
commit8f356192d196ae146b0c2390f8d62024694e691f (patch)
tree6ae599958e40c12825ac550b7a8a03c70f908dc3 /apps/app_voicemail.c
parent507ce0aa95e4020bebac8fb19f4329b3e1953e77 (diff)
app_voicemail: IMAP connection control
A new global option "imap_poll_logout" was added to specify whether need to disconnect from the IMAP server after polling of mailboxes. ASTERISK-27068 #close Closing IMAP connection after loading mailbox from voicemail.conf ASTERISK-24052 #close Change-Id: Ib7558ba04516240a32b65f42e9be64372a0ae12a
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r--apps/app_voicemail.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 2152ccac1..fe5657dc8 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -507,6 +507,7 @@ static int imapversion = 1;
static int expungeonhangup = 1;
static int imapgreetings = 0;
+static int imap_poll_logout = 0;
static char delimiter = '\0';
/* mail_open cannot be protected on a stream basis */
@@ -544,6 +545,8 @@ static int imap_retrieve_file (const char *dir, const int msgnum, const char *ma
static int imap_delete_old_greeting (char *dir, struct vm_state *vms);
static void check_quota(struct vm_state *vms, char *mailbox);
static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box);
+static void imap_logout(const char *mailbox_id);
+
struct vmstate {
struct vm_state *vms;
AST_LIST_ENTRY(vmstate) list;
@@ -12226,6 +12229,9 @@ static int append_mailbox(const char *context, const char *box, const char *data
strcat(mailbox_full, context);
inboxcount2(mailbox_full, &urgent, &new, &old);
+#ifdef IMAP_STORAGE
+ imap_logout(mailbox_full);
+#endif
queue_mwi_event(NULL, mailbox_full, urgent, new, old);
return 0;
@@ -12978,6 +12984,12 @@ static void poll_subscribed_mailbox(struct mwi_sub *mwi_sub)
inboxcount2(mwi_sub->mailbox, &urgent, &new, &old);
+#ifdef IMAP_STORAGE
+ if (imap_poll_logout) {
+ imap_logout(mwi_sub->mailbox);
+ }
+#endif
+
if (urgent != mwi_sub->old_urgent || new != mwi_sub->old_new || old != mwi_sub->old_old) {
mwi_sub->old_urgent = urgent;
mwi_sub->old_new = new;
@@ -13698,6 +13710,11 @@ static int actual_load_config(int reload, struct ast_config *cfg, struct ast_con
} else {
ast_copy_string(greetingfolder, imapfolder, sizeof(greetingfolder));
}
+ if ((val = ast_variable_retrieve(cfg, "general", "imap_poll_logout"))) {
+ imap_poll_logout = ast_true(val);
+ } else {
+ imap_poll_logout = 0;
+ }
/* There is some very unorthodox casting done here. This is due
* to the way c-client handles the argument passed in. It expects a