view mgw/main.c @ 205:0047c4c08d9e

mgw: accept the new TRAUlike RTP format in addition to standard, old BFI and zero-length payload formats
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 06 Apr 2023 19:50:09 -0800
parents a6eb2de277f6
children
line wrap: on
line source

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

#include <sys/types.h>
#include <sys/time.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();
	dtmf_init_sample_arrays();
	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();
	}
}