view mgw/main.c @ 112:6aa63cf4620a

sip-in call clearing: select timeout implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 28 Sep 2022 18:59:55 -0800
parents f280328e7e2e
children 815e4c59162e
line wrap: on
line source

/*
 * Main module for themwi-mgw.
 */

#include <sys/types.h>
#include <sys/errno.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <signal.h>
#include <syslog.h>
#include <unistd.h>

fd_set select_for_read;
void (*select_handlers[FD_SETSIZE])();
void *select_data[FD_SETSIZE];

static int max_fd;

update_max_fd(newfd)
{
	if (newfd >= FD_SETSIZE) {
		syslog(LOG_CRIT, "FATAL: file descriptor %d >= FD_SETSIZE",
			newfd);
		exit(1);
	}
	if (newfd > max_fd)
		max_fd = newfd;
}

main(argc, argv)
	char **argv;
{
	fd_set fds;
	int cc, i;

	openlog("themwi-mgw", 0, LOG_LOCAL5);
	read_config_file();
	if (create_ctrl_socket() < 0) {
		fprintf(stderr, "error creating TMGW control socket\n");
		exit(1);
	}
	signal(SIGPIPE, SIG_IGN);
	/* main select loop */
	for (;;) {
		bcopy(&select_for_read, &fds, sizeof(fd_set));
		cc = select(max_fd+1, &fds, 0, 0, 0);
		if (cc < 0) {
			if (errno == EINTR)
				continue;
			syslog(LOG_CRIT, "select: %m");
			exit(1);
		}
		for (i = 0; cc && i <= max_fd; i++) {
			if (FD_ISSET(i, &fds)) {
				select_handlers[i](i, select_data[i]);
				cc--;
			}
		}
		free_deleted_endpoints();
	}
}