Code cleanup of IMAP storage support in app_voicemail.
authorJoshua Colp <jcolp@digium.com>
Mon, 29 Jan 2007 20:04:42 +0000 (20:04 +0000)
committerJoshua Colp <jcolp@digium.com>
Mon, 29 Jan 2007 20:04:42 +0000 (20:04 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@52607 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_voicemail.c

index b521a36..c31b8ab 100644 (file)
@@ -89,9 +89,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #endif
 
 #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];
@@ -110,9 +107,9 @@ static int init_mailstream (struct vm_state *vms, int box);
 static void write_file (char *filename, char *buffer, unsigned long len);
 /*static void status (MAILSTREAM *stream); */ /* No need for this. */
 static void display_body (BODY *body, char *pfx, long i);
-static char *get_header_by_tag(char *header, char *tag);
+static char *get_header_by_tag(char *header, char *tag, char *buf, size_t len);
 static void vm_imap_delete(int msgnum, struct vm_state *vms);
-static char *get_user_by_mailbox(char *mailbox);
+static char *get_user_by_mailbox(char *mailbox, char *buf, size_t len);
 static struct vm_state *get_vm_state_by_imapuser(char *user, int interactive);
 static struct vm_state *get_vm_state_by_mailbox(const char *mailbox, int interactive);
 static void vmstate_insert(struct vm_state *vms);
@@ -2421,32 +2418,33 @@ static int imap_store_file(char *dir, char *mailboxuser, char *mailboxcontext, i
                fmt = "WAV";
        if(option_debug > 2)
                ast_log(LOG_DEBUG, "Storing file '%s', format '%s'\n", fn, fmt);
+
        /* Make a temporary file instead of piping directly to sendmail, in case the mail
           command hangs */
-       if ((p = vm_mkftemp(tmp)) == NULL) {
+       if (!(p = vm_mkftemp(tmp))) {
                ast_log(LOG_WARNING, "Unable to store '%s' (can't create temporary file)\n", fn);
                return -1;
-       } else {
-               make_email_file(p, myserveremail, vmu, msgnum, vmu->context, vmu->mailbox, S_OR(chan->cid.cid_num, NULL), S_OR(chan->cid.cid_name, NULL), fn, fmt, duration, 1, chan, NULL, 1);
-               /* read mail file to memory */          
-               len = ftell(p);
-               rewind(p);
-               if((buf = ast_malloc(len+1)) == NIL) {
-                       ast_log(LOG_ERROR, "Can't allocate %ld bytes to read message\n", len+1);
-                       return -1;
-               }
-               fread(buf, len, 1, p);
-               ((char *)buf)[len] = '\0';
-               INIT(&str, mail_string, buf, len);
-               imap_mailbox_name(mailbox, vms, 0, 1);
-               if(!mail_append(vms->mailstream, mailbox, &str))
-                       ast_log(LOG_ERROR, "Error while sending the message to %s\n", mailbox);
-               fclose(p);
-               unlink(tmp);
-               ast_free(buf);
-               if(option_debug > 2)
-                       ast_log(LOG_DEBUG, "%s stored\n", fn);
        }
+       
+       make_email_file(p, myserveremail, vmu, msgnum, vmu->context, vmu->mailbox, S_OR(chan->cid.cid_num, NULL), S_OR(chan->cid.cid_name, NULL), fn, fmt, duration, 1, chan, NULL, 1);
+       /* read mail file to memory */          
+       len = ftell(p);
+       rewind(p);
+       if (!(buf = ast_malloc(len+1))) {
+               ast_log(LOG_ERROR, "Can't allocate %ld bytes to read message\n", len+1);
+               return -1;
+       }
+       fread(buf, len, 1, p);
+       ((char *)buf)[len] = '\0';
+       INIT(&str, mail_string, buf, len);
+       imap_mailbox_name(mailbox, vms, 0, 1);
+       if(!mail_append(vms->mailstream, mailbox, &str))
+               ast_log(LOG_ERROR, "Error while sending the message to %s\n", mailbox);
+       fclose(p);
+       unlink(tmp);
+       ast_free(buf);
+       if(option_debug > 2)
+               ast_log(LOG_DEBUG, "%s stored\n", fn);
        return 0;
 
 }
@@ -2463,6 +2461,7 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
        char *mailboxnc; 
        char *context;
        int ret = 0;
+
        if (newmsgs)
                *newmsgs = 0;
        if (oldmsgs)
@@ -2470,9 +2469,11 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
  
        if(option_debug > 2)
                ast_log (LOG_DEBUG,"Mailbox is set to %s\n",mailbox);
+
        /* If no mailbox, return immediately */
        if (ast_strlen_zero(mailbox))
                return 0;
+
        if (strchr(mailbox, ',')) {
                int tmpnew, tmpold;
                ast_copy_string(tmp, mailbox, sizeof(tmp));
@@ -2492,9 +2493,10 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
                }
                return 0;
        }
+
        ast_copy_string(tmp, mailbox, sizeof(tmp));
-       context = strchr(tmp, '@');
-       if (context) {
+
+       if ((context = strchr(tmp, '@'))) {
                *context = '\0';
                mailboxnc = tmp;
                context++;
@@ -2505,24 +2507,19 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
  
        /* We have to get the user before we can open the stream! */
        /*ast_log (LOG_DEBUG,"Before find_user, context is %s and mailbox is %s\n",context,mailbox); */
-       vmu = find_user(NULL, context, mailboxnc);
-       if (!vmu) {
-               ast_log (LOG_ERROR,"Couldn't find mailbox %s in context %s\n",mailboxnc,context);
-               return -1;
-       } else {
-               /* No IMAP account available */
-               if (vmu->imapuser[0] == '\0') {
-                       ast_log (LOG_WARNING,"IMAP user not set for mailbox %s\n",vmu->mailbox);
-                       return -1;
-               }
+       if (!(vmu = find_user(NULL, context, mailboxnc))) {
+               ast_log(LOG_ERROR, "Couldn't find mailbox %s in context %s\n", mailboxnc, context);
+               return -1;
+       }
+       
+       /* No IMAP account available */
+       if (vmu->imapuser[0] == '\0') {
+               ast_log (LOG_WARNING,"IMAP user not set for mailbox %s\n",vmu->mailbox);
+               return -1;
        }
  
        /* check if someone is accessing this box right now... */
-       vms_p = get_vm_state_by_imapuser(vmu->imapuser,1);
-       if (!vms_p) {
-               vms_p = get_vm_state_by_mailbox(mailboxnc,1);
-       }
-       if (vms_p) {
+       if ((vms_p = get_vm_state_by_imapuser(vmu->imapuser, 1)) || (vms_p = get_vm_state_by_mailbox(mailboxnc, 1))) {
                if(option_debug > 2)
                        ast_log (LOG_DEBUG,"Returning before search - user is logged in\n");
                *newmsgs = vms_p->newmessages;
@@ -2531,12 +2528,7 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
        }
  
        /* add one if not there... */
-       vms_p = get_vm_state_by_imapuser(vmu->imapuser,0);
-       if (!vms_p) {
-               vms_p = get_vm_state_by_mailbox(mailboxnc,0);
-       }
-       if (!vms_p) {
+       if (!(vms_p = get_vm_state_by_imapuser(vmu->imapuser, 0)) && !(vms_p = get_vm_state_by_mailbox(mailboxnc, 0))) {
                if(option_debug > 2)
                        ast_log (LOG_DEBUG,"Adding new vmstate for %s\n",vmu->imapuser);
                if (!(vms_p = ast_calloc(1, sizeof(*vms_p))))
@@ -2552,44 +2544,47 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
                init_vm_state(vms_p);
                vmstate_insert(vms_p);
        }
-       if (!vms_p->mailstream)
-               ret = init_mailstream(vms_p, 0);
+
+       /* If no mailstream exists yet and even after attempting to initialize it fails, bail out */
        if (!vms_p->mailstream) {
-               ast_log (LOG_ERROR,"Houston we have a problem - IMAP mailstream is NULL\n");
-               return -1;
-       }
-       if (newmsgs && ret==0 && vms_p->updated==1 ) {
-               pgm = mail_newsearchpgm ();
-               hdr = mail_newsearchheader ("X-Asterisk-VM-Extension", (char *)mailboxnc);
-               pgm->header = hdr;
-               pgm->unseen = 1;
-               pgm->seen = 0;
-               pgm->undeleted = 1;
-               pgm->deleted = 0;
-               vms_p->vmArrayIndex = 0;
-       
-               mail_search_full (vms_p->mailstream, NULL, pgm, NIL);
-               *newmsgs = vms_p->vmArrayIndex;
-               vms_p->newmessages = vms_p->vmArrayIndex;
-               mail_free_searchpgm(&pgm);
-       }
-       if (oldmsgs && ret==0 && vms_p->updated==1 ) {
-               pgm = mail_newsearchpgm ();
-               hdr = mail_newsearchheader ("X-Asterisk-VM-Extension", (char *)mailboxnc);
-               pgm->header = hdr;
-               pgm->unseen = 0;
-               pgm->seen = 1;
-               pgm->deleted = 0;
-               pgm->undeleted = 1;
-               vms_p->vmArrayIndex = 0;
-       
-               mail_search_full (vms_p->mailstream, NULL, pgm, NIL);
-               *oldmsgs = vms_p->vmArrayIndex;
-               vms_p->oldmessages = vms_p->vmArrayIndex;
-               mail_free_searchpgm(&pgm);
-       }
+               ret = init_mailstream(vms_p, 0);
+               if (!vms_p->mailstream) {
+                       ast_log (LOG_ERROR,"Houston we have a problem - IMAP mailstream is NULL\n");
+                       return -1;
+               }
+       }
+
+       if (!ret && vms_p->updated == 1) {
+               if (newmsgs) {
+                       pgm = mail_newsearchpgm();
+                       hdr = mail_newsearchheader("X-Asterisk-VM-Extension", (char *)mailboxnc);
+                       pgm->header = hdr;
+                       pgm->unseen = 1;
+                       pgm->seen = 0;
+                       pgm->undeleted = 1;
+                       pgm->deleted = 0;
+                       vms_p->vmArrayIndex = 0;
+                       mail_search_full(vms_p->mailstream, NULL, pgm, NIL);
+                       *newmsgs = vms_p->vmArrayIndex;
+                       vms_p->newmessages = vms_p->vmArrayIndex;
+                       mail_free_searchpgm(&pgm);
+               }
+               if (oldmsgs) {
+                       pgm = mail_newsearchpgm ();
+                       hdr = mail_newsearchheader ("X-Asterisk-VM-Extension", (char *)mailboxnc);
+                       pgm->header = hdr;
+                       pgm->unseen = 0;
+                       pgm->seen = 1;
+                       pgm->undeleted = 1;
+                       pgm->deleted = 0;
+                       vms_p->vmArrayIndex = 0;
+                       mail_search_full(vms_p->mailstream, NULL, pgm, NIL);
+                       *oldmsgs = vms_p->vmArrayIndex;
+                       vms_p->oldmessages = vms_p->vmArrayIndex;
+                       mail_free_searchpgm(&pgm);
+               }
+       }
+
        if (vms_p->updated == 1) {  /* changes, so we did the searches above */
                vms_p->updated = 0;
        } else if (vms_p->updated > 1) {  /* decrement delay count */
@@ -2600,6 +2595,7 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
                *newmsgs = vms_p->newmessages;
                *oldmsgs = vms_p->oldmessages;
        }
+
        return 0;
  }
 
@@ -2678,17 +2674,21 @@ static int __has_voicemail(const char *context, const char *mailbox, const char
        struct dirent *de;
        char fn[256];
        int ret = 0;
-       if (!folder)
-               folder = "INBOX";
+
        /* If no mailbox, return immediately */
        if (ast_strlen_zero(mailbox))
                return 0;
-       if (!context)
+
+       if (ast_strlen_zero(folder))
+               folder = "INBOX";
+       if (ast_strlen_zero(context))
                context = "default";
+
        snprintf(fn, sizeof(fn), "%s%s/%s/%s", VM_SPOOL_DIR, context, mailbox, folder);
-       dir = opendir(fn);
-       if (!dir)
+
+       if (!(dir = opendir(fn)))
                return 0;
+
        while ((de = readdir(dir))) {
                if (!strncasecmp(de->d_name, "msg", 3)) {
                        if (shortcircuit) {
@@ -2698,7 +2698,9 @@ static int __has_voicemail(const char *context, const char *mailbox, const char
                                ret++;
                }
        }
+
        closedir(dir);
+
        return ret;
 }
 
@@ -2724,13 +2726,15 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
        char tmp[256];
        char *context;
 
+       /* If no mailbox, return immediately */
+       if (ast_strlen_zero(mailbox))
+               return 0;
+
        if (newmsgs)
                *newmsgs = 0;
        if (oldmsgs)
                *oldmsgs = 0;
-       /* If no mailbox, return immediately */
-       if (ast_strlen_zero(mailbox))
-               return 0;
+
        if (strchr(mailbox, ',')) {
                int tmpnew, tmpold;
                char *mb, *cur;
@@ -2751,17 +2755,19 @@ static int inboxcount(const char *mailbox, int *newmsgs, int *oldmsgs)
                }
                return 0;
        }
+
        ast_copy_string(tmp, mailbox, sizeof(tmp));
-       context = strchr(tmp, '@');
-       if (context) {
-               *context = '\0';
-               context++;
-       } else
+       
+       if ((context = strchr(tmp, '@')))
+               *context++ = '\0';
+       else
                context = "default";
+
        if (newmsgs)
                *newmsgs = __has_voicemail(context, tmp, "INBOX", 0);
        if (oldmsgs)
                *oldmsgs = __has_voicemail(context, tmp, "Old", 0);
+
        return 0;
 }
 
@@ -2847,8 +2853,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_
 
        ast_copy_string(tmp, ext, sizeof(tmp));
        ext = tmp;
-       context = strchr(tmp, '@');
-       if (context) {
+       if ((context = strchr(tmp, '@'))) {
                *context++ = '\0';
                tmpptr = strchr(context, '&');
        } else {
@@ -4086,6 +4091,9 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st
 
                /* Forward VoiceMail */
                long duration = 0;
+               char *myserveremail = serveremail;
+               char buf[1024] = "";
+               int attach_user_voicemail = ast_test_flag((&globalflags), VM_ATTACH);
                RETRIEVE(dir, curmsg);
                cmd = vm_forwardoptions(chan, sender, dir, curmsg, vmfmts, S_OR(context, "default"), record_gain, &duration, vms);
                if (!cmd) {
@@ -4094,7 +4102,7 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st
                                /* Need to get message content */
                                if(option_debug > 2)
                                        ast_log (LOG_DEBUG,"Before mail_fetchheaders, curmsg is: %d, imap messages is %lu\n",vms->curmsg, vms->msgArray[vms->curmsg]);
-                               if (vms->msgArray[vms->curmsg] == 0) {
+                               if (!vms->msgArray[vms->curmsg]) {
                                        ast_log (LOG_WARNING,"Trying to access unknown message\n");
                                        return -1;
                                }
@@ -4107,15 +4115,13 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st
                                        return -1;
                                }
                                /* Get header info needed by sendmail */
-                               temp = get_header_by_tag(header_content, "X-Asterisk-VM-Duration:");
-                               if (temp)
+                               if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Duration:", buf, sizeof(buf))))
                                        duration = atoi(temp);
                                else
                                        duration = 0;
+                               
                                /* Attach only the first format */
-                               fmt = ast_strdupa(fmt);
-                               if (fmt) {
+                               if ((fmt = ast_strdupa(fmt))) {
                                        stringp = fmt;
                                        strsep(&stringp, "|");
                                } else {
@@ -4140,10 +4146,8 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st
  
                                STORE(todir, vmtmp->mailbox, vmtmp->context, vms->curmsg, chan, vmtmp, fmt, duration, vms);
 
-                               char *myserveremail = serveremail;
                                if (!ast_strlen_zero(vmtmp->serveremail))
                                        myserveremail = vmtmp->serveremail;
-                               int attach_user_voicemail = ast_test_flag((&globalflags), VM_ATTACH);
                                attach_user_voicemail = ast_test_flag(vmtmp, VM_ATTACH);
                                /* NULL category for IMAP storage */
                                sendmail(myserveremail, vmtmp, todircount, vmtmp->context, vmtmp->mailbox, S_OR(chan->cid.cid_num, NULL), S_OR(chan->cid.cid_name, NULL), vms->fn, fmt, duration, attach_user_voicemail, chan, NULL);
@@ -4403,11 +4407,13 @@ static int play_message(struct ast_channel *chan, struct ast_vm_user *vmu, struc
        char todir[PATH_MAX];
        int res = 0;
        char *temp;
+       char buf[1024];
 
        vms->starting = 0; 
        if(option_debug > 2)
                ast_log (LOG_DEBUG,"Before mail_fetchheaders, curmsg is: %d, imap messages is %lu\n",vms->curmsg, vms->msgArray[vms->curmsg]);
-       if (vms->msgArray[vms->curmsg] == 0) {
+
+       if (!vms->msgArray[vms->curmsg]) {
                ast_log (LOG_WARNING,"Trying to access unknown message\n");
                return -1;
        }
@@ -4430,6 +4436,7 @@ static int play_message(struct ast_channel *chan, struct ast_vm_user *vmu, struc
                res = wait_file2(chan, vms, "vm-first");        /* "First" */
        else if (vms->curmsg == vms->lastmsg)
                res = wait_file2(chan, vms, "vm-last");         /* "last" */
+
        if (!res) {
                res = wait_file2(chan, vms, "vm-message");      /* "message" */
                if (vms->curmsg && (vms->curmsg != vms->lastmsg)) {
@@ -4439,37 +4446,27 @@ static int play_message(struct ast_channel *chan, struct ast_vm_user *vmu, struc
        }
 
        /* Get info from headers!! */
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Caller-ID-Num:");
-
-       if (temp)
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Caller-ID-Num:", buf, sizeof(buf))))
                ast_copy_string(cid, temp, sizeof(cid)); 
        else 
                cid[0] = '\0';
-
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Context:");
-
-       if (temp)
+       
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Context:", buf, sizeof(buf))))
                ast_copy_string(context, temp, sizeof(context)); 
        else
                context[0] = '\0';
 
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Orig-time:");
-
-       if (temp)
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Orig-time:", buf, sizeof(buf))))
                ast_copy_string(origtime, temp, sizeof(origtime));
        else
                origtime[0] = '\0';
 
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Duration:");
-
-       if (temp)
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Duration:", buf, sizeof(buf))))
                ast_copy_string(duration,temp, sizeof(duration));
        else
                duration[0] = '\0';
        
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Category:");
-       
-       if (temp)
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Category:", buf, sizeof(buf))))
                ast_copy_string(category,temp, sizeof(category));
        else
                category[0] = '\0';
@@ -4665,22 +4662,23 @@ static int init_mailstream(struct vm_state *vms, int box)
 #include "linkage.c"
                /* Connect to INBOX first to get folders delimiter */
                imap_mailbox_name(tmp, vms, 0, 0);
-               stream = mail_open (stream, tmp, debug ? OP_DEBUG : NIL);
+               stream = mail_open(stream, tmp, debug ? OP_DEBUG : NIL);
                if (stream == NIL) {
                        ast_log (LOG_ERROR, "Can't connect to imap server %s\n", tmp);
                        return NIL;
                }
                get_mailbox_delimiter(stream);
                /* update delimiter in imapfolder */
-               for(cp = imapfolder; *cp; cp++)
+               for(cp = imapfolder; *cp; cp++) {
                        if(*cp == '/')
                                *cp = delimiter;
+               }
        }
        /* Now connect to the target folder */
        imap_mailbox_name(tmp, vms, box, 1);
        if(option_debug > 2)
                ast_log (LOG_DEBUG,"Before mail_open, server: %s, box:%d\n", tmp, box);
-       vms->mailstream = mail_open (stream, tmp, debug ? OP_DEBUG : NIL);
+       vms->mailstream = mail_open(stream, tmp, debug ? OP_DEBUG : NIL);
        if (vms->mailstream == NIL) {
                return -1;
        } else {
@@ -4696,14 +4694,15 @@ static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box)
        char dbox[256];
 
        ast_copy_string(vms->imapuser,vmu->imapuser, sizeof(vms->imapuser));
+
        if(option_debug > 2)
                ast_log(LOG_DEBUG,"Before init_mailstream, user is %s\n",vmu->imapuser);
-       ret = init_mailstream(vms, box);
-       if (ret != 0 || !vms->mailstream) {
+
+       if ((ret = init_mailstream(vms, box)) || !vms->mailstream) {
                ast_log (LOG_ERROR,"Could not initialize mailstream\n");
                return -1;
        }
-
+       
        /* Check Quota (here for now to test) */
        mail_parameters(NULL, SET_QUOTA, (void *) mm_parsequota);
        imap_mailbox_name(dbox, vms, box, 1);
@@ -4712,7 +4711,7 @@ static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box)
        pgm = mail_newsearchpgm();
 
        /* Check IMAP folder for Asterisk messages only... */
-       hdr = mail_newsearchheader ("X-Asterisk-VM-Extension", vmu->mailbox);
+       hdr = mail_newsearchheader("X-Asterisk-VM-Extension", vmu->mailbox);
        pgm->header = hdr;
        pgm->deleted = 0;
        pgm->undeleted = 1;
@@ -4726,15 +4725,14 @@ static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box)
                pgm->unseen = 0;
        }
 
-       vms->vmArrayIndex = 0;
        if(option_debug > 2)
                ast_log(LOG_DEBUG,"Before mail_search_full, user is %s\n",vmu->imapuser);
-       mail_search_full (vms->mailstream, NULL, pgm, NIL);
-
 
+       vms->vmArrayIndex = 0;
+       mail_search_full (vms->mailstream, NULL, pgm, NIL);
        vms->lastmsg = vms->vmArrayIndex - 1;
-
        mail_free_searchpgm(&pgm);
+
        return 0;
 }
 #else
@@ -7788,8 +7786,9 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
 {
        int res = 0;
 #ifdef IMAP_STORAGE
-       char origtimeS[256],cidS[256],contextS[256];
-       char *header_content,*temp;
+       char origtimeS[256], cidS[256], contextS[256];
+       char *header_content, *temp;
+       char buf[1024];
 #endif
        char filename[PATH_MAX];
        struct ast_config *msg_cfg = NULL;
@@ -7800,42 +7799,38 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
        vms->starting = 0; 
 #ifdef IMAP_STORAGE
        /* START HERE */
+
        /* get the message info!! */
        if(option_debug > 2)
-               ast_log (LOG_DEBUG,"Before mail_fetchheaders, curmsg is: %d, imap messages is %lu\n",vms->curmsg, vms->msgArray[vms->curmsg]);
-       if (vms->msgArray[vms->curmsg] == 0) {
-               ast_log (LOG_WARNING,"Trying to access unknown message\n");
+               ast_log(LOG_DEBUG, "Before mail_fetchheaders, curmsg is: %d, imap messages is %lu\n", vms->curmsg, vms->msgArray[vms->curmsg]);
+
+       if (!vms->msgArray[vms->curmsg]) {
+               ast_log(LOG_WARNING, "Trying to access unknown message\n");
                return -1;
        }
 
        /* This will only work for new messages... */
-       header_content = mail_fetchheader (vms->mailstream, vms->msgArray[vms->curmsg]);
-       /* empty string means no valid header */
-       if (ast_strlen_zero(header_content)) {
-               ast_log (LOG_ERROR,"Could not fetch header for message number %ld\n",vms->msgArray[vms->curmsg]);
+       if (!(header_content = mail_fetchheader(vms->mailstream, vms->msgArray[vms->curmsg])) || ast_strlen_zero(header_content)) {
+               ast_log(LOG_ERROR,"Could not fetch header for message number %ld\n", vms->msgArray[vms->curmsg]);
                return -1;
        }
-
-       /* Get info from headers!! */
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Caller-ID-Num:");
        
-       if (temp)
-               ast_copy_string(cidS,temp, sizeof(cidS));
+       /* Get info from headers!! */
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Caller-ID-Num:", buf, sizeof(buf))))
+               ast_copy_string(cidS, temp, sizeof(cidS));
        else
                cidS[0] = '\0';
        
        cid = &cidS[0];
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Context:");
-       
-       if (temp)
+
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Context:", buf, sizeof(buf))))
                ast_copy_string(contextS,temp, sizeof(contextS));
        else
                contextS[0] = '\0';
        
        context = &contextS[0];
-       temp = get_header_by_tag(header_content, "X-Asterisk-VM-Orig-time:");
-       
-       if (temp)
+
+       if ((temp = get_header_by_tag(header_content, "X-Asterisk-VM-Orig-time:", buf, sizeof(buf))))
                ast_copy_string(origtimeS,temp, sizeof(origtimeS));
        else
                origtimeS[0] = '\0';
@@ -8230,19 +8225,20 @@ static void write_file(char *filename, char *buffer, unsigned long len)
 void mm_searched(MAILSTREAM *stream, unsigned long number)
 {
        struct vm_state *vms;
-       char *mailbox;
-       char *user;
-       mailbox = stream->mailbox;
-       user = get_user_by_mailbox(mailbox);
-       
-       vms = get_vm_state_by_imapuser(user,2);
-       if (vms) {
-               if(option_debug > 2)
-                       ast_log (LOG_DEBUG, "saving mailbox message number %lu as message %d. Interactive set to %d\n",number,vms->vmArrayIndex,vms->interactive);
-               vms->msgArray[vms->vmArrayIndex++] = number;
-       } else {
-               ast_log (LOG_ERROR, "No state found.\n");
+       char *mailbox = stream->mailbox, buf[1024] = "", *user;
+
+       if (!(user = get_user_by_mailbox(mailbox, buf, sizeof(buf))))
+               return;
+
+       if (!(vms = get_vm_state_by_imapuser(user, 2))) {
+               ast_log(LOG_ERROR, "No state found.\n");
+               return;
        }
+       
+       if(option_debug > 2)
+               ast_log(LOG_DEBUG, "saving mailbox message number %lu as message %d. Interactive set to %d\n", number, vms->vmArrayIndex, vms->interactive);
+
+       vms->msgArray[vms->vmArrayIndex++] = number;
 }
 
 
@@ -8605,10 +8601,9 @@ void mm_fatal(char *string)
 static void mm_parsequota(MAILSTREAM *stream, unsigned char *msg, QUOTALIST *pquota)
 {
        struct vm_state *vms;
-       char *mailbox;
-       char *user;
-       unsigned long usage = 0;
-       unsigned long limit = 0;
+       char *mailbox = stream->mailbox, *user;
+       char buf[1024] = "";
+       unsigned long usage = 0, limit = 0;
        
        while (pquota) {
                usage = pquota->usage;
@@ -8616,72 +8611,63 @@ static void mm_parsequota(MAILSTREAM *stream, unsigned char *msg, QUOTALIST *pqu
                pquota = pquota->next;
        }
        
-       mailbox = stream->mailbox;
-       user = get_user_by_mailbox(mailbox);
-       vms = get_vm_state_by_imapuser(user,2);
-       if (vms) {
-               if(option_debug > 2)
-                       ast_log (LOG_DEBUG, "User %s usage is %lu, limit is %lu\n",user,usage,limit);
-               vms->quota_usage = usage;
-               vms->quota_limit = limit;
-       } else {
-               ast_log (LOG_ERROR, "No state found.\n");
+       if (!(user = get_user_by_mailbox(mailbox, buf, sizeof(buf))) || !(vms = get_vm_state_by_imapuser(user, 2))) {
+               ast_log(LOG_ERROR, "No state found.\n");
+               return;
        }
+
+       if (option_debug > 2)
+               ast_log(LOG_DEBUG, "User %s usage is %lu, limit is %lu\n", user, usage, limit);
+
+       vms->quota_usage = usage;
+       vms->quota_limit = limit;
 }
 
-static char *get_header_by_tag(char *header, char *tag)
+static char *get_header_by_tag(char *header, char *tag, char *buf, size_t len)
 {
-       char *start;
+       char *start, *eol_pnt;
        int taglen;
-       char *eol_pnt;
 
-       if (!header || !tag)
+       if (ast_strlen_zero(header) || ast_strlen_zero(tag))
                return NULL;
 
        taglen = strlen(tag) + 1;
        if (taglen < 1)
                return NULL;
 
-       start = strstr(header, tag);
-       if (!start)
+       if (!(start = strstr(header, tag)))
                return NULL;
 
-       ast_mutex_lock(&imaptemp_lock);
-       ast_copy_string(imaptemp, start+taglen, sizeof(imaptemp));
-       ast_mutex_unlock(&imaptemp_lock);
-       eol_pnt = strchr(imaptemp,'\n');
+       /* Since we can be called multiple times we should clear our buffer */
+       memset(buf, 0, len);
+
+       ast_copy_string(buf, start+taglen, len);
+       eol_pnt = strchr(buf,'\n');
        *eol_pnt = '\0';
-       return imaptemp;
+       return buf;
 }
 
-static char *get_user_by_mailbox(char *mailbox)
+static char *get_user_by_mailbox(char *mailbox, char *buf, size_t len)
 {
-       char *start, *quote;
-       char *eol_pnt;
+       char *start, *quote, *eol_pnt;
 
-       if (!mailbox)
+       if (ast_strlen_zero(mailbox))
                return NULL;
 
-       start = strstr(mailbox,"user=");
-       if (!start)
+       if (!(start = strstr(mailbox, "user=")))
                return NULL;
 
-       ast_mutex_lock(&imaptemp_lock);
-       ast_copy_string(imaptemp, start+5, sizeof(imaptemp));
-       ast_mutex_unlock(&imaptemp_lock);
+       ast_copy_string(buf, start+5, len);
 
-       quote = strchr(imaptemp,'\"');
-       if (!quote) {  /* if username is not in quotes */
-               eol_pnt = strchr(imaptemp,'/');
-               if (!eol_pnt) {
-                       eol_pnt = strchr(imaptemp,'}');
-               }
+       if (!(quote = strchr(buf, '\"'))) {
+               if (!(eol_pnt = strchr(buf, '/')))
+                       eol_pnt = strchr(buf,'}');
                *eol_pnt = '\0';
-               return imaptemp;
+               return buf;
        } else {
-               eol_pnt = strchr(imaptemp+1,'\"');
+               eol_pnt = strchr(buf+1,'\"');
                *eol_pnt = '\0';
-               return imaptemp+1;
+               return buf+1;
        }
 }
 
@@ -8839,20 +8825,19 @@ static void vmstate_delete(struct vm_state *vms)
 static void set_update(MAILSTREAM * stream) 
 {
        struct vm_state *vms;
-       char *mailbox;
-       char *user;
+       char *mailbox = stream->mailbox, *user;
+       char buf[1024] = "";
 
-       mailbox = stream->mailbox;
-       user = get_user_by_mailbox(mailbox);
-       vms = get_vm_state_by_imapuser(user, 0);
-       if (vms) {
-               if(option_debug > 2)
-                       ast_log (LOG_DEBUG, "User %s mailbox set for update.\n",user);
-               vms->updated = 2; /* set updated flag since mailbox changed */
-       } else {
-               if(option_debug > 2)
-                       ast_log (LOG_WARNING, "User %s mailbox not found for update.\n",user);
+       if (!(user = get_user_by_mailbox(mailbox, buf, sizeof(buf))) || !(vms = get_vm_state_by_imapuser(user, 0))) {
+               if (user && option_debug > 2)
+                       ast_log(LOG_WARNING, "User %s mailbox not found for update.\n", user);
+               return;
        }
+
+       if (option_debug > 2)
+               ast_log(LOG_DEBUG, "User %s mailbox set for update.\n", user);
+       
+       vms->updated = 2; /* Set updated flag since mailbox changed */
 }
 
 static void init_vm_state(struct vm_state *vms)