]> code.citadel.org Git - citadel.git/blobdiff - citadel/server/modules/imap/serv_imap.c
Where gettimeofday() is required, include both time.h and sys/time.h
[citadel.git] / citadel / server / modules / imap / serv_imap.c
index e492bc74faef77eb2f3385e8558b88827272daaf..d55971bb5f76de414b88cd4122b3bf9ad3ea2d8a 100644 (file)
@@ -1,6 +1,6 @@
 // IMAP server for the Citadel system
 //
-// Copyright (c) 1987-2022 by the citadel.org team
+// Copyright (c) 1987-2023 by the citadel.org team
 //
 // This program is open source software.  Use, duplication, or disclosure
 // is subject to the terms of the GNU General Public License, version 3.
@@ -15,6 +15,7 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <time.h>
+#include <sys/time.h>
 #include <sys/wait.h>
 #include <ctype.h>
 #include <string.h>
@@ -26,6 +27,7 @@
 #include "../../support.h"
 #include "../../config.h"
 #include "../../user_ops.h"
+#include "../../room_ops.h"
 #include "../../database.h"
 #include "../../msgbase.h"
 #include "../../internet_addressing.h"
@@ -63,9 +65,8 @@ void registerImapCMD(const char *First, long FLen, const char *Second, long SLen
 
 
 const imap_handler_hook *imap_lookup(int num_parms, ConstStr *Params) {
-       struct CitContext *CCC = CC;
        void *v;
-       citimap *Imap = CCCIMAP;
+       citimap *Imap = IMAP;
 
        if (num_parms < 1)
                return NULL;
@@ -159,14 +160,14 @@ void imap_free_transmitted_message(void) {
  */
 void imap_set_seen_flags(int first_msg) {
        citimap *Imap = IMAP;
-       visit vbuf;
+       struct visit vbuf;
        int i;
        int num_sets;
        int s;
        char setstr[64], lostr[64], histr[64];
        long lo, hi;
 
-       if (Imap->num_msgs < 1) return;
+       if (Imap->num_msgs < 0) return;
        CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
 
        for (i = first_msg; i < Imap->num_msgs; ++i) {
@@ -257,9 +258,7 @@ void imap_add_single_msgid(long msgnum, void *userdata) {
  * Set up a message ID map for the current room (folder)
  */
 void imap_load_msgids(void) {
-       struct CitContext *CCC = CC;
-       struct cdbdata *cdbfr;
-       citimap *Imap = CCCIMAP;
+       citimap *Imap = IMAP;
 
        if (Imap->selected == 0) {
                syslog(LOG_ERR, "imap_load_msgids() can't run; no room selected");
@@ -269,21 +268,13 @@ void imap_load_msgids(void) {
        imap_free_msgids();     /* If there was already a map, free it */
 
        /* Load the message list */
-       cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
-       if (cdbfr != NULL) {
-               Imap->msgids = (long*)cdbfr->ptr;
-               Imap->num_msgs = cdbfr->len / sizeof(long);
-               Imap->num_alloc = cdbfr->len / sizeof(long);
-               cdbfr->ptr = NULL;
-               cdbfr->len = 0;
-               cdb_free(cdbfr);
-       }
+       Imap->num_msgs = CtdlFetchMsgList(CC->room.QRnumber, &Imap->msgids);
+       Imap->num_alloc = Imap->num_msgs;
 
        if (Imap->num_msgs) {
                Imap->flags = malloc(Imap->num_alloc * sizeof(unsigned int));
                memset(Imap->flags, 0, (Imap->num_alloc * sizeof(unsigned int)) );
        }
-
        imap_set_seen_flags(0);
 }
 
@@ -292,13 +283,11 @@ void imap_load_msgids(void) {
  * Re-scan the selected room (folder) and see if it's been changed at all
  */
 void imap_rescan_msgids(void) {
-       struct CitContext *CCC = CC;
-       citimap *Imap = CCCIMAP;
+       citimap *Imap = IMAP;
        int original_num_msgs = 0;
        long original_highest = 0L;
        int i, j, jstart;
        int message_still_exists;
-       struct cdbdata *cdbfr;
        long *msglist = NULL;
        int num_msgs = 0;
        int num_recent = 0;
@@ -320,17 +309,7 @@ void imap_rescan_msgids(void) {
        /* Load the *current* message list from disk, so we can compare it
         * to what we have in memory.
         */
-       cdbfr = cdb_fetch(CDB_MSGLISTS, &CC->room.QRnumber, sizeof(long));
-       if (cdbfr != NULL) {
-               msglist = (long*)cdbfr->ptr;
-               cdbfr->ptr = NULL;
-               num_msgs = cdbfr->len / sizeof(long);
-               cdbfr->len = 0;
-               cdb_free(cdbfr);
-       }
-       else {
-               num_msgs = 0;
-       }
+       num_msgs = CtdlFetchMsgList(CC->room.QRnumber, &msglist);
 
        /*
         * Check to see if any of the messages we know about have been expunged
@@ -399,9 +378,7 @@ void imap_rescan_msgids(void) {
                IAPrintf("* %d RECENT\r\n", num_recent);
        }
 
-       if (msglist != NULL) {
-               free(msglist);
-       }
+       free(msglist);
        Imap->last_mtime = CC->room.QRmtime;
 }
 
@@ -411,8 +388,7 @@ void imap_rescan_msgids(void) {
  * the IMAP server.
  */
 void imap_cleanup_function(void) {
-       struct CitContext *CCC = CC;
-       citimap *Imap = CCCIMAP;
+       citimap *Imap = IMAP;
 
        /* Don't do this stuff if this is not a Imap session! */
        if (CC->h_command_function != imap_command_loop)
@@ -511,20 +487,19 @@ void imap_id(int num_parms, ConstStr *Params) {
  */
 void imap_greeting(void) {
        citimap *Imap;
-       CitContext *CCC = CC;
 
-       strcpy(CCC->cs_clientname, "IMAP session");
-       CCC->session_specific_data = malloc(sizeof(citimap));
-       Imap = (citimap *)CCC->session_specific_data;
+       strcpy(CC->cs_clientname, "IMAP session");
+       CC->session_specific_data = malloc(sizeof(citimap));
+       Imap = (citimap *)CC->session_specific_data;
        memset(Imap, 0, sizeof(citimap));
        Imap->authstate = imap_as_normal;
        Imap->cached_rfc822_msgnum = (-1);
        Imap->cached_rfc822_withbody = 0;
        Imap->Reply = NewStrBufPlain(NULL, SIZ * 10); /* 40k */
 
-       if (CCC->nologin) {
+       if (CC->nologin) {
                IAPuts("* BYE; Server busy, try later\r\n");
-               CCC->kill_me = KILLME_NOLOGIN;
+               CC->kill_me = KILLME_NOLOGIN;
                IUnbuffer();
                return;
        }
@@ -555,7 +530,7 @@ void imap_login(int num_parms, ConstStr *Params) {
 
        switch (num_parms) {
        case 3:
-               if (Params[2].Key[0] == '{') {
+               if (Params[2].len && (Params[2].Key[0] == '{')) {
                        IAPuts("+ go ahead\r\n");
                        IMAP->authstate = imap_as_expecting_multilineusername;
                        strcpy(IMAP->authseq, Params[0].Key);
@@ -862,8 +837,7 @@ void imap_select(int num_parms, ConstStr *Params) {
  * Does the real work for expunge.
  */
 int imap_do_expunge(void) {
-       struct CitContext *CCC = CC;
-       citimap *Imap = CCCIMAP;
+       citimap *Imap = IMAP;
        int i;
        int num_expunged = 0;
        long *delmsgs = NULL;
@@ -1408,7 +1382,6 @@ void imap_rename(int num_parms, ConstStr *Params) {
  * Main command loop for IMAP sessions.
  */
 void imap_command_loop(void) {
-       struct CitContext *CCC = CC;
        struct timeval tv1, tv2;
        suseconds_t total_time = 0;
        citimap *Imap;
@@ -1416,8 +1389,8 @@ void imap_command_loop(void) {
        const imap_handler_hook *h;
 
        gettimeofday(&tv1, NULL);
-       CCC->lastcmd = time(NULL);
-       Imap = CCCIMAP;
+       CC->lastcmd = time(NULL);
+       Imap = IMAP;
 
        flush_output();
        if (Imap->Cmd.CmdBuf == NULL)