00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <unistd.h>
00031 #include <termios.h>
00032 #include <signal.h>
00033 #include <stdlib.h>
00034 #include <stdio.h>
00035
00036 #include "hostcompat.h"
00037
00038
00039
00040
00041
00042 const char *hostcompat_progname = NULL;
00043
00044
00045
00046
00047
00048 static struct termios hostcompat_runtios;
00049 static struct termios hostcompat_savetios;
00050
00051
00052
00053
00054 static
00055 void
00056 hostcompat_ttyreset(void)
00057 {
00058 tcsetattr(STDIN_FILENO, TCSADRAIN, &hostcompat_savetios);
00059 }
00060
00061
00062
00063
00064 static
00065 void
00066 hostcompat_ttyresume(void)
00067 {
00068 tcsetattr(STDIN_FILENO, TCSADRAIN, &hostcompat_runtios);
00069 }
00070
00071
00072
00073
00074 static
00075 int
00076 hostcompat_ttysetup(void)
00077 {
00078 struct termios tios;
00079
00080
00081 if (tcgetattr(STDIN_FILENO, &tios) < 0) {
00082
00083 return -1;
00084 }
00085
00086 hostcompat_savetios = tios;
00087
00088
00089 tios.c_lflag &= ~ICANON;
00090
00091
00092
00093
00094
00095 tios.c_cc[VMIN] = 1;
00096
00097
00098 tios.c_cc[VTIME] = 0;
00099
00100
00101 tios.c_lflag &= ~(ECHO|ECHONL|ECHOCTL);
00102
00103
00104 tios.c_iflag &= ~(IXON|IXOFF);
00105
00106
00107 tios.c_iflag &= ~(INLCR|IGNCR|ICRNL);
00108
00109
00110 #ifdef OCRNL
00111 tios.c_oflag &= ~(OCRNL);
00112 #endif
00113 tios.c_oflag |= OPOST|ONLCR;
00114
00115
00116 tios.c_lflag |= ISIG;
00117
00118
00119 hostcompat_runtios = tios;
00120 tcsetattr(STDIN_FILENO, TCSADRAIN, &tios);
00121
00122 return 0;
00123 }
00124
00125
00126
00127
00128 static
00129 void
00130 hostcompat_die(int sig)
00131 {
00132
00133 hostcompat_ttyreset();
00134
00135
00136 signal(sig, SIG_DFL);
00137
00138
00139 kill(getpid(), sig);
00140
00141
00142 _exit(255);
00143 }
00144
00145
00146
00147
00148 static
00149 void
00150 hostcompat_stop(int sig)
00151 {
00152
00153 hostcompat_ttyreset();
00154
00155
00156 signal(sig, SIG_DFL);
00157
00158
00159 kill(getpid(), sig);
00160 }
00161
00162
00163
00164
00165 static
00166 void
00167 hostcompat_cont(int sig)
00168 {
00169 (void)sig;
00170
00171
00172 hostcompat_ttyresume();
00173
00174
00175
00176
00177
00178 signal(SIGTTIN, hostcompat_stop);
00179 signal(SIGTTOU, hostcompat_stop);
00180 signal(SIGTSTP, hostcompat_stop);
00181 signal(SIGCONT, hostcompat_cont);
00182 }
00183
00184
00185
00186
00187 void
00188 hostcompat_init(int argc, char *argv[])
00189 {
00190
00191 if (argc > 0 && argv[0] != NULL) {
00192 hostcompat_progname = argv[0];
00193 }
00194
00195
00196 if (hostcompat_ttysetup() < 0) {
00197 return;
00198 }
00199
00200
00201 atexit(hostcompat_ttyreset);
00202
00203
00204 setvbuf(stdout, NULL, _IONBF, 0);
00205 setvbuf(stderr, NULL, _IONBF, 0);
00206
00207
00208 signal(SIGHUP, hostcompat_die);
00209 signal(SIGINT, hostcompat_die);
00210 signal(SIGQUIT, hostcompat_die);
00211 signal(SIGILL, hostcompat_die);
00212 signal(SIGTRAP, hostcompat_die);
00213 signal(SIGABRT, hostcompat_die);
00214 #ifdef SIGEMT
00215 signal(SIGEMT, hostcompat_die);
00216 #endif
00217 signal(SIGFPE, hostcompat_die);
00218 signal(SIGBUS, hostcompat_die);
00219 signal(SIGSEGV, hostcompat_die);
00220 signal(SIGSYS, hostcompat_die);
00221 signal(SIGPIPE, hostcompat_die);
00222 signal(SIGALRM, hostcompat_die);
00223 signal(SIGTERM, hostcompat_die);
00224 signal(SIGXCPU, hostcompat_die);
00225 signal(SIGXFSZ, hostcompat_die);
00226 signal(SIGVTALRM, hostcompat_die);
00227 signal(SIGPROF, hostcompat_die);
00228 signal(SIGUSR1, hostcompat_die);
00229 signal(SIGUSR2, hostcompat_die);
00230
00231
00232 signal(SIGTTIN, hostcompat_stop);
00233 signal(SIGTTOU, hostcompat_stop);
00234 signal(SIGTSTP, hostcompat_stop);
00235
00236
00237 signal(SIGCONT, hostcompat_cont);
00238 }