2 ** Copyright 2000 Double Precision, Inc.
3 ** See COPYING for distribution information.
10 #include <sys/types.h>
23 #include "maildirmisc.h"
25 static const char rcsid[]="$Id: maildiropen.c,v 1.8 2003/01/19 16:39:52 mrsam Exp $";
27 char *maildir_getlink(const char *filename)
42 if ((buf=malloc(bufsiz)) == 0)
47 if ((n=readlink(filename, buf, bufsiz)) < 0)
64 int maildir_semisafeopen(const char *path, int mode, int perm)
69 char *l=maildir_getlink(path);
77 char *q=malloc(strlen(path)+strlen(l)+2);
87 if ((s=strchr(q, '/')) != 0)
95 f=maildir_safeopen(l, mode, perm);
102 return (maildir_safeopen(path, mode, perm));
105 int maildir_safeopen(const char *path, int mode, int perm)
109 return maildir_safeopen_stat(path, mode, perm, &stat1);
112 int maildir_safeopen_stat(const char *path, int mode, int perm,
117 int fd=open(path, mode
125 if (fd < 0) return (fd);
126 if (fcntl(fd, F_SETFL, (mode & O_APPEND)) || fstat(fd, stat1)
127 || lstat(path, &stat2))
133 if (stat1->st_dev != stat2.st_dev || stat1->st_ino != stat2.st_ino)