Back to index

courier  0.68.2
maildirnewshared.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 2003 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #include      "maildiraclt.h"
00007 #include      "maildirmisc.h"
00008 #include      "maildircreate.h"
00009 #include      "maildirnewshared.h"
00010 #include      "numlib/numlib.h"
00011 #include      <time.h>
00012 #if    HAVE_UNISTD_H
00013 #include      <unistd.h>
00014 #endif
00015 #include      <string.h>
00016 #include      <errno.h>
00017 #include      <stdio.h>
00018 #include      <stdlib.h>
00019 
00020 
00021 int maildir_newshared_disabled=0;
00022 
00023 int maildir_newshared_open(const char *indexfile,
00024                         struct maildir_newshared_enum_cb *info)
00025 {
00026        info->indexfile=indexfile;
00027        if ((info->fp=fopen(maildir_newshared_disabled ?
00028                          "/dev/null":indexfile, "r")) == NULL)
00029               return -1;
00030        info->startingpos=0;
00031        info->linenum=0;
00032        return 0;
00033 }
00034 
00035 void maildir_newshared_close(struct maildir_newshared_enum_cb *info)
00036 {
00037        if (info->fp)
00038               fclose(info->fp);
00039        info->fp=NULL;
00040 }
00041 
00042 int maildir_newshared_nextAt(struct maildir_newshared_enum_cb *info,
00043                           int *eof,
00044                           int (*cb_func)(struct maildir_newshared_enum_cb*),
00045                           void *cb_arg)
00046 {
00047        if (fseek(info->fp, info->startingpos, SEEK_SET) < 0)
00048               return -1;
00049        info->linenum= -1;
00050        return maildir_newshared_next(info, eof, cb_func, cb_arg);
00051 }
00052 
00053 int maildir_newshared_next(struct maildir_newshared_enum_cb *info,
00054                         int *eof,
00055                         int (*cb_func)(struct maildir_newshared_enum_cb *),
00056                         void *cb_arg)
00057 {
00058        char linebuf[BUFSIZ];
00059        int rc;
00060        char *p;
00061        const char *name;
00062        const char *homedir;
00063        const char *maildir;
00064        uid_t uid;
00065        gid_t gid;
00066        off_t nbytes;
00067 
00068 #define CB_INIT(name_,homedir_,maildir_,uid_,gid_) \
00069        info->name=name_; info->homedir=homedir_; info->maildir=maildir_; \
00070        info->uid=uid_; info->gid=gid_; info->cb_arg=cb_arg;
00071 
00072        *eof=0;
00073 
00074        while (fgets(linebuf, sizeof(linebuf), info->fp) != NULL)
00075        {
00076               nbytes=strlen(linebuf);
00077 
00078               if (nbytes && linebuf[nbytes-1] == '\n')
00079                      linebuf[nbytes-1]=0;
00080 
00081               p=strchr(linebuf, '#');
00082               if (p) *p=0;
00083 
00084               p=strchr(linebuf, '\t');
00085               ++info->linenum;
00086               if (p)
00087               {
00088                      name=linebuf;
00089                      *p++=0;
00090 
00091                      if (*p == '*')
00092                      {
00093                             p=strchr(p, '\t');
00094                             if (p)
00095                             {
00096                                    const char *q;
00097                                    size_t n;
00098 
00099                                    *p++=0;
00100                                    maildir=p;
00101                                    p=strchr(p, '\t');
00102                                    if (p) *p=0;
00103 
00104                                    q=strrchr(info->indexfile, '/');
00105                                    if (q)
00106                                           ++q;
00107                                    else q=info->indexfile;
00108 
00109                                    n=strlen(info->indexfile)-strlen(q);
00110 
00111                                    p=malloc(n+strlen(maildir)+1);
00112                                    if (!p)
00113                                           return -1;
00114 
00115                                    if (n)
00116                                           memcpy(p, info->indexfile, n);
00117                                    strcpy(p+n, maildir);
00118 
00119 
00120                                    CB_INIT(name, NULL, p, 0, 0);
00121 
00122                                    info->cb_arg=cb_arg;
00123                                    rc= (*cb_func)(info);
00124 
00125                                    free(p);
00126                                    info->startingpos += nbytes;
00127                                    return rc;
00128                             }
00129                      }
00130                      else
00131                      {
00132                             uid=libmail_atouid_t(p);
00133                             p=strchr(p, '\t');
00134                             if (uid && p)
00135                             {
00136                                    *p++=0;
00137                                    gid=libmail_atogid_t(p);
00138                                    p=strchr(p, '\t');
00139                                    if (gid && p)
00140                                    {
00141                                           *p++=0;
00142                                           homedir=p;
00143                                           p=strchr(p, '\t');
00144                                           maildir="./Maildir";
00145 
00146                                           if (p)
00147                                           {
00148                                                  *p++=0;
00149                                                  if (*p && *p != '\t')
00150                                                         maildir=p;
00151                                                  p=strchr(p, '\t');
00152                                                  if (p) *p=0;
00153                                           }
00154 
00155                                           CB_INIT(name, homedir,
00156                                                  maildir,
00157                                                  uid,
00158                                                  gid);
00159 
00160                                           info->cb_arg=cb_arg;
00161                                           rc=(*cb_func)(info);
00162                                           info->startingpos += nbytes;
00163                                           return rc;
00164                                    }
00165                             }
00166                      }
00167               }
00168 
00169               if (linebuf[0])
00170               {
00171                      fprintf(stderr, "ERR: %s(%d): syntax error.\n",
00172                             info->indexfile, (int)info->linenum);
00173               }
00174               info->startingpos += nbytes;
00175        }
00176        *eof=1;
00177        return 0;
00178 }
00179 
00180 int maildir_newshared_enum(const char *indexfile,
00181                         int (*cb_func)(struct maildir_newshared_enum_cb *),
00182                         void *cb_arg)
00183 {
00184        struct maildir_newshared_enum_cb cb;
00185        int eof;
00186        int rc;
00187 
00188        if (maildir_newshared_open(indexfile, &cb) < 0)
00189               return -1;
00190 
00191        while ((rc=maildir_newshared_next(&cb, &eof, cb_func, cb_arg)) == 0)
00192        {
00193               if (eof)
00194               {
00195                      maildir_newshared_close(&cb);
00196                      return 0;
00197               }
00198        }
00199 
00200        maildir_newshared_close(&cb);
00201        return rc;
00202 }