Back to index

courier  0.68.2
maildirlock.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 "config.h"
00007 #include "maildirwatch.h"
00008 #include "maildircreate.h"
00009 #include "liblock/config.h"
00010 #include "liblock/liblock.h"
00011 #include "liblock/mail.h"
00012 #include <unistd.h>
00013 #include <string.h>
00014 #include <stdlib.h>
00015 #include <stdio.h>
00016 #include <errno.h>
00017 
00018 
00019 /*
00020 ** Courier-IMAP compatible maildir lock.
00021 */
00022 
00023 char *maildir_lock(const char *dir, struct maildirwatch *w,
00024                  int *tryAnyway)
00025 {
00026        struct maildir_tmpcreate_info createInfo;
00027        char *tmpname;
00028        char *newname;
00029        int rc;
00030 
00031        *tryAnyway=0;
00032 
00033        maildir_tmpcreate_init(&createInfo);
00034 
00035        createInfo.maildir=dir;
00036        createInfo.uniq="courierlock";
00037        createInfo.hostname=getenv("HOSTNAME");
00038        createInfo.doordie=1;
00039 
00040        if ((rc=maildir_tmpcreate_fd(&createInfo)) < 0)
00041               return NULL;
00042        close(rc);
00043 
00044        tmpname=createInfo.tmpname;
00045        newname=createInfo.newname;
00046 
00047        createInfo.tmpname=NULL;
00048        createInfo.newname=NULL;
00049        maildir_tmpcreate_free(&createInfo);
00050 
00051        /* HACK: newname now contains: ".../new/filename" */
00052 
00053        strcpy(strrchr(newname, '/')-3, WATCHDOTLOCK);
00054 
00055        while (ll_dotlock(newname, tmpname, 120) < 0)
00056        {
00057               if (errno == EEXIST)
00058               {
00059                      if (w == NULL || maildirwatch_unlock(w, 120) < 0)
00060                             sleep(1);
00061                      continue;
00062               }
00063 
00064               if (errno == EAGAIN)
00065               {
00066                      unlink(newname);
00067                      sleep(5);
00068                      continue;
00069               }
00070 
00071               free(newname);
00072               newname=NULL;
00073               *tryAnyway=1;
00074               break;
00075        }
00076 
00077        free(tmpname);
00078 
00079        return newname;
00080 }