Пример #1
0
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;
}
Пример #2
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);
		}
	}
}