summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/apps/embeddedkonsole/MyPty.cpp99
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
@@ -5,17 +5,17 @@
/* -------------------------------------------------------------------------- */
/* */
/* 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.
*/
@@ -110,14 +110,14 @@ 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);
}
@@ -136,46 +136,47 @@ void MyPty::error()
/*!
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()));
@@ -189,33 +190,33 @@ 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;
}
/*!
@@ -246,13 +247,13 @@ void MyPty::send_bytes(const char* s, int len)
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];