/*
 * Program: multisuck (msuck)
 * 
 * $Id: main.c,v 1.9 2002/06/10 03:10:42 conrads Exp $
 * 
 * a multi-server, multi-connection Usenet news sucking system
 * 
 * continuously sucks all groups in local active file (except control* and junk)
 * until user interrupt
 * 
 * all program output is logged in one of three different files: one for errors,
 * one for filter results, one for general suck info
 * 
 * no output is written directly to terminal, so may be run automatically on
 * system startup as a quasi-daemon
 * 
 * uses "mode reader" on all servers, except for using "ihave" to post articles
 * to the local server and "check" to test if an article already exists
 * locally, and of course, "list active"
 * 
 * the main process (the parent) forks a separate process for each remote server
 * connection, then exits, leaving the children to do the actual work.  this
 * allows a quick visual check of how many sucks are actually running via
 * "ps" command
 */

#include <sys/types.h>
#include <sys/param.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include "msuck.h"

/*
 * define *most* global variables here
 */

SERVER server[MAXNEWSRCS];

int numservers;

CONNECTION local, remote;

ACTIVE_INFO active[MAX_LOCAL_GROUPS];

int local_active_groups;	/* actual number of local groups */

/* various filenames in user's config */
char *errlogpath;
char *killlogpath;
char *sucklogpath;
char *filterspath;
char *newsrc_path_template;

/* logfiles */
FILE *sucklog, *killlog, *errlog;

int
main(void)
{
	int s;
	pid_t pid;

	fprintf(stderr, "%s version %s\n", PACKAGE_NAME, PACKAGE_VERSION);

	/* remove any old junk in /tmp */
	cleanup();

	/* read user's configuration */
	if ((numservers = read_config()) <= 0)
	{
		fprintf(stderr, "suck: error in parse_config(), exiting\n");
		exit(EXIT_FAILURE);
	}

	/* open log files */
	if (open_logs() == -1)
	{
		perror("suck: error in open_logs(), exiting");
		exit(EXIT_FAILURE);
	}

	/* fill the active array from local active file */
	if ((local_active_groups = read_active()) <= 0)
	{
		fprintf(stderr, "suck: no groups found in local active file!\n");
		exit(EXIT_FAILURE);
	}

	for (s = 0; s < numservers; ++s)
	{
		if (server[s].maxconns > 0)
		{
			pid = fork();

			switch (pid)
			{
			case -1:	/* fork error */
				{
					perror("suck: fork() error");
					exit(EXIT_FAILURE);
				}
			case 0:	/* child */
				{
					/* this never returns */
					suck_server(&server[s]);
				}
			default:	/* parent */
				{
					sleep(5);
				}
			}
		}
	}
	return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1