icmpd.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /* include icmpd1 */
  2. #include "icmpd.h"
  3. int
  4. main(int argc, char **argv)
  5. {
  6. int i, sockfd;
  7. struct sockaddr_un sun;
  8. if (argc != 1)
  9. err_quit("usage: icmpd");
  10. maxi = -1; /* index into client[] array */
  11. for (i = 0; i < FD_SETSIZE; i++)
  12. client[i].connfd = -1; /* -1 indicates available entry */
  13. FD_ZERO(&allset);
  14. fd4 = Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
  15. FD_SET(fd4, &allset);
  16. maxfd = fd4;
  17. #ifdef IPV6
  18. fd6 = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
  19. FD_SET(fd6, &allset);
  20. maxfd = max(maxfd, fd6);
  21. #endif
  22. listenfd = Socket(AF_UNIX, SOCK_STREAM, 0);
  23. sun.sun_family = AF_LOCAL;
  24. strcpy(sun.sun_path, ICMPD_PATH);
  25. unlink(ICMPD_PATH);
  26. Bind(listenfd, (SA *)&sun, sizeof(sun));
  27. Listen(listenfd, LISTENQ);
  28. FD_SET(listenfd, &allset);
  29. maxfd = max(maxfd, listenfd);
  30. /* end icmpd1 */
  31. /* include icmpd2 */
  32. for ( ; ; ) {
  33. rset = allset;
  34. nready = Select(maxfd+1, &rset, NULL, NULL, NULL);
  35. if (FD_ISSET(listenfd, &rset))
  36. if (readable_listen() <= 0)
  37. continue;
  38. if (FD_ISSET(fd4, &rset))
  39. if (readable_v4() <= 0)
  40. continue;
  41. #ifdef IPV6
  42. if (FD_ISSET(fd6, &rset))
  43. if (readable_v6() <= 0)
  44. continue;
  45. #endif
  46. for (i = 0; i <= maxi; i++) { /* check all clients for data */
  47. if ( (sockfd = client[i].connfd) < 0)
  48. continue;
  49. if (FD_ISSET(sockfd, &rset))
  50. if (readable_conn(i) <= 0)
  51. break; /* no more readable descriptors */
  52. }
  53. }
  54. exit(0);
  55. }
  56. /* end icmpd2 */