]> code.citadel.org Git - citadel.git/blobdiff - citadel/imap_tools.c
* Changed a bunch of localtime() calls to localtime_r(), for great justice.
[citadel.git] / citadel / imap_tools.c
index 9215873aa0b1fb88a6dc2ff554971e00f0be02fe..d1f2654fe40449c5e5a4e92cf0f558b249e19214 100644 (file)
@@ -95,28 +95,25 @@ void imap_mailboxname(char *buf, int bufsize, struct ctdlroom *qrbuf)
 {
        struct floor *fl;
        int i;
+       char buf2[SIZ];
+       int sfstart = 0;
 
        /*
         * For mailboxes, just do it straight.
-        * Also handle Kolab-compatible groupware folder names.
+        * Do the Cyrus-compatible thing: all private folders are
+        * subfolders of INBOX.
         */
        if (qrbuf->QRflags & QR_MAILBOX) {
                safestrncpy(buf, qrbuf->QRname, bufsize);
                strcpy(buf, &buf[11]);
                if (!strcasecmp(buf, MAILROOM)) {
                        strcpy(buf, "INBOX");
+                       sfstart = 5;
                }
-               if (!strcasecmp(buf, USERCALENDARROOM)) {
-                       sprintf(buf, "INBOX|%s", USERCALENDARROOM);
-               }
-               if (!strcasecmp(buf, USERCONTACTSROOM)) {
-                       sprintf(buf, "INBOX|%s", USERCONTACTSROOM);
-               }
-               if (!strcasecmp(buf, USERTASKSROOM)) {
-                       sprintf(buf, "INBOX|%s", USERTASKSROOM);
-               }
-               if (!strcasecmp(buf, USERNOTESROOM)) {
-                       sprintf(buf, "INBOX|%s", USERNOTESROOM);
+               else {
+                       sprintf(buf2, "INBOX/%s", buf);
+                       strcpy(buf, buf2);
+                       sfstart = 6;
                }
        }
        /*
@@ -124,16 +121,19 @@ void imap_mailboxname(char *buf, int bufsize, struct ctdlroom *qrbuf)
         */
        else {
                fl = cgetfloor(qrbuf->QRfloor);
-               snprintf(buf, bufsize, "%s|%s",
+               snprintf(buf, bufsize, "%s/%s",
                         fl->f_name,
                         qrbuf->QRname);
+               sfstart = strlen(fl->f_name) + 1;
        }
 
        /*
-        * Replace delimiter characters with "|" for pseudo-folder-delimiting
+        * Replace delimiter characters with "/" for pseudo-folder-delimiting
+        * and replace actual slashes with "|" because they're illegal here.
         */
-       for (i=0; i<strlen(buf); ++i) {
-               if (buf[i] == FDELIM) buf[i] = '|';
+       for (i=sfstart; i<strlen(buf); ++i) {
+               if (buf[i] == FDELIM) buf[i] = '/';
+               else if (buf[i] == '/') buf[i] = '|';
        }
 }
 
@@ -159,38 +159,22 @@ int imap_roomname(char *rbuf, int bufsize, char *foldername)
        int ret = (-1);
 
        if (foldername == NULL) return(-1);
-       levels = num_parms(foldername);
+       levels = num_tokens(foldername, '/');
 
        /*
         * Convert the crispy idiot's reserved names to our reserved names.
-        * Also handle Kolab-compatible groupware folder names.
+        * Also handle Cyrus-compatible folder names.
         */
        if (!strcasecmp(foldername, "INBOX")) {
                safestrncpy(rbuf, MAILROOM, bufsize);
                ret = (0 | IR_MAILBOX);
        }
-       else if ( (!strncasecmp(foldername, "INBOX", 5))
-             && (!strcasecmp(&foldername[6], USERCALENDARROOM)) ) {
-               safestrncpy(rbuf, USERCALENDARROOM, bufsize);
-               ret = (0 | IR_MAILBOX);
-       }
-       else if ( (!strncasecmp(foldername, "INBOX", 5))
-             && (!strcasecmp(&foldername[6], USERCONTACTSROOM)) ) {
-               safestrncpy(rbuf, USERCONTACTSROOM, bufsize);
-               ret = (0 | IR_MAILBOX);
-       }
-       else if ( (!strncasecmp(foldername, "INBOX", 5))
-             && (!strcasecmp(&foldername[6], USERTASKSROOM)) ) {
-               safestrncpy(rbuf, USERTASKSROOM, bufsize);
-               ret = (0 | IR_MAILBOX);
-       }
-       else if ( (!strncasecmp(foldername, "INBOX", 5))
-             && (!strcasecmp(&foldername[6], USERNOTESROOM)) ) {
-               safestrncpy(rbuf, USERNOTESROOM, bufsize);
+       else if (!strncasecmp(foldername, "INBOX/", 6)) {
+               safestrncpy(rbuf, &foldername[6], bufsize);
                ret = (0 | IR_MAILBOX);
        }
        else if (levels > 1) {
-               extract(floorname, foldername, 0);
+               extract_token(floorname, foldername, 0, '/');
                strcpy(roomname, &foldername[strlen(floorname)+1]);
                for (i = 0; i < MAXFLOORS; ++i) {
                        fl = cgetfloor(i);
@@ -214,23 +198,13 @@ int imap_roomname(char *rbuf, int bufsize, char *foldername)
                ret = (0 | IR_MAILBOX);
        }
 
-       /* Undelimiterizationalize the room name (change '|') */
+       /* Undelimiterizationalisticize the room name (change '/' and '|') */
        for (i=0; i<strlen(rbuf); ++i) {
-               if (rbuf[i] == '|') rbuf[i] = FDELIM;
-       }
-
-
-/*** This doesn't work.
-       char buf[SIZ];
-       if (ret & IR_MAILBOX) {
-               if (atol(rbuf) == 0L) {
-                       strcpy(buf, rbuf);
-                       sprintf(rbuf, "%010ld.%s", CC->user.usernum, buf);
-               }
+               if (rbuf[i] == '/') rbuf[i] = FDELIM;
+               else if (rbuf[i] == '|') rbuf[i] = '/';
        }
- ***/
 
-       lprintf(9, "(That translates to \"%s\")\n", rbuf);
+       lprintf(CTDL_DEBUG, "(That translates to \"%s\")\n", rbuf);
        return(ret);
 }
 
@@ -307,7 +281,7 @@ int imap_is_message_set(char *buf)
 #define WILDMAT_TRUE   1
 #define WILDMAT_FALSE  0
 #define WILDMAT_ABORT  -1
-#define WILDMAT_DELIM  '|'
+#define WILDMAT_DELIM  '/'
 
 /*
  * Match text and p, return TRUE, FALSE, or ABORT.
@@ -441,7 +415,7 @@ int imap_datecmp(char *datestr, time_t msgtime) {
        }
 
        /* Extract day/month/year from message timestamp */
-       memcpy(&msgtm, localtime(&msgtime), sizeof(struct tm));
+       localtime_r(&msgtime, &msgtm);
        msgday = msgtm.tm_mday;
        msgmonth = msgtm.tm_mon;
        msgyear = msgtm.tm_year + 1900;