deliver(char *maildir, char *newfn)
{
char fn[TMPNAMLEN];
- int fd;
+ int fd, tmpfd;
char buf[BUFSIZ]; /* Allocated here only as an (early,
* evil) space optimization. */
strcpy(newfn, fn);
memcpy(newfn, "new", 3);
- if (link(fn, newfn) != 0) {
- save_errno( unlink(fn) );
- err(MDELIVER_EXITCODE, "Failed link(%s, new)", fn);
+ tmpfd = open(newfn, O_WRONLY | O_EXCL | O_CREAT, 0600);
+ if (tmpfd < 0) {
+ /* XXX: what error message to use? */
+ err(MDELIVER_EXITCODE, "Failed open(%s)", newfn);
}
+ close(tmpfd);
- unlink(fn);
+ if (rename(fn, newfn) != 0) {
+ save_errno( unlink(newfn) );
+ save_errno( unlink(fn) );
+ err(MDELIVER_EXITCODE, "Failed rename(%s, new)", fn);
+ }
}
/* Run a program to process the new message. */