-rw-r--r-- | core/apps/embeddedkonsole/MyPty.cpp | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/core/apps/embeddedkonsole/MyPty.cpp b/core/apps/embeddedkonsole/MyPty.cpp index 3622d48..6421ab0 100644 --- a/core/apps/embeddedkonsole/MyPty.cpp +++ b/core/apps/embeddedkonsole/MyPty.cpp @@ -1,27 +1,27 @@ /* -------------------------------------------------------------------------- */ /* */ /* [MyPty.C] Pseudo Terminal Device */ /* */ /* -------------------------------------------------------------------------- */ /* */ /* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ /* */ /* This file is part of Konsole - an X terminal for KDE */ /* -------------------------------------------------------------------------- */ -/* */ +/* */ /* Ported Konsole to Qt/Embedded */ -/* */ +/* */ /* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ -/* */ +/* */ /* -------------------------------------------------------------------------- */ /* If you're compiling konsole on non-Linux platforms and find problems that you can track down to this file, please have a look into ../README.ports, too. */ /*! \file */ /*! \class TEPty @@ -104,124 +104,125 @@ void MyPty::setSize(int lines, int columns) ioctl(fd,TIOCSWINSZ,(char *)&wsize); } void MyPty::donePty() { // This is code from the Qt DumbTerminal example int status = 0; ::close(fd); if (cpid) { - kill(cpid, SIGHUP); - waitpid(cpid, &status, 0); + kill(cpid, SIGHUP); + waitpid(cpid, &status, 0); } emit done(status); } const char* MyPty::deviceName() { return ttynam; } void MyPty::error() { // This is code from the Qt DumbTerminal example donePty(); } /*! start the client program. */ int MyPty::run(const char* cmd, QStrList &, const char*, int) { - // This is code from the Qt DumbTerminal example + // This is code from the Qt DumbTerminal example cpid = fork(); if ( !cpid ) { - // child - exec shell on tty - for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); - int ttyfd = open(ttynam, O_RDWR); - dup2(ttyfd, STDIN_FILENO); - dup2(ttyfd, STDOUT_FILENO); - dup2(ttyfd, STDERR_FILENO); - // should be done with tty, so close it - close(ttyfd); - static struct termios ttmode; - if ( setsid() < 0 ) - perror( "failed to set process group" ); + // child - exec shell on tty + for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); + int ttyfd = open(ttynam, O_RDWR); + dup2(ttyfd, STDIN_FILENO); + dup2(ttyfd, STDOUT_FILENO); + dup2(ttyfd, STDERR_FILENO); + // should be done with tty, so close it + close(ttyfd); + static struct termios ttmode; + if ( setsid() < 0 ) + perror( "failed to set process group" ); #if defined (TIOCSCTTY) - // grabbed from APUE by Stevens - ioctl(STDIN_FILENO, TIOCSCTTY, 0); + // grabbed from APUE by Stevens + ioctl(STDIN_FILENO, TIOCSCTTY, 0); #endif - tcgetattr( STDIN_FILENO, &ttmode ); - ttmode.c_cc[VINTR] = 3; - ttmode.c_cc[VERASE] = 8; - tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); - setenv("TERM","vt100",1); - setenv("COLORTERM","0",1); - - if (getuid() == 0) { - char msg[] = "WARNING: You are running this shell as root!\n"; - write(ttyfd, msg, sizeof(msg)); - } - execl(cmd, cmd, 0); - - donePty(); - exit(-1); + tcgetattr( STDIN_FILENO, &ttmode ); + ttmode.c_cc[VINTR] = 3; + ttmode.c_cc[VERASE] = 8; + tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); + setenv("TERM","vt100",1); + setenv("COLORTERM","0",1); + + if (getuid() == 0) { + char msg[] = "WARNING: You are running this shell as root!\n"; + write(ttyfd, msg, sizeof(msg)); + } +; //creates a login shell + execl(cmd, cmd, "--login", 0); + + donePty(); + exit(-1); } // parent - continue as a widget QSocketNotifier* sn_r = new QSocketNotifier(fd,QSocketNotifier::Read,this); QSocketNotifier* sn_e = new QSocketNotifier(fd,QSocketNotifier::Exception,this); connect(sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); connect(sn_e,SIGNAL(activated(int)),this,SLOT(error())); return 0; } int MyPty::openPty() { // This is code from the Qt DumbTerminal example int ptyfd = -1; #ifdef HAVE_OPENPTY int ttyfd; if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) - ptyfd = -1; + ptyfd = -1; else - close(ttyfd); // we open the ttynam ourselves. + close(ttyfd); // we open the ttynam ourselves. #else for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { - for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { - sprintf(ptynam,"/dev/pty%c%c",*c0,*c1); - sprintf(ttynam,"/dev/tty%c%c",*c0,*c1); - if ((ptyfd = ::open(ptynam,O_RDWR)) >= 0) { - if (geteuid() != 0 && !access(ttynam,R_OK|W_OK) == 0) { - ::close(ptyfd); - ptyfd = -1; - } - } - } + for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { + sprintf(ptynam,"/dev/pty%c%c",*c0,*c1); + sprintf(ttynam,"/dev/tty%c%c",*c0,*c1); + if ((ptyfd = ::open(ptynam,O_RDWR)) >= 0) { + if (geteuid() != 0 && !access(ttynam,R_OK|W_OK) == 0) { + ::close(ptyfd); + ptyfd = -1; + } + } + } } #endif if ( ptyfd < 0 ) { - qApp->exit(1); - return -1; + qApp->exit(1); + return -1; } return ptyfd; } /*! Create an instance. */ MyPty::MyPty() : cpid(0) { fd = openPty(); } @@ -240,25 +241,25 @@ MyPty::~MyPty() /*! sends len bytes through the line */ void MyPty::send_bytes(const char* s, int len) { #ifdef VERBOSE_DEBUG // verbose debug printf("sending bytes:\n"); for (int i = 0; i < len; i++) printf("%c", s[i]); printf("\n"); #endif - ::write(fd, s, len); + ::write(fd, s, len); } /*! indicates that a block of data is received */ void MyPty::readPty() { char buf[4096]; int len = ::read( fd, buf, 4096 ); if (len == -1) donePty(); |