#endif
#ifdef IMAP_STORAGE
+#include "asterisk/threadstorage.h"
+
AST_MUTEX_DEFINE_STATIC(imaptemp_lock);
static char imaptemp[1024];
static char imapserver[48];
struct vm_state;
struct ast_vm_user;
+AST_THREADSTORAGE(ts_vmstate, ts_vmstate_init);
+
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. */
mailbox = stream->mailbox;
user = get_user_by_mailbox(mailbox);
vms = get_vm_state_by_imapuser(user,2);
+ if (!vms) {
+ vms = get_vm_state_by_imapuser(user, 0);
+ }
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);
mailbox = stream->mailbox;
user = get_user_by_mailbox(mailbox);
vms = get_vm_state_by_imapuser(user,2);
+ if (!vms) {
+ vms = get_vm_state_by_imapuser(user, 0);
+ }
if (vms) {
if (option_debug > 2)
ast_log (LOG_DEBUG, "User %s usage is %lu, limit is %lu\n",user,usage,limit);
{
struct vm_state *vms_p;
+ if ((vms_p = pthread_getspecific(ts_vmstate.key)) && !strcmp(vms_p->imapuser, vmu->imapuser) && !strcmp(vms_p->username, vmu->mailbox)) {
+ return vms_p;
+ }
if (option_debug > 4)
ast_log(LOG_DEBUG,"Adding new vmstate for %s\n",vmu->imapuser);
if (!(vms_p = ast_calloc(1, sizeof(*vms_p))))
{
struct vmstate *vlist = NULL;
+ if (interactive) {
+ struct vm_state *vms;
+ vms = pthread_getspecific(ts_vmstate.key);
+ return vms;
+ }
+
ast_mutex_lock(&vmstate_lock);
vlist = vmstates;
while (vlist) {
struct vmstate *vlist = NULL;
const char *local_context = S_OR(context, "default");
+ if (interactive) {
+ struct vm_state *vms;
+ vms = pthread_getspecific(ts_vmstate.key);
+ return vms;
+ }
+
ast_mutex_lock(&vmstate_lock);
vlist = vmstates;
if (option_debug > 2)
if (vlist->vms->username && vlist->vms->context) {
if (option_debug > 2)
ast_log(LOG_DEBUG, " comparing mailbox %s (i=%d) to vmstate mailbox %s (i=%d)\n",mailbox,interactive,vlist->vms->username,vlist->vms->interactive);
- if (!strcmp(vlist->vms->username,mailbox) && !(strcmp(vlist->vms->context, local_context)) && vlist->vms->interactive == interactive) {
+ if (!strcmp(vlist->vms->username,mailbox) && !(strcmp(vlist->vms->context, local_context))) {
if (option_debug > 2)
ast_log(LOG_DEBUG, " Found it!\n");
ast_mutex_unlock(&vmstate_lock);
/* get a pointer to the persistent store */
vms->persist_vms = altvms;
/* Reuse the mailstream? */
+#ifdef REALLY_FAST_EVEN_IF_IT_MEANS_RESOURCE_LEAKS
vms->mailstream = altvms->mailstream;
- /* vms->mailstream = NIL; */
+#else
+ vms->mailstream = NIL;
+#endif
}
+ return;
}
v = (struct vmstate *)malloc(sizeof(struct vmstate));
altvms->oldmessages = vms->oldmessages;
altvms->updated = 1;
}
+ vms->mailstream = mail_close(vms->mailstream);
+
+ /* Interactive states are not stored within the persistent list */
+ return;
}
ast_mutex_lock(&vmstate_lock);
adsi_begin(chan, &useadsi);
#ifdef IMAP_STORAGE
+ pthread_once(&ts_vmstate.once, ts_vmstate.key_init);
+ pthread_setspecific(ts_vmstate.key, &vms);
+
vms.interactive = 1;
vms.updated = 1;
if (vmu)
free(vms.deleted);
if (vms.heard)
free(vms.heard);
- ast_module_user_remove(u);
+#ifdef IMAP_STORAGE
+ pthread_setspecific(ts_vmstate.key, NULL);
+#endif
+ ast_module_user_remove(u);
return res;
}