… | |
… | |
39 | #include <fcntl.h> |
39 | #include <fcntl.h> |
40 | |
40 | |
41 | #ifdef HAVE_SYS_IOCTL_H |
41 | #ifdef HAVE_SYS_IOCTL_H |
42 | # include <sys/ioctl.h> |
42 | # include <sys/ioctl.h> |
43 | #endif |
43 | #endif |
44 | #if defined(HAVE_DEV_PTMX) && defined(HAVE_SYS_STROPTS_H) |
44 | #if defined(HAVE_SYS_STROPTS_H) |
45 | # include <sys/stropts.h> /* for I_PUSH */ |
45 | # include <sys/stropts.h> /* for I_PUSH */ |
46 | #endif |
46 | #endif |
47 | #if defined(HAVE_ISASTREAM) && defined(HAVE_STROPTS_H) |
47 | #if defined(HAVE_ISASTREAM) && defined(HAVE_STROPTS_H) |
48 | # include <stropts.h> |
48 | # include <stropts.h> |
49 | #endif |
49 | #endif |
… | |
… | |
78 | int pfd; |
78 | int pfd; |
79 | |
79 | |
80 | # if defined(HAVE_GETPT) |
80 | # if defined(HAVE_GETPT) |
81 | pfd = getpt(); |
81 | pfd = getpt(); |
82 | # elif defined(HAVE_POSIX_OPENPT) |
82 | # elif defined(HAVE_POSIX_OPENPT) |
83 | pfd = posix_openpt (O_RDWR); |
83 | pfd = posix_openpt (O_RDWR | O_NOCTTY); |
84 | # else |
84 | # else |
|
|
85 | # ifdef _AIX |
85 | pfd = open (CLONE_DEVICE, O_RDWR | O_NOCTTY, 0); |
86 | pfd = open ("/dev/ptc", O_RDWR | O_NOCTTY, 0); |
|
|
87 | # else |
|
|
88 | pfd = open ("/dev/ptmx", O_RDWR | O_NOCTTY, 0); |
|
|
89 | # endif |
86 | # endif |
90 | # endif |
87 | |
91 | |
88 | if (pfd >= 0) |
92 | if (pfd >= 0) |
89 | { |
93 | { |
90 | if (grantpt (pfd) == 0 /* change slave permissions */ |
94 | if (grantpt (pfd) == 0 /* change slave permissions */ |
… | |
… | |
197 | control_tty (int fd_tty) |
201 | control_tty (int fd_tty) |
198 | { |
202 | { |
199 | int fd; |
203 | int fd; |
200 | |
204 | |
201 | setsid (); |
205 | setsid (); |
202 | |
|
|
203 | #if defined(HAVE_DEV_PTMX) && defined(I_PUSH) |
|
|
204 | /* |
|
|
205 | * Push STREAMS modules: |
|
|
206 | * ptem: pseudo-terminal hardware emulation module. |
|
|
207 | * ldterm: standard terminal line discipline. |
|
|
208 | * ttcompat: V7, 4BSD and XENIX STREAMS compatibility module. |
|
|
209 | * |
|
|
210 | * After we push the STREAMS modules, the first open () on the slave side |
|
|
211 | * (i.e. the next section between the dashes giving us "tty opened OK") |
|
|
212 | * should make the "ptem" (or "ldterm" depending upon either which OS |
|
|
213 | * version or which set of manual pages you have) module give us a |
|
|
214 | * controlling terminal. We must already have close ()d the master side |
|
|
215 | * fd in this child process before we push STREAMS modules on because the |
|
|
216 | * documentation is really unclear about whether it is any close () on |
|
|
217 | * the master side or the last close () - i.e. a proper STREAMS dismantling |
|
|
218 | * close () - on the master side which causes a hang up to be sent |
|
|
219 | * through - Geoff Wing |
|
|
220 | */ |
|
|
221 | #if defined(HAVE_ISASTREAM) && defined(HAVE_STROPTS_H) |
|
|
222 | if (isastream (fd_tty) == 1) |
|
|
223 | # endif |
|
|
224 | { |
|
|
225 | ioctl (fd_tty, I_PUSH, "ptem"); |
|
|
226 | ioctl (fd_tty, I_PUSH, "ldterm"); |
|
|
227 | ioctl (fd_tty, I_PUSH, "ttcompat"); |
|
|
228 | } |
|
|
229 | #endif |
|
|
230 | |
206 | |
231 | #ifdef TIOCSCTTY |
207 | #ifdef TIOCSCTTY |
232 | ioctl (fd_tty, TIOCSCTTY, NULL); |
208 | ioctl (fd_tty, TIOCSCTTY, NULL); |
233 | #else |
209 | #else |
234 | fd = open (ttyname (fd_tty), O_RDWR); |
210 | fd = open (ttyname (fd_tty), O_RDWR); |
… | |
… | |
373 | put (); |
349 | put (); |
374 | return false; |
350 | return false; |
375 | } |
351 | } |
376 | } |
352 | } |
377 | |
353 | |
|
|
354 | #if defined(I_PUSH) |
|
|
355 | /* |
|
|
356 | * Push STREAMS modules: |
|
|
357 | * ptem: pseudo-terminal hardware emulation module. |
|
|
358 | * ldterm: standard terminal line discipline. |
|
|
359 | * ttcompat: V7, 4BSD and XENIX STREAMS compatibility module. |
|
|
360 | * |
|
|
361 | * After we push the STREAMS modules, the first open () on the slave side |
|
|
362 | * should make the "ptem" (or "ldterm" depending upon either which OS |
|
|
363 | * version or which set of manual pages you have) module give us a |
|
|
364 | * controlling terminal. We must already have close ()d the master side |
|
|
365 | * fd in this child process before we push STREAMS modules on because the |
|
|
366 | * documentation is really unclear about whether it is any close () on |
|
|
367 | * the master side or the last close () - i.e. a proper STREAMS dismantling |
|
|
368 | * close () - on the master side which causes a hang up to be sent |
|
|
369 | * through - Geoff Wing |
|
|
370 | */ |
|
|
371 | #if defined(HAVE_ISASTREAM) && defined(HAVE_STROPTS_H) |
|
|
372 | if (isastream (tty) == 1) |
|
|
373 | # endif |
|
|
374 | { |
|
|
375 | ioctl (tty, I_PUSH, "ptem"); |
|
|
376 | ioctl (tty, I_PUSH, "ldterm"); |
|
|
377 | ioctl (tty, I_PUSH, "ttcompat"); |
|
|
378 | } |
|
|
379 | #endif |
|
|
380 | |
378 | return true; |
381 | return true; |
379 | } |
382 | } |
380 | |
383 | |