author | erik <erik> | 2007-04-20 21:21:14 (UTC) |
---|---|---|
committer | erik <erik> | 2007-04-20 21:21:14 (UTC) |
commit | d07beba6b9351c6b575235522781e3ce8495e578 (patch) (unidiff) | |
tree | 8c5d9cca84d79d7d3016ceb187a1a67a8adba662 /core | |
parent | fb862bdc6c9a6f5b6e7529823eb4b56cc7085a59 (diff) | |
download | opie-d07beba6b9351c6b575235522781e3ce8495e578.zip opie-d07beba6b9351c6b575235522781e3ce8495e578.tar.gz opie-d07beba6b9351c6b575235522781e3ce8495e578.tar.bz2 |
additional info to a comment about pty mangling
-rw-r--r-- | core/apps/embeddedkonsole/MyPty.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/core/apps/embeddedkonsole/MyPty.cpp b/core/apps/embeddedkonsole/MyPty.cpp index 4b1ae59..c11889e 100644 --- a/core/apps/embeddedkonsole/MyPty.cpp +++ b/core/apps/embeddedkonsole/MyPty.cpp | |||
@@ -116,97 +116,97 @@ void MyPty::donePty() | |||
116 | kill(cpid, SIGHUP); | 116 | kill(cpid, SIGHUP); |
117 | waitpid(cpid, &status, 0); | 117 | waitpid(cpid, &status, 0); |
118 | } | 118 | } |
119 | 119 | ||
120 | emit done(status); | 120 | emit done(status); |
121 | } | 121 | } |
122 | 122 | ||
123 | 123 | ||
124 | const char* MyPty::deviceName() | 124 | const char* MyPty::deviceName() |
125 | { | 125 | { |
126 | return ttynam; | 126 | return ttynam; |
127 | } | 127 | } |
128 | 128 | ||
129 | 129 | ||
130 | void MyPty::error() | 130 | void MyPty::error() |
131 | { | 131 | { |
132 | // This is code from the Qt DumbTerminal example | 132 | // This is code from the Qt DumbTerminal example |
133 | donePty(); | 133 | donePty(); |
134 | } | 134 | } |
135 | 135 | ||
136 | 136 | ||
137 | /*! | 137 | /*! |
138 | start the client program. | 138 | start the client program. |
139 | */ | 139 | */ |
140 | int MyPty::run(const char* cmd, QStrList &, const char*, int) | 140 | int MyPty::run(const char* cmd, QStrList &, const char*, int) |
141 | { | 141 | { |
142 | // This is code from the Qt DumbTerminal example | 142 | // This is code from the Qt DumbTerminal example |
143 | cpid = fork(); | 143 | cpid = fork(); |
144 | 144 | ||
145 | if ( !cpid ) { | 145 | if ( !cpid ) { |
146 | // child - exec shell on tty | 146 | // child - exec shell on tty |
147 | for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); | 147 | for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); |
148 | 148 | ||
149 | // attempt to keep apm driver from killing us on power on/off | 149 | // attempt to keep apm driver from killing us on power on/off |
150 | signal(SIGSTOP, SIG_IGN); | 150 | signal(SIGSTOP, SIG_IGN); |
151 | signal(SIGCONT, SIG_IGN); | 151 | signal(SIGCONT, SIG_IGN); |
152 | signal(SIGTSTP, SIG_IGN); | 152 | signal(SIGTSTP, SIG_IGN); |
153 | 153 | ||
154 | int ttyfd = open(ttynam, O_RDWR); | 154 | int ttyfd = open(ttynam, O_RDWR); |
155 | dup2(ttyfd, STDIN_FILENO); | 155 | dup2(ttyfd, STDIN_FILENO); |
156 | dup2(ttyfd, STDOUT_FILENO); | 156 | dup2(ttyfd, STDOUT_FILENO); |
157 | dup2(ttyfd, STDERR_FILENO); | 157 | dup2(ttyfd, STDERR_FILENO); |
158 | // should be done with tty, so close it | 158 | // should be done with tty, so close it |
159 | close(ttyfd); | 159 | close(ttyfd); |
160 | static struct termios ttmode; | 160 | static struct termios ttmode; |
161 | if ( setsid() < 0 ) | 161 | if ( setsid() < 0 ) |
162 | perror( "failed to set process group" ); | 162 | perror( "failed to set process group" ); |
163 | #if defined (TIOCSCTTY) | 163 | #if defined (TIOCSCTTY) |
164 | // grabbed from APUE by Stevens | 164 | // grabbed from APUE by Stevens (see section 9.6, should be page 246) |
165 | ioctl(STDIN_FILENO, TIOCSCTTY, 0); | 165 | ioctl(STDIN_FILENO, TIOCSCTTY, 0); |
166 | #endif | 166 | #endif |
167 | tcgetattr( STDIN_FILENO, &ttmode ); | 167 | tcgetattr( STDIN_FILENO, &ttmode ); |
168 | ttmode.c_cc[VINTR] = 3; | 168 | ttmode.c_cc[VINTR] = 3; |
169 | ttmode.c_cc[VERASE] = 8; | 169 | ttmode.c_cc[VERASE] = 8; |
170 | tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); | 170 | tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); |
171 | 171 | ||
172 | if(strlen(getenv("TERM"))<=0) | 172 | if(strlen(getenv("TERM"))<=0) |
173 | setenv("TERM","vt100",1); | 173 | setenv("TERM","vt100",1); |
174 | setenv("COLORTERM","0",1); | 174 | setenv("COLORTERM","0",1); |
175 | 175 | ||
176 | if (getuid() == 0) { | 176 | if (getuid() == 0) { |
177 | char msg[] = "WARNING: You are running this shell as root!\n"; | 177 | char msg[] = "WARNING: You are running this shell as root!\n"; |
178 | write(ttyfd, msg, sizeof(msg)); | 178 | write(ttyfd, msg, sizeof(msg)); |
179 | } | 179 | } |
180 | 180 | ||
181 | QString ccmd = "-"+QFileInfo(cmd).fileName(); //creates a login shell | 181 | QString ccmd = "-"+QFileInfo(cmd).fileName(); //creates a login shell |
182 | 182 | ||
183 | execl(cmd, ccmd.latin1(), 0); | 183 | execl(cmd, ccmd.latin1(), 0); |
184 | 184 | ||
185 | donePty(); | 185 | donePty(); |
186 | exit(-1); | 186 | exit(-1); |
187 | } | 187 | } |
188 | 188 | ||
189 | // parent - continue as a widget | 189 | // parent - continue as a widget |
190 | QSocketNotifier* sn_r = new QSocketNotifier(fd,QSocketNotifier::Read,this); | 190 | QSocketNotifier* sn_r = new QSocketNotifier(fd,QSocketNotifier::Read,this); |
191 | QSocketNotifier* sn_e = new QSocketNotifier(fd,QSocketNotifier::Exception,this); | 191 | QSocketNotifier* sn_e = new QSocketNotifier(fd,QSocketNotifier::Exception,this); |
192 | connect(sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); | 192 | connect(sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); |
193 | connect(sn_e,SIGNAL(activated(int)),this,SLOT(error())); | 193 | connect(sn_e,SIGNAL(activated(int)),this,SLOT(error())); |
194 | 194 | ||
195 | return 0; | 195 | return 0; |
196 | } | 196 | } |
197 | 197 | ||
198 | int MyPty::openPty() | 198 | int MyPty::openPty() |
199 | { | 199 | { |
200 | // This is code from the Qt DumbTerminal example | 200 | // This is code from the Qt DumbTerminal example |
201 | int ptyfd = -1; | 201 | int ptyfd = -1; |
202 | 202 | ||
203 | #ifdef HAVE_OPENPTY | 203 | #ifdef HAVE_OPENPTY |
204 | int ttyfd; | 204 | int ttyfd; |
205 | if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) | 205 | if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) |
206 | ptyfd = -1; | 206 | ptyfd = -1; |
207 | else | 207 | else |
208 | close(ttyfd); // we open the ttynam ourselves. | 208 | close(ttyfd); // we open the ttynam ourselves. |
209 | #else | 209 | #else |
210 | for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { | 210 | for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { |
211 | for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { | 211 | for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { |
212 | sprintf(ptynam,"/dev/pty%c%c",*c0,*c1); | 212 | sprintf(ptynam,"/dev/pty%c%c",*c0,*c1); |