www.pudn.com > unpv12e.rar > icmpd.c
/* 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 */