#include <sys/socket.h>
#endif
#include <fcntl.h>
+#ifndef G_OS_WIN32
#include <sys/mman.h>
#include <sys/wait.h>
-
+#endif
#include <gtk/gtk.h>
#include <log.h>
#include "etpan-thread-manager.h"
void imap_main_done(void)
{
+ imap_disconnect_all();
etpan_thread_manager_stop(thread_manager);
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__)
+ return;
+#endif
etpan_thread_manager_join(thread_manager);
g_source_remove(thread_manager_signal);
int imap_threaded_select(Folder * folder, const char * mb,
gint * exists, gint * recent, gint * unseen,
- guint32 * uid_validity,gint *can_create_flags)
+ guint32 * uid_validity,gint *can_create_flags,
+ GSList **ok_flags)
{
struct select_param param;
struct select_result result;
* can_create_flags = FALSE;
if (imap->imap_selection_info->sel_perm_flags) {
+ GSList *t_flags = NULL;
clistiter *cur =
clist_begin(imap->imap_selection_info->sel_perm_flags);
- for (; cur && !(*can_create_flags); cur = clist_next(cur)) {
+ for (; cur; cur = clist_next(cur)) {
struct mailimap_flag_perm *flag = (struct mailimap_flag_perm *)clist_content(cur);
if (flag->fl_type == MAILIMAP_FLAG_PERM_ALL)
*can_create_flags = TRUE;
flag->fl_flag->fl_type == 6 &&
!strcmp(flag->fl_flag->fl_data.fl_extension, "*"))
*can_create_flags = TRUE;
-
+ if (ok_flags) {
+ MsgPermFlags c_flag = 0;
+ switch (flag->fl_flag->fl_type) {
+ case MAILIMAP_FLAG_ANSWERED:
+ c_flag = IMAP_FLAG_ANSWERED;
+ break;
+ case MAILIMAP_FLAG_FLAGGED:
+ c_flag = IMAP_FLAG_FLAGGED;
+ break;
+ case MAILIMAP_FLAG_DELETED:
+ c_flag = IMAP_FLAG_DELETED;
+ break;
+ case MAILIMAP_FLAG_DRAFT:
+ c_flag = IMAP_FLAG_DRAFT;
+ break;
+ case MAILIMAP_FLAG_SEEN:
+ c_flag = IMAP_FLAG_SEEN;
+ break;
+ case MAILIMAP_FLAG_KEYWORD:
+ if (!strcasecmp(flag->fl_flag->fl_data.fl_keyword, "$Forwarded"))
+ c_flag = IMAP_FLAG_FORWARDED;
+ break;
+ default:
+ break;
+ }
+ if (c_flag != 0) {
+ t_flags = g_slist_prepend(t_flags,
+ GUINT_TO_POINTER(c_flag));
+ }
+ }
}
+ if (ok_flags)
+ *ok_flags = t_flags;
}
debug_print("imap select - end\n");
NULL, NULL, NULL, NULL, NULL,
NULL, 0, NULL, NULL, NULL);
break;
+ case IMAP_SEARCH_TYPE_FORWARDED:
+ search_type_key = mailimap_search_key_new(MAILIMAP_SEARCH_KEY_KEYWORD,
+ NULL, NULL, NULL, NULL, NULL,
+ strdup("$Forwarded"), NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, 0,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, 0, NULL, NULL, NULL);
+ break;
}
if (search_type_key != NULL) {
r = fwrite(content, 1, content_size, f);
if (r < content_size) {
+ result->error = MAILIMAP_ERROR_FETCH;
goto fclose;
}
r = fclose(f);
if (r == EOF) {
+ result->error = MAILIMAP_ERROR_FETCH;
goto unlink;
}
goto free;
close:
close(fd);
unlink:
- g_unlink(param->filename);
+ claws_unlink(param->filename);
free:
+ /* mmap_string_unref is a simple free in libetpan
+ * when it has MMAP_UNAVAILABLE defined */
if (mmap_string_unref(content) != 0)
free(content);
}
- debug_print("imap fetch_content run - end %i\n", r);
+ debug_print("imap fetch_content run - end %i\n", result->error);
}
int imap_threaded_fetch_content(Folder * folder, uint32_t msg_index,
flags &= ~MSG_NEW;
break;
case MAILIMAP_FLAG_KEYWORD:
- if (s_tags)
+ if (!strcasecmp(flag_fetch->fl_flag->fl_data.fl_keyword, "$Forwarded"))
+ flags |= MSG_FORWARDED;
+ else if (s_tags)
tags = g_slist_prepend(tags, g_strdup(flag_fetch->fl_flag->fl_data.fl_keyword));
break;
}
int r;
char * data;
size_t size;
+#ifndef G_OS_WIN32
struct stat stat_buf;
int fd;
+#endif
guint32 uid = 0, val = 0;
param = op->param;
CHECK_IMAP();
+#ifndef G_OS_WIN32
r = stat(param->filename, &stat_buf);
if (r < 0) {
result->error = MAILIMAP_ERROR_APPEND;
result->error = MAILIMAP_ERROR_APPEND;
return;
}
-
+#else
+ data = file_read_to_str_no_recode(param->filename);
+ if (data == NULL) {
+ result->error = MAILIMAP_ERROR_APPEND;
+ return;
+ }
+ size = strlen(data);
+#endif
mailstream_logger = imap_logger_append;
r = mailimap_uidplus_append(param->imap, param->mailbox,
mailstream_logger = imap_logger_cmd;
+#ifndef G_OS_WIN32
munmap(data, size);
close(fd);
+#else
+ g_free(data);
+#endif
result->error = r;
result->uid = uid;
#define ENV_BUFFER_SIZE 512
-
+#ifndef G_OS_WIN32
static void do_exec_command(int fd, const char * command,
const char * servername, uint16_t port)
{
exit(0);
}
-#ifdef SOLARIS
if (servername)
- snprintf(env_buffer, ENV_BUFFER_SIZE,
- "ETPANSERVER=%s", servername);
+ g_setenv("ETPANSERVER", servername, TRUE);
else
- snprintf(env_buffer, ENV_BUFFER_SIZE, "ETPANSERVER=");
- putenv(env_buffer);
-#else
- if (servername)
- setenv("ETPANSERVER", servername, 1);
- else
- unsetenv("ETPANSERVER");
-#endif
+ g_unsetenv("ETPANSERVER");
-#ifdef SOLARIS
- if (port)
- snprintf(env_buffer, ENV_BUFFER_SIZE, "ETPANPORT=%d", port);
- else
- snprintf(env_buffer, ENV_BUFFER_SIZE, "ETPANPORT=");
- putenv(env_buffer);
-#else
if (port) {
char porttext[20];
snprintf(porttext, sizeof(porttext), "%d", port);
- setenv("ETPANPORT", porttext, 1);
+ g_setenv("ETPANPORT", porttext, TRUE);
}
else {
- unsetenv("ETPANPORT");
+ g_unsetenv("ETPANPORT");
}
-#endif
/* Not a lot we can do if there's an error other than bail. */
if (dup2(fd, 0) == -1)
return result.error;
}
+#endif /* G_OS_WIN32 */
void imap_threaded_cancel(Folder * folder)
{