readable_conn.lc 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /* include readable_conn1 */
  2. #include "icmpd.h"## 1 ##src/icmpd/readable_conn.c##
  3. int## 2 ##src/icmpd/readable_conn.c##
  4. readable_conn(int i)## 3 ##src/icmpd/readable_conn.c##
  5. {## 4 ##src/icmpd/readable_conn.c##
  6. int unixfd, recvfd;## 5 ##src/icmpd/readable_conn.c##
  7. char c;## 6 ##src/icmpd/readable_conn.c##
  8. ssize_t n;## 7 ##src/icmpd/readable_conn.c##
  9. socklen_t len;## 8 ##src/icmpd/readable_conn.c##
  10. union {## 9 ##src/icmpd/readable_conn.c##
  11. char buf[MAXSOCKADDR];## 10 ##src/icmpd/readable_conn.c##
  12. struct sockaddr sock;## 11 ##src/icmpd/readable_conn.c##
  13. } un;## 12 ##src/icmpd/readable_conn.c##
  14. unixfd = client[i].connfd;## 13 ##src/icmpd/readable_conn.c##
  15. recvfd = -1;## 14 ##src/icmpd/readable_conn.c##
  16. if ((n = Read_fd(unixfd, &c, 1, &recvfd)) == 0) {## 15 ##src/icmpd/readable_conn.c##
  17. err_msg("client %d terminated, recvfd = %d", i, recvfd);## 16 ##src/icmpd/readable_conn.c##
  18. goto clientdone; /* client probably terminated */## 17 ##src/icmpd/readable_conn.c##
  19. }## 18 ##src/icmpd/readable_conn.c##
  20. /* 4data from client; should be descriptor */## 19 ##src/icmpd/readable_conn.c##
  21. if (recvfd < 0) {## 20 ##src/icmpd/readable_conn.c##
  22. err_msg("read_fd did not return descriptor");## 21 ##src/icmpd/readable_conn.c##
  23. goto clienterr;## 22 ##src/icmpd/readable_conn.c##
  24. }## 23 ##src/icmpd/readable_conn.c##
  25. /* end readable_conn1 */
  26. /* include readable_conn2 */
  27. len = sizeof(un.buf);## 24 ##src/icmpd/readable_conn.c##
  28. if (getsockname(recvfd, (SA *) un.buf, &len) < 0) {## 25 ##src/icmpd/readable_conn.c##
  29. err_ret("getsockname error");## 26 ##src/icmpd/readable_conn.c##
  30. goto clienterr;## 27 ##src/icmpd/readable_conn.c##
  31. }## 28 ##src/icmpd/readable_conn.c##
  32. client[i].family = un.sock.sa_family;## 29 ##src/icmpd/readable_conn.c##
  33. if ((client[i].lport = sock_get_port(&un.sock, len)) == 0) {## 30 ##src/icmpd/readable_conn.c##
  34. client[i].lport = sock_bind_wild(recvfd, client[i].family);## 31 ##src/icmpd/readable_conn.c##
  35. if (client[i].lport <= 0) {## 32 ##src/icmpd/readable_conn.c##
  36. err_ret("error binding ephemeral port");## 33 ##src/icmpd/readable_conn.c##
  37. goto clienterr;## 34 ##src/icmpd/readable_conn.c##
  38. }## 35 ##src/icmpd/readable_conn.c##
  39. }## 36 ##src/icmpd/readable_conn.c##
  40. Write(unixfd, "1", 1); /* tell client all OK */## 37 ##src/icmpd/readable_conn.c##
  41. FD_SET(unixfd, &allset);## 38 ##src/icmpd/readable_conn.c##
  42. if (unixfd > maxfd)## 39 ##src/icmpd/readable_conn.c##
  43. maxfd = unixfd;## 40 ##src/icmpd/readable_conn.c##
  44. if (i > maxi)## 41 ##src/icmpd/readable_conn.c##
  45. maxi = i;## 42 ##src/icmpd/readable_conn.c##
  46. Close(recvfd); /* all done with client's UDP socket */## 43 ##src/icmpd/readable_conn.c##
  47. return (--nready);## 44 ##src/icmpd/readable_conn.c##
  48. clienterr:## 45 ##src/icmpd/readable_conn.c##
  49. Write(unixfd, "0", 1); /* tell client error occurred */## 46 ##src/icmpd/readable_conn.c##
  50. clientdone:## 47 ##src/icmpd/readable_conn.c##
  51. Close(unixfd);## 48 ##src/icmpd/readable_conn.c##
  52. if (recvfd >= 0)## 49 ##src/icmpd/readable_conn.c##
  53. Close(recvfd);## 50 ##src/icmpd/readable_conn.c##
  54. FD_CLR(unixfd, &allset);## 51 ##src/icmpd/readable_conn.c##
  55. client[i].connfd = -1;## 52 ##src/icmpd/readable_conn.c##
  56. return (--nready);## 53 ##src/icmpd/readable_conn.c##
  57. }## 54 ##src/icmpd/readable_conn.c##
  58. /* end readable_conn2 */