author | zecke <zecke> | 2002-10-31 18:42:29 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-10-31 18:42:29 (UTC) |
commit | 3c76157137de747176466df8c7ecb85105ab9d53 (patch) (unidiff) | |
tree | 3c93ed589d8b9fb05dfa139ef21c77649daa7bd1 | |
parent | 1793c4b5f743c31be9db1fbb0b3fbbe08df7df28 (diff) | |
download | opie-3c76157137de747176466df8c7ecb85105ab9d53.zip opie-3c76157137de747176466df8c7ecb85105ab9d53.tar.gz opie-3c76157137de747176466df8c7ecb85105ab9d53.tar.bz2 |
The if file exists check was wrong..
I limit it to a /bin/bash check...
-rw-r--r-- | noncore/apps/opie-console/MyPty.cpp | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/noncore/apps/opie-console/MyPty.cpp b/noncore/apps/opie-console/MyPty.cpp index c3c58be..23d4966 100644 --- a/noncore/apps/opie-console/MyPty.cpp +++ b/noncore/apps/opie-console/MyPty.cpp | |||
@@ -176,195 +176,193 @@ int MyPty::run(const char* cmd, QStrList &, const char*, int) | |||
176 | tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); | 176 | tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); |
177 | setenv("TERM",m_term,1); | 177 | setenv("TERM",m_term,1); |
178 | setenv("COLORTERM","0",1); | 178 | setenv("COLORTERM","0",1); |
179 | EnvironmentMap::Iterator it; | 179 | EnvironmentMap::Iterator it; |
180 | for (it = m_env.begin(); it != m_env.end(); it++) { | 180 | for (it = m_env.begin(); it != m_env.end(); it++) { |
181 | setenv(it.key().latin1(), it.data().latin1(), 1); | 181 | setenv(it.key().latin1(), it.data().latin1(), 1); |
182 | } | 182 | } |
183 | if (getuid() == 0) { | 183 | if (getuid() == 0) { |
184 | char msg[] = "WARNING: You are running this shell as root!\n"; | 184 | char msg[] = "WARNING: You are running this shell as root!\n"; |
185 | write(ttyfd, msg, sizeof(msg)); | 185 | write(ttyfd, msg, sizeof(msg)); |
186 | } | 186 | } |
187 | execl(cmd, cmd, 0); | 187 | execl(cmd, cmd, 0); |
188 | 188 | ||
189 | donePty(); | 189 | donePty(); |
190 | exit(-1); | 190 | exit(-1); |
191 | } | 191 | } |
192 | 192 | ||
193 | // parent - continue as a widget | 193 | // parent - continue as a widget |
194 | delete m_sn_r; | 194 | delete m_sn_r; |
195 | m_sn_r = new QSocketNotifier(m_fd,QSocketNotifier::Read,this); | 195 | m_sn_r = new QSocketNotifier(m_fd,QSocketNotifier::Read,this); |
196 | delete m_sn_e; | 196 | delete m_sn_e; |
197 | m_sn_e = new QSocketNotifier(m_fd,QSocketNotifier::Exception,this); | 197 | m_sn_e = new QSocketNotifier(m_fd,QSocketNotifier::Exception,this); |
198 | connect(m_sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); | 198 | connect(m_sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); |
199 | connect(m_sn_e,SIGNAL(activated(int)),this,SLOT(error())); | 199 | connect(m_sn_e,SIGNAL(activated(int)),this,SLOT(error())); |
200 | 200 | ||
201 | return 0; | 201 | return 0; |
202 | } | 202 | } |
203 | 203 | ||
204 | int MyPty::openPty() | 204 | int MyPty::openPty() |
205 | { | 205 | { |
206 | // This is code from the Qt DumbTerminal example | 206 | // This is code from the Qt DumbTerminal example |
207 | int ptyfd = -1; | 207 | int ptyfd = -1; |
208 | 208 | ||
209 | #ifdef HAVE_OPENPTY | 209 | #ifdef HAVE_OPENPTY |
210 | int ttyfd; | 210 | int ttyfd; |
211 | if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) | 211 | if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) |
212 | ptyfd = -1; | 212 | ptyfd = -1; |
213 | else | 213 | else |
214 | close(ttyfd); // we open the ttynam ourselves. | 214 | close(ttyfd); // we open the ttynam ourselves. |
215 | #else | 215 | #else |
216 | for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { | 216 | for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { |
217 | for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { | 217 | for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { |
218 | sprintf(m_ptynam,"/dev/pty%c%c",*c0,*c1); | 218 | sprintf(m_ptynam,"/dev/pty%c%c",*c0,*c1); |
219 | sprintf(m_ttynam,"/dev/tty%c%c",*c0,*c1); | 219 | sprintf(m_ttynam,"/dev/tty%c%c",*c0,*c1); |
220 | if ((ptyfd = ::open(m_ptynam,O_RDWR)) >= 0) { | 220 | if ((ptyfd = ::open(m_ptynam,O_RDWR)) >= 0) { |
221 | if (geteuid() != 0 && !access(m_ttynam,R_OK|W_OK) == 0) { | 221 | if (geteuid() != 0 && !access(m_ttynam,R_OK|W_OK) == 0) { |
222 | ::close(ptyfd); | 222 | ::close(ptyfd); |
223 | ptyfd = -1; | 223 | ptyfd = -1; |
224 | } | 224 | } |
225 | } | 225 | } |
226 | } | 226 | } |
227 | } | 227 | } |
228 | #endif | 228 | #endif |
229 | 229 | ||
230 | if ( ptyfd < 0 ) { | 230 | if ( ptyfd < 0 ) { |
231 | //qApp->exit(1); | 231 | //qApp->exit(1); |
232 | return -1; | 232 | return -1; |
233 | } | 233 | } |
234 | 234 | ||
235 | return ptyfd; | 235 | return ptyfd; |
236 | } | 236 | } |
237 | 237 | ||
238 | /*! | 238 | /*! |
239 | Create an instance. | 239 | Create an instance. |
240 | */ | 240 | */ |
241 | MyPty::MyPty(const Profile& prof) : m_cpid(0) | 241 | MyPty::MyPty(const Profile& prof) : m_cpid(0) |
242 | { | 242 | { |
243 | 243 | ||
244 | int term = prof.readNumEntry("Terminal", Profile::VT100 ); | 244 | int term = prof.readNumEntry("Terminal", Profile::VT100 ); |
245 | switch( term ) { | 245 | switch( term ) { |
246 | default: | 246 | default: |
247 | case Profile::VT100: | 247 | case Profile::VT100: |
248 | case Profile::VT102: | 248 | case Profile::VT102: |
249 | m_term = "vt100"; | 249 | m_term = "vt100"; |
250 | break; | 250 | break; |
251 | case Profile::Linux: | 251 | case Profile::Linux: |
252 | m_term = "linux"; | 252 | m_term = "linux"; |
253 | break; | 253 | break; |
254 | case Profile::XTerm: | 254 | case Profile::XTerm: |
255 | m_term = "xterm"; | 255 | m_term = "xterm"; |
256 | break; | 256 | break; |
257 | } | 257 | } |
258 | m_sn_e = 0l; | 258 | m_sn_e = 0l; |
259 | m_sn_r = 0l; | 259 | m_sn_r = 0l; |
260 | m_fd = openPty(); | 260 | m_fd = openPty(); |
261 | ProcCtl* ctl = ProcCtl::self(); | 261 | ProcCtl* ctl = ProcCtl::self(); |
262 | Q_UNUSED(ctl); | 262 | Q_UNUSED(ctl); |
263 | reload(prof); | 263 | reload(prof); |
264 | } | 264 | } |
265 | 265 | ||
266 | /*! | 266 | /*! |
267 | Destructor. | 267 | Destructor. |
268 | Note that the related client program is not killed | 268 | Note that the related client program is not killed |
269 | (yet) when a instance is deleted. | 269 | (yet) when a instance is deleted. |
270 | */ | 270 | */ |
271 | MyPty::~MyPty() | 271 | MyPty::~MyPty() |
272 | { | 272 | { |
273 | donePty(); | 273 | donePty(); |
274 | } | 274 | } |
275 | QString MyPty::identifier()const { | 275 | QString MyPty::identifier()const { |
276 | return QString::fromLatin1("term"); | 276 | return QString::fromLatin1("term"); |
277 | } | 277 | } |
278 | QString MyPty::name()const{ | 278 | QString MyPty::name()const{ |
279 | return identifier(); | 279 | return identifier(); |
280 | } | 280 | } |
281 | bool MyPty::open() { | 281 | bool MyPty::open() { |
282 | if (m_fd < 0) | 282 | if (m_fd < 0) |
283 | m_fd = openPty(); | 283 | m_fd = openPty(); |
284 | 284 | ||
285 | start(); | 285 | start(); |
286 | return true; | 286 | return true; |
287 | } | 287 | } |
288 | void MyPty::close() { | 288 | void MyPty::close() { |
289 | donePty(); | 289 | donePty(); |
290 | m_fd = openPty(); | 290 | m_fd = openPty(); |
291 | } | 291 | } |
292 | void MyPty::reload( const Profile& prof) { | 292 | void MyPty::reload( const Profile& prof) { |
293 | m_env.clear(); | 293 | m_env.clear(); |
294 | m_cmd = prof.readEntry("Command", "/bin/sh"); | 294 | m_cmd = prof.readEntry("Command", "/bin/sh"); |
295 | 295 | ||
296 | /* | 296 | /* |
297 | * Lets check if m_cmd actually | 297 | * Lets check if m_cmd actually |
298 | * exists.... | 298 | * exists.... |
299 | * we try to use bin/bash and if | 299 | * we try to use bin/bash and if |
300 | * this fails we | 300 | * this fails we |
301 | * will fallback to /bin/sh | 301 | * will fallback to /bin/sh |
302 | * which should be there 100% | 302 | * which should be there 100% |
303 | */ | 303 | */ |
304 | if ( !QFile::exists(QFile::encodeName(m_cmd) ) ) | 304 | if ( m_cmd.stripWhiteSpace() == "/bin/bash" && !QFile::exists(QFile::encodeName(m_cmd) ) ) |
305 | if (QFile::exists("/bin/bash") ) | ||
306 | m_cmd = "/bin/bash"; | ||
307 | else | ||
308 | m_cmd = "/bin/sh"; | 305 | m_cmd = "/bin/sh"; |
306 | |||
309 | 307 | ||
310 | int envcount = prof.readNumEntry("EnvVars", 0); | 308 | int envcount = prof.readNumEntry("EnvVars", 0); |
311 | for (int i=0; i<envcount; i++) { | 309 | for (int i=0; i<envcount; i++) { |
312 | QString name = prof.readEntry("Env_Name_" + QString::number(i), ""); | 310 | QString name = prof.readEntry("Env_Name_" + QString::number(i), ""); |
313 | QString value = prof.readEntry("Env_Value_" + QString::number(i), ""); | 311 | QString value = prof.readEntry("Env_Value_" + QString::number(i), ""); |
314 | if (!(name.isEmpty() || value.isEmpty())) { | 312 | if (!(name.isEmpty() || value.isEmpty())) { |
315 | m_env.insert(name, value); | 313 | m_env.insert(name, value); |
316 | } | 314 | } |
317 | } | 315 | } |
318 | } | 316 | } |
319 | /*! sends len bytes through the line */ | 317 | /*! sends len bytes through the line */ |
320 | void MyPty::send(const QByteArray& ar) | 318 | void MyPty::send(const QByteArray& ar) |
321 | { | 319 | { |
322 | #ifdef VERBOSE_DEBUG | 320 | #ifdef VERBOSE_DEBUG |
323 | // verbose debug | 321 | // verbose debug |
324 | printf("sending bytes:\n"); | 322 | printf("sending bytes:\n"); |
325 | for (uint i = 0; i < ar.count(); i++) | 323 | for (uint i = 0; i < ar.count(); i++) |
326 | printf("%c", ar[i]); | 324 | printf("%c", ar[i]); |
327 | printf("\n"); | 325 | printf("\n"); |
328 | #endif | 326 | #endif |
329 | 327 | ||
330 | ::write(m_fd, ar.data(), ar.count()); | 328 | ::write(m_fd, ar.data(), ar.count()); |
331 | } | 329 | } |
332 | 330 | ||
333 | /*! indicates that a block of data is received */ | 331 | /*! indicates that a block of data is received */ |
334 | void MyPty::readPty() | 332 | void MyPty::readPty() |
335 | { | 333 | { |
336 | QByteArray buf(4096); | 334 | QByteArray buf(4096); |
337 | 335 | ||
338 | int len = ::read( m_fd, buf.data(), 4096 ); | 336 | int len = ::read( m_fd, buf.data(), 4096 ); |
339 | 337 | ||
340 | if (len == -1 || len == 0) { | 338 | if (len == -1 || len == 0) { |
341 | donePty(); | 339 | donePty(); |
342 | return; | 340 | return; |
343 | } | 341 | } |
344 | 342 | ||
345 | if (len < 0) | 343 | if (len < 0) |
346 | return; | 344 | return; |
347 | 345 | ||
348 | 346 | ||
349 | buf.resize(len); | 347 | buf.resize(len); |
350 | emit received(buf); | 348 | emit received(buf); |
351 | 349 | ||
352 | #ifdef VERBOSE_DEBUG | 350 | #ifdef VERBOSE_DEBUG |
353 | // verbose debug | 351 | // verbose debug |
354 | printf("read bytes:\n"); | 352 | printf("read bytes:\n"); |
355 | for (uint i = 0; i < buf.count(); i++) | 353 | for (uint i = 0; i < buf.count(); i++) |
356 | printf("%c", buf[i]); | 354 | printf("%c", buf[i]); |
357 | printf("\n"); | 355 | printf("\n"); |
358 | #endif | 356 | #endif |
359 | 357 | ||
360 | } | 358 | } |
361 | QBitArray MyPty::supports()const { | 359 | QBitArray MyPty::supports()const { |
362 | QBitArray ar(3); | 360 | QBitArray ar(3); |
363 | //autoconnect | 361 | //autoconnect |
364 | ar[0] = 1; | 362 | ar[0] = 1; |
365 | // | 363 | // |
366 | ar[1] = 0; | 364 | ar[1] = 0; |
367 | ar[2] = 0; | 365 | ar[2] = 0; |
368 | 366 | ||
369 | return ar; | 367 | return ar; |
370 | } | 368 | } |