202 lines
4.2 KiB
Plaintext
202 lines
4.2 KiB
Plaintext
$OpenBSD: patch-icb_unix_c,v 1.2 2005/12/31 02:09:46 fgsch Exp $
|
|
--- icb/unix.c.orig Fri Feb 24 21:20:31 1995
|
|
+++ icb/unix.c Sat Dec 31 01:54:33 2005
|
|
@@ -9,12 +9,36 @@
|
|
#include "externs.h"
|
|
#include <pwd.h>
|
|
#include <sys/dir.h>
|
|
+#include <sys/types.h>
|
|
+#include <sys/stat.h>
|
|
+#include <unistd.h>
|
|
|
|
#undef stty
|
|
#undef gtty
|
|
|
|
-#ifndef SYSV
|
|
+#ifdef SYSV
|
|
|
|
+#define USE_TERMIO
|
|
+#include <termio.h>
|
|
+#define TTYSTRUCT termio
|
|
+#define stty(fd,buf) ioctl((fd),TCSETA,(buf))
|
|
+#define gtty(fd,buf) ioctl((fd),TCGETA,(buf))
|
|
+
|
|
+#else /* SYSV */
|
|
+
|
|
+# ifdef BSD4_4
|
|
+# define USE_TERMIO
|
|
+# include <termios.h>
|
|
+# define TTYSTRUCT termios
|
|
+# define stty(fd,buf) ioctl((fd),TIOCSETA,(buf))
|
|
+# define gtty(fd,buf) ioctl((fd),TIOCGETA,(buf))
|
|
+
|
|
+# endif /* BSD4_4 */
|
|
+
|
|
+#endif /* SYSV */
|
|
+
|
|
+#ifndef USE_TERMIO /* neither case above (SYSV or BSD4_4) */
|
|
+
|
|
#ifdef linux
|
|
#include <bsd/sgtty.h>
|
|
#else
|
|
@@ -22,18 +46,15 @@
|
|
#endif
|
|
|
|
#define TTYSTRUCT sgttyb
|
|
-#define stty(fd,buf) ioctl((fd),TIOCSETN,(buf))
|
|
+#define stty(fd,buf) ioctl((fd),TIOCSETP,(buf))
|
|
#define gtty(fd,buf) ioctl((fd),TIOCGETP,(buf))
|
|
-#else /* SYSV */
|
|
-#include <termio.h>
|
|
-#define TTYSTRUCT termio
|
|
-#define stty(fd,buf) ioctl((fd),TCSETA,(buf))
|
|
-#define gtty(fd,buf) ioctl((fd),TCGETA,(buf))
|
|
-#endif /* SYSV */
|
|
+#endif
|
|
|
|
char *getlogin();
|
|
|
|
struct TTYSTRUCT origtty; /* holds the user's original term settings */
|
|
+struct stat origtty_stats; /* holds termainal stats */
|
|
+char *mytty = NULL; /* holds terminal name */
|
|
|
|
int badttyinfo = 0; /* used when running under some weird modes */
|
|
|
|
@@ -79,13 +100,13 @@ FILE *fp;
|
|
pushback(c)
|
|
char c;
|
|
{
|
|
-#ifndef SYSV
|
|
+#ifndef USE_TERMIO
|
|
if (ioctl(0, TIOCSTI, &c) < 0)
|
|
perror("TIOCSTI ioctl failed");
|
|
-#else /* SYSV */
|
|
+#else /* USE_TERMIO */
|
|
if (ungetc(c,stdin) == EOF)
|
|
perror("ungetc() failed");
|
|
-#endif /* SYSV */
|
|
+#endif /* USE_TERMIO */
|
|
}
|
|
|
|
|
|
@@ -94,25 +115,30 @@ char c;
|
|
|
|
getterm()
|
|
{
|
|
-#ifndef SYSV
|
|
+ /* get terminal stats */
|
|
+ if ((mytty = ttyname(STDERR_FILENO))) {
|
|
+ if (stat(mytty, &origtty_stats)) mytty = NULL;
|
|
+ }
|
|
+
|
|
+#ifndef USE_TERMIO
|
|
struct ltchars lt;
|
|
-#endif /* SYSV */
|
|
+#endif /* USE_TERMIO */
|
|
/* get tty settings */
|
|
if (gtty(0,&origtty) < 0) {
|
|
badttyinfo++;
|
|
ttyinfo.erase = '\b'; /* ^H */
|
|
ttyinfo.kill = '\025'; /* ^U */
|
|
} else {
|
|
-#ifndef SYSV
|
|
+#ifndef USE_TERMIO
|
|
ttyinfo.erase = origtty.sg_erase;
|
|
ttyinfo.kill = origtty.sg_kill;
|
|
-#else /* SYSV */
|
|
+#else /* USE_TERMIO */
|
|
ttyinfo.erase = origtty.c_cc[VERASE];
|
|
ttyinfo.kill = origtty.c_cc[VKILL];
|
|
-#endif /* SYSV */
|
|
+#endif /* USE_TERMIO */
|
|
}
|
|
|
|
-#ifndef SYSV
|
|
+#ifndef USE_TERMIO
|
|
/* get local special chars */
|
|
if (ioctl(0, TIOCGLTC, <) < 0) {
|
|
ttyinfo.redraw = '\022'; /* ^R */
|
|
@@ -121,10 +147,10 @@ getterm()
|
|
ttyinfo.redraw = lt.t_rprntc;
|
|
ttyinfo.werase = lt.t_werasc;
|
|
}
|
|
-#else /* SYSV */
|
|
+#else /* USE_TERMIO */
|
|
ttyinfo.redraw = '\022'; /* ^R */
|
|
ttyinfo.werase = '\027'; /* ^W */
|
|
-#endif /* SYSV */
|
|
+#endif /* USE_TERMIO */
|
|
|
|
/* get the current window size */
|
|
getwinsize();
|
|
@@ -138,21 +164,24 @@ icbterm()
|
|
{
|
|
struct TTYSTRUCT tty;
|
|
|
|
+ /* disable biff/mesg */
|
|
+ if (mytty)
|
|
+ chmod(mytty, origtty_stats.st_mode & ~(S_IXUSR | S_IWGRP));
|
|
+
|
|
if (badttyinfo)
|
|
return;
|
|
|
|
-
|
|
bcopy((char *)&origtty, (char *)&tty, (unsigned)sizeof(struct TTYSTRUCT));
|
|
|
|
/* turn on cbreak - turn off echo */
|
|
-#ifndef SYSV
|
|
+#ifndef USE_TERMIO
|
|
tty.sg_flags |= CBREAK;
|
|
tty.sg_flags &= ~ECHO;
|
|
-#else /* SYSV */
|
|
+#else /* USE_TERMIO */
|
|
tty.c_lflag &= ~ICANON;
|
|
tty.c_cc[VEOF] = 1;
|
|
tty.c_lflag &= ~ECHO;
|
|
-#endif /* SYSV */
|
|
+#endif /* USE_TERMIO */
|
|
|
|
echomode = 0;
|
|
/* set the new flags */
|
|
@@ -167,6 +196,10 @@ icbterm()
|
|
|
|
restoreterm()
|
|
{
|
|
+ /* restore terminal stats */
|
|
+ if (mytty)
|
|
+ chmod(mytty, origtty_stats.st_mode);
|
|
+
|
|
if (badttyinfo)
|
|
return;
|
|
|
|
@@ -258,11 +291,11 @@ echo()
|
|
}
|
|
|
|
/* turn on echo */
|
|
-#ifndef SYSV
|
|
+#ifndef USE_TERMIO
|
|
tty.sg_flags |= ECHO;
|
|
-#else /* SYSV */
|
|
+#else /* USE_TERMIO */
|
|
tty.c_lflag |= ECHO;
|
|
-#endif /* SYSV */
|
|
+#endif /* USE_TERMIO */
|
|
|
|
echomode = 1;
|
|
|
|
@@ -287,11 +320,11 @@ noecho()
|
|
}
|
|
|
|
/* turn off echo */
|
|
-#ifndef SYSV
|
|
+#ifndef USE_TERMIO
|
|
tty.sg_flags &= ~ECHO;
|
|
-#else /* SYSV */
|
|
+#else /* USE_TERMIO */
|
|
tty.c_lflag &= ~ECHO;
|
|
-#endif /* SYSV */
|
|
+#endif /* USE_TERMIO */
|
|
|
|
echomode = 0;
|
|
|