/*****************************************************************************
 *
 * $Id$
 * Purpose: File Database Maintenance
 *
 *****************************************************************************
 * Copyright (C) 1997-2004
 *   
 * Michiel Broek		FIDO:		2:280/2802
 * Beekmansbos 10
 * 1971 BV IJmuiden
 * the Netherlands
 *
 * This file is part of MBSE BBS.
 *
 * This BBS 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.
 *
 * MBSE BBS 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.
 * 
 * You should have received a copy of the GNU General Public License
 * along with MBSE BBS; see the file COPYING.  If not, write to the Free
 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *****************************************************************************/

#include "../config.h"
#include "../lib/mbselib.h"
#include "../lib/users.h"
#include "../lib/mbsedb.h"
#include "mbfkill.h"
#include "mbfadopt.h"
#include "mbfindex.h"
#include "mbfcheck.h"
#include "mbfpack.h"
#include "mbflist.h"
#include "mbfimport.h"
#include "mbftoberep.h"
#include "mbfmove.h"
#include "mbfdel.h"
#include "mbfutil.h"
#include "mbfsort.h"
#include "mbfile.h"
#include "mbfrearc.h"


extern int	do_quiet;		/* Suppress screen output	    */
int		do_annon = FALSE;	/* Suppress announce on new files   */
int		do_novir = FALSE;	/* Suppress virus check		    */
int		do_adopt = FALSE;	/* Adopt a file			    */
int		do_pack  = FALSE;	/* Pack filebase		    */
int		do_check = FALSE;	/* Check filebase		    */
int		do_kill  = FALSE;	/* Kill/move old files		    */
int		do_index = FALSE;	/* Create request index		    */
int		do_import= FALSE;	/* Import files in area		    */
int		do_list  = FALSE;	/* List fileareas		    */
int		do_tobe  = FALSE;	/* List toberep database	    */
int		do_move  = FALSE;	/* Move a file			    */
int		do_del   = FALSE;	/* Delete/undelete a file	    */
int		do_sort  = FALSE;	/* Sort a filebase		    */
int		do_rearc = FALSE;	/* ReArc a file			    */
extern	int	e_pid;			/* Pid of external process	    */
extern	int	show_log;		/* Show logging			    */
time_t		t_start;		/* Start time			    */
time_t		t_end;			/* End time			    */


int main(int argc, char **argv)
{
    int	    i, Area = 0, ToArea = 0, UnDel = FALSE;
    char    *cmd, *FileName = NULL, *Description = NULL;
    struct  passwd *pw;

    InitConfig();
    mbse_TermInit(1, 80, 25);
    t_start = time(NULL);
    umask(002);

    /*
     * Catch all signals we can, and ignore the rest.
     */
    for (i = 0; i < NSIG; i++) {
	if ((i == SIGHUP) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV) || (i == SIGTERM))
	    signal(i, (void (*))die);
	else if (i == SIGCHLD)
	    signal(i, SIG_DFL);
	else if ((i != SIGKILL) && (i != SIGSTOP))
	    signal(i, SIG_IGN);
    }

    if(argc < 2)
	Help();

    cmd = xstrcpy((char *)"Command line: mbfile");

    for (i = 1; i < argc; i++) {

	cmd = xstrcat(cmd, (char *)" ");
	cmd = xstrcat(cmd, argv[i]);

	if (!strncasecmp(argv[i], "a", 1)) {
	    i++;
	    Area = atoi(argv[i]);
	    cmd = xstrcat(cmd, (char *)" ");
	    cmd = xstrcat(cmd, argv[i]);
	    if (Area) {
		do_adopt = TRUE;
		i++;
		FileName = xstrcpy(argv[i]);
		cmd = xstrcat(cmd, (char *)" ");
		cmd = xstrcat(cmd, argv[i]);
		if (argc > (i + 1)) {
		    i++;
		    cmd = xstrcat(cmd, (char *)" ");
		    cmd = xstrcat(cmd, argv[i]);
		    if (!strncasecmp(argv[i], "-a", 2)) {
			do_annon = TRUE;
		    } else {
			Description = xstrcpy(argv[i]);
		    }
		}
	    }
	} else if ((!strncasecmp(argv[i], "d", 1)) || (!strncasecmp(argv[i], "u", 1))) {
	    if (!strncasecmp(argv[i], "u", 1))
		UnDel = TRUE;
	    if (argc > (i + 1)) {
		i++;
		Area = atoi(argv[i]);
		cmd = xstrcat(cmd, (char *)" ");
		cmd = xstrcat(cmd, argv[i]);
		if (argc > (i + 1)) {
		    i++;
		    FileName = xstrcpy(argv[i]);
		    cmd = xstrcat(cmd, (char *)" ");
		    cmd = xstrcat(cmd, argv[i]);
		    do_del = TRUE;
		}
	    }
	} else if (!strncasecmp(argv[i], "r", 1)) {
	    if (argc > (i + 1)) {
		i++;
		Area = atoi(argv[i]);
		cmd = xstrcat(cmd, (char *)" ");
		cmd = xstrcat(cmd, argv[i]);
		if (argc > (i + 1)) {
		    i++;
		    FileName = xstrcpy(argv[i]);
		    cmd = xstrcat(cmd, (char *)" ");
		    cmd = xstrcat(cmd, argv[i]);
		    do_rearc = TRUE;
		}
	    }
	} else if (!strncasecmp(argv[i], "in", 2)) {
	    do_index = TRUE;
	} else if (!strncasecmp(argv[i], "im", 2)) {
	    if (argc > (i + 1)) {
		do_import = TRUE;
		i++;
		Area = atoi(argv[i]);
		cmd = xstrcat(cmd, (char *)" ");
		cmd = xstrcat(cmd, argv[i]);
	    }
	} else if (!strcasecmp(argv[i], "i")) {
	    Help();
	} else if (!strncasecmp(argv[i], "l", 1)) {
	    do_list  = TRUE;
	    if (argc > (i + 1)) {
		i++;
		Area = atoi(argv[i]);
		cmd = xstrcat(cmd, (char *)" ");
		cmd = xstrcat(cmd, argv[i]);
	    }
	} else if (!strncasecmp(argv[i], "m", 1)) {
	    if (argc > (i + 1)) {
		i++;
		Area = atoi(argv[i]);
		cmd = xstrcat(cmd, (char *)" ");
		cmd = xstrcat(cmd, argv[i]);
		if (argc > (i + 1)) {
		    i++;
		    ToArea = atoi(argv[i]);
		    cmd = xstrcat(cmd, (char *)" ");
		    cmd = xstrcat(cmd, argv[i]);
		    if (argc > (i + 1)) {
			i++;
			FileName = xstrcpy(argv[i]);
			cmd = xstrcat(cmd, (char *)" ");
			cmd = xstrcat(cmd, argv[i]);
			do_move = TRUE;
		    }
		}
	    }
	} else if (!strncasecmp(argv[i], "s", 1)) {
	    if (argc > (i + 1)) {
		i++;
		Area = atoi(argv[i]);
		cmd = xstrcat(cmd, (char *)" ");
		cmd = xstrcat(cmd, argv[i]);
		do_sort = TRUE;
	    }
	} else if (!strncasecmp(argv[i], "p", 1)) {
	    do_pack = TRUE;
	} else if (!strncasecmp(argv[i], "c", 1)) {
	    do_check = TRUE;
	    if (argc > (i + 1)) {
		Area = atoi(argv[i+1]);
		if (Area) {
		    i++;
		    cmd = xstrcat(cmd, (char *)" ");
		    cmd = xstrcat(cmd, argv[i]);
		}
	    }
	} else if (!strncasecmp(argv[i], "k", 1)) {
	    do_kill = TRUE;
	} else if (!strncasecmp(argv[i], "t", 1)) {
	    do_tobe = TRUE;
	} else if (!strncasecmp(argv[i], "-q", 2)) {
	    do_quiet = TRUE;
	} else if (!strncasecmp(argv[i], "-a", 2)) {
	    do_annon = TRUE;
	} else if (!strncasecmp(argv[i], "-v", 2)) {
	    do_novir = TRUE;
	}
    }

    if (!(do_pack || do_sort || do_check || do_kill || do_index || do_import || 
		do_list || do_adopt || do_del || do_move || do_tobe || do_rearc))
	Help();

    ProgName();
    pw = getpwuid(getuid());
    InitClient(pw->pw_name, (char *)"mbfile", CFG.location, CFG.logfile, 
	    CFG.util_loglevel, CFG.error_log, CFG.mgrlog, CFG.debuglog);

    Syslog(' ', " ");
    Syslog(' ', "MBFILE v%s", VERSION);
    Syslog(' ', cmd);
    if (do_novir)
	Syslog('!', "WARNING: running without virus checking");
    free(cmd);

    if (!do_quiet)
	printf("\n");

    if (enoughspace(CFG.freespace) == 0)
	die(MBERR_DISK_FULL);

    if (lockprogram((char *)"mbfile")) {
	if (!do_quiet)
	    printf("Can't lock mbfile, abort.\n");
	die(MBERR_NO_PROGLOCK);
    }

    if (do_adopt) {
	AdoptFile(Area, FileName, Description);
	die(MBERR_OK);
    }

    if (do_import) {
	ImportFiles(Area);
	die(MBERR_OK);
    }

    if (do_kill)
	Kill();

    if (do_sort)
	SortFileBase(Area);

    if (do_check) {
	Check(Area);
    }

    if (do_rearc) {
	ReArc(Area, FileName);
	if (do_index)
	    Index();
	die(MBERR_OK);
    }

    if (do_pack)
	PackFileBase();

    if (do_index)
	Index();

    if (do_move) {
	Move(Area, ToArea, FileName);
	die(MBERR_OK);
    }

    if (do_del) {
	Delete(UnDel, Area, FileName);
	die(MBERR_OK);
    }

    if (do_list) {
	ListFileAreas(Area);
	die(MBERR_OK);
    }

    if (do_tobe)
	ToBeRep();
    die(MBERR_OK);
    return 0;
}