summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/MyPty.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/noncore/apps/opie-console/MyPty.cpp b/noncore/apps/opie-console/MyPty.cpp
index 2570826..534f79a 100644
--- a/noncore/apps/opie-console/MyPty.cpp
+++ b/noncore/apps/opie-console/MyPty.cpp
@@ -52,193 +52,193 @@
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 <qapplication.h> 67#include <qapplication.h>
68#include <qsocketnotifier.h> 68#include <qsocketnotifier.h>
69#include <qstring.h> 69#include <qstring.h>
70#include <qfile.h> 70#include <qfile.h>
71 71
72#include <stdlib.h> 72#include <stdlib.h>
73#include <stdio.h> 73#include <stdio.h>
74#include <signal.h> 74#include <signal.h>
75#include <fcntl.h> 75#include <fcntl.h>
76#include <unistd.h> 76#include <unistd.h>
77#include <termios.h> 77#include <termios.h>
78#include <sys/types.h> 78#include <sys/types.h>
79#include <sys/ioctl.h> 79#include <sys/ioctl.h>
80#include <sys/wait.h> 80#include <sys/wait.h>
81 81
82#ifdef HAVE_OPENPTY 82#ifdef HAVE_OPENPTY
83#include <pty.h> 83#include <pty.h>
84#endif 84#endif
85 85
86#include "procctl.h" 86#include "procctl.h"
87#include "MyPty.h" 87#include "MyPty.h"
88 88
89 89
90#undef VERBOSE_DEBUG 90#undef VERBOSE_DEBUG
91 91
92 92
93/* -------------------------------------------------------------------------- */ 93/* -------------------------------------------------------------------------- */
94 94
95/*! 95/*!
96 Informs the client program about the 96 Informs the client program about the
97 actual size of the window. 97 actual size of the window.
98*/ 98*/
99 99
100void MyPty::setSize(int lines, int columns) 100void MyPty::setSize(int lines, int columns)
101{ 101{
102 qWarning("setting size"); 102 qWarning("setting size");
103 struct winsize wsize; 103 struct winsize wsize;
104 wsize.ws_row = (unsigned short)lines; 104 wsize.ws_row = (unsigned short)lines;
105 wsize.ws_col = (unsigned short)columns; 105 wsize.ws_col = (unsigned short)columns;
106 if(m_fd < 0) return; 106 if(m_fd < 0) return;
107 ioctl(m_fd,TIOCSWINSZ,(char *)&wsize); 107 ioctl(m_fd,TIOCSWINSZ,(char *)&wsize);
108} 108}
109 109
110 110
111void MyPty::donePty() 111void MyPty::donePty()
112{ 112{
113 // This is code from the Qt DumbTerminal example 113 // This is code from the Qt DumbTerminal example
114 114
115 ::close(m_fd); 115 ::close(m_fd);
116 116
117 if (m_cpid) { 117 if (m_cpid) {
118 kill(m_cpid, SIGHUP); 118 kill(m_cpid, SIGHUP);
119 //waitpid(m_cpid, &status, 0); 119 //waitpid(m_cpid, &status, 0);
120 delete m_sn_e; 120 delete m_sn_e;
121 delete m_sn_r; 121 delete m_sn_r;
122 m_sn_e = 0l; 122 m_sn_e = 0l;
123 m_sn_r = 0l; 123 m_sn_r = 0l;
124 } 124 }
125 125
126 m_cpid = 0; 126 m_cpid = 0;
127 m_fd = -1; 127 m_fd = -1;
128// emit done(status); 128// emit done(status);
129} 129}
130 130
131 131
132const char* MyPty::deviceName() 132const char* MyPty::deviceName()
133{ 133{
134 return m_ttynam; 134 return m_ttynam;
135} 135}
136 136
137 137
138void MyPty::error() 138void MyPty::error()
139{ 139{
140 // This is code from the Qt DumbTerminal example 140 // This is code from the Qt DumbTerminal example
141 donePty(); 141 donePty();
142} 142}
143 143
144void MyPty::start() { 144void MyPty::start() {
145 char* cmd = "/bin/sh"; 145 char* cmd = "/bin/sh";
146 146
147 if ( QFile::exists( "/bin/bash" ) ) { 147 if ( QFile::exists( "/bin/bash" ) ) {
148 char* cmd = "/bin/bash"; 148 cmd = "/bin/bash";
149 } 149 }
150 150
151 QStrList lis; 151 QStrList lis;
152 int r =run(cmd, lis, 0, 0); 152 int r =run(cmd, lis, 0, 0);
153 r = r; 153 r = r;
154} 154}
155/*! 155/*!
156 start the client program. 156 start the client program.
157*/ 157*/
158int MyPty::run(const char* cmd, QStrList &, const char*, int) 158int MyPty::run(const char* cmd, QStrList &, const char*, int)
159{ 159{
160 // This is code from the Qt DumbTerminal example 160 // This is code from the Qt DumbTerminal example
161 m_cpid = fork(); 161 m_cpid = fork();
162 162
163 if ( !m_cpid ) { 163 if ( !m_cpid ) {
164 // child - exec shell on tty 164 // child - exec shell on tty
165 for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); 165 for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL);
166 int ttyfd = ::open(m_ttynam, O_RDWR); 166 int ttyfd = ::open(m_ttynam, O_RDWR);
167 dup2(ttyfd, STDIN_FILENO); 167 dup2(ttyfd, STDIN_FILENO);
168 dup2(ttyfd, STDOUT_FILENO); 168 dup2(ttyfd, STDOUT_FILENO);
169 dup2(ttyfd, STDERR_FILENO); 169 dup2(ttyfd, STDERR_FILENO);
170 // should be done with tty, so close it 170 // should be done with tty, so close it
171 ::close(ttyfd); 171 ::close(ttyfd);
172 static struct termios ttmode; 172 static struct termios ttmode;
173 if ( setsid() < 0 ) 173 if ( setsid() < 0 )
174 perror( "failed to set process group" ); 174 perror( "failed to set process group" );
175#if defined (TIOCSCTTY) 175#if defined (TIOCSCTTY)
176 // grabbed from APUE by Stevens 176 // grabbed from APUE by Stevens
177 ioctl(STDIN_FILENO, TIOCSCTTY, 0); 177 ioctl(STDIN_FILENO, TIOCSCTTY, 0);
178#endif 178#endif
179 tcgetattr( STDIN_FILENO, &ttmode ); 179 tcgetattr( STDIN_FILENO, &ttmode );
180 ttmode.c_cc[VINTR] = 3; 180 ttmode.c_cc[VINTR] = 3;
181 ttmode.c_cc[VERASE] = 8; 181 ttmode.c_cc[VERASE] = 8;
182 tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); 182 tcsetattr( STDIN_FILENO, TCSANOW, &ttmode );
183 setenv("TERM",m_term,1); 183 setenv("TERM",m_term,1);
184 setenv("COLORTERM","0",1); 184 setenv("COLORTERM","0",1);
185 185
186 if (getuid() == 0) { 186 if (getuid() == 0) {
187 char msg[] = "WARNING: You are running this shell as root!\n"; 187 char msg[] = "WARNING: You are running this shell as root!\n";
188 write(ttyfd, msg, sizeof(msg)); 188 write(ttyfd, msg, sizeof(msg));
189 } 189 }
190 execl(cmd, cmd, 0); 190 execl(cmd, cmd, 0);
191 191
192 donePty(); 192 donePty();
193 exit(-1); 193 exit(-1);
194 } 194 }
195 195
196 // parent - continue as a widget 196 // parent - continue as a widget
197 delete m_sn_r; 197 delete m_sn_r;
198 m_sn_r = new QSocketNotifier(m_fd,QSocketNotifier::Read,this); 198 m_sn_r = new QSocketNotifier(m_fd,QSocketNotifier::Read,this);
199 delete m_sn_e; 199 delete m_sn_e;
200 m_sn_e = new QSocketNotifier(m_fd,QSocketNotifier::Exception,this); 200 m_sn_e = new QSocketNotifier(m_fd,QSocketNotifier::Exception,this);
201 connect(m_sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); 201 connect(m_sn_r,SIGNAL(activated(int)),this,SLOT(readPty()));
202 connect(m_sn_e,SIGNAL(activated(int)),this,SLOT(error())); 202 connect(m_sn_e,SIGNAL(activated(int)),this,SLOT(error()));
203 203
204 return 0; 204 return 0;
205} 205}
206 206
207int MyPty::openPty() 207int MyPty::openPty()
208{ 208{
209 // This is code from the Qt DumbTerminal example 209 // This is code from the Qt DumbTerminal example
210 int ptyfd = -1; 210 int ptyfd = -1;
211 211
212#ifdef HAVE_OPENPTY 212#ifdef HAVE_OPENPTY
213 int ttyfd; 213 int ttyfd;
214 if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) 214 if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) )
215 ptyfd = -1; 215 ptyfd = -1;
216 else 216 else
217 close(ttyfd); // we open the ttynam ourselves. 217 close(ttyfd); // we open the ttynam ourselves.
218#else 218#else
219 for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { 219 for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) {
220 for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { 220 for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) {
221 sprintf(m_ptynam,"/dev/pty%c%c",*c0,*c1); 221 sprintf(m_ptynam,"/dev/pty%c%c",*c0,*c1);
222 sprintf(m_ttynam,"/dev/tty%c%c",*c0,*c1); 222 sprintf(m_ttynam,"/dev/tty%c%c",*c0,*c1);
223 if ((ptyfd = ::open(m_ptynam,O_RDWR)) >= 0) { 223 if ((ptyfd = ::open(m_ptynam,O_RDWR)) >= 0) {
224 if (geteuid() != 0 && !access(m_ttynam,R_OK|W_OK) == 0) { 224 if (geteuid() != 0 && !access(m_ttynam,R_OK|W_OK) == 0) {
225 ::close(ptyfd); 225 ::close(ptyfd);
226 ptyfd = -1; 226 ptyfd = -1;
227 } 227 }
228 } 228 }
229 } 229 }
230 } 230 }
231#endif 231#endif
232 232
233 if ( ptyfd < 0 ) { 233 if ( ptyfd < 0 ) {
234 //qApp->exit(1); 234 //qApp->exit(1);
235 return -1; 235 return -1;
236 } 236 }
237 237
238 return ptyfd; 238 return ptyfd;
239} 239}
240 240
241/*! 241/*!
242 Create an instance. 242 Create an instance.
243*/ 243*/
244MyPty::MyPty(const Profile& prof) : m_cpid(0) 244MyPty::MyPty(const Profile& prof) : m_cpid(0)