/* include icmpd1 */ #include "icmpd.h" int main(int argc, char **argv) { int i, sockfd; if (argc != 1) err_quit("usage: icmpd"); maxi = -1; /* index into client[] array */ for (i = 0; i < FD_SETSIZE; i++) client[i].connfd = -1; /* -1 indicates available entry */ FD_ZERO(&allset); fd4 = Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); FD_SET(fd4, &allset); maxfd = fd4; #ifdef IPV6 fd6 = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); FD_SET(fd6, &allset); maxfd = max(maxfd, fd6); #endif listenfd = Tcp_listen("/unix", ICMPD_PATH, &addrlen); FD_SET(listenfd, &allset); maxfd = max(maxfd, listenfd); cliaddr = Malloc(addrlen); /* end icmpd1 */ /* include icmpd2 */ for ( ; ; ) { rset = allset; nready = Select(maxfd+1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) if (readable_listen() <= 0) continue; if (FD_ISSET(fd4, &rset)) if (readable_v4() <= 0) continue; #ifdef IPV6 if (FD_ISSET(fd6, &rset)) if (readable_v6() <= 0) continue; #endif for (i = 0; i <= maxi; i++) { /* check all clients for data */ if ( (sockfd = client[i].connfd) < 0) continue; if (FD_ISSET(sockfd, &rset)) if (readable_conn(i) <= 0) break; /* no more readable descriptors */ } } exit(0); } /* end icmpd2 */