summaryrefslogtreecommitdiff
authorzecke <zecke>2002-10-31 18:42:29 (UTC)
committer zecke <zecke>2002-10-31 18:42:29 (UTC)
commit3c76157137de747176466df8c7ecb85105ab9d53 (patch) (unidiff)
tree3c93ed589d8b9fb05dfa139ef21c77649daa7bd1
parent1793c4b5f743c31be9db1fbb0b3fbbe08df7df28 (diff)
downloadopie-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...
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/MyPty.cpp6
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
204int MyPty::openPty() 204int 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*/
241MyPty::MyPty(const Profile& prof) : m_cpid(0) 241MyPty::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*/
271MyPty::~MyPty() 271MyPty::~MyPty()
272{ 272{
273 donePty(); 273 donePty();
274} 274}
275QString MyPty::identifier()const { 275QString MyPty::identifier()const {
276 return QString::fromLatin1("term"); 276 return QString::fromLatin1("term");
277} 277}
278QString MyPty::name()const{ 278QString MyPty::name()const{
279 return identifier(); 279 return identifier();
280} 280}
281bool MyPty::open() { 281bool 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}
288void MyPty::close() { 288void MyPty::close() {
289 donePty(); 289 donePty();
290 m_fd = openPty(); 290 m_fd = openPty();
291} 291}
292void MyPty::reload( const Profile& prof) { 292void 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 */
320void MyPty::send(const QByteArray& ar) 318void 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 */
334void MyPty::readPty() 332void 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}
361QBitArray MyPty::supports()const { 359QBitArray 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}