/* nctopd.c
 * $Id: nctopd.c,v 1.5.4.3 2005/07/28 12:32:14 becker Exp $
 * Ralf Becker <nctop@web.de>
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>
#include <signal.h>
#include <libgen.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/stat.h>
#include "daemon.h"
#include "udpserver.h"
#include "machine.h"
#include "version.h"
#include "privileges.h"

#ifndef DEFAULT_PORT
#define DEFAULT_PORT	5000
#endif

#define DEFAULT_WAIT	1
#define DEFAULT_CONF	SYSCONFDIR"/nctopd.conf"

#define PIDFILE		"/var/run/nctopd.pid"

static char cvsid[] = "$Id: nctopd.c,v 1.5.4.3 2005/07/28 12:32:14 becker Exp $";

char *myname;

int flag_daemon;	/* daemonmode */
int opt_port;		/* network port */
int opt_wait;		/* update every opt_wait seconds */
char *opt_conf;		/* alternative configuration */
char *opt_user;		/* run as user */

/* usage information */
void usage(FILE* stream) {

	fprintf(stream, "%s [-dhV] [-p port] [-w sec] [-u user]\n",myname);
}

/* version information */
void version(void) {

	printf ("%s: "PACKAGE_BUGREPORT" "VERSION"\n",myname);
}

int main(int argc, char **argv) {

	extern char *optarg;
	extern int optind;
	char ch;
	struct itimerval value,ovalue;
	FILE *stream;	

	/* the name of the game */
	myname = basename(argv[0]);

	/* default values */

	flag_daemon = 0;
	opt_port = DEFAULT_PORT;
	opt_wait = DEFAULT_WAIT;
	opt_user = NULL;
	

	/* process commandline */
	while ((ch = getopt(argc, argv, "dhp:u:w:V")) != -1) {
		switch(ch) {
			case 'd': {
				flag_daemon = 1;
				break;
			}
			case 'h': {
				usage(stdout);
				exit(EXIT_SUCCESS);
			}
			case 'p':  {
				if (sscanf(optarg, "%d", &opt_port) != 1) {
					fprintf(stderr, "invalid argument\n");
					exit(EX_USAGE);
				}
				break;
			}
			case 'u': {
				opt_user = optarg;
				break;
			}
			case 'w': {
				if (sscanf(optarg, "%d",&opt_wait) != 1) {
					fprintf(stderr, "invalid argument \n");
					exit(EX_USAGE);
				}
				break;
			}
			case 'V': {
				version();
				exit(EXIT_SUCCESS);
			}
			default : {
				usage(stderr);
				exit(EX_USAGE);
			}
		}
	}

	/* change to /proc */
	if (chdir(PROCFS) == -1) {
		perror(PROCFS);
		exit(EX_UNAVAILABLE);
	}

	/* go to daemon mode */
	if (1 == flag_daemon) {
		daemonmode();
		if ((stream = fopen(PIDFILE,"w")) == NULL) {
			perror(PIDFILE);
		} else {
			fprintf (stream,"%ld",(long int)getpid());
			fchmod(fileno(stream), 0644);
			fclose(stream);
		}
	}

	/* now we drop privileges */
	if (opt_user != NULL) {
		drop_privileges(opt_user);
	}
		
	/* get status information */
	getstat(0);

	/* set SIGALRM handler */
	if (signal(SIGALRM,getstat) == SIG_ERR) {
		perror(myname);
		exit(EX_UNAVAILABLE);
	}
	/* initialize timer */
	value.it_interval.tv_sec = opt_wait;
	value.it_interval.tv_usec = 0;
	value.it_value.tv_sec = opt_wait;
	value.it_value.tv_usec = 0;
	if (setitimer(ITIMER_REAL, &value, &ovalue) == -1) {
			perror(myname);
			exit(EX_UNAVAILABLE);
	}


	udpserver(opt_port);

	/* never reached */
	exit(EXIT_SUCCESS);
}


syntax highlighted by Code2HTML, v. 0.9.1