File:  [ELWIX - Embedded LightWeight unIX -] / embedtools / src / butz.c
Revision 1.1.2.1: download - view: text, annotated - select for diffs - revision graph
Fri Feb 7 23:37:41 2014 UTC (10 years, 3 months ago) by misho
Branches: tools2_6
add new prog

#include "global.h"


cfg_root_t cfg;
sched_root_task_t *root;
int Verbose, Kill;
extern char compiled[], compiledby[], compilehost[];
char szCfgName[PATH_MAX] = BUTZ_CFG;

static void
Usage()
{
	printf(	" -= Butz =- Service for board buttons management\n"
		"=== %s === %s@%s ===\n\n"
		"  Syntax: butz [options] [set_value]\n"
		"\n"
		"\t-c <cfgfile>\tConfig file [default: /etc/butz.conf]\n"
		"\t-v\t\tVerbose ...\n"
		"\n", compiled, compiledby, compilehost);
}

static void *
sigHandler(sched_task_t *task)
{
	switch (TASK_VAL(task)) {
		case SIGHUP:
			cfgUnloadConfig(&cfg);
			if (cfgLoadConfig(szCfgName, &cfg)) {
				ELIBERR(cfg);
				Kill++;
			}
			break;
		case SIGTERM:
			Kill++;
			break;
		default:
			EERROR(EINVAL, "Undefined signal %lu!", TASK_VAL(task));
			break;
	}
	taskExit(task, NULL);
}


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

	while ((ch = getopt(argc, argv, "hvc:")) != -1)
		switch (ch) {
			case 'c':
				strlcpy(szCfgName, optarg, sizeof szCfgName);
				break;
			case 'v':
				Verbose++;
				break;
			case 'h':
			default:
				Usage();
				return 1;
		}
	argc -= optind;
	argv += optind;

	openlog("butz", LOG_PID | LOG_CONS, LOG_DAEMON);
	if (cfgLoadConfig(szCfgName, &cfg)) {
		ELIBERR(cfg);
		return 1;
	}
	root = schedBegin();
	if (!root) {
		ELIBERR(sched);
		return 1;
	}

	schedSignal(root, sigHandler, NULL, SIGHUP, NULL, 0);
	schedSignal(root, sigHandler, NULL, SIGTERM, NULL, 0);
	schedRun(root, &Kill);

	schedEnd(&root);
	cfgUnloadConfig(&cfg);
	closelog();
	return 0;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>