terminal.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:6k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /* Copyright (c) 1988, 1990, 1993                                            */
  2. /* The Regents of the University of California.  All rights reserved.        */
  3. /*                                                                           */
  4. /* Redistribution and use in source and binary forms, with or without        */
  5. /* modification, are permitted provided that the following conditions        */
  6. /* are met:                                                                  */
  7. /* 1. Redistributions of source code must retain the above copyright         */
  8. /* notice, this list of conditions and the following disclaimer.             */
  9. /* 2. Redistributions in binary form must reproduce the above copyright      */
  10. /* notice, this list of conditions and the following disclaimer in the       */
  11. /* documentation and/or other materials provided with the distribution.      */
  12. /* 3. All advertising materials mentioning features or use of this           */
  13. /* software must display the following acknowledgement:                      */
  14. /*   This product includes software developed by the University of           */
  15. /*   California, Berkeley and its contributors.                              */
  16. /* 4. Neither the name of the University nor the names of its contributors   */
  17. /* may be used to endorse or promote products derived from this software     */
  18. /* without specific prior written permission.                                */
  19. /*                                                                           */
  20. /* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   */
  21. /* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     */
  22. /* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR        */
  23. /* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE */
  24. /* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR       */
  25. /* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF      */
  26. /* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  */
  27. /* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN   */
  28. /* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)   */
  29. /* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF    */
  30. /* THE POSSIBILITY OF SUCH DAMAGE.                                           */
  31. #ifdef SHOW_SCCSIDS
  32. static char sccsid[] = "@(#)terminal.c 8.2 (Berkeley) 2/16/95";
  33. #endif
  34. #include <arpa/telnet.h>
  35. #include <sys/types.h>
  36. #include "ring.h"
  37. #include "externs.h"
  38. #include "types.h"
  39. Ring ttyoring, ttyiring;
  40. unsigned char ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ];
  41. int termdata; /* Debugging flag */
  42. #ifdef USE_TERMIO
  43. # ifndef VDISCARD
  44. cc_t termFlushChar;
  45. # endif
  46. # ifndef VLNEXT
  47. cc_t termLiteralNextChar;
  48. # endif
  49. # ifndef VSUSP
  50. cc_t termSuspChar;
  51. # endif
  52. # ifndef VWERASE
  53. cc_t termWerasChar;
  54. # endif
  55. # ifndef VREPRINT
  56. cc_t termRprntChar;
  57. # endif
  58. # ifndef VSTART
  59. cc_t termStartChar;
  60. # endif
  61. # ifndef VSTOP
  62. cc_t termStopChar;
  63. # endif
  64. # ifndef VEOL
  65. cc_t termForw1Char;
  66. # endif
  67. # ifndef VEOL2
  68. cc_t termForw2Char;
  69. # endif
  70. # ifndef VSTATUS
  71. cc_t termAytChar;
  72. # endif
  73. #else
  74. cc_t termForw2Char;
  75. cc_t termAytChar;
  76. #endif
  77. /*
  78.  * initialize the terminal data structures.
  79.  */
  80.     void
  81. init_terminal()
  82. {
  83.     if (ring_init(&ttyoring, ttyobuf, sizeof ttyobuf) != 1) {
  84. exit(1);
  85.     }
  86.     if (ring_init(&ttyiring, ttyibuf, sizeof ttyibuf) != 1) {
  87. exit(1);
  88.     }
  89.     autoflush = TerminalAutoFlush();
  90. }
  91. /*
  92.  * Send as much data as possible to the terminal.
  93.  *
  94.  * Return value:
  95.  * -1: No useful work done, data waiting to go out.
  96.  *  0: No data was waiting, so nothing was done.
  97.  *  1: All waiting data was written out.
  98.  *  n: All data - n was written out.
  99.  */
  100.     int
  101. ttyflush(drop)
  102.     int drop;
  103. {
  104.     register int n, n0, n1;
  105.     n0 = ring_full_count(&ttyoring);
  106.     if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) {
  107. if (drop) {
  108.     TerminalFlushOutput();
  109.     /* we leave 'n' alone! */
  110. } else {
  111.     n = TerminalWrite((char *)ttyoring.consume, n);
  112. }
  113.     }
  114.     if (n > 0) {
  115. if (termdata && n) {
  116.     Dump('>', ttyoring.consume, n);
  117. }
  118. /*
  119.  * If we wrote everything, and the full count is
  120.  * larger than what we wrote, then write the
  121.  * rest of the buffer.
  122.  */
  123. if (n1 == n && n0 > n) {
  124. n1 = n0 - n;
  125. if (!drop)
  126. n1 = TerminalWrite((char *)ttyoring.bottom, n1);
  127. if (n1 > 0)
  128. n += n1;
  129. }
  130. ring_consumed(&ttyoring, n);
  131.     }
  132.     if (n < 0)
  133. return -1;
  134.     if (n == n0) {
  135. if (n0)
  136.     return -1;
  137. return 0;
  138.     }
  139.     return n0 - n + 1;
  140. }
  141. /*
  142.  * These routines decides on what the mode should be (based on the values
  143.  * of various global variables).
  144.  */
  145.     int
  146. getconnmode()
  147. {
  148.     extern int linemode;
  149.     int mode = 0;
  150. #ifdef KLUDGELINEMODE
  151.     extern int kludgelinemode;
  152. #endif
  153.     if (In3270)
  154. return(MODE_FLOW);
  155.     if (my_want_state_is_dont(TELOPT_ECHO))
  156. mode |= MODE_ECHO;
  157.     if (localflow)
  158. mode |= MODE_FLOW;
  159.     if (my_want_state_is_will(TELOPT_BINARY))
  160. mode |= MODE_INBIN;
  161.     if (his_want_state_is_will(TELOPT_BINARY))
  162. mode |= MODE_OUTBIN;
  163. #ifdef KLUDGELINEMODE
  164.     if (kludgelinemode) {
  165. if (my_want_state_is_dont(TELOPT_SGA)) {
  166.     mode |= (MODE_TRAPSIG|MODE_EDIT);
  167.     if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) {
  168. mode &= ~MODE_ECHO;
  169.     }
  170. }
  171. return(mode);
  172.     }
  173. #endif
  174.     if (my_want_state_is_will(TELOPT_LINEMODE))
  175. mode |= linemode;
  176.     return(mode);
  177. }
  178.     void
  179. setconnmode(force)
  180.     int force;
  181. {
  182.     register int newmode;
  183.     newmode = getconnmode()|(force?MODE_FORCE:0);
  184.     TerminalNewMode(newmode);
  185. }
  186.     void
  187. setcommandmode()
  188. {
  189.     TerminalNewMode(-1);
  190. }