rae@unicus.UUCP (Reid) (03/05/88)
Below are patches to iface to allow it to run under System V. Beware -- this is my first patch posting. :-) It's mostly fixing ioctl() calls and adding some flags to CFLAGS to define index to strchr and that sort of thing. I made a small addition to newterm() and oldterm() to use a static termio/sgttyb structure to save the original state of the terminal instead of assuming things. I created 'patchlevel.h' and set PATCHLEVEL to 3, since I have applied the previous two patches that were posted. Reid Ellis rae@unicus.com ================ Index: Makefile *** Makefile.old --- Makefile ************** *** 1,4 ! CFLAGS = -O BIN=iface iface: iface.o init.o fns.o exec.o iface.h comc.o io.o --- 1,7 ----- ! # For System V ! CFLAGS = -O -Dsgttyb=termio -DSYSV -Dindex=strchr -Drindex=strrchr -Drandom=rand -Dsrandom=srand ! # For BSD ! # CFLAGS = -O BIN=iface iface: iface.o init.o fns.o exec.o iface.h comc.o io.o ************** *** 3,8 iface: iface.o init.o fns.o exec.o iface.h comc.o io.o cc -g -o ${BIN} iface.o init.o fns.o exec.o comc.o io.o lint: lint iface.c init.c fns.c exec.c iface.h comc.c io.c --- 6,12 ----- iface: iface.o init.o fns.o exec.o iface.h comc.o io.o cc -g -o ${BIN} iface.o init.o fns.o exec.o comc.o io.o + @echo All done. lint: lint iface.c init.c fns.c exec.c iface.h comc.c io.c Index: exec.c *** exec.c.old --- exec.c ************** *** 1,5 #include "iface.h" print_version() { int ref; --- 1,7 ----- #include "iface.h" + static struct sgttyb savedterm; + print_version() { int ref; ************** *** 57,62 oldterm() { ioctl(fileno(stdin),TIOCGETP,&iobasic); iobasic.sg_flags = oldflags; ioctl(fileno(stdin),TIOCSETP,&iobasic); --- 59,68 ----- oldterm() { + #ifdef SYSV + /* Use the saved terminal state */ + ioctl(fileno(stdin),TCSETA,&savedterm); + #else ioctl(fileno(stdin),TIOCGETP,&iobasic); iobasic.sg_flags = oldflags; ioctl(fileno(stdin),TIOCSETP,&iobasic); ************** *** 65,70 termc.t_suspc = 26; termc.t_dsuspc = 25; ioctl(fileno(stdin),TIOCSLTC,&termc); } newterm() --- 71,77 ----- termc.t_suspc = 26; termc.t_dsuspc = 25; ioctl(fileno(stdin),TIOCSLTC,&termc); + #endif } newterm() ************** *** 69,74 newterm() { ioctl(fileno(stdin),TIOCGETP,&iobasic); oldflags = iobasic.sg_flags; iobasic.sg_flags |= CBREAK; --- 76,98 ----- newterm() { + #ifdef SYSV + /* Save a copy of the current serial state + * in 'savedterm'. + * ioctl() is called twice, since structure + * assigns aren't very portable :-) + */ + ioctl(fileno(stdin),TCGETA,&savedterm); + ioctl(fileno(stdin),TCGETA,&iobasic); + + /* how to do CBREAK and ~ECHO in System V */ + iobasic.c_cc[VMIN]=1; + iobasic.c_cc[VTIME]=1; + iobasic.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL); + + /* set the terminal state */ + ioctl(fileno(stdin),TCSETA,&iobasic); + #else ioctl(fileno(stdin),TIOCGETP,&iobasic); oldflags = iobasic.sg_flags; iobasic.sg_flags |= CBREAK; ************** *** 79,84 termc.t_suspc = -1; termc.t_dsuspc = -1; ioctl(fileno(stdin),TIOCSLTC,&termc); } extended_command() --- 103,109 ----- termc.t_suspc = -1; termc.t_dsuspc = -1; ioctl(fileno(stdin),TIOCSLTC,&termc); + #endif } extended_command() Index: iface.c *** iface.c.old --- iface.c ************** *** 13,18 int sortcmd = 0; #endif struct ltchars termc; struct sgttyb iobasic; jmp_buf topenv; --- 13,19 ----- int sortcmd = 0; #endif + #ifndef SYSV struct ltchars termc; #endif struct sgttyb iobasic; ************** *** 14,19 #endif struct ltchars termc; struct sgttyb iobasic; jmp_buf topenv; void sigtrap(); --- 15,21 ----- #ifndef SYSV struct ltchars termc; + #endif struct sgttyb iobasic; jmp_buf topenv; void sigtrap(); Index: iface.h *** iface.h.old --- iface.h ************** *** 1,5 #include <setjmp.h> ! #include <sgtty.h> #include <signal.h> #include <stdio.h> #define NSYM 256 --- 1,9 ----- #include <setjmp.h> ! #ifdef SYSV ! # include <termio.h> ! #else ! # include <sgtty.h> ! #endif #include <signal.h> #include <stdio.h> ************** *** 2,7 #include <sgtty.h> #include <signal.h> #include <stdio.h> #define NSYM 256 #define COMMAND 0 #define VARIABLE 1 --- 6,12 ----- #endif #include <signal.h> #include <stdio.h> + #define NSYM 256 #define COMMAND 0 #define VARIABLE 1 ************** *** 5,10 #define NSYM 256 #define COMMAND 0 #define VARIABLE 1 extern char *cmds[256], *syms[NSYM], lastkey; extern int (*cptr[256])(), binding[128][4]; extern int oldflags, ncmds, nsyms; --- 10,16 ----- #define NSYM 256 #define COMMAND 0 #define VARIABLE 1 + extern char *cmds[256], *syms[NSYM], lastkey; extern int (*cptr[256])(), binding[128][4]; extern int oldflags, ncmds, nsyms; ************** *** 12,18 extern int sortcmd; #endif ! extern struct ltchars termc; extern struct sgttyb iobasic; jmp_buf topenv; void sigtrap(); --- 18,26 ----- extern int sortcmd; #endif ! #ifndef SYSV ! extern struct ltchars termc; ! #endif extern struct sgttyb iobasic; jmp_buf topenv; void sigtrap(); Index: patchlevel.h *** patchlevel.h.old --- patchlevel.h ************** *** 0,1 --- 1 ----- + #define PATCHLEVEL 3