FreeCalypso > hg > themwi-system-sw
diff mgw/main.c @ 32:b3f74df7b808
beginning of themwi-mgw
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 09 Jul 2022 22:51:44 -0800 |
parents | |
children | f280328e7e2e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mgw/main.c Sat Jul 09 22:51:44 2022 -0800 @@ -0,0 +1,63 @@ +/* + * Main module for themwi-mgw. + */ + +#include <sys/types.h> +#include <sys/errno.h> +#include <stdio.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(); + } +}