diff --git a/sys/share/ioctl.c b/sys/share/ioctl.c new file mode 100644 index 000000000..61c5e1e8f --- /dev/null +++ b/sys/share/ioctl.c @@ -0,0 +1,187 @@ +/* SCCS Id: @(#)ioctl.c 3.3 90/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 */