strclinonb.lc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /* include nonb1 */
  2. #include "unp.h"## 1 ##src/nonblock/strclinonb.c##
  3. void## 2 ##src/nonblock/strclinonb.c##
  4. str_cli(FILE *fp, int sockfd)## 3 ##src/nonblock/strclinonb.c##
  5. {## 4 ##src/nonblock/strclinonb.c##
  6. int maxfdp1, val, stdineof;## 5 ##src/nonblock/strclinonb.c##
  7. ssize_t n, nwritten;## 6 ##src/nonblock/strclinonb.c##
  8. fd_set rset, wset;## 7 ##src/nonblock/strclinonb.c##
  9. char to[MAXLINE], fr[MAXLINE];## 8 ##src/nonblock/strclinonb.c##
  10. char *toiptr, *tooptr, *friptr, *froptr;## 9 ##src/nonblock/strclinonb.c##
  11. val = Fcntl(sockfd, F_GETFL, 0);## 10 ##src/nonblock/strclinonb.c##
  12. Fcntl(sockfd, F_SETFL, val | O_NONBLOCK);## 11 ##src/nonblock/strclinonb.c##
  13. val = Fcntl(STDIN_FILENO, F_GETFL, 0);## 12 ##src/nonblock/strclinonb.c##
  14. Fcntl(STDIN_FILENO, F_SETFL, val | O_NONBLOCK);## 13 ##src/nonblock/strclinonb.c##
  15. val = Fcntl(STDOUT_FILENO, F_GETFL, 0);## 14 ##src/nonblock/strclinonb.c##
  16. Fcntl(STDOUT_FILENO, F_SETFL, val | O_NONBLOCK);## 15 ##src/nonblock/strclinonb.c##
  17. toiptr = tooptr = to; /* initialize buffer pointers */## 16 ##src/nonblock/strclinonb.c##
  18. friptr = froptr = fr;## 17 ##src/nonblock/strclinonb.c##
  19. stdineof = 0;## 18 ##src/nonblock/strclinonb.c##
  20. maxfdp1 = max(max(STDIN_FILENO, STDOUT_FILENO), sockfd) + 1;## 19 ##src/nonblock/strclinonb.c##
  21. for (;;) {## 20 ##src/nonblock/strclinonb.c##
  22. FD_ZERO(&rset);## 21 ##src/nonblock/strclinonb.c##
  23. FD_ZERO(&wset);## 22 ##src/nonblock/strclinonb.c##
  24. if (stdineof == 0 && toiptr < &to[MAXLINE])## 23 ##src/nonblock/strclinonb.c##
  25. FD_SET(STDIN_FILENO, &rset); /* read from stdin */## 24 ##src/nonblock/strclinonb.c##
  26. if (friptr < &fr[MAXLINE])## 25 ##src/nonblock/strclinonb.c##
  27. FD_SET(sockfd, &rset); /* read from socket */## 26 ##src/nonblock/strclinonb.c##
  28. if (tooptr != toiptr)## 27 ##src/nonblock/strclinonb.c##
  29. FD_SET(sockfd, &wset); /* data to write to socket */## 28 ##src/nonblock/strclinonb.c##
  30. if (froptr != friptr)## 29 ##src/nonblock/strclinonb.c##
  31. FD_SET(STDOUT_FILENO, &wset); /* data to write to stdout */## 30 ##src/nonblock/strclinonb.c##
  32. Select(maxfdp1, &rset, &wset, NULL, NULL);## 31 ##src/nonblock/strclinonb.c##
  33. /* end nonb1 */
  34. /* include nonb2 */
  35. if (FD_ISSET(STDIN_FILENO, &rset)) {## 32 ##src/nonblock/strclinonb.c##
  36. if ((n = read(STDIN_FILENO, toiptr, &to[MAXLINE] - toiptr)) < 0) {## 33 ##src/nonblock/strclinonb.c##
  37. if (errno != EWOULDBLOCK)## 34 ##src/nonblock/strclinonb.c##
  38. err_sys("read error on stdin");## 35 ##src/nonblock/strclinonb.c##
  39. } else if (n == 0) {## 36 ##src/nonblock/strclinonb.c##
  40. fprintf(stderr, "%s: EOF on stdin\n", gf_time());## 37 ##src/nonblock/strclinonb.c##
  41. stdineof = 1; /* all done with stdin */## 38 ##src/nonblock/strclinonb.c##
  42. if (tooptr == toiptr)## 39 ##src/nonblock/strclinonb.c##
  43. Shutdown(sockfd, SHUT_WR); /* send FIN */## 40 ##src/nonblock/strclinonb.c##
  44. } else {## 41 ##src/nonblock/strclinonb.c##
  45. fprintf(stderr, "%s: read %d bytes from stdin\n", gf_time(),## 42 ##src/nonblock/strclinonb.c##
  46. n);## 43 ##src/nonblock/strclinonb.c##
  47. toiptr += n; /* # just read */## 44 ##src/nonblock/strclinonb.c##
  48. FD_SET(sockfd, &wset); /* try and write to socket below */## 45 ##src/nonblock/strclinonb.c##
  49. }## 46 ##src/nonblock/strclinonb.c##
  50. }## 47 ##src/nonblock/strclinonb.c##
  51. if (FD_ISSET(sockfd, &rset)) {## 48 ##src/nonblock/strclinonb.c##
  52. if ((n = read(sockfd, friptr, &fr[MAXLINE] - friptr)) < 0) {## 49 ##src/nonblock/strclinonb.c##
  53. if (errno != EWOULDBLOCK)## 50 ##src/nonblock/strclinonb.c##
  54. err_sys("read error on socket");## 51 ##src/nonblock/strclinonb.c##
  55. } else if (n == 0) {## 52 ##src/nonblock/strclinonb.c##
  56. fprintf(stderr, "%s: EOF on socket\n", gf_time());## 53 ##src/nonblock/strclinonb.c##
  57. if (stdineof)## 54 ##src/nonblock/strclinonb.c##
  58. return; /* normal termination */## 55 ##src/nonblock/strclinonb.c##
  59. else## 56 ##src/nonblock/strclinonb.c##
  60. err_quit("str_cli: server terminated prematurely");## 57 ##src/nonblock/strclinonb.c##
  61. } else {## 58 ##src/nonblock/strclinonb.c##
  62. fprintf(stderr, "%s: read %d bytes from socket\n",## 59 ##src/nonblock/strclinonb.c##
  63. gf_time(), n);## 60 ##src/nonblock/strclinonb.c##
  64. friptr += n; /* # just read */## 61 ##src/nonblock/strclinonb.c##
  65. FD_SET(STDOUT_FILENO, &wset); /* try and write below */## 62 ##src/nonblock/strclinonb.c##
  66. }## 63 ##src/nonblock/strclinonb.c##
  67. }## 64 ##src/nonblock/strclinonb.c##
  68. /* end nonb2 */
  69. /* include nonb3 */
  70. if (FD_ISSET(STDOUT_FILENO, &wset) && ((n = friptr - froptr) > 0)) {## 65 ##src/nonblock/strclinonb.c##
  71. if ((nwritten = write(STDOUT_FILENO, froptr, n)) < 0) {## 66 ##src/nonblock/strclinonb.c##
  72. if (errno != EWOULDBLOCK)## 67 ##src/nonblock/strclinonb.c##
  73. err_sys("write error to stdout");## 68 ##src/nonblock/strclinonb.c##
  74. } else {## 69 ##src/nonblock/strclinonb.c##
  75. fprintf(stderr, "%s: wrote %d bytes to stdout\n",## 70 ##src/nonblock/strclinonb.c##
  76. gf_time(), nwritten);## 71 ##src/nonblock/strclinonb.c##
  77. froptr += nwritten; /* # just written */## 72 ##src/nonblock/strclinonb.c##
  78. if (froptr == friptr)## 73 ##src/nonblock/strclinonb.c##
  79. froptr = friptr = fr; /* back to beginning of buffer */## 74 ##src/nonblock/strclinonb.c##
  80. }## 75 ##src/nonblock/strclinonb.c##
  81. }## 76 ##src/nonblock/strclinonb.c##
  82. if (FD_ISSET(sockfd, &wset) && ((n = toiptr - tooptr) > 0)) {## 77 ##src/nonblock/strclinonb.c##
  83. if ((nwritten = write(sockfd, tooptr, n)) < 0) {## 78 ##src/nonblock/strclinonb.c##
  84. if (errno != EWOULDBLOCK)## 79 ##src/nonblock/strclinonb.c##
  85. err_sys("write error to socket");## 80 ##src/nonblock/strclinonb.c##
  86. } else {## 81 ##src/nonblock/strclinonb.c##
  87. fprintf(stderr, "%s: wrote %d bytes to socket\n",## 82 ##src/nonblock/strclinonb.c##
  88. gf_time(), nwritten);## 83 ##src/nonblock/strclinonb.c##
  89. tooptr += nwritten; /* # just written */## 84 ##src/nonblock/strclinonb.c##
  90. if (tooptr == toiptr) {## 85 ##src/nonblock/strclinonb.c##
  91. toiptr = tooptr = to; /* back to beginning of buffer */## 86 ##src/nonblock/strclinonb.c##
  92. if (stdineof)## 87 ##src/nonblock/strclinonb.c##
  93. Shutdown(sockfd, SHUT_WR); /* send FIN */## 88 ##src/nonblock/strclinonb.c##
  94. }## 89 ##src/nonblock/strclinonb.c##
  95. }## 90 ##src/nonblock/strclinonb.c##
  96. }## 91 ##src/nonblock/strclinonb.c##
  97. }## 92 ##src/nonblock/strclinonb.c##
  98. }## 93 ##src/nonblock/strclinonb.c##
  99. /* end nonb3 */