#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>

int  main( int argc, char **argv )
{
    pid_t  pid;
    char  hostname[64];
    int  count = 0;
    int  len;
    int  file;
    struct stat  info;
    char  buffer[1024];
    char  filename[1024];

    if (argc != 2)
    {
	fputs("Usage:  maildir {maildir-path}\n", stderr);
	return (75);
    }

    alarm(24 * 3600);

    gethostname(hostname, 64);
    pid = getpid();

    if (chdir(argv[1]))
    {
	perror(argv[1]);
	return (75);
    }

    while (++count < 1000)
    {
	sprintf(filename, "tmp/%d.%d.%s", time(NULL), pid, hostname);

	if ((file = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0600)) == -1)
	{
	    if (errno != EINTR && errno != EEXIST)
	    {
		perror(filename);
		return (75);
	    }
	}
	else
	{
	    break;
	}

	sleep(2);
    }

    if (file == -1)
    {
	fputs("Could not create a mail file\n", stderr);
	return (75);
    }

    while (fgets(buffer, 1024, stdin))  /* Strip From_ line, if present */
    {
	if (strncmp(buffer, "From ", 5))
	{
	    len = strlen(buffer);

	    if (write(file, buffer, len) != len)
	    {
		perror(filename);
		close(file);
		unlink(filename);
		return (75);
	    }

	    break;
	}
    }

    while (!feof (stdin))	/* Copy mail message */
    {
	while (len = fread(buffer, 1, 1024, stdin))
	{
	    if (write(file, buffer, len) != len)
	    {
		perror(filename);
		close(file);
		unlink(filename);
		return (75);
	    }
	}
    }

    if (close(file))
    {
	perror(filename);
	unlink(filename);
	return (75);
    }

    strcpy(buffer, filename);

    strncpy(buffer, "new", 3);

    if (rename(filename, buffer))
    {
	perror(buffer);
	unlink(filename);
	return (75);
    }

    return (0);
}
