Return to os.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / readline / examples / rlfe |
1.1 ! misho 1: /* Copyright (c) 1993-2002 ! 2: * Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de) ! 3: * Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de) ! 4: * Copyright (c) 1987 Oliver Laumann ! 5: * ! 6: * This program is free software; you can redistribute it and/or modify ! 7: * it under the terms of the GNU General Public License as published by ! 8: * the Free Software Foundation; either version 2, or (at your option) ! 9: * any later version. ! 10: * ! 11: * This program is distributed in the hope that it will be useful, ! 12: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: * GNU General Public License for more details. ! 15: * ! 16: * You should have received a copy of the GNU General Public License ! 17: * along with this program (see the file COPYING); if not, write to the ! 18: * Free Software Foundation, Inc., ! 19: * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA ! 20: * ! 21: **************************************************************** ! 22: * $Id: os.h,v 1.10 1994/05/31 12:32:22 mlschroe Exp $ FAU ! 23: */ ! 24: ! 25: #include <stdio.h> ! 26: #include <errno.h> ! 27: ! 28: #include <sys/param.h> ! 29: ! 30: /* In strict ANSI mode, HP-UX machines define __hpux but not hpux */ ! 31: #if defined(__hpux) && !defined(hpux) ! 32: # define hpux ! 33: #endif ! 34: ! 35: #if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux) ! 36: # include <signal.h> ! 37: #endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */ ! 38: ! 39: #ifdef ISC ! 40: # ifdef ENAMETOOLONG ! 41: # undef ENAMETOOLONG ! 42: # endif ! 43: # ifdef ENOTEMPTY ! 44: # undef ENOTEMPTY ! 45: # endif ! 46: # include <sys/bsdtypes.h> ! 47: # include <net/errno.h> ! 48: #endif ! 49: ! 50: #ifdef sun ! 51: # define getpgrp __getpgrp ! 52: # define exit __exit ! 53: #endif ! 54: #ifdef POSIX ! 55: # include <unistd.h> ! 56: # if defined(__STDC__) ! 57: # include <stdlib.h> ! 58: # endif /* __STDC__ */ ! 59: #endif /* POSIX */ ! 60: #ifdef sun ! 61: # undef getpgrp ! 62: # undef exit ! 63: #endif /* sun */ ! 64: ! 65: #ifndef linux /* all done in <errno.h> */ ! 66: extern int errno; ! 67: #endif /* linux */ ! 68: #ifndef HAVE_STRERROR ! 69: /* No macros, please */ ! 70: #undef strerror ! 71: #endif ! 72: ! 73: #if !defined(SYSV) && !defined(linux) ! 74: # ifdef NEWSOS ! 75: # define strlen ___strlen___ ! 76: # include <strings.h> ! 77: # undef strlen ! 78: # else /* NEWSOS */ ! 79: # include <strings.h> ! 80: # endif /* NEWSOS */ ! 81: #else /* SYSV */ ! 82: # if defined(SVR4) || defined(NEWSOS) ! 83: # define strlen ___strlen___ ! 84: # include <string.h> ! 85: # undef strlen ! 86: # if !defined(NEWSOS) && !defined(__hpux) ! 87: extern size_t strlen(const char *); ! 88: # endif ! 89: # else /* SVR4 */ ! 90: # include <string.h> ! 91: # endif /* SVR4 */ ! 92: #endif /* SYSV */ ! 93: ! 94: #ifdef USEVARARGS ! 95: # if defined(__STDC__) ! 96: # include <stdarg.h> ! 97: # define VA_LIST(var) va_list var; ! 98: # define VA_DOTS ... ! 99: # define VA_DECL ! 100: # define VA_START(ap, fmt) va_start(ap, fmt) ! 101: # define VA_ARGS(ap) ap ! 102: # define VA_END(ap) va_end(ap) ! 103: # else ! 104: # include <varargs.h> ! 105: # define VA_LIST(var) va_list var; ! 106: # define VA_DOTS va_alist ! 107: # define VA_DECL va_dcl ! 108: # define VA_START(ap, fmt) va_start(ap) ! 109: # define VA_ARGS(ap) ap ! 110: # define VA_END(ap) va_end(ap) ! 111: # endif ! 112: #else ! 113: # define VA_LIST(var) ! 114: # define VA_DOTS p1, p2, p3, p4, p5, p6 ! 115: # define VA_DECL unsigned long VA_DOTS; ! 116: # define VA_START(ap, fmt) ! 117: # define VA_ARGS(ap) VA_DOTS ! 118: # define VA_END(ap) ! 119: # undef vsnprintf ! 120: # define vsnprintf xsnprintf ! 121: #endif ! 122: ! 123: #if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX) ! 124: # include <time.h> ! 125: #endif ! 126: #include <sys/time.h> ! 127: ! 128: #ifdef M_UNIX /* SCO */ ! 129: # include <sys/stream.h> ! 130: # include <sys/ptem.h> ! 131: # define ftruncate(fd, s) chsize(fd, s) ! 132: #endif ! 133: ! 134: #ifdef SYSV ! 135: # define index strchr ! 136: # define rindex strrchr ! 137: # define bzero(poi,len) memset(poi,0,len) ! 138: # define bcmp memcmp ! 139: # define killpg(pgrp,sig) kill( -(pgrp), sig) ! 140: #endif ! 141: ! 142: #ifndef HAVE_GETCWD ! 143: # define getcwd(b,l) getwd(b) ! 144: #endif ! 145: ! 146: #ifndef USEBCOPY ! 147: # ifdef USEMEMMOVE ! 148: # define bcopy(s,d,len) memmove(d,s,len) ! 149: # else ! 150: # ifdef USEMEMCPY ! 151: # define bcopy(s,d,len) memcpy(d,s,len) ! 152: # else ! 153: # define NEED_OWN_BCOPY ! 154: # define bcopy xbcopy ! 155: # endif ! 156: # endif ! 157: #endif ! 158: ! 159: #ifdef hpux ! 160: # define setreuid(ruid, euid) setresuid(ruid, euid, -1) ! 161: # define setregid(rgid, egid) setresgid(rgid, egid, -1) ! 162: #endif ! 163: ! 164: #if defined(HAVE_SETEUID) || defined(HAVE_SETREUID) ! 165: # define USE_SETEUID ! 166: #endif ! 167: ! 168: #if !defined(HAVE__EXIT) && !defined(_exit) ! 169: #define _exit(x) exit(x) ! 170: #endif ! 171: ! 172: #ifndef HAVE_UTIMES ! 173: # define utimes utime ! 174: #endif ! 175: ! 176: #ifdef BUILTIN_TELNET ! 177: # include <netinet/in.h> ! 178: # include <arpa/inet.h> ! 179: #endif ! 180: ! 181: #if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME)) ! 182: # undef USE_LOCALE ! 183: #endif ! 184: ! 185: /***************************************************************** ! 186: * terminal handling ! 187: */ ! 188: ! 189: #if defined (POSIX) || defined (__FreeBSD__) ! 190: # include <termios.h> ! 191: # ifdef hpux ! 192: # include <bsdtty.h> ! 193: # endif /* hpux */ ! 194: # ifdef NCCS ! 195: # define MAXCC NCCS ! 196: # else ! 197: # define MAXCC 256 ! 198: # endif ! 199: #else /* POSIX */ ! 200: # ifdef TERMIO ! 201: # include <termio.h> ! 202: # ifdef NCC ! 203: # define MAXCC NCC ! 204: # else ! 205: # define MAXCC 256 ! 206: # endif ! 207: # ifdef CYTERMIO ! 208: # include <cytermio.h> ! 209: # endif ! 210: # else /* TERMIO */ ! 211: # if defined (HAVE_SGTTY_H) ! 212: # include <sgtty.h> ! 213: # endif ! 214: # endif /* TERMIO */ ! 215: #endif /* POSIX */ ! 216: ! 217: #ifndef VDISABLE ! 218: # ifdef _POSIX_VDISABLE ! 219: # define VDISABLE _POSIX_VDISABLE ! 220: # else ! 221: # define VDISABLE 0377 ! 222: # endif /* _POSIX_VDISABLE */ ! 223: #endif /* !VDISABLE */ ! 224: ! 225: ! 226: /* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD) ! 227: * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE) ! 228: * to hold the whole packet at first read(). ! 229: * (Marc Boucher) ! 230: * ! 231: * matthew green: ! 232: * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100 ! 233: * ! 234: * Joe Traister: On AIX4, programs like irc won't work if screen ! 235: * uses TIOCPKT (select fails to return on pty read). ! 236: */ ! 237: #if defined(sgi) || defined(DGUX) || defined(_IBMR2) ! 238: # undef TIOCPKT ! 239: #endif ! 240: ! 241: /* linux ncurses is broken, we have to use our own tputs */ ! 242: #if defined(linux) && defined(TERMINFO) ! 243: # define tputs xtputs ! 244: #endif ! 245: ! 246: /* Alexandre Oliva: SVR4 style ptys don't work with osf */ ! 247: #ifdef __osf__ ! 248: # undef HAVE_SVR4_PTYS ! 249: #endif ! 250: ! 251: /***************************************************************** ! 252: * utmp handling ! 253: */ ! 254: ! 255: #ifdef GETUTENT ! 256: typedef char *slot_t; ! 257: #else ! 258: typedef int slot_t; ! 259: #endif ! 260: ! 261: #if defined(UTMPOK) || defined(BUGGYGETLOGIN) ! 262: # if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux) ! 263: # include <utmpx.h> ! 264: # define UTMPFILE UTMPX_FILE ! 265: # define utmp utmpx ! 266: # define getutent getutxent ! 267: # define getutid getutxid ! 268: # define getutline getutxline ! 269: # define pututline pututxline ! 270: # define setutent setutxent ! 271: # define endutent endutxent ! 272: # define ut_time ut_xtime ! 273: # else /* SVR4 */ ! 274: # include <utmp.h> ! 275: # endif /* SVR4 */ ! 276: # ifdef apollo ! 277: /* ! 278: * We don't have GETUTENT, so we dig into utmp ourselves. ! 279: * But we save the permanent filedescriptor and ! 280: * open utmp just when we need to. ! 281: * This code supports an unsorted utmp. jw. ! 282: */ ! 283: # define UTNOKEEP ! 284: # endif /* apollo */ ! 285: ! 286: # ifndef UTMPFILE ! 287: # ifdef UTMP_FILE ! 288: # define UTMPFILE UTMP_FILE ! 289: # else ! 290: # ifdef _PATH_UTMP ! 291: # define UTMPFILE _PATH_UTMP ! 292: # else ! 293: # define UTMPFILE "/etc/utmp" ! 294: # endif /* _PATH_UTMP */ ! 295: # endif ! 296: # endif ! 297: ! 298: #endif /* UTMPOK || BUGGYGETLOGIN */ ! 299: ! 300: #if !defined(UTMPOK) && defined(USRLIMIT) ! 301: # undef USRLIMIT ! 302: #endif ! 303: ! 304: #ifdef LOGOUTOK ! 305: # ifndef LOGINDEFAULT ! 306: # define LOGINDEFAULT 0 ! 307: # endif ! 308: #else ! 309: # ifdef LOGINDEFAULT ! 310: # undef LOGINDEFAULT ! 311: # endif ! 312: # define LOGINDEFAULT 1 ! 313: #endif ! 314: ! 315: ! 316: /***************************************************************** ! 317: * file stuff ! 318: */ ! 319: ! 320: #ifndef F_OK ! 321: #define F_OK 0 ! 322: #endif ! 323: #ifndef X_OK ! 324: #define X_OK 1 ! 325: #endif ! 326: #ifndef W_OK ! 327: #define W_OK 2 ! 328: #endif ! 329: #ifndef R_OK ! 330: #define R_OK 4 ! 331: #endif ! 332: ! 333: #ifndef S_IFIFO ! 334: #define S_IFIFO 0010000 ! 335: #endif ! 336: #ifndef S_IREAD ! 337: #define S_IREAD 0000400 ! 338: #endif ! 339: #ifndef S_IWRITE ! 340: #define S_IWRITE 0000200 ! 341: #endif ! 342: #ifndef S_IEXEC ! 343: #define S_IEXEC 0000100 ! 344: #endif ! 345: ! 346: #if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO) ! 347: #define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) ! 348: #endif ! 349: #if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK) ! 350: #define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) ! 351: #endif ! 352: #if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR) ! 353: #define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) ! 354: #endif ! 355: #if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR) ! 356: #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) ! 357: #endif ! 358: #if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK) ! 359: #define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) ! 360: #endif ! 361: ! 362: /* ! 363: * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK: ! 364: * ! 365: * O_NONBLOCK Same as O_NDELAY above. ! 366: * ! 367: * on the very same SunOS 4.1.3, I traced the open system call and found ! 368: * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked, ! 369: * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY |O_NOCTTY) went through. ! 370: * ! 371: * For this simple reason I now favour O_NDELAY. jw. 4.5.95 ! 372: */ ! 373: #if defined(sun) && !defined(SVR4) ! 374: # undef O_NONBLOCK ! 375: #endif ! 376: ! 377: #if !defined(O_NONBLOCK) && defined(O_NDELAY) ! 378: # define O_NONBLOCK O_NDELAY ! 379: #endif ! 380: ! 381: #if !defined(FNBLOCK) && defined(FNONBLOCK) ! 382: # define FNBLOCK FNONBLOCK ! 383: #endif ! 384: #if !defined(FNBLOCK) && defined(FNDELAY) ! 385: # define FNBLOCK FNDELAY ! 386: #endif ! 387: #if !defined(FNBLOCK) && defined(O_NONBLOCK) ! 388: # define FNBLOCK O_NONBLOCK ! 389: #endif ! 390: ! 391: #ifndef POSIX ! 392: #undef mkfifo ! 393: #define mkfifo(n,m) mknod(n,S_IFIFO|(m),0) ! 394: #endif ! 395: ! 396: #if !defined(HAVE_LSTAT) && !defined(lstat) ! 397: # define lstat stat ! 398: #endif ! 399: ! 400: /***************************************************************** ! 401: * signal handling ! 402: */ ! 403: ! 404: #ifdef SIGVOID ! 405: # define SIGRETURN ! 406: # define sigret_t void ! 407: #else ! 408: # define SIGRETURN return 0; ! 409: # define sigret_t int ! 410: #endif ! 411: ! 412: /* Geeeee, reverse it? */ ! 413: #if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT) ! 414: # define SIGHASARG ! 415: #endif ! 416: ! 417: #ifdef SIGHASARG ! 418: # define SIGPROTOARG (int) ! 419: # define SIGDEFARG (sigsig) int sigsig; ! 420: # define SIGARG 0 ! 421: #else ! 422: # define SIGPROTOARG (void) ! 423: # define SIGDEFARG () ! 424: # define SIGARG ! 425: #endif ! 426: ! 427: #ifndef SIGCHLD ! 428: #define SIGCHLD SIGCLD ! 429: #endif ! 430: ! 431: #if defined(POSIX) || defined(hpux) ! 432: # define signal xsignal ! 433: #else ! 434: # ifdef USESIGSET ! 435: # define signal sigset ! 436: # endif /* USESIGSET */ ! 437: #endif ! 438: ! 439: /* used in screen.c and attacher.c */ ! 440: #ifndef NSIG /* kbeal needs these w/o SYSV */ ! 441: # define NSIG 32 ! 442: #endif /* !NSIG */ ! 443: ! 444: ! 445: /***************************************************************** ! 446: * Wait stuff ! 447: */ ! 448: ! 449: #if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX) ! 450: # include <sys/wait.h> ! 451: #endif ! 452: ! 453: #ifndef WTERMSIG ! 454: # ifndef BSDWAIT /* if wait is NOT a union: */ ! 455: # define WTERMSIG(status) (status & 0177) ! 456: # else ! 457: # define WTERMSIG(status) status.w_T.w_Termsig ! 458: # endif ! 459: #endif ! 460: ! 461: #ifndef WSTOPSIG ! 462: # ifndef BSDWAIT /* if wait is NOT a union: */ ! 463: # define WSTOPSIG(status) ((status >> 8) & 0377) ! 464: # else ! 465: # define WSTOPSIG(status) status.w_S.w_Stopsig ! 466: # endif ! 467: #endif ! 468: ! 469: /* NET-2 uses WCOREDUMP */ ! 470: #if defined(WCOREDUMP) && !defined(WIFCORESIG) ! 471: # define WIFCORESIG(status) WCOREDUMP(status) ! 472: #endif ! 473: ! 474: #ifndef WIFCORESIG ! 475: # ifndef BSDWAIT /* if wait is NOT a union: */ ! 476: # define WIFCORESIG(status) (status & 0200) ! 477: # else ! 478: # define WIFCORESIG(status) status.w_T.w_Coredump ! 479: # endif ! 480: #endif ! 481: ! 482: #ifndef WEXITSTATUS ! 483: # ifndef BSDWAIT /* if wait is NOT a union: */ ! 484: # define WEXITSTATUS(status) ((status >> 8) & 0377) ! 485: # else ! 486: # define WEXITSTATUS(status) status.w_T.w_Retcode ! 487: # endif ! 488: #endif ! 489: ! 490: ! 491: /***************************************************************** ! 492: * select stuff ! 493: */ ! 494: ! 495: #if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_) || defined (__INTERIX) ! 496: #include <sys/select.h> /* for timeval + FD... */ ! 497: #endif ! 498: ! 499: /* ! 500: * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93 ! 501: * tschmidt@vax.micron.com ! 502: */ ! 503: #ifndef FD_SET ! 504: # ifndef SUNOS3 ! 505: typedef struct fd_set { int fds_bits[1]; } fd_set; ! 506: # endif ! 507: # define FD_ZERO(fd) ((fd)->fds_bits[0] = 0) ! 508: # define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b)) ! 509: # define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b)) ! 510: # define FD_SETSIZE 32 ! 511: #endif ! 512: ! 513: ! 514: /***************************************************************** ! 515: * user defineable stuff ! 516: */ ! 517: ! 518: #ifndef TERMCAP_BUFSIZE ! 519: # define TERMCAP_BUFSIZE 2048 ! 520: #endif ! 521: ! 522: #ifndef MAXPATHLEN ! 523: # define MAXPATHLEN 1024 ! 524: #endif ! 525: ! 526: /* ! 527: * you may try to vary this value. Use low values if your (VMS) system ! 528: * tends to choke when pasting. Use high values if you want to test ! 529: * how many characters your pty's can buffer. ! 530: */ ! 531: #define IOSIZE 4096