home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / gnu / sh-utils-1.12-src.lha / sh-utils-1.12 / src / stty.c < prev    next >
C/C++ Source or Header  |  1994-11-12  |  44KB  |  1,710 lines

  1. /* stty -- change and print terminal line settings
  2.    Copyright (C) 90, 91, 92, 93, 1994 Free Software Foundation, Inc.
  3.  
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2, or (at your option)
  7.    any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software
  16.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  17.  
  18. /* Usage: stty [-ag] [--all] [--save] [setting...]
  19.  
  20.    Options:
  21.    -a, --all    Write all current settings to stdout in human-readable form.
  22.    -g, --save   Write all current settings to stdout in stty-readable form.
  23.  
  24.    If no args are given, write to stdout the baud rate and settings that
  25.    have been changed from their defaults.  Mode reading and changes
  26.    are done on stdin.
  27.  
  28.    David MacKenzie <djm@gnu.ai.mit.edu> */
  29.  
  30. #include <config.h>
  31. #include <stdio.h>
  32. #include <sys/types.h>
  33. #include <termios.h>
  34. #ifdef GWINSZ_IN_SYS_IOCTL
  35. #include <sys/ioctl.h>
  36. #endif
  37. #ifdef WINSIZE_IN_PTEM
  38. #include <sys/stream.h>
  39. #include <sys/ptem.h>
  40. #endif
  41. #include <getopt.h>
  42. #ifdef __STDC__
  43. #include <stdarg.h>
  44. #define VA_START(args, lastarg) va_start(args, lastarg)
  45. #else
  46. #include <varargs.h>
  47. #define VA_START(args, lastarg) va_start(args)
  48. #endif
  49.  
  50. #include "system.h"
  51. #include "version.h"
  52. #include "long-options.h"
  53.  
  54. #if defined(GWINSZ_BROKEN)    /* Such as for SCO UNIX 3.2.2. */
  55. #undef TIOCGWINSZ
  56. #endif
  57.  
  58. #ifndef _POSIX_VDISABLE
  59. #define _POSIX_VDISABLE ((unsigned char) 0)
  60. #endif
  61.  
  62. #define Control(c) ((c) & 0x1f)
  63. /* Canonical values for control characters. */
  64. #ifndef CINTR
  65. #define CINTR Control ('c')
  66. #endif
  67. #ifndef CQUIT
  68. #define CQUIT 28
  69. #endif
  70. #ifndef CERASE
  71. #define CERASE 127
  72. #endif
  73. #ifndef CKILL
  74. #define CKILL Control ('u')
  75. #endif
  76. #ifndef CEOF
  77. #define CEOF Control ('d')
  78. #endif
  79. #ifndef CEOL
  80. #define CEOL _POSIX_VDISABLE
  81. #endif
  82. #ifndef CSTART
  83. #define CSTART Control ('q')
  84. #endif
  85. #ifndef CSTOP
  86. #define CSTOP Control ('s')
  87. #endif
  88. #ifndef CSUSP
  89. #define CSUSP Control ('z')
  90. #endif
  91. #if defined(VEOL2) && !defined(CEOL2)
  92. #define CEOL2 _POSIX_VDISABLE
  93. #endif
  94. #if defined(VSWTCH) && !defined(CSWTCH)
  95. #define CSWTCH _POSIX_VDISABLE
  96. #endif
  97.  
  98. /* SunOS 5.3 loses (^Z doesn't work) if `swtch' is the same as `susp'.
  99.    So the default is to disable `swtch.'  */
  100. #if defined (__sparc__) && defined (__svr4__)
  101. #undef CSWTCH
  102. #define CSWTCH _POSIX_VDISABLE
  103. #endif
  104.  
  105. #if defined(VWERSE) && !defined (VWERASE)    /* AIX-3.2.5 */
  106. #define VWERASE VWERSE
  107. #endif
  108. #if defined(VDSUSP) && !defined (CDSUSP)
  109. #define CDSUSP Control ('y')
  110. #endif
  111. #if !defined(VREPRINT) && defined(VRPRNT)    /* Irix 4.0.5 */
  112. #define VREPRINT VRPRNT
  113. #endif
  114. #if defined(VREPRINT) && !defined(CRPRNT)
  115. #define CRPRNT Control ('r')
  116. #endif
  117. #if defined(VWERASE) && !defined(CWERASE)
  118. #define CWERASE Control ('w')
  119. #endif
  120. #if defined(VLNEXT) && !defined(CLNEXT)
  121. #define CLNEXT Control ('v')
  122. #endif
  123. #if defined(VDISCARD) && !defined(VFLUSHO)
  124. #define VFLUSHO VDISCARD
  125. #endif
  126. #if defined(VFLUSH) && !defined(VFLUSHO)    /* Ultrix 4.2 */
  127. #define VFLUSHO VFLUSH
  128. #endif
  129. #if defined(VFLUSHO) && !defined(CFLUSHO)
  130. #define CFLUSHO Control ('o')
  131. #endif
  132. #if defined(VSTATUS) && !defined(CSTATUS)
  133. #define CSTATUS Control ('t')
  134. #endif
  135.  
  136. static const char *visible ();
  137. static unsigned long baud_to_value ();
  138. static int recover_mode ();
  139. static int screen_columns ();
  140. static int set_mode ();
  141. static long integer_arg ();
  142. static speed_t string_to_baud ();
  143. static tcflag_t *mode_type_flag ();
  144. static void display_all ();
  145. static void display_changed ();
  146. static void display_recoverable ();
  147. static void display_settings ();
  148. static void display_speed ();
  149. static void display_window_size ();
  150. static void sane_mode ();
  151. static void set_control_char ();
  152. static void set_speed ();
  153. static void set_window_size ();
  154.  
  155. void error ();
  156.  
  157. /* Which speeds to set.  */
  158. enum speed_setting
  159.   {
  160.     input_speed, output_speed, both_speeds
  161.   };
  162.  
  163. /* What to output and how.  */
  164. enum output_type
  165.   {
  166.     changed, all, recoverable    /* Default, -a, -g.  */
  167.   };
  168.  
  169. /* Which member(s) of `struct termios' a mode uses.  */
  170. enum mode_type
  171.   {
  172.     control, input, output, local, combination
  173.   };
  174.  
  175. /* Flags for `struct mode_info'. */
  176. #define SANE_SET 1        /* Set in `sane' mode. */
  177. #define SANE_UNSET 2        /* Unset in `sane' mode. */
  178. #define REV 4            /* Can be turned off by prepending `-'. */
  179. #define OMIT 8            /* Don't display value. */
  180.  
  181. /* Each mode.  */
  182. struct mode_info
  183.   {
  184.     const char *name;        /* Name given on command line.  */
  185.     enum mode_type type;    /* Which structure element to change. */
  186.     char flags;            /* Setting and display options.  */
  187.     unsigned long bits;        /* Bits to set for this mode.  */
  188.     unsigned long mask;        /* Other bits to turn off for this mode.  */
  189.   };
  190.  
  191. static struct mode_info mode_info[] =
  192. {
  193.   {"parenb", control, REV, PARENB, 0},
  194.   {"parodd", control, REV, PARODD, 0},
  195.   {"cs5", control, 0, CS5, CSIZE},
  196.   {"cs6", control, 0, CS6, CSIZE},
  197.   {"cs7", control, 0, CS7, CSIZE},
  198.   {"cs8", control, 0, CS8, CSIZE},
  199.   {"hupcl", control, REV, HUPCL, 0},
  200.   {"hup", control, REV | OMIT, HUPCL, 0},
  201.   {"cstopb", control, REV, CSTOPB, 0},
  202.   {"cread", control, SANE_SET | REV, CREAD, 0},
  203.   {"clocal", control, REV, CLOCAL, 0},
  204. #ifdef CRTSCTS
  205.   {"crtscts", control, REV, CRTSCTS, 0},
  206. #endif
  207.  
  208.   {"ignbrk", input, SANE_UNSET | REV, IGNBRK, 0},
  209.   {"brkint", input, SANE_SET | REV, BRKINT, 0},
  210.   {"ignpar", input, REV, IGNPAR, 0},
  211.   {"parmrk", input, REV, PARMRK, 0},
  212.   {"inpck", input, REV, INPCK, 0},
  213.   {"istrip", input, REV, ISTRIP, 0},
  214.   {"inlcr", input, SANE_UNSET | REV, INLCR, 0},
  215.   {"igncr", input, SANE_UNSET | REV, IGNCR, 0},
  216.   {"icrnl", input, SANE_SET | REV, ICRNL, 0},
  217.   {"ixon", input, REV, IXON, 0},
  218.   {"ixoff", input, SANE_UNSET | REV, IXOFF, 0},
  219.   {"tandem", input, REV | OMIT, IXOFF, 0},
  220. #ifdef IUCLC
  221.   {"iuclc", input, SANE_UNSET | REV, IUCLC, 0},
  222. #endif
  223. #ifdef IXANY
  224.   {"ixany", input, SANE_UNSET | REV, IXANY, 0},
  225. #endif
  226. #ifdef IMAXBEL
  227.   {"imaxbel", input, SANE_SET | REV, IMAXBEL, 0},
  228. #endif
  229.  
  230.   {"opost", output, SANE_SET | REV, OPOST, 0},
  231. #ifdef OLCUC
  232.   {"olcuc", output, SANE_UNSET | REV, OLCUC, 0},
  233. #endif
  234. #ifdef OCRNL
  235.   {"ocrnl", output, SANE_UNSET | REV, OCRNL, 0},
  236. #endif
  237. #ifdef ONLCR
  238.   {"onlcr", output, SANE_SET | REV, ONLCR, 0},
  239. #endif
  240. #ifdef ONOCR
  241.   {"onocr", output, SANE_UNSET | REV, ONOCR, 0},
  242. #endif
  243. #ifdef ONLRET
  244.   {"onlret", output, SANE_UNSET | REV, ONLRET, 0},
  245. #endif
  246. #ifdef OFILL
  247.   {"ofill", output, SANE_UNSET | REV, OFILL, 0},
  248. #endif
  249. #ifdef OFDEL
  250.   {"ofdel", output, SANE_UNSET | REV, OFDEL, 0},
  251. #endif
  252. #ifdef NLDLY
  253.   {"nl1", output, SANE_UNSET, NL1, NLDLY},
  254.   {"nl0", output, SANE_SET, NL0, NLDLY},
  255. #endif
  256. #ifdef CRDLY
  257.   {"cr3", output, SANE_UNSET, CR3, CRDLY},
  258.   {"cr2", output, SANE_UNSET, CR2, CRDLY},
  259.   {"cr1", output, SANE_UNSET, CR1, CRDLY},
  260.   {"cr0", output, SANE_SET, CR0, CRDLY},
  261. #endif
  262. #ifdef TABDLY
  263.   {"tab3", output, SANE_UNSET, TAB3, TABDLY},
  264.   {"tab2", output, SANE_UNSET, TAB2, TABDLY},
  265.   {"tab1", output, SANE_UNSET, TAB1, TABDLY},
  266.   {"tab0", output, SANE_SET, TAB0, TABDLY},
  267. #else
  268. #ifdef OXTABS
  269.   {"tab3", output, SANE_UNSET, OXTABS, 0},
  270. #endif
  271. #endif
  272. #ifdef BSDLY
  273.   {"bs1", output, SANE_UNSET, BS1, BSDLY},
  274.   {"bs0", output, SANE_SET, BS0, BSDLY},
  275. #endif
  276. #ifdef VTDLY
  277.   {"vt1", output, SANE_UNSET, VT1, VTDLY},
  278.   {"vt0", output, SANE_SET, VT0, VTDLY},
  279. #endif
  280. #ifdef FFDLY
  281.   {"ff1", output, SANE_UNSET, FF1, FFDLY},
  282.   {"ff0", output, SANE_SET, FF0, FFDLY},
  283. #endif
  284.  
  285.   {"isig", local, SANE_SET | REV, ISIG, 0},
  286.   {"icanon", local, SANE_SET | REV, ICANON, 0},
  287. #ifdef IEXTEN
  288.   {"iexten", local, SANE_SET | REV, IEXTEN, 0},
  289. #endif
  290.   {"echo", local, SANE_SET | REV, ECHO, 0},
  291.   {"echoe", local, SANE_SET | REV, ECHOE, 0},
  292.   {"crterase", local, REV | OMIT, ECHOE, 0},
  293.   {"echok", local, SANE_SET | REV, ECHOK, 0},
  294.   {"echonl", local, SANE_UNSET | REV, ECHONL, 0},
  295.   {"noflsh", local, SANE_UNSET | REV, NOFLSH, 0},
  296. #ifdef XCASE
  297.   {"xcase", local, SAN