Back to index

courier  0.68.2
maildirpath.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2000 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #if HAVE_CONFIG_H
00007 #include "config.h"
00008 #endif
00009 
00010 #include      <sys/types.h>
00011 #include      <sys/stat.h>
00012 #include      <string.h>
00013 #include      <stdlib.h>
00014 #include      <time.h>
00015 #if    HAVE_UNISTD_H
00016 #include      <unistd.h>
00017 #endif
00018 #include      <stdio.h>
00019 #include      <ctype.h>
00020 #include      <errno.h>
00021 
00022 #include      "maildirmisc.h"
00023 
00024 
00025 char *maildir_name2dir(const char *maildir,      /* DIR location */
00026                      const char *foldername) /* INBOX.name */
00027 {
00028        const char *inbox=INBOX;
00029        int l=strlen(inbox);
00030        char *p;
00031 
00032        if (!maildir) maildir=".";
00033 
00034        if (foldername && strncasecmp(foldername, INBOX, l) == 0 &&
00035            strchr(foldername, '/') == NULL)
00036        {
00037               if (foldername[l] == 0)
00038                      return strdup(maildir); /* INBOX: main maildir inbox */
00039 
00040               if (foldername[l] == '.')
00041               {
00042                      const char *r;
00043 
00044                      for (r=foldername; *r; r++)
00045                      {
00046                             if (*r != '.')       continue;
00047 
00048                             if (r[1] == 0 || r[1] == '.')
00049                             {
00050                                    errno=EINVAL;
00051                                    return (0);
00052                             }
00053                      }
00054 
00055                      r=strchr(foldername, '.');
00056 
00057                      p=malloc(strlen(maildir)+strlen(r) + 2);
00058 
00059                      if (!p)
00060                             return NULL;
00061 
00062                      return (strcat(strcat(strcpy(p, maildir), "/"),
00063                                    r));
00064               }
00065        }
00066 
00067        errno=EINVAL;
00068        return NULL;
00069 }
00070 
00071 char *maildir_location(const char *homedir,
00072                      const char *maildir)
00073 {
00074        char *p;
00075 
00076        if (*maildir == '/')
00077               return strdup(maildir);
00078 
00079        p=malloc(strlen(homedir)+strlen(maildir)+2);
00080 
00081        if (!p)
00082               return NULL;
00083        strcat(strcat(strcpy(p, homedir), "/"), maildir);
00084        return p;
00085 }
00086 
00087 char *maildir_folderdir(const char *maildir, const char *foldername)
00088 {
00089 char   *p;
00090 const char *r;
00091 size_t l;
00092 
00093        if (!maildir) maildir=".";
00094        l=strlen(maildir);
00095 
00096        if (foldername == 0 ||
00097               strcasecmp(foldername, INBOX) == 0)
00098        {
00099               if ((p=malloc(l+1)) == 0)   return (0);
00100               strcpy(p, maildir);
00101               return(p);
00102        }
00103 
00104        /* Rules: no leading/trailing periods, no /s */
00105        if (*foldername == '.' || strchr(foldername, '/'))
00106        {
00107               errno=EINVAL;
00108               return (0);
00109        }
00110 
00111        for (r=foldername; *r; r++)
00112        {
00113               if (*r != '.')       continue;
00114               if (r[1] == 0 || r[1] == '.')
00115               {
00116                      errno=EINVAL;
00117                      return (0);
00118               }
00119        }
00120 
00121        if ((p=malloc(l+strlen(foldername)+3)) == 0)     return (0);
00122        *p=0;
00123        if (strcmp(maildir, "."))
00124               strcat(strcpy(p, maildir), "/");
00125        
00126        return (strcat(strcat(p, "."), foldername));
00127 }