pollhup.patch 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. Index: netcat-openbsd-1.89/netcat.c
  2. ===================================================================
  3. --- netcat-openbsd-1.89.orig/netcat.c 2008-01-22 16:17:18.000000000 -0500
  4. +++ netcat-openbsd-1.89/netcat.c 2008-01-22 16:17:25.000000000 -0500
  5. @@ -618,9 +618,7 @@
  6. if ((n = read(nfd, buf, plen)) < 0)
  7. return;
  8. else if (n == 0) {
  9. - shutdown(nfd, SHUT_RD);
  10. - pfd[0].fd = -1;
  11. - pfd[0].events = 0;
  12. + goto shutdown_rd;
  13. } else {
  14. if (tflag)
  15. atelnet(nfd, buf, n);
  16. @@ -628,18 +626,30 @@
  17. return;
  18. }
  19. }
  20. + else if (pfd[0].revents & POLLHUP) {
  21. + shutdown_rd:
  22. + shutdown(nfd, SHUT_RD);
  23. + pfd[0].fd = -1;
  24. + pfd[0].events = 0;
  25. + }
  26. - if (!dflag && pfd[1].revents & POLLIN) {
  27. + if (!dflag) {
  28. + if(pfd[1].revents & POLLIN) {
  29. if ((n = read(wfd, buf, plen)) < 0)
  30. return;
  31. else if (n == 0) {
  32. - shutdown(nfd, SHUT_WR);
  33. - pfd[1].fd = -1;
  34. - pfd[1].events = 0;
  35. + goto shutdown_wr;
  36. } else {
  37. if (atomicio(vwrite, nfd, buf, n) != n)
  38. return;
  39. }
  40. + }
  41. + else if (pfd[1].revents & POLLHUP) {
  42. + shutdown_wr:
  43. + shutdown(nfd, SHUT_WR);
  44. + pfd[1].fd = -1;
  45. + pfd[1].events = 0;
  46. + }
  47. }
  48. }
  49. }