int main(int argc, char **argv) { int sock; fd_set rset, wset; sock = bind_socket(); set_nonblock(STDIN_FILENO); set_nonblock(sock); FD_ZERO(&rset); FD_ZERO(&wset); FD_SET(sock, &wset); for (;;) { int res; ssize_t n; FD_SET(STDIN_FILENO, &rset); FD_SET(sock, &rset); res = select(sock + 1, &rset, &wset, NULL, NULL); if (res == -1) error_quit("select"); if (FD_ISSET(STDIN_FILENO, &rset)) { char buf[1]; n = read(STDIN_FILENO, buf, 1); if (n == -1 && errno != EWOULDBLOCK) error_quit("read"); else if (n == 0) { close(sock); exit(0); /* got EOF from erlang */ } } if (FD_ISSET(sock, &wset)) { FD_CLR(sock, &wset); request_dump(sock); read_routes(sock); } if (FD_ISSET(sock, &rset)) read_routes(sock); } return 0; }
int main(int argc, char **argv) { int s, i; struct sockaddr_in loc_addr; struct timeval timeout; time_t timenow, timelast = 0; int interval = 3600; fd_set fdset; if (!load_dests()) { fprintf(stderr, "rip98d: no destination routers defined\n"); return 1; } while ((i = getopt(argc, argv, "dlrt:v")) != -1) { switch (i) { case 'd': debug = TRUE; break; case 'l': logging = TRUE; break; case 'r': route_restrict = TRUE; break; case 't': interval = atoi(optarg) * 60; if (interval < 60 || interval > 7200) { fprintf(stderr, "rip98d: invalid time interval\n"); return 1; } break; case 'v': printf("rip98d: %s\n", VERSION); return 0; case ':': fprintf(stderr, "rip98d: invalid time interval\n"); return 1; case '?': fprintf(stderr, "usage: rip98d [-d] [-l] [-r] [-t interval] [-v]\n"); return 1; } } signal(SIGTERM, terminate); if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("rip98d: socket"); return 1; } memset((char *)&loc_addr, 0, sizeof(loc_addr)); loc_addr.sin_family = AF_INET; loc_addr.sin_addr.s_addr = htonl(INADDR_ANY); loc_addr.sin_port = htons(RIP_PORT); if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr)) < 0) { perror("rip98d: bind"); close(s); return 1; } if (!daemon_start(FALSE)) { fprintf(stderr, "rip98d: cannot become a daemon\n"); close(s); return 1; } if (logging) { openlog("rip98d", LOG_PID, LOG_DAEMON); syslog(LOG_INFO, "starting"); } for (;;) { FD_ZERO(&fdset); FD_SET(s, &fdset); timeout.tv_sec = 60; timeout.tv_usec = 0; select(s + 1, &fdset, NULL, NULL, &timeout); if (!read_routes()) { if (logging) closelog(); return 1; } if (FD_ISSET(s, &fdset)) receive_routes(s); time(&timenow); if ((timenow - timelast) > interval) { timelast = timenow; if (first_route != NULL) transmit_routes(s); } } }