author | llornkcor <llornkcor> | 2004-04-07 07:48:07 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2004-04-07 07:48:07 (UTC) |
commit | a1221f718bb1e9bcb6318dbf3314b9a35891caac (patch) (unidiff) | |
tree | 5f230f06f55029ee06954447bcd628002bb6bcec | |
parent | b3447b43b48cb6d720b76a1e9fc46acac6961dc8 (diff) | |
download | opie-a1221f718bb1e9bcb6318dbf3314b9a35891caac.zip opie-a1221f718bb1e9bcb6318dbf3314b9a35891caac.tar.gz opie-a1221f718bb1e9bcb6318dbf3314b9a35891caac.tar.bz2 |
respect TERM variable
-rw-r--r-- | core/apps/embeddedkonsole/MyPty.cpp | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/core/apps/embeddedkonsole/MyPty.cpp b/core/apps/embeddedkonsole/MyPty.cpp index d05e31e..4b1ae59 100644 --- a/core/apps/embeddedkonsole/MyPty.cpp +++ b/core/apps/embeddedkonsole/MyPty.cpp | |||
@@ -43,246 +43,248 @@ | |||
43 | [NOTE: much of the technical stuff below will be replaced by forkpty.] | 43 | [NOTE: much of the technical stuff below will be replaced by forkpty.] |
44 | 44 | ||
45 | publish the SIGCHLD signal if not related to an instance. | 45 | publish the SIGCHLD signal if not related to an instance. |
46 | 46 | ||
47 | clearify TEPty::done vs. TEPty::~TEPty semantics. | 47 | clearify TEPty::done vs. TEPty::~TEPty semantics. |
48 | check if pty is restartable via run after done. | 48 | check if pty is restartable via run after done. |
49 | 49 | ||
50 | \par Pseudo terminals | 50 | \par Pseudo terminals |
51 | 51 | ||
52 | Pseudo terminals are a unique feature of UNIX, and always come in form of | 52 | Pseudo terminals are a unique feature of UNIX, and always come in form of |
53 | pairs of devices (/dev/ptyXX and /dev/ttyXX), which are connected to each | 53 | pairs of devices (/dev/ptyXX and /dev/ttyXX), which are connected to each |
54 | other by the operating system. One may think of them as two serial devices | 54 | other by the operating system. One may think of them as two serial devices |
55 | linked by a null-modem cable. Being based on devices the number of | 55 | linked by a null-modem cable. Being based on devices the number of |
56 | simultanous instances of this class is (globally) limited by the number of | 56 | simultanous instances of this class is (globally) limited by the number of |
57 | those device pairs, which is 256. | 57 | those device pairs, which is 256. |
58 | 58 | ||
59 | Another technic are UNIX 98 PTY's. These are supported also, and prefered | 59 | Another technic are UNIX 98 PTY's. These are supported also, and prefered |
60 | over the (obsolete) predecessor. | 60 | over the (obsolete) predecessor. |
61 | 61 | ||
62 | There's a sinister ioctl(2), signal(2) and job control stuff | 62 | There's a sinister ioctl(2), signal(2) and job control stuff |
63 | nessesary to make everything work as it should. | 63 | nessesary to make everything work as it should. |
64 | */ | 64 | */ |
65 | 65 | ||
66 | 66 | ||
67 | #include <qfileinfo.h> | 67 | #include <qfileinfo.h> |
68 | #include <qapplication.h> | 68 | #include <qapplication.h> |
69 | #include <qsocketnotifier.h> | 69 | #include <qsocketnotifier.h> |
70 | 70 | ||
71 | #include <stdlib.h> | 71 | #include <stdlib.h> |
72 | #include <stdio.h> | 72 | #include <stdio.h> |
73 | #include <signal.h> | 73 | #include <signal.h> |
74 | #include <fcntl.h> | 74 | #include <fcntl.h> |
75 | #include <unistd.h> | 75 | #include <unistd.h> |
76 | #include <termios.h> | 76 | #include <termios.h> |
77 | #include <sys/types.h> | 77 | #include <sys/types.h> |
78 | #include <sys/ioctl.h> | 78 | #include <sys/ioctl.h> |
79 | #include <sys/wait.h> | 79 | #include <sys/wait.h> |
80 | 80 | ||
81 | #ifdef HAVE_OPENPTY | 81 | #ifdef HAVE_OPENPTY |
82 | #include <pty.h> | 82 | #include <pty.h> |
83 | #endif | 83 | #endif |
84 | 84 | ||
85 | #include "MyPty.h" | 85 | #include "MyPty.h" |
86 | 86 | ||
87 | 87 | ||
88 | #undef VERBOSE_DEBUG | 88 | #undef VERBOSE_DEBUG |
89 | 89 | ||
90 | 90 | ||
91 | /* -------------------------------------------------------------------------- */ | 91 | /* -------------------------------------------------------------------------- */ |
92 | 92 | ||
93 | /*! | 93 | /*! |
94 | Informs the client program about the | 94 | Informs the client program about the |
95 | actual size of the window. | 95 | actual size of the window. |
96 | */ | 96 | */ |
97 | 97 | ||
98 | void MyPty::setSize(int lines, int columns) | 98 | void MyPty::setSize(int lines, int columns) |
99 | { | 99 | { |
100 | struct winsize wsize; | 100 | struct winsize wsize; |
101 | wsize.ws_row = (unsigned short)lines; | 101 | wsize.ws_row = (unsigned short)lines; |
102 | wsize.ws_col = (unsigned short)columns; | 102 | wsize.ws_col = (unsigned short)columns; |
103 | if(fd < 0) return; | 103 | if(fd < 0) return; |
104 | ioctl(fd,TIOCSWINSZ,(char *)&wsize); | 104 | ioctl(fd,TIOCSWINSZ,(char *)&wsize); |
105 | } | 105 | } |
106 | 106 | ||
107 | 107 | ||
108 | void MyPty::donePty() | 108 | void MyPty::donePty() |
109 | { | 109 | { |
110 | // This is code from the Qt DumbTerminal example | 110 | // This is code from the Qt DumbTerminal example |
111 | int status = 0; | 111 | int status = 0; |
112 | 112 | ||
113 | ::close(fd); | 113 | ::close(fd); |
114 | 114 | ||
115 | if (cpid) { | 115 | if (cpid) { |
116 | kill(cpid, SIGHUP); | 116 | kill(cpid, SIGHUP); |
117 | waitpid(cpid, &status, 0); | 117 | waitpid(cpid, &status, 0); |
118 | } | 118 | } |
119 | 119 | ||
120 | emit done(status); | 120 | emit done(status); |
121 | } | 121 | } |
122 | 122 | ||
123 | 123 | ||
124 | const char* MyPty::deviceName() | 124 | const char* MyPty::deviceName() |
125 | { | 125 | { |
126 | return ttynam; | 126 | return ttynam; |
127 | } | 127 | } |
128 | 128 | ||
129 | 129 | ||
130 | void MyPty::error() | 130 | void MyPty::error() |
131 | { | 131 | { |
132 | // This is code from the Qt DumbTerminal example | 132 | // This is code from the Qt DumbTerminal example |
133 | donePty(); | 133 | donePty(); |
134 | } | 134 | } |
135 | 135 | ||
136 | 136 | ||
137 | /*! | 137 | /*! |
138 | start the client program. | 138 | start the client program. |
139 | */ | 139 | */ |
140 | int MyPty::run(const char* cmd, QStrList &, const char*, int) | 140 | int MyPty::run(const char* cmd, QStrList &, const char*, int) |
141 | { | 141 | { |
142 | // This is code from the Qt DumbTerminal example | 142 | // This is code from the Qt DumbTerminal example |
143 | cpid = fork(); | 143 | cpid = fork(); |
144 | 144 | ||
145 | if ( !cpid ) { | 145 | if ( !cpid ) { |
146 | // child - exec shell on tty | 146 | // child - exec shell on tty |
147 | for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); | 147 | for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); |
148 | 148 | ||
149 | // attempt to keep apm driver from killing us on power on/off | 149 | // attempt to keep apm driver from killing us on power on/off |
150 | signal(SIGSTOP, SIG_IGN); | 150 | signal(SIGSTOP, SIG_IGN); |
151 | signal(SIGCONT, SIG_IGN); | 151 | signal(SIGCONT, SIG_IGN); |
152 | signal(SIGTSTP, SIG_IGN); | 152 | signal(SIGTSTP, SIG_IGN); |
153 | 153 | ||
154 | int ttyfd = open(ttynam, O_RDWR); | 154 | int ttyfd = open(ttynam, O_RDWR); |
155 | dup2(ttyfd, STDIN_FILENO); | 155 | dup2(ttyfd, STDIN_FILENO); |
156 | dup2(ttyfd, STDOUT_FILENO); | 156 | dup2(ttyfd, STDOUT_FILENO); |
157 | dup2(ttyfd, STDERR_FILENO); | 157 | dup2(ttyfd, STDERR_FILENO); |
158 | // should be done with tty, so close it | 158 | // should be done with tty, so close it |
159 | close(ttyfd); | 159 | close(ttyfd); |
160 | static struct termios ttmode; | 160 | static struct termios ttmode; |
161 | if ( setsid() < 0 ) | 161 | if ( setsid() < 0 ) |
162 | perror( "failed to set process group" ); | 162 | perror( "failed to set process group" ); |
163 | #if defined (TIOCSCTTY) | 163 | #if defined (TIOCSCTTY) |
164 | // grabbed from APUE by Stevens | 164 | // grabbed from APUE by Stevens |
165 | ioctl(STDIN_FILENO, TIOCSCTTY, 0); | 165 | ioctl(STDIN_FILENO, TIOCSCTTY, 0); |
166 | #endif | 166 | #endif |
167 | tcgetattr( STDIN_FILENO, &ttmode ); | 167 | tcgetattr( STDIN_FILENO, &ttmode ); |
168 | ttmode.c_cc[VINTR] = 3; | 168 | ttmode.c_cc[VINTR] = 3; |
169 | ttmode.c_cc[VERASE] = 8; | 169 | ttmode.c_cc[VERASE] = 8; |
170 | tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); | 170 | tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); |
171 | setenv("TERM","vt100",1); | 171 | |
172 | if(strlen(getenv("TERM"))<=0) | ||
173 | setenv("TERM","vt100",1); | ||
172 | setenv("COLORTERM","0",1); | 174 | setenv("COLORTERM","0",1); |
173 | 175 | ||
174 | if (getuid() == 0) { | 176 | if (getuid() == 0) { |
175 | char msg[] = "WARNING: You are running this shell as root!\n"; | 177 | char msg[] = "WARNING: You are running this shell as root!\n"; |
176 | write(ttyfd, msg, sizeof(msg)); | 178 | write(ttyfd, msg, sizeof(msg)); |
177 | } | 179 | } |
178 | 180 | ||
179 | QString ccmd = "-"+QFileInfo(cmd).fileName(); //creates a login shell | 181 | QString ccmd = "-"+QFileInfo(cmd).fileName(); //creates a login shell |
180 | 182 | ||
181 | execl(cmd, ccmd.latin1(), 0); | 183 | execl(cmd, ccmd.latin1(), 0); |
182 | 184 | ||
183 | donePty(); | 185 | donePty(); |
184 | exit(-1); | 186 | exit(-1); |
185 | } | 187 | } |
186 | 188 | ||
187 | // parent - continue as a widget | 189 | // parent - continue as a widget |
188 | QSocketNotifier* sn_r = new QSocketNotifier(fd,QSocketNotifier::Read,this); | 190 | QSocketNotifier* sn_r = new QSocketNotifier(fd,QSocketNotifier::Read,this); |
189 | QSocketNotifier* sn_e = new QSocketNotifier(fd,QSocketNotifier::Exception,this); | 191 | QSocketNotifier* sn_e = new QSocketNotifier(fd,QSocketNotifier::Exception,this); |
190 | connect(sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); | 192 | connect(sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); |
191 | connect(sn_e,SIGNAL(activated(int)),this,SLOT(error())); | 193 | connect(sn_e,SIGNAL(activated(int)),this,SLOT(error())); |
192 | 194 | ||
193 | return 0; | 195 | return 0; |
194 | } | 196 | } |
195 | 197 | ||
196 | int MyPty::openPty() | 198 | int MyPty::openPty() |
197 | { | 199 | { |
198 | // This is code from the Qt DumbTerminal example | 200 | // This is code from the Qt DumbTerminal example |
199 | int ptyfd = -1; | 201 | int ptyfd = -1; |
200 | 202 | ||
201 | #ifdef HAVE_OPENPTY | 203 | #ifdef HAVE_OPENPTY |
202 | int ttyfd; | 204 | int ttyfd; |
203 | if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) | 205 | if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) |
204 | ptyfd = -1; | 206 | ptyfd = -1; |
205 | else | 207 | else |
206 | close(ttyfd); // we open the ttynam ourselves. | 208 | close(ttyfd); // we open the ttynam ourselves. |
207 | #else | 209 | #else |
208 | for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { | 210 | for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { |
209 | for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { | 211 | for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { |
210 | sprintf(ptynam,"/dev/pty%c%c",*c0,*c1); | 212 | sprintf(ptynam,"/dev/pty%c%c",*c0,*c1); |
211 | sprintf(ttynam,"/dev/tty%c%c",*c0,*c1); | 213 | sprintf(ttynam,"/dev/tty%c%c",*c0,*c1); |
212 | if ((ptyfd = ::open(ptynam,O_RDWR)) >= 0) { | 214 | if ((ptyfd = ::open(ptynam,O_RDWR)) >= 0) { |
213 | if (geteuid() != 0 && !access(ttynam,R_OK|W_OK) == 0) { | 215 | if (geteuid() != 0 && !access(ttynam,R_OK|W_OK) == 0) { |
214 | ::close(ptyfd); | 216 | ::close(ptyfd); |
215 | ptyfd = -1; | 217 | ptyfd = -1; |
216 | } | 218 | } |
217 | } | 219 | } |
218 | } | 220 | } |
219 | } | 221 | } |
220 | #endif | 222 | #endif |
221 | 223 | ||
222 | if ( ptyfd < 0 ) { | 224 | if ( ptyfd < 0 ) { |
223 | qApp->exit(1); | 225 | qApp->exit(1); |
224 | return -1; | 226 | return -1; |
225 | } | 227 | } |
226 | 228 | ||
227 | return ptyfd; | 229 | return ptyfd; |
228 | } | 230 | } |
229 | 231 | ||
230 | /*! | 232 | /*! |
231 | Create an instance. | 233 | Create an instance. |
232 | */ | 234 | */ |
233 | MyPty::MyPty() : cpid(0) | 235 | MyPty::MyPty() : cpid(0) |
234 | { | 236 | { |
235 | fd = openPty(); | 237 | fd = openPty(); |
236 | } | 238 | } |
237 | 239 | ||
238 | /*! | 240 | /*! |
239 | Destructor. | 241 | Destructor. |
240 | Note that the related client program is not killed | 242 | Note that the related client program is not killed |
241 | (yet) when a instance is deleted. | 243 | (yet) when a instance is deleted. |
242 | */ | 244 | */ |
243 | MyPty::~MyPty() | 245 | MyPty::~MyPty() |
244 | { | 246 | { |
245 | donePty(); | 247 | donePty(); |
246 | } | 248 | } |
247 | 249 | ||
248 | 250 | ||
249 | /*! sends len bytes through the line */ | 251 | /*! sends len bytes through the line */ |
250 | void MyPty::send_bytes(const char* s, int len) | 252 | void MyPty::send_bytes(const char* s, int len) |
251 | { | 253 | { |
252 | 254 | ||
253 | #ifdef VERBOSE_DEBUG | 255 | #ifdef VERBOSE_DEBUG |
254 | // verbose debug | 256 | // verbose debug |
255 | printf("sending bytes:\n"); | 257 | printf("sending bytes:\n"); |
256 | for (int i = 0; i < len; i++) | 258 | for (int i = 0; i < len; i++) |
257 | printf("%c", s[i]); | 259 | printf("%c", s[i]); |
258 | printf("\n"); | 260 | printf("\n"); |
259 | #endif | 261 | #endif |
260 | 262 | ||
261 | ::write(fd, s, len); | 263 | ::write(fd, s, len); |
262 | } | 264 | } |
263 | 265 | ||
264 | /*! indicates that a block of data is received */ | 266 | /*! indicates that a block of data is received */ |
265 | void MyPty::readPty() | 267 | void MyPty::readPty() |
266 | { | 268 | { |
267 | char buf[4096]; | 269 | char buf[4096]; |
268 | 270 | ||
269 | int len = ::read( fd, buf, 4096 ); | 271 | int len = ::read( fd, buf, 4096 ); |
270 | 272 | ||
271 | if (len == -1) | 273 | if (len == -1) |
272 | donePty(); | 274 | donePty(); |
273 | 275 | ||
274 | if (len < 0) | 276 | if (len < 0) |
275 | return; | 277 | return; |
276 | 278 | ||
277 | emit block_in(buf,len); | 279 | emit block_in(buf,len); |
278 | 280 | ||
279 | #ifdef VERBOSE_DEBUG | 281 | #ifdef VERBOSE_DEBUG |
280 | // verbose debug | 282 | // verbose debug |
281 | printf("read bytes:\n"); | 283 | printf("read bytes:\n"); |
282 | for (int i = 0; i < len; i++) | 284 | for (int i = 0; i < len; i++) |
283 | printf("%c", buf[i]); | 285 | printf("%c", buf[i]); |
284 | printf("\n"); | 286 | printf("\n"); |
285 | #endif | 287 | #endif |
286 | 288 | ||
287 | } | 289 | } |
288 | 290 | ||