diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/Modules/zpty.c | 29 |
2 files changed, 28 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index 32c92839c..d3b2f66a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-03-16 Peter Stephenson <pws@csr.com> + + * 19629: Src/Modules/zpty.c: implement Oliver's research into + making zpty work under HP-UX. + 2004-03-16 Clint Adams <clint@zsh.org> * 19640: Src/Modules/pcre.c: improve error reporting a bit. diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c index 08ec1b2bd..360d1cc63 100644 --- a/Src/Modules/zpty.c +++ b/Src/Modules/zpty.c @@ -160,12 +160,31 @@ getptycmd(char *name) #include <sys/stropts.h> #endif +#if defined(I_FIND) && defined(I_PUSH) +/* + * These tests are ad hoc. Unfortunately if you get the wrong ioctl, + * STREAMS simply hangs up, so there's no obvious way of doing this + * more systematically. + * + * Apparently Solaris needs all three ioctls, but HP-UX doesn't need + * ttcompat. The Solaris definition has been extended to all __SVR4 + * as a guess; I have no idea if this is right. + */ +#ifdef __SVR4 +#define USE_STREAMS_IOCTLS +#define USE_STREAMS_TTCOMPAT +#endif +#ifdef __hpux +#define USE_STREAMS_IOCTLS +#endif +#endif + static int get_pty(int master, int *retfd) { static char *name; static int mfd, sfd; -#if defined(I_FIND) && defined(I_PUSH) && defined(__SVR4) +#ifdef USE_STREAMS_IOCTLS int ret; #endif @@ -190,11 +209,7 @@ get_pty(int master, int *retfd) close(mfd); return 1; } -#if defined(I_FIND) && defined(I_PUSH) && defined(__SVR4) - /* - * Use if STREAMS is available. The test is probably OK, - * but we could use e.g. the sys/stropts.h test. - */ +#ifdef USE_STREAMS_IOCTLS if ((ret = ioctl(sfd, I_FIND, "ptem")) != 1) if (ret == -1 || ioctl(sfd, I_PUSH, "ptem") == -1) { close(mfd); @@ -207,6 +222,7 @@ get_pty(int master, int *retfd) close(sfd); return 1; } +#ifdef USE_STREAMS_TTCOMPAT if ((ret = ioctl(sfd, I_FIND, "ttcompat")) != 1) if (ret == -1 || ioctl(sfd, I_PUSH, "ttcompat") == -1) { close(mfd); @@ -214,6 +230,7 @@ get_pty(int master, int *retfd) return 1; } #endif +#endif *retfd = sfd; |