| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- /* include icmpd1 */
- #include "icmpd.h"
- int
- main(int argc, char **argv)
- {
- int i, sockfd;
- struct sockaddr_un sun;
- 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 = Socket(AF_UNIX, SOCK_STREAM, 0);
- sun.sun_family = AF_LOCAL;
- strcpy(sun.sun_path, ICMPD_PATH);
- unlink(ICMPD_PATH);
- Bind(listenfd, (SA *)&sun, sizeof(sun));
- Listen(listenfd, LISTENQ);
- FD_SET(listenfd, &allset);
- maxfd = max(maxfd, listenfd);
- /* 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 */
|