// Copyright (c) 2001  David Muse
// See the file COPYING for more information

#include <rudiments/daemonprocess.h>
#include <rudiments/permissions.h>
#include <rudiments/process.h>
#include <rudiments/file.h>
#include <rudiments/snooze.h>

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

#ifdef RUDIMENTS_NAMESPACE
using namespace rudiments;
#endif

daemonprocess	*dmn;

// define a function to shut down the process cleanly
RETSIGTYPE	shutDown() {

	printf("%d: shutting down\n",process::getProcessId());

	// clean up
	delete dmn;
	file::remove("/tmp/dmn.pidfile");
	exit(0);
}

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

	dmn=new daemonprocess();

	// set up signal handlers for clean shutdown
	dmn->handleShutDown((RETSIGTYPE *)shutDown);
	dmn->handleCrash((RETSIGTYPE *)shutDown);

	// change the user/group that the daemon is running as
	dmn->runAsUser("nobody");
	dmn->runAsGroup("nobody");

	// make sure that only one instance is running
	int	pid=dmn->checkForPidFile("/tmp/dmn.pidfile");
	if (pid>-1) {
		printf("Sorry, an instance of this daemon is already running with process id: %d\n",pid);
		delete dmn;
		exit(0);
	}

	// detach from the controlling terminal
	dmn->detach();

	// create a pid file which is used to make sure that only one instance
	// is running and can also be used to kill the process
	dmn->createPidFile("/tmp/dmn.pidfile",permissions::ownerReadWrite());

	if (!fork()) {
		for (;;) {
			printf("%d: child looping...\n",
				process::getProcessId());
			snooze::macrosnooze(1);
		}
	}

	// loop, printing "looping..." once per second
	for (;;) {
		printf("%d: parent looping...\n",
				process::getProcessId());
		snooze::macrosnooze(1);
	}
}


syntax highlighted by Code2HTML, v. 0.9.1