/* SCCS Id: @(#)ioctl.c 3.4 1990/22/02 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ /* This cannot be part of hack.tty.c (as it was earlier) since on some systems (e.g. MUNIX) the include files and define the same constants, and the C preprocessor complains. */ #include "hack.h" #if defined(BSD_JOB_CONTROL) || defined(_BULL_SOURCE) # ifdef HPUX #include # else # if defined(AIX_31) && !defined(_ALL_SOURCE) # define _ALL_SOURCE /* causes struct winsize to be present */ # ifdef _AIX32 # include # endif # endif # if defined(_BULL_SOURCE) # include struct termios termio; # undef TIMEOUT /* defined in you.h and sys/tty.h */ # include /* define winsize */ # include /* define struct ltchars */ # include /* define TIOGWINSZ */ # else # ifdef LINUX # include # else # include # endif # endif # endif struct ltchars ltchars; struct ltchars ltchars0 = { -1, -1, -1, -1, -1, -1 }; /* turn all off */ #else # ifdef POSIX_TYPES #include struct termios termio; # if defined(BSD) || defined(_AIX32) # if defined(_AIX32) && !defined(_ALL_SOURCE) # define _ALL_SOURCE # endif #include # endif # else #include /* also includes part of */ # if defined(TCSETS) && !defined(AIX_31) struct termios termio; # else struct termio termio; # endif # endif # ifdef AMIX #include # endif /* AMIX */ #endif #ifdef SUSPEND /* BSD isn't alone anymore... */ #include #endif #if defined(TIOCGWINSZ) && (defined(BSD) || defined(ULTRIX) || defined(AIX_31) || defined(_BULL_SOURCE) || defined(SVR4)) #define USE_WIN_IOCTL #include "tcap.h" /* for LI and CO */ #endif #ifdef _M_UNIX extern void NDECL(sco_mapon); extern void NDECL(sco_mapoff); #endif #ifdef __linux__ extern void NDECL(linux_mapon); extern void NDECL(linux_mapoff); #endif #ifdef AUX void catch_stp() { signal(SIGTSTP, SIG_DFL); dosuspend(); } #endif /* AUX */ void getwindowsz() { #ifdef USE_WIN_IOCTL /* * ttysize is found on Suns and BSD * winsize is found on Suns, BSD, and Ultrix */ struct winsize ttsz; if (ioctl(fileno(stdin), (int)TIOCGWINSZ, (char *)&ttsz) != -1) { /* * Use the kernel's values for lines and columns if it has * any idea. */ if (ttsz.ws_row) LI = ttsz.ws_row; if (ttsz.ws_col) CO = ttsz.ws_col; } #endif } void getioctls() { #ifdef BSD_JOB_CONTROL (void) ioctl(fileno(stdin), (int) TIOCGLTC, (char *) <chars); (void) ioctl(fileno(stdin), (int) TIOCSLTC, (char *) <chars0); #else # ifdef POSIX_TYPES (void) tcgetattr(fileno(stdin), &termio); # else # if defined(TCSETS) && !defined(AIX_31) (void) ioctl(fileno(stdin), (int) TCGETS, &termio); # else (void) ioctl(fileno(stdin), (int) TCGETA, &termio); # endif # endif #endif getwindowsz(); #ifdef AUX ( void ) signal ( SIGTSTP , catch_stp ) ; #endif } void setioctls() { #ifdef BSD_JOB_CONTROL (void) ioctl(fileno(stdin), (int) TIOCSLTC, (char *) <chars); #else # ifdef POSIX_TYPES (void) tcsetattr(fileno(stdin), TCSADRAIN, &termio); # else # if defined(TCSETS) && !defined(AIX_31) (void) ioctl(fileno(stdin), (int) TCSETSW, &termio); # else (void) ioctl(fileno(stdin), (int) TCSETAW, &termio); # endif # endif #endif } #ifdef SUSPEND /* No longer implies BSD */ int dosuspend() { # ifdef SIGTSTP if(signal(SIGTSTP, SIG_IGN) == SIG_DFL) { suspend_nhwindows((char *)0); # ifdef _M_UNIX sco_mapon(); # endif # ifdef __linux__ linux_mapon(); # endif (void) signal(SIGTSTP, SIG_DFL); # ifdef AUX ( void ) kill ( 0 , SIGSTOP ) ; # else (void) kill(0, SIGTSTP); # endif # ifdef _M_UNIX sco_mapoff(); # endif # ifdef __linux__ linux_mapoff(); # endif resume_nhwindows(); } else { pline("I don't think your shell has job control."); } # else pline("Sorry, it seems we have no SIGTSTP here. Try ! or S."); # endif return(0); } #endif /* SUSPEND */