Back to index

courier  0.68.2
Functions
maildirmake.c File Reference
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <ctype.h>
#include <errno.h>
#include "maildircreate.h"
#include "maildirmisc.h"
#include "maildirsharedrc.h"
#include "maildirquota.h"

Go to the source code of this file.

Functions

static void usage ()
FILE * maildir_shared_fopen (const char *, const char *)
void maildir_shared_fparse (char *, char **, char **)
static void add (const char *dir, const char *name)
static void del (const char *dir, const char *n)
int main (int argc, char *argv[])

Function Documentation

static void add ( const char *  dir,
const char *  name 
) [static]

Definition at line 40 of file maildirmake.c.

{
char   *c=malloc(strlen(name)+1);
char   *s;
FILE   *fp;
char   buf[BUFSIZ];
char   *ptr, *dirp;

       if (!c)
       {
              perror("malloc");
              exit(1);
       }
       strcpy(c, name);

       if ((s=strchr(c, '=')) == 0)
              usage();
       *s++=0;
       if (*s != '/')
              usage();
       if (access(s, R_OK))
       {
              perror(s);
              exit(1);
       }
       if (strchr(c, '.') || strchr(c, '/'))
       {
              fprintf(stderr, "%s: invalid name\n", c);
              exit(1);
       }

       if (chdir(dir))
       {
              perror(dir);
              exit(1);
       }

       if ((fp=fopen(MAILDIRSHAREDRC, "r")) != 0)
       {
              while ((ptr=fgets(buf, sizeof(buf), fp)) != 0)
              {
              char   *namep;

                     maildir_shared_fparse(buf, &namep, &dirp);
                     if (!namep)   continue;
                     if (strcmp(namep, c) == 0)
                     {
                            fclose(fp);
                            fprintf(stderr,
              "%s: already defined as a sharable maildir in %s.\n",
                                   namep, MAILDIRSHAREDRC);
                            exit(2);
                     }
              }
              fclose(fp);
       }

       if ((fp=maildir_shared_fopen(".", "a+")) == 0)
       {
              perror(dir);
              exit(1);
       }

       if (fseek(fp, 0L, SEEK_SET) < 0)
       {
              perror(dir);
              exit(1);
       }

       while ((ptr=fgets(buf, sizeof(buf), fp)) != 0)
       {
       char   *namep;

              maildir_shared_fparse(buf, &namep, &dirp);
              if (!namep)   continue;
              if (strcmp(namep, c) == 0)
              {
                     fclose(fp);
                     fprintf(stderr, "%s: already defined as a sharable maildir.\n",
                            namep);
                     exit(2);
              }
       }
       fprintf(fp, "%s\t%s\n", c, s);
       if (fflush(fp) || ferror(fp) || fclose(fp))
       {
              perror("dir");
              exit(1);
       }
       exit(0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void del ( const char *  dir,
const char *  n 
) [static]

Definition at line 132 of file maildirmake.c.

{
FILE   *fp;
char   buf[BUFSIZ];
char   buf2[BUFSIZ];

FILE   *fp2;
int    found;
 struct maildir_tmpcreate_info createInfo;

       if (chdir(dir))
       {
              perror(dir);
              exit(1);
       }
       if ((fp=maildir_shared_fopen(".", "r")) == 0)
       {
              perror(dir);
              exit(1);
       }

       maildir_tmpcreate_init(&createInfo);

       createInfo.uniq="shared";
       createInfo.msgsize=0;
       createInfo.doordie=1;

       if ((fp2=maildir_tmpcreate_fp(&createInfo)) == NULL)
       {
              perror(dir);
              exit(1);
       }

       found=0;
       while (fgets(buf, sizeof(buf), fp))
       {
       char   *name, *dirp;

              strcpy(buf2, buf);
              maildir_shared_fparse(buf2, &name, &dirp);
              if (name && strcmp(name, n) == 0)
              {
                     found=1;
                     continue;
              }
              fprintf(fp2, "%s", buf);
       }
       fclose(fp);
       if (fflush(fp2) || ferror(fp2) || fclose(fp2)
           || rename(createInfo.tmpname, "shared-maildirs"))
       {
              perror(createInfo.tmpname);
              unlink(createInfo.tmpname);
              exit(1);
       }
       maildir_tmpcreate_free(&createInfo);
       if (!found)
       {
              fprintf(stderr, "%s: not found.\n", n);
              exit(1);
       }
       exit(0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

FILE* maildir_shared_fopen ( const char *  ,
const char *   
)

Definition at line 15 of file maildirshared2.c.

{
char   *m;
FILE   *fp;

       m=malloc(strlen(maildir)+sizeof("/shared-maildirs"));
       if (!m)
       {
              perror("malloc");
              return (0);
       }
       strcat(strcpy(m, maildir), "/shared-maildirs");

       fp=fopen(m, mode);
       free(m);
       return (fp);
}

Here is the caller graph for this function:

void maildir_shared_fparse ( char *  ,
char **  ,
char **   
)

Definition at line 33 of file maildirshared2.c.

{
char   *q;

       *name=0;
       *dir=0;

       if ((q=strchr(p, '\n')) != 0)      *q=0;
       if ((q=strchr(p, '#')) != 0)       *q=0;

       for (q=p; *q; q++)
              if (isspace((int)(unsigned char)*q))      break;
       if (!*q)      return;
       *q++=0;
       while (*q && isspace((int)(unsigned char)*q))
              ++q;
       if (*q)
       {
              *name=p;
              *dir=q;
       }
}

Here is the caller graph for this function:

int main ( int  argc,
char *  argv[] 
)

Definition at line 196 of file maildirmake.c.

{
const char *maildir, *folder=0;
char *p;
int    argn;
int    perm=0700;
int    musthavefolder=0;
int    subdirperm;
char   *addshared=0, *delshared=0;
const char *quota=0;
char   *tmp=0;

       for (argn=1; argn<argc; argn++)
       {
              if (argv[argn][0] != '-')   break;
              if (strcmp(argv[argn], "-") == 0)  break;
              if (strncmp(argv[argn], "-f", 2) == 0)
              {
                     folder=argv[argn]+2;
                     if (*folder == 0 && argn+1 < argc)
                            folder=argv[++argn];
                     continue;
              }
              if (strcmp(argv[argn], "-S") == 0)
              {
                     perm=0755;
                     continue;
              }

              if (strncmp(argv[argn], "-s", 2) == 0)
              {
              const char *p=argv[argn]+2;

                     if (*p == 0 && argn+1 < argc)
                            p=argv[++argn];

                     perm=0755;
                     for (; *p; ++p)
                     {
                            if (isspace((int)(unsigned char)*p) ||
                                   *p == ',')
                                   continue;
                            if (*p == 'r')
                                   perm=0755;
                            else if (*p == 'w')
                                   perm=0777 | S_ISVTX;
                            else if (*p == 'g')
                                   perm &= ~0007;

                            while (*p && !isspace((int)(unsigned char)*p)
                                   && *p != ',')
                                   ++p;
                            if (!*p)      break;
                     }
                     musthavefolder=1;
                     continue;
              }

              if (strncmp(argv[argn], "-q", 2) == 0)
              {
                     const char *p=argv[argn]+2;

                     if (*p == 0 && argn+1 < argc)
                            p=argv[++argn];

                     quota=p;
                     continue;
              }

              if (strcmp(argv[argn], "--add") == 0 && argc-argn > 1)
              {
                     addshared=argv[++argn];
                     continue;
              }

              if (strcmp(argv[argn], "--del") == 0 && argc-argn > 1)
              {
                     delshared=argv[++argn];
                     continue;
              }

              usage();
       }

       if (argn == argc)    usage();
       maildir=argv[argn];

       if (addshared)
       {
              add(maildir, addshared);
              exit (0);
       }

       if (delshared)
       {
              del(maildir, delshared);
              exit (0);
       }

       if (folder && *folder == '.')
       {
              printf("Invalid folder name: %s\n", folder);
              exit(1);
       }

       if (folder)
       {
              if ((p=(char *)malloc(strlen(maildir)+strlen(folder)+4)) == 0)
              {
                     perror("maildirmake malloc");
                     exit(1);
              }
              strcat(strcat(strcpy(p, maildir), "/."), folder);
              maildir=p;
       }
       else   if (musthavefolder)
              usage();

       if (quota)
       {
              maildir_quota_set(maildir, quota);
              exit(0);
       }
       subdirperm=perm;
       if (!folder)  subdirperm=0700;
       umask(0);
       if (maildir_make(maildir, perm & ~0022, subdirperm, folder ? 1:0) < 0)
       {
              tmp=(char *)malloc(strlen(maildir)+14);
              if (!tmp) {
                     perror("maildirmake malloc");
                     exit(1);
              }
              snprintf(tmp, 14+strlen(maildir), "maildirmake: %s", maildir);
              perror(tmp);
              exit(1);
       }
       exit(0);
       return (0);
}

Here is the call graph for this function:

static void usage ( ) [static]

Definition at line 31 of file maildirmake.c.

{
       printf("Usage: maildirmake [ options ] maildir\n");
       exit(1);
}