File:  [ELWIX - Embedded LightWeight unIX -] / embedtools / src / dwds.c
Revision 1.1.2.4: download - view: text, annotated - select for diffs - revision graph
Wed Oct 27 15:23:49 2010 UTC (13 years, 7 months ago) by misho
Branches: tools1_0
added new source for wifi tools

#include "global.h"
#include "dwds.h"


sl_config cfg;
int Verbose, Kill, nif;
char **ifs, szConfig[MAXPATHLEN] = DWDS_CONFIG;
struct dwds_if *wds;
extern char compiled[], compiledby[], compilehost[];


static void
Usage()
{
	printf(	"-= dWDS =- WiFi dynamic WDS service managment for VAP\n"
		"=== %s === %s@%s ===\n\n"
		"  Syntax: dwds [options] <interface|any> [interface [...]]\n"
		"\n"
		"\t-v\t\tVerbose ...\n"
		"\t-f\t\tForeground, not demonize process ...\n"
		"\t-c <config>\tConfig file [default=/etc/dwds.conf]\n"
		"\n", compiled, compiledby, compilehost);
}

static void
sigHandler(int sig)
{
	int stat;
	const u_char *v;
	char szStr[STRSIZ];

	switch (sig) {
		case SIGHUP:
			UnloadConfig(&cfg);
			if (LoadConfig(szConfig, &cfg)) {
				printf("Error:: can`t load config %s ...\n", szConfig);
				Kill++;
			} else {
				closelog();

				cfg_LoadAttribute(&cfg, CFG("dwds"), CFG("name"), CFG(szStr), STRSIZ, DWDS_NAME);
				openlog(szStr, LOG_PID | LOG_CONS, LOG_DAEMON);
				v = cfg_GetAttribute(&cfg, CFG("dwds"), CFG("syslog_upto"));
				setlogmask(v ? strtol((char*) v, NULL, 0) : 0);
			}
			break;
		case SIGTERM:
			Kill++;
			break;
		case SIGCHLD:
			while (waitpid(-1, &stat, WNOHANG) > 0);
			break;
	}
}

static int
RtMsg(struct rt_msghdr *msg, size_t len)
{
	return 0;
}

// ---------------------------------------------------------------

int
main(int argc, char **argv)
{
	char ch, szStr[STRSIZ], fg = 0;
	const u_char *v, msg[2048];
	int s;
	struct sigaction sa;
	size_t len;

	while ((ch = getopt(argc, argv, "hvfc:")) != -1)
		switch (ch) {
			case 'v':
				Verbose++;
				break;
			case 'f':
				fg = 1;
				break;
			case 'c':
				strlcpy(szConfig, optarg, MAXPATHLEN);
				break;
			case 'h':
			default:
				Usage();
				return 1;
		}
	argc -= optind;
	argv += optind;
	if (!argc) {
		printf("Error:: not specified interface for use ...\n");
		Usage();
		return 1;
	} else {
		nif = argc;
		ifs = argv;
	}
	if (LoadConfig(szConfig, &cfg)) {
		printf("Error:: can`t load config %s ...\n", szConfig);
		return 1;
	}

	if (fg)
		switch (fork()) {
			case -1:
				printf("Error:: when fork() #%d - %s\n", errno, strerror(errno));
				UnloadConfig(&cfg);
				return 2;
			case 0 :
				VERB(1) printf("Going to shadow land ...\n");

				setsid();

				memset(&sa, 0, sizeof sa);
				sa.sa_handler = sigHandler;
				sigemptyset(&sa.sa_mask);
				sigaction(SIGHUP, &sa, NULL);
				sigaction(SIGTERM, &sa, NULL);
				sigaction(SIGCHLD, &sa, NULL);
				break;
			default:
				goto end;
		}

	cfg_LoadAttribute(&cfg, CFG("dwds"), CFG("name"), CFG(szStr), STRSIZ, DWDS_NAME);
	openlog(szStr, LOG_PID | LOG_CONS, LOG_DAEMON);
	v = cfg_GetAttribute(&cfg, CFG("dwds"), CFG("syslog_upto"));
	setlogmask(v ? strtol((char*) v, NULL, 0) : 0);

	s = socket(PF_ROUTE, SOCK_RAW, 0);
	if (s == -1) {
		syslog(LOG_ERR, "Error:: socket() #%d - %s\n", errno, strerror(errno));
		goto end;
	}

	while (!Kill) {
		len = read(s, (void*) msg, sizeof msg);
		if (len == -1) {
			syslog(LOG_ERR, "Error:: read() #%d - %s\n", errno, strerror(errno));
			Kill++;
		} else
			RtMsg((struct rt_msghdr*) msg, len);
	}

	close(s);
end:
	closelog();
	UnloadConfig(&cfg);
	return 0;
}

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