OSSP CVS Repository

ossp - ossp-pkg/petidomo/archive.c
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

ossp-pkg/petidomo/archive.c
/*
   $Source: /v/ossp/cvs/ossp-pkg/petidomo/archive.c,v $
   $Revision: 1.7 $

   Copyright (C) 2000 by CyberSolutions GmbH, Germany.

   This file is part of Petidomo.

   Petidomo is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   Petidomo is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   General Public License for more details.
*/

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>

#include "libtext/text.h"
#include "petidomo.h"

int
ArchiveMail(const struct Mail * MailStruct, const char * listname)
    {
    const struct List_Config * ListConfig;
    struct stat   sb;
    FILE *        fh;
    char *        filename;
    unsigned int  counter;
    int           rc;
    struct tm *   timeptr;
    char *        date;
    time_t        t;

    assert(MailStruct != NULL);
    assert(listname != NULL);

    /* Initialize internals. */

    ListConfig = getListConfig(listname);
    t = time(NULL);
    timeptr = localtime(&t);
    date = asctime(timeptr);
    rc = -1;

    /* Sanity checks. */

    if (ListConfig->archivepath == NULL)
	return 0;

    /* Check whether we have a file or a directory. */

    if (stat(ListConfig->archivepath, &sb) == 0 && (sb.st_mode & S_IFDIR) != 0)
	{

	/* Read the "active"-file to see at what article number we
           were. */

	filename = text_easy_sprintf("%s/.active", ListConfig->archivepath);
	fh = fopen(filename, "r");
	if (fh != NULL)
	    {
	    fscanf(fh, "%u", &counter);
	    fclose(fh);
	    }
	else
	    {
	    if (errno != ENOENT)
		syslog(LOG_ERR, "Failed to read file \"%s\": %s", filename,  strerror(errno));
	    else
		counter = 0;
	    }

	/* Store the article. */

	do
	    {
	    filename = text_easy_sprintf("%s/%u", ListConfig->archivepath, counter);
	    if (stat(filename, &sb) == -1)
		{
		if (errno == ENOENT)
		    {
		    fh = fopen(filename, "a");
		    if (fh != NULL)
			{
			fprintf(fh, "From %s-owner@%s  %s", listname, ListConfig->fqdn, date);
			fprintf(fh, "%s\n", MailStruct->Header);
			fprintf(fh, "%s\n", MailStruct->Body);
			fclose(fh);
			rc = 0;
			}
		    else
			syslog(LOG_ERR, "Failed opening file \"%s\" for writing: %s", filename, strerror(errno));
		    break;
		    }
		else
		    {
		    syslog(LOG_ERR, "An error while trying to access the log " \
			   "directory \"%s\": %s", ListConfig->archivepath,  strerror(errno));
		    break;
		    }
		}
	    }
	while (++counter);	/* until break */

	/* Write the current "active" number back to the file. */

	counter++;
	filename = text_easy_sprintf("%s/.active", ListConfig->archivepath);
	fh = fopen(filename, "w");
	if (fh != NULL)
	    {
	    fprintf(fh, "%u", counter);
	    fclose(fh);
	    }
	else
	    syslog(LOG_ERR, "Failed to write to file \"%s\": %s", filename, strerror(errno));
	}
    else
	{

	/* Simply append the article to this file. */

	fh = fopen(ListConfig->archivepath, "a");
	if (fh != NULL)
	    {
	    /* Write an envelope first. */

	    fprintf(fh, "From %s-owner@%s  %s", listname, ListConfig->fqdn, date);
	    fprintf(fh, "%s\n", MailStruct->Header);
	    fprintf(fh, "%s\n", MailStruct->Body);
	    fclose(fh);
	    rc = 0;
	    }
	else
	    syslog(LOG_ERR, "Failed opening file \"%s\" for writing: %s", ListConfig->archivepath, strerror(errno));
	}

    return rc;
    }

CVSTrac 2.0.1