summaryrefslogtreecommitdiff
path: root/app/xterm/os2main.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/xterm/os2main.c')
-rw-r--r--app/xterm/os2main.c2230
1 files changed, 0 insertions, 2230 deletions
diff --git a/app/xterm/os2main.c b/app/xterm/os2main.c
deleted file mode 100644
index 44b6f904c..000000000
--- a/app/xterm/os2main.c
+++ /dev/null
@@ -1,2230 +0,0 @@
-/* $XTermId: os2main.c,v 1.277 2012/10/14 18:55:18 tom Exp $ */
-
-/* removed all foreign stuff to get the code more clear (hv)
- * and did some rewrite for the obscure OS/2 environment
- */
-
-/***********************************************************
-
-Copyright (c) 1987, 1988 X Consortium
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the X Consortium.
-
-Copyright 1987, 1988 by Digital Equipment Corporation, Maynard.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be used in
-advertising or publicity pertaining to distribution of the software
-without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-******************************************************************/
-
-/* os2main.c */
-#define INCL_DOSFILEMGR
-#define INCL_DOSDEVIOCTL
-#define INCL_DOSSEMAPHORES
-#ifdef __INNOTEK_LIBC__
-#define INCL_DOSDEVICES
-#endif
-#define I_NEED_OS2_H
-#include <os2.h>
-#define XTERM_MAIN
-
-#define RES_OFFSET(field) XtOffsetOf(XTERM_RESOURCE, field)
-
-#include <xterm.h>
-
-#include <X11/cursorfont.h>
-#ifdef I18N
-#include <X11/Xlocale.h>
-#endif
-
-#if OPT_TOOLBAR
-
-#if defined(HAVE_LIB_XAW)
-#include <X11/Xaw/Form.h>
-#elif defined(HAVE_LIB_XAW3D)
-#include <X11/Xaw3d/Form.h>
-#elif defined(HAVE_LIB_NEXTAW)
-#include <X11/neXtaw/Form.h>
-#elif defined(HAVE_LIB_XAWPLUS)
-#include <X11/XawPlus/Form.h>
-#endif
-
-#endif /* OPT_TOOLBAR */
-
-#include <pwd.h>
-#include <ctype.h>
-
-#include <data.h>
-#include <error.h>
-#include <menu.h>
-#include <main.h>
-#include <xstrings.h>
-#include <xtermcap.h>
-#include <xterm_io.h>
-
-#if OPT_WIDE_CHARS
-#include <charclass.h>
-#endif
-
-int
-setpgrp(pid_t pid, gid_t pgid)
-{
- return 0;
-}
-
-int
-chown(const char *fn, pid_t pid, gid_t gid)
-{
- return 0;
-}
-
-char *
-ttyname(int fd)
-{
- return "/dev/tty";
-}
-
-#include <sys/stat.h>
-#include <sys/param.h> /* for NOFILE */
-#include <stdio.h>
-#include <signal.h>
-
-static SIGNAL_T reapchild(int n);
-static int spawnXTerm(XtermWidget /* xw */ );
-static void resize_termcap(XtermWidget xw);
-static void set_owner(char *device, uid_t uid, gid_t gid, mode_t mode);
-
-static Bool added_utmp_entry = False;
-
-static uid_t save_ruid;
-static gid_t save_rgid;
-
-/*
-** Ordinarily it should be okay to omit the assignment in the following
-** statement. Apparently the c89 compiler on AIX 4.1.3 has a bug, or does
-** it? Without the assignment though the compiler will init command_to_exec
-** to 0xffffffff instead of NULL; and subsequent usage, e.g. in spawnXTerm() to
-** SEGV.
-*/
-static char **command_to_exec = NULL;
-
-#if OPT_LUIT_PROG
-static char **command_to_exec_with_luit = NULL;
-#endif
-
-/* The following structures are initialized in main() in order
-** to eliminate any assumptions about the internal order of their
-** contents.
-*/
-static struct termio d_tio;
-
-/* allow use of system default characters if defined and reasonable */
-#ifndef CEOF
-#define CEOF CONTROL('D')
-#endif
-#ifndef CEOL
-#define CEOL 0
-#endif
-#ifndef CFLUSH
-#define CFLUSH CONTROL('O')
-#endif
-#ifndef CLNEXT
-#define CLNEXT CONTROL('V')
-#endif
-#ifndef CNUL
-#define CNUL 0
-#endif
-#ifndef CQUIT
-#define CQUIT CONTROL('\\')
-#endif
-#ifndef CRPRNT
-#define CRPRNT CONTROL('R')
-#endif
-#ifndef CSTART
-#define CSTART CONTROL('Q')
-#endif
-#ifndef CSTOP
-#define CSTOP CONTROL('S')
-#endif
-#ifndef CSUSP
-#define CSUSP CONTROL('Z')
-#endif
-#ifndef CSWTCH
-#define CSWTCH 0
-#endif
-#ifndef CWERASE
-#define CWERASE CONTROL('W')
-#endif
-
-#define TERMIO_STRUCT struct termio
-
-/*
- * SYSV has the termio.c_cc[V] and ltchars; BSD has tchars and ltchars;
- * SVR4 has only termio.c_cc, but it includes everything from ltchars.
- * POSIX termios has termios.c_cc, which is similar to SVR4.
- */
-#define TTYMODE(name) { name, sizeof(name)-1, 0, 0 }
-static Boolean override_tty_modes = False;
-/* *INDENT-OFF* */
-static struct _xttymodes {
- const char *name;
- size_t len;
- int set;
- int value;
-} ttymodelist[] = {
- TTYMODE("intr"), /* tchars.t_intrc ; VINTR */
-#define XTTYMODE_intr 0
- TTYMODE("quit"), /* tchars.t_quitc ; VQUIT */
-#define XTTYMODE_quit 1
- TTYMODE("erase"), /* sgttyb.sg_erase ; VERASE */
-#define XTTYMODE_erase 2
- TTYMODE("kill"), /* sgttyb.sg_kill ; VKILL */
-#define XTTYMODE_kill 3
- TTYMODE("eof"), /* tchars.t_eofc ; VEOF */
-#define XTTYMODE_eof 4
- TTYMODE("eol"), /* VEOL */
-#define XTTYMODE_eol 5
- TTYMODE("swtch"), /* VSWTCH */
-#define XTTYMODE_swtch 6
- TTYMODE("start"), /* tchars.t_startc ; VSTART */
-#define XTTYMODE_start 7
- TTYMODE("stop"), /* tchars.t_stopc ; VSTOP */
-#define XTTYMODE_stop 8
- TTYMODE("brk"), /* tchars.t_brkc */
-#define XTTYMODE_brk 9
- TTYMODE("susp"), /* ltchars.t_suspc ; VSUSP */
-#define XTTYMODE_susp 10
- TTYMODE("dsusp"), /* ltchars.t_dsuspc ; VDSUSP */
-#define XTTYMODE_dsusp 11
- TTYMODE("rprnt"), /* ltchars.t_rprntc ; VREPRINT */
-#define XTTYMODE_rprnt 12
- TTYMODE("flush"), /* ltchars.t_flushc ; VDISCARD */
-#define XTTYMODE_flush 13
- TTYMODE("weras"), /* ltchars.t_werasc ; VWERASE */
-#define XTTYMODE_weras 14
- TTYMODE("lnext"), /* ltchars.t_lnextc ; VLNEXT */
-#define XTTYMODE_lnext 15
- { NULL, 0, 0, '\0' }, /* end of data */
-};
-/* *INDENT-ON* */
-
-#define TMODE(ind,var) if (ttymodelist[ind].set) var = ttymodelist[ind].value
-
-static int parse_tty_modes(char *s, struct _xttymodes *modelist);
-
-static char passedPty[2]; /* name if pty if slave */
-
-static int Console;
-#include <X11/Xmu/SysUtil.h> /* XmuGetHostname */
-#define MIT_CONSOLE_LEN 12
-#define MIT_CONSOLE "MIT_CONSOLE_"
-static char mit_console_name[255 + MIT_CONSOLE_LEN + 1] = MIT_CONSOLE;
-static Atom mit_console;
-
-static int tslot;
-static jmp_buf env;
-
-/* used by VT (charproc.c) */
-
-static XtResource application_resources[] =
-{
- Sres("iconGeometry", "IconGeometry", icon_geometry, NULL),
- Sres(XtNtitle, XtCTitle, title, NULL),
- Sres(XtNiconHint, XtCIconHint, icon_hint, NULL),
- Sres(XtNiconName, XtCIconName, icon_name, NULL),
- Sres("termName", "TermName", term_name, NULL),
- Sres("ttyModes", "TtyModes", tty_modes, NULL),
- Bres("hold", "Hold", hold_screen, False),
- Bres("utmpInhibit", "UtmpInhibit", utmpInhibit, False),
- Bres("utmpDisplayId", "UtmpDisplayId", utmpDisplayId, True),
- Bres("messages", "Messages", messages, True),
- Ires("minBufSize", "MinBufSize", minBufSize, 4096),
- Ires("maxBufSize", "MaxBufSize", maxBufSize, 32768),
- Sres("menuLocale", "MenuLocale", menuLocale, DEF_MENU_LOCALE),
- Sres("omitTranslation", "OmitTranslation", omitTranslation, NULL),
- Sres("keyboardType", "KeyboardType", keyboardType, "unknown"),
-#if OPT_PRINT_ON_EXIT
- Ires("printModeImmediate", "PrintModeImmediate", printModeNow, 0),
- Ires("printOptsImmediate", "PrintOptsImmediate", printOptsNow, 9),
- Sres("printFileImmediate", "PrintFileImmediate", printFileNow, NULL),
- Ires("printModeOnXError", "PrintModeOnXError", printModeOnXError, 0),
- Ires("printOptsOnXError", "PrintOptsOnXError", printOptsOnXError, 9),
- Sres("printFileOnXError", "PrintFileOnXError", printFileOnXError, NULL),
-#endif
-#if OPT_SUNPC_KBD
- Bres("sunKeyboard", "SunKeyboard", sunKeyboard, False),
-#endif
-#if OPT_HP_FUNC_KEYS
- Bres("hpFunctionKeys", "HpFunctionKeys", hpFunctionKeys, False),
-#endif
-#if OPT_SCO_FUNC_KEYS
- Bres("scoFunctionKeys", "ScoFunctionKeys", scoFunctionKeys, False),
-#endif
-#if OPT_SUN_FUNC_KEYS
- Bres("sunFunctionKeys", "SunFunctionKeys", sunFunctionKeys, False),
-#endif
-#if OPT_TCAP_FKEYS
- Bres("tcapFunctionKeys", "TcapFunctionKeys", termcapKeys, False),
-#endif
-#if OPT_INITIAL_ERASE
- Bres("ptyInitialErase", "PtyInitialErase", ptyInitialErase, DEF_INITIAL_ERASE),
- Bres("backarrowKeyIsErase", "BackarrowKeyIsErase", backarrow_is_erase, DEF_BACKARO_ERASE),
-#endif
- Bres("useInsertMode", "UseInsertMode", useInsertMode, False),
-#if OPT_ZICONBEEP
- Ires("zIconBeep", "ZIconBeep", zIconBeep, 0),
- Sres("zIconTitleFormat", "ZIconTitleFormat", zIconFormat, "*** %s"),
-#endif
-#if OPT_PTY_HANDSHAKE
- Bres("waitForMap", "WaitForMap", wait_for_map, False),
- Bres("ptyHandshake", "PtyHandshake", ptyHandshake, True),
- Bres("ptySttySize", "PtySttySize", ptySttySize, DEF_PTY_STTY_SIZE),
-#endif
-#if OPT_SAME_NAME
- Bres("sameName", "SameName", sameName, True),
-#endif
-#if OPT_SESSION_MGT
- Bres("sessionMgt", "SessionMgt", sessionMgt, True),
-#endif
-#if OPT_TOOLBAR
- Bres(XtNtoolBar, XtCToolBar, toolBar, True),
-#endif
-#if OPT_MAXIMIZE
- Bres(XtNmaximized, XtCMaximized, maximized, False),
- Sres(XtNfullscreen, XtCFullscreen, fullscreen_s, "off"),
-#endif
-};
-
-static String fallback_resources[] =
-{
-#if OPT_TOOLBAR
- "*toolBar: false",
-#endif
- "*SimpleMenu*menuLabel.vertSpace: 100",
- "*SimpleMenu*HorizontalMargins: 16",
- "*SimpleMenu*Sme.height: 16",
- "*SimpleMenu*Cursor: left_ptr",
- "*mainMenu.Label: Main Options (no app-defaults)",
- "*vtMenu.Label: VT Options (no app-defaults)",
- "*fontMenu.Label: VT Fonts (no app-defaults)",
-#if OPT_TEK4014
- "*tekMenu.Label: Tek Options (no app-defaults)",
-#endif
- NULL
-};
-
-/* Command line options table. Only resources are entered here...there is a
- pass over the remaining options after XrmParseCommand is let loose. */
-/* *INDENT-OFF* */
-static XrmOptionDescRec optionDescList[] = {
-{"-geometry", "*vt100.geometry",XrmoptionSepArg, (XPointer) NULL},
-{"-132", "*c132", XrmoptionNoArg, (XPointer) "on"},
-{"+132", "*c132", XrmoptionNoArg, (XPointer) "off"},
-{"-ah", "*alwaysHighlight", XrmoptionNoArg, (XPointer) "on"},
-{"+ah", "*alwaysHighlight", XrmoptionNoArg, (XPointer) "off"},
-{"-aw", "*autoWrap", XrmoptionNoArg, (XPointer) "on"},
-{"+aw", "*autoWrap", XrmoptionNoArg, (XPointer) "off"},
-#ifndef NO_ACTIVE_ICON
-{"-ai", "*activeIcon", XrmoptionNoArg, (XPointer) "off"},
-{"+ai", "*activeIcon", XrmoptionNoArg, (XPointer) "on"},
-#endif /* NO_ACTIVE_ICON */
-{"-b", "*internalBorder",XrmoptionSepArg, (XPointer) NULL},
-{"-bc", "*cursorBlink", XrmoptionNoArg, (XPointer) "on"},
-{"+bc", "*cursorBlink", XrmoptionNoArg, (XPointer) "off"},
-{"-bcf", "*cursorOffTime",XrmoptionSepArg, (XPointer) NULL},
-{"-bcn", "*cursorOnTime",XrmoptionSepArg, (XPointer) NULL},
-{"-bdc", "*colorBDMode", XrmoptionNoArg, (XPointer) "off"},
-{"+bdc", "*colorBDMode", XrmoptionNoArg, (XPointer) "on"},
-{"-cb", "*cutToBeginningOfLine", XrmoptionNoArg, (XPointer) "off"},
-{"+cb", "*cutToBeginningOfLine", XrmoptionNoArg, (XPointer) "on"},
-{"-cc", "*charClass", XrmoptionSepArg, (XPointer) NULL},
-{"-cm", "*colorMode", XrmoptionNoArg, (XPointer) "off"},
-{"+cm", "*colorMode", XrmoptionNoArg, (XPointer) "on"},
-{"-cn", "*cutNewline", XrmoptionNoArg, (XPointer) "off"},
-{"+cn", "*cutNewline", XrmoptionNoArg, (XPointer) "on"},
-{"-cr", "*cursorColor", XrmoptionSepArg, (XPointer) NULL},
-{"-cu", "*curses", XrmoptionNoArg, (XPointer) "on"},
-{"+cu", "*curses", XrmoptionNoArg, (XPointer) "off"},
-{"-dc", "*dynamicColors",XrmoptionNoArg, (XPointer) "off"},
-{"+dc", "*dynamicColors",XrmoptionNoArg, (XPointer) "on"},
-{"-fb", "*boldFont", XrmoptionSepArg, (XPointer) NULL},
-{"-fbb", "*freeBoldBox", XrmoptionNoArg, (XPointer)"off"},
-{"+fbb", "*freeBoldBox", XrmoptionNoArg, (XPointer)"on"},
-{"-fbx", "*forceBoxChars", XrmoptionNoArg, (XPointer)"off"},
-{"+fbx", "*forceBoxChars", XrmoptionNoArg, (XPointer)"on"},
-#ifndef NO_ACTIVE_ICON
-{"-fi", "*iconFont", XrmoptionSepArg, (XPointer) NULL},
-#endif /* NO_ACTIVE_ICON */
-#if OPT_RENDERFONT
-{"-fa", "*faceName", XrmoptionSepArg, (XPointer) NULL},
-{"-fd", "*faceNameDoublesize", XrmoptionSepArg, (XPointer) NULL},
-{"-fs", "*faceSize", XrmoptionSepArg, (XPointer) NULL},
-#endif
-#if OPT_WIDE_CHARS
-{"-fw", "*wideFont", XrmoptionSepArg, (XPointer) NULL},
-{"-fwb", "*wideBoldFont", XrmoptionSepArg, (XPointer) NULL},
-#endif
-#if OPT_INPUT_METHOD
-{"-fx", "*ximFont", XrmoptionSepArg, (XPointer) NULL},
-#endif
-#if OPT_HIGHLIGHT_COLOR
-{"-hc", "*highlightColor", XrmoptionSepArg, (XPointer) NULL},
-{"-hm", "*highlightColorMode", XrmoptionNoArg, (XPointer) "on"},
-{"+hm", "*highlightColorMode", XrmoptionNoArg, (XPointer) "off"},
-{"-selfg", "*highlightTextColor", XrmoptionSepArg, (XPointer) NULL},
-{"-selbg", "*highlightColor", XrmoptionSepArg, (XPointer) NULL},
-#endif
-#if OPT_HP_FUNC_KEYS
-{"-hf", "*hpFunctionKeys",XrmoptionNoArg, (XPointer) "on"},
-{"+hf", "*hpFunctionKeys",XrmoptionNoArg, (XPointer) "off"},
-#endif
-{"-hold", "*hold", XrmoptionNoArg, (XPointer) "on"},
-{"+hold", "*hold", XrmoptionNoArg, (XPointer) "off"},
-#if OPT_INITIAL_ERASE
-{"-ie", "*ptyInitialErase", XrmoptionNoArg, (XPointer) "on"},
-{"+ie", "*ptyInitialErase", XrmoptionNoArg, (XPointer) "off"},
-#endif
-{"-j", "*jumpScroll", XrmoptionNoArg, (XPointer) "on"},
-{"+j", "*jumpScroll", XrmoptionNoArg, (XPointer) "off"},
-#if OPT_C1_PRINT
-{"-k8", "*allowC1Printable", XrmoptionNoArg, (XPointer) "on"},
-{"+k8", "*allowC1Printable", XrmoptionNoArg, (XPointer) "off"},
-#endif
-{"-kt", "*keyboardType", XrmoptionSepArg, (XPointer) NULL},
-/* parse logging options anyway for compatibility */
-{"-l", "*logging", XrmoptionNoArg, (XPointer) "on"},
-{"+l", "*logging", XrmoptionNoArg, (XPointer) "off"},
-{"-lf", "*logFile", XrmoptionSepArg, (XPointer) NULL},
-{"-ls", "*loginShell", XrmoptionNoArg, (XPointer) "on"},
-{"+ls", "*loginShell", XrmoptionNoArg, (XPointer) "off"},
-{"-mb", "*marginBell", XrmoptionNoArg, (XPointer) "on"},
-{"+mb", "*marginBell", XrmoptionNoArg, (XPointer) "off"},
-{"-mc", "*multiClickTime", XrmoptionSepArg, (XPointer) NULL},
-{"-mesg", "*messages", XrmoptionNoArg, (XPointer) "off"},
-{"+mesg", "*messages", XrmoptionNoArg, (XPointer) "on"},
-{"-ms", "*pointerColor",XrmoptionSepArg, (XPointer) NULL},
-{"-nb", "*nMarginBell", XrmoptionSepArg, (XPointer) NULL},
-{"-nul", "*underLine", XrmoptionNoArg, (XPointer) "off"},
-{"+nul", "*underLine", XrmoptionNoArg, (XPointer) "on"},
-{"-pc", "*boldColors", XrmoptionNoArg, (XPointer) "on"},
-{"+pc", "*boldColors", XrmoptionNoArg, (XPointer) "off"},
-{"-rw", "*reverseWrap", XrmoptionNoArg, (XPointer) "on"},
-{"+rw", "*reverseWrap", XrmoptionNoArg, (XPointer) "off"},
-{"-s", "*multiScroll", XrmoptionNoArg, (XPointer) "on"},
-{"+s", "*multiScroll", XrmoptionNoArg, (XPointer) "off"},
-{"-sb", "*scrollBar", XrmoptionNoArg, (XPointer) "on"},
-{"+sb", "*scrollBar", XrmoptionNoArg, (XPointer) "off"},
-#ifdef SCROLLBAR_RIGHT
-{"-leftbar", "*rightScrollBar", XrmoptionNoArg, (XPointer) "off"},
-{"-rightbar", "*rightScrollBar", XrmoptionNoArg, (XPointer) "on"},
-#endif
-{"-rvc", "*colorRVMode", XrmoptionNoArg, (XPointer) "off"},
-{"+rvc", "*colorRVMode", XrmoptionNoArg, (XPointer) "on"},
-{"-sf", "*sunFunctionKeys", XrmoptionNoArg, (XPointer) "on"},
-{"+sf", "*sunFunctionKeys", XrmoptionNoArg, (XPointer) "off"},
-{"-sh", "*scaleHeight", XrmoptionSepArg, (XPointer) NULL},
-{"-si", "*scrollTtyOutput", XrmoptionNoArg, (XPointer) "off"},
-{"+si", "*scrollTtyOutput", XrmoptionNoArg, (XPointer) "on"},
-{"-sk", "*scrollKey", XrmoptionNoArg, (XPointer) "on"},
-{"+sk", "*scrollKey", XrmoptionNoArg, (XPointer) "off"},
-{"-sl", "*saveLines", XrmoptionSepArg, (XPointer) NULL},
-#if OPT_SUNPC_KBD
-{"-sp", "*sunKeyboard", XrmoptionNoArg, (XPointer) "on"},
-{"+sp", "*sunKeyboard", XrmoptionNoArg, (XPointer) "off"},
-#endif
-#if OPT_TEK4014
-{"-t", "*tekStartup", XrmoptionNoArg, (XPointer) "on"},
-{"+t", "*tekStartup", XrmoptionNoArg, (XPointer) "off"},
-#endif
-{"-ti", "*decTerminalID",XrmoptionSepArg, (XPointer) NULL},
-{"-tm", "*ttyModes", XrmoptionSepArg, (XPointer) NULL},
-{"-tn", "*termName", XrmoptionSepArg, (XPointer) NULL},
-#if OPT_WIDE_CHARS
-{"-u8", "*utf8", XrmoptionNoArg, (XPointer) "2"},
-{"+u8", "*utf8", XrmoptionNoArg, (XPointer) "0"},
-#endif
-#if OPT_LUIT_PROG
-{"-lc", "*locale", XrmoptionNoArg, (XPointer) "on"},
-{"+lc", "*locale", XrmoptionNoArg, (XPointer) "off"},
-{"-lcc", "*localeFilter",XrmoptionSepArg, (XPointer) NULL},
-{"-en", "*locale", XrmoptionSepArg, (XPointer) NULL},
-#endif
-{"-uc", "*cursorUnderLine", XrmoptionNoArg, (XPointer) "on"},
-{"+uc", "*cursorUnderLine", XrmoptionNoArg, (XPointer) "off"},
-{"-ulc", "*colorULMode", XrmoptionNoArg, (XPointer) "off"},
-{"+ulc", "*colorULMode", XrmoptionNoArg, (XPointer) "on"},
-{"-ulit", "*italicULMode", XrmoptionNoArg, (XPointer) "off"},
-{"+ulit", "*italicULMode", XrmoptionNoArg, (XPointer) "on"},
-{"-ut", "*utmpInhibit", XrmoptionNoArg, (XPointer) "on"},
-{"+ut", "*utmpInhibit", XrmoptionNoArg, (XPointer) "off"},
-{"-im", "*useInsertMode", XrmoptionNoArg, (XPointer) "on"},
-{"+im", "*useInsertMode", XrmoptionNoArg, (XPointer) "off"},
-{"-vb", "*visualBell", XrmoptionNoArg, (XPointer) "on"},
-{"+vb", "*visualBell", XrmoptionNoArg, (XPointer) "off"},
-{"-pob", "*popOnBell", XrmoptionNoArg, (XPointer) "on"},
-{"+pob", "*popOnBell", XrmoptionNoArg, (XPointer) "off"},
-#if OPT_WIDE_CHARS
-{"-wc", "*wideChars", XrmoptionNoArg, (XPointer) "on"},
-{"+wc", "*wideChars", XrmoptionNoArg, (XPointer) "off"},
-{"-mk_width", "*mkWidth", XrmoptionNoArg, (XPointer) "on"},
-{"+mk_width", "*mkWidth", XrmoptionNoArg, (XPointer) "off"},
-{"-cjk_width", "*cjkWidth", XrmoptionNoArg, (XPointer) "on"},
-{"+cjk_width", "*cjkWidth", XrmoptionNoArg, (XPointer) "off"},
-#endif
-{"-wf", "*waitForMap", XrmoptionNoArg, (XPointer) "on"},
-{"+wf", "*waitForMap", XrmoptionNoArg, (XPointer) "off"},
-#if OPT_ZICONBEEP
-{"-ziconbeep", "*zIconBeep", XrmoptionSepArg, (XPointer) NULL},
-#endif
-#if OPT_SAME_NAME
-{"-samename", "*sameName", XrmoptionNoArg, (XPointer) "on"},
-{"+samename", "*sameName", XrmoptionNoArg, (XPointer) "off"},
-#endif
-#if OPT_SESSION_MGT
-{"-sm", "*sessionMgt", XrmoptionNoArg, (XPointer) "on"},
-{"+sm", "*sessionMgt", XrmoptionNoArg, (XPointer) "off"},
-#endif
-#if OPT_TOOLBAR
-{"-tb", "*"XtNtoolBar, XrmoptionNoArg, (XPointer) "on"},
-{"+tb", "*"XtNtoolBar, XrmoptionNoArg, (XPointer) "off"},
-#endif
-#if OPT_MAXIMIZE
-{"-maximized", "*maximized", XrmoptionNoArg, (XPointer) "on"},
-{"+maximized", "*maximized", XrmoptionNoArg, (XPointer) "off"},
-{"-fullscreen", "*fullscreen", XrmoptionNoArg, (XPointer) "on"},
-{"+fullscreen", "*fullscreen", XrmoptionNoArg, (XPointer) "off"},
-#endif
-/* options that we process ourselves */
-{"-help", NULL, XrmoptionSkipNArgs, (XPointer) NULL},
-{"-version", NULL, XrmoptionSkipNArgs, (XPointer) NULL},
-{"-class", NULL, XrmoptionSkipArg, (XPointer) NULL},
-{"-e", NULL, XrmoptionSkipLine, (XPointer) NULL},
-{"-into", NULL, XrmoptionSkipArg, (XPointer) NULL},
-/* bogus old compatibility stuff for which there are
- standard XtOpenApplication options now */
-{"%", "*tekGeometry", XrmoptionStickyArg, (XPointer) NULL},
-{"#", ".iconGeometry",XrmoptionStickyArg, (XPointer) NULL},
-{"-T", ".title", XrmoptionSepArg, (XPointer) NULL},
-{"-n", "*iconName", XrmoptionSepArg, (XPointer) NULL},
-{"-r", "*reverseVideo",XrmoptionNoArg, (XPointer) "on"},
-{"+r", "*reverseVideo",XrmoptionNoArg, (XPointer) "off"},
-{"-rv", "*reverseVideo",XrmoptionNoArg, (XPointer) "on"},
-{"+rv", "*reverseVideo",XrmoptionNoArg, (XPointer) "off"},
-{"-w", ".borderWidth", XrmoptionSepArg, (XPointer) NULL},
-};
-
-static OptionHelp xtermOptions[] = {
-{ "-version", "print the version number" },
-{ "-help", "print out this message" },
-{ "-display displayname", "X server to contact" },
-{ "-geometry geom", "size (in characters) and position" },
-{ "-/+rv", "turn on/off reverse video" },
-{ "-bg color", "background color" },
-{ "-fg color", "foreground color" },
-{ "-bd color", "border color" },
-{ "-bw number", "border width in pixels" },
-{ "-fn fontname", "normal text font" },
-{ "-fb fontname", "bold text font" },
-{ "-/+fbb", "turn on/off normal/bold font comparison inhibit"},
-{ "-/+fbx", "turn off/on linedrawing characters"},
-#if OPT_RENDERFONT
-{ "-fa pattern", "FreeType font-selection pattern" },
-{ "-fd pattern", "FreeType Doublesize font-selection pattern" },
-{ "-fs size", "FreeType font-size" },
-#endif
-#if OPT_WIDE_CHARS
-{ "-fw fontname", "doublewidth text font" },
-{ "-fwb fontname", "doublewidth bold text font" },
-#endif
-#if OPT_INPUT_METHOD
-{ "-fx fontname", "XIM fontset" },
-#endif
-{ "-iconic", "start iconic" },
-{ "-name string", "client instance, icon, and title strings" },
-{ "-class string", "class string (XTerm)" },
-{ "-title string", "title string" },
-{ "-xrm resourcestring", "additional resource specifications" },
-{ "-/+132", "turn on/off 80/132 column switching" },
-{ "-/+ah", "turn on/off always highlight" },
-#ifndef NO_ACTIVE_ICON
-{ "-/+ai", "turn off/on active icon" },
-{ "-fi fontname", "icon font for active icon" },
-#endif /* NO_ACTIVE_ICON */
-{ "-b number", "internal border in pixels" },
-{ "-/+bc", "turn on/off text cursor blinking" },
-{ "-bcf milliseconds", "time text cursor is off when blinking"},
-{ "-bcn milliseconds", "time text cursor is on when blinking"},
-{ "-/+bdc", "turn off/on display of bold as color"},
-{ "-/+cb", "turn on/off cut-to-beginning-of-line inhibit" },
-{ "-cc classrange", "specify additional character classes" },
-{ "-/+cm", "turn off/on ANSI color mode" },
-{ "-/+cn", "turn on/off cut newline inhibit" },
-{ "-cr color", "text cursor color" },
-{ "-/+cu", "turn on/off curses emulation" },
-{ "-/+dc", "turn off/on dynamic color selection" },
-#if OPT_HIGHLIGHT_COLOR
-{ "-/+hm", "turn on/off selection-color override" },
-{ "-selbg color", "selection background color" },
-{ "-selfg color", "selection foreground color" },
-#endif
-#if OPT_HP_FUNC_KEYS
-{ "-/+hf", "turn on/off HP Function Key escape codes" },
-#endif
-{ "-/+hold", "turn on/off logic that retains window after exit" },
-#if OPT_INITIAL_ERASE
-{ "-/+ie", "turn on/off initialization of 'erase' from pty" },
-#endif
-{ "-/+im", "use insert mode for TERMCAP" },
-{ "-/+j", "turn on/off jump scroll" },
-#if OPT_C1_PRINT
-{ "-/+k8", "turn on/off C1-printable classification"},
-#endif
-{ "-kt keyboardtype", "set keyboard type:" KEYBOARD_TYPES },
-#ifdef ALLOWLOGGING
-{ "-/+l", "turn on/off logging" },
-{ "-lf filename", "logging filename" },
-#else
-{ "-/+l", "turn on/off logging (not supported)" },
-{ "-lf filename", "logging filename (not supported)" },
-#endif
-{ "-/+ls", "turn on/off login shell" },
-{ "-/+mb", "turn on/off margin bell" },
-{ "-mc milliseconds", "multiclick time in milliseconds" },
-{ "-/+mesg", "forbid/allow messages" },
-{ "-ms color", "pointer color" },
-{ "-nb number", "margin bell in characters from right end" },
-{ "-/+nul", "turn off/on display of underlining" },
-{ "-/+aw", "turn on/off auto wraparound" },
-{ "-/+pc", "turn on/off PC-style bold colors" },
-{ "-/+rw", "turn on/off reverse wraparound" },
-{ "-/+s", "turn on/off multiscroll" },
-{ "-/+sb", "turn on/off scrollbar" },
-#ifdef SCROLLBAR_RIGHT
-{ "-rightbar", "force scrollbar right (default left)" },
-{ "-leftbar", "force scrollbar left" },
-#endif
-{ "-/+rvc", "turn off/on display of reverse as color" },
-{ "-/+sf", "turn on/off Sun Function Key escape codes" },
-{ "-/+si", "turn on/off scroll-on-tty-output inhibit" },
-{ "-/+sk", "turn on/off scroll-on-keypress" },
-{ "-sl number", "number of scrolled lines to save" },
-#if OPT_SUNPC_KBD
-{ "-/+sp", "turn on/off Sun/PC Function/Keypad mapping" },
-#endif
-#if OPT_TEK4014
-{ "-/+t", "turn on/off Tek emulation window" },
-#endif
-#if OPT_TOOLBAR
-{ "-/+tb", "turn on/off toolbar" },
-#endif
-{ "-ti termid", "terminal identifier" },
-{ "-tm string", "terminal mode keywords and characters" },
-{ "-tn name", "TERM environment variable name" },
-#if OPT_WIDE_CHARS
-{ "-/+u8", "turn on/off UTF-8 mode (implies wide-characters)" },
-#endif
-#if OPT_LUIT_PROG
-{ "-/+lc", "turn on/off locale mode using luit" },
-{ "-lcc path", "filename of locale converter (" DEFLOCALEFILTER ")" },
-#endif
-{ "-/+uc", "turn on/off underline cursor" },
-{ "-/+ulc", "turn off/on display of underline as color" },
-{ "-/+ulit", "turn off/on display of underline as italics" },
-{ "-/+ut", "turn on/off utmp inhibit (not supported)" },
-{ "-/+vb", "turn on/off visual bell" },
-{ "-/+pob", "turn on/off pop on bell" },
-#if OPT_WIDE_CHARS
-{ "-/+wc", "turn on/off wide-character mode" },
-{ "-/+mk_width", "turn on/off simple width convention" },
-{ "-/+cjk_width", "turn on/off legacy CJK width convention" },
-#endif
-{ "-/+wf", "turn on/off wait for map before command exec" },
-{ "-e command args ...", "command to execute" },
-#if OPT_TEK4014
-{ "%geom", "Tek window geometry" },
-#endif
-{ "#geom", "icon window geometry" },
-{ "-T string", "title name for window" },
-{ "-n string", "icon name for window" },
-{ "-C", "intercept console messages" },
-{ "-Sccn", "slave mode on \"ttycc\", file descriptor \"n\"" },
-{ "-into windowId", "use the window id given to -into as the parent window rather than the default root window" },
-#if OPT_ZICONBEEP
-{ "-ziconbeep percent", "beep and flag icon of window having hidden output" },
-#endif
-#if OPT_SAME_NAME
-{ "-/+samename", "turn on/off the no-flicker option for title and icon name" },
-#endif
-#if OPT_SESSION_MGT
-{ "-/+sm", "turn on/off the session-management support" },
-#endif
-#if OPT_MAXIMIZE
-{"-/+maximized", "turn on/off maxmize on startup" },
-{"-/+fullscreen", "turn on/off fullscreen on startup" },
-#endif
-{ NULL, NULL }};
-/* *INDENT-ON* */
-
-#ifdef DBG_CONSOLE
-FILE *confd;
-
-static void
-closecons(void)
-{
- if (confs != 0) {
- fclose(confd);
- confd = 0;
- }
-}
-static void
-opencons(void)
-{
- closecons();
- if ((confd = fopen("/dev/console$", "w")) < 0) {
- fputs("!!! Cannot open console device.\n",
- stderr);
- exit(1);
- }
-}
-#else
-#define opencons() /* nothing */
-#define closecons() /* nothing */
-#endif
-
-static const char *message[] =
-{
- "Fonts should be fixed width and, if both normal and bold are specified, should",
- "have the same size. If only a normal font is specified, it will be used for",
- "both normal and bold text (by doing overstriking). The -e option, if given,",
- "must appear at the end of the command line, otherwise the user's default shell",
- "will be started. Options that start with a plus sign (+) restore the default.",
- NULL};
-
-/*
- * Decode a key-definition. This combines the termcap and ttyModes, for
- * comparison. Note that octal escapes in ttyModes are done by the normal
- * resource translation. Also, ttyModes allows '^-' as a synonym for disabled.
- */
-static int
-decode_keyvalue(char **ptr, int termcap)
-{
- char *string = *ptr;
- int value = -1;
-
- TRACE(("decode_keyvalue '%s'\n", string));
- if (*string == '^') {
- switch (*++string) {
- case '?':
- value = A2E(ANSI_DEL);
- break;
- case '-':
- if (!termcap) {
- errno = 0;
-#if defined(_POSIX_VDISABLE) && defined(HAVE_UNISTD_H)
- value = _POSIX_VDISABLE;
-#endif
-#if defined(_PC_VDISABLE)
- if (value == -1) {
- value = (int) fpathconf(0, _PC_VDISABLE);
- if (value == -1) {
- if (errno != 0)
- break; /* skip this (error) */
- value = 0377;
- }
- }
-#elif defined(VDISABLE)
- if (value == -1)
- value = VDISABLE;
-#endif
- break;
- }
- /* FALLTHRU */
- default:
- value = CONTROL(*string);
- break;
- }
- ++string;
- } else if (termcap && (*string == '\\')) {
- char *d;
- int temp = (int) strtol(string + 1, &d, 8);
- if (temp > 0 && d != string) {
- value = temp;
- string = d;
- }
- } else {
- value = CharOf(*string);
- ++string;
- }
- *ptr = string;
- TRACE(("...decode_keyvalue %#x\n", value));
- return value;
-}
-
-static int
-abbrev(const char *tst, const char *cmp, size_t need)
-{
- size_t len = strlen(tst);
- return ((len >= need) && (!strncmp(tst, cmp, len)));
-}
-
-static void
-Syntax(char *badOption)
-{
- OptionHelp *opt;
- OptionHelp *list = sortedOpts(xtermOptions, optionDescList, XtNumber(optionDescList));
- int col;
-
- xtermWarning("bad command line option \"%s\"\r\n\n", badOption);
-
- fprintf(stderr, "usage: %s", ProgramName);
- col = 8 + (int) strlen(ProgramName);
- for (opt = list; opt->opt; opt++) {
- int len = 3 + (int) strlen(opt->opt); /* space [ string ] */
- if (col + len > 79) {
- fprintf(stderr, "\r\n "); /* 3 spaces */
- col = 3;
- }
- fprintf(stderr, " [%s]", opt->opt);
- col += len;
- }
-
- fprintf(stderr, "\r\n\nType %s -help for a full description.\r\n\n",
- ProgramName);
- exit(1);
-}
-
-static void
-Version(void)
-{
- printf("%s\n", xtermVersion());
- fflush(stdout);
-}
-
-static void
-Help(void)
-{
- OptionHelp *opt;
- OptionHelp *list = sortedOpts(xtermOptions, optionDescList, XtNumber(optionDescList));
- const char **cpp;
-
- printf("%s usage:\n %s [-options ...] [-e command args]\n\n",
- xtermVersion(), ProgramName);
- printf("where options include:\n");
- for (opt = list; opt->opt; opt++) {
- printf(" %-28s %s\n", opt->opt, opt->desc);
- }
-
- putchar('\n');
- for (cpp = message; *cpp; cpp++)
- puts(*cpp);
- putchar('\n');
- fflush(stdout);
-}
-
-/* ARGSUSED */
-static Boolean
-ConvertConsoleSelection(Widget w GCC_UNUSED,
- Atom * selection GCC_UNUSED,
- Atom * target GCC_UNUSED,
- Atom * type GCC_UNUSED,
- XtPointer *value GCC_UNUSED,
- unsigned long *length GCC_UNUSED,
- int *format GCC_UNUSED)
-{
- /* we don't save console output, so can't offer it */
- return False;
-}
-
-#if OPT_SESSION_MGT
-static void
-die_callback(Widget w GCC_UNUSED,
- XtPointer client_data GCC_UNUSED,
- XtPointer call_data GCC_UNUSED)
-{
- Cleanup(0);
-}
-
-static void
-save_callback(Widget w GCC_UNUSED,
- XtPointer client_data GCC_UNUSED,
- XtPointer call_data)
-{
- XtCheckpointToken token = (XtCheckpointToken) call_data;
- /* we have nothing to save */
- token->save_success = True;
-}
-
-static void
-icewatch(IceConn iceConn,
- IcePointer clientData GCC_UNUSED,
- Bool opening,
- IcePointer * watchData GCC_UNUSED)
-{
- if (opening) {
- ice_fd = IceConnectionNumber(iceConn);
- TRACE(("got IceConnectionNumber %d\n", ice_fd));
- } else {
- ice_fd = -1;
- TRACE(("reset IceConnectionNumber\n"));
- }
-}
-
-#endif /* OPT_SESSION_MGT */
-
-/*
- * DeleteWindow(): Action proc to implement ICCCM delete_window.
- */
-/* ARGSUSED */
-static void
-DeleteWindow(Widget w,
- XEvent * event GCC_UNUSED,
- String * params GCC_UNUSED,
- Cardinal *num_params GCC_UNUSED)
-{
-#if OPT_TEK4014
- if (w == toplevel) {
- if (TEK4014_SHOWN(term))
- hide_vt_window();
- else
- do_hangup(w, (XtPointer) 0, (XtPointer) 0);
- } else if (TScreenOf(term)->Vshow)
- hide_tek_window();
- else
-#endif
- do_hangup(w, (XtPointer) 0, (XtPointer) 0);
-}
-
-/* ARGSUSED */
-static void
-KeyboardMapping(Widget w GCC_UNUSED,
- XEvent * event,
- String * params GCC_UNUSED,
- Cardinal *num_params GCC_UNUSED)
-{
- switch (event->type) {
- case MappingNotify:
- XRefreshKeyboardMapping(&event->xmapping);
- break;
- }
-}
-
-static XtActionsRec actionProcs[] =
-{
- {"DeleteWindow", DeleteWindow},
- {"KeyboardMapping", KeyboardMapping},
-};
-
-char **gblenvp;
-
-int
-main(int argc, char **argv ENVP_ARG)
-{
- Widget form_top, menu_top;
- Dimension menu_high;
- TScreen *screen;
- int mode;
- char *my_class = DEFCLASS;
- Window winToEmbedInto = None;
-#if OPT_COLOR_RES
- Bool reversed = False;
-#endif
-
- ProgramName = argv[0];
-
- save_ruid = getuid();
- save_rgid = getgid();
-
- /* Do these first, since we may not be able to open the display */
- TRACE_OPTS(xtermOptions, optionDescList, XtNumber(optionDescList));
- TRACE_ARGV("Before XtOpenApplication", argv);
- if (argc > 1) {
- int n;
- size_t unique = 2;
- Bool quit = False;
-
- for (n = 1; n < argc; n++) {
- TRACE(("parsing %s\n", argv[n]));
- if (abbrev(argv[n], "-version", unique)) {
- Version();
- quit = True;
- } else if (abbrev(argv[n], "-help", unique)) {
- Help();
- quit = True;
- } else if (abbrev(argv[n], "-class", (size_t) 3)) {
- if ((my_class = argv[++n]) == 0) {
- Help();
- quit = True;
- }
- }
- }
- if (quit)
- exit(0);
- }
-
- /* XXX: for some obscure reason EMX seems to lose the value of
- * the environ variable, don't understand why, so save it recently
- */
- gblenvp = envp;
-
-#ifdef I18N
- setlocale(LC_ALL, NULL);
-#endif
-
- opencons();
-
- ttydev = TypeMallocN(char, PTMS_BUFSZ);
- ptydev = TypeMallocN(char, PTMS_BUFSZ);
- if (!ttydev || !ptydev) {
- xtermWarning("unable to allocate memory for ttydev or ptydev\n");
- exit(1);
- }
- strcpy(ttydev, TTYDEV);
- strcpy(ptydev, PTYDEV);
-
- /* Initialization is done here rather than above in order
- * to prevent any assumptions about the order of the contents
- * of the various terminal structures (which may change from
- * implementation to implementation).
- */
- d_tio.c_iflag = ICRNL | IXON;
- d_tio.c_oflag = OPOST | ONLCR | TAB3;
- d_tio.c_cflag = B38400 | CS8 | CREAD | PARENB | HUPCL;
- d_tio.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK;
- d_tio.c_line = 0;
- d_tio.c_cc[VINTR] = CONTROL('C'); /* '^C' */
- d_tio.c_cc[VERASE] = ANSI_DEL; /* DEL */
- d_tio.c_cc[VKILL] = CONTROL('U'); /* '^U' */
- d_tio.c_cc[VQUIT] = CQUIT; /* '^\' */
- d_tio.c_cc[VEOF] = CEOF; /* '^D' */
- d_tio.c_cc[VEOL] = CEOL; /* '^@' */
-
- XtSetErrorHandler(xt_error);
-#if OPT_SESSION_MGT
- toplevel = XtOpenApplication(&app_con, my_class,
- optionDescList,
- XtNumber(optionDescList),
- &argc, argv, fallback_resources,
- sessionShellWidgetClass,
- NULL, 0);
- IceAddConnectionWatch(icewatch, NULL);
-#else
- toplevel = XtAppInitialize(&app_con, my_class,
- optionDescList,
- XtNumber(optionDescList),
- &argc, argv, fallback_resources,
- NULL, 0);
-#endif /* OPT_SESSION_MGT */
- XtSetErrorHandler((XtErrorHandler) 0);
-
- XtGetApplicationResources(toplevel, (XtPointer) &resource,
- application_resources,
- XtNumber(application_resources), NULL, 0);
- TRACE_XRES();
-#if OPT_MAXIMIZE
- resource.fullscreen = extendedBoolean(resource.fullscreen_s,
- tblFullscreen,
- XtNumber(tblFullscreen));
-#endif
-
- /*
- * ICCCM delete_window.
- */
- XtAppAddActions(app_con, actionProcs, XtNumber(actionProcs));
-
- /*
- * fill in terminal modes
- */
- if (resource.tty_modes) {
- int n = parse_tty_modes(resource.tty_modes, ttymodelist);
- if (n < 0) {
- xtermWarning("bad tty modes \"%s\"\n", resource.tty_modes);
- } else if (n > 0) {
- override_tty_modes = True;
- }
- }
- initZIconBeep();
- hold_screen = resource.hold_screen ? 1 : 0;
- if (resource.icon_geometry != NULL) {
- int scr, junk;
- int ix, iy;
- Arg args[2];
-
- for (scr = 0; /* yyuucchh */
- XtScreen(toplevel) != ScreenOfDisplay(XtDisplay(toplevel), scr);
- scr++) ;
-
- args[0].name = XtNiconX;
- args[1].name = XtNiconY;
- XGeometry(XtDisplay(toplevel), scr, resource.icon_geometry, "",
- 0, 0, 0, 0, 0, &ix, &iy, &junk, &junk);
- args[0].value = (XtArgVal) ix;
- args[1].value = (XtArgVal) iy;
- XtSetValues(toplevel, args, 2);
- }
-
- XtSetValues(toplevel, ourTopLevelShellArgs,
- number_ourTopLevelShellArgs);
-
-#if OPT_WIDE_CHARS
- /* seems as good a place as any */
- init_classtab();
-#endif
-
- /* Parse the rest of the command line */
- TRACE_ARGV("After XtOpenApplication", argv);
- for (argc--, argv++; argc > 0; argc--, argv++) {
- if (**argv != '-')
- Syntax(*argv);
-
- TRACE(("parsing %s\n", argv[0]));
- switch (argv[0][1]) {
- case 'h': /* -help */
- Help();
- exit(0);
- case 'v': /* -version */
- Version();
- exit(0);
- case 'C':
- {
- struct stat sbuf;
-
- /* Must be owner and have read/write permission.
- xdm cooperates to give the console the right user. */
- if (!stat("/dev/console", &sbuf) &&
- (sbuf.st_uid == save_ruid) &&
- !access("/dev/console", R_OK | W_OK)) {
- Console = True;
- } else
- Console = False;
- }
- continue;
- case 'S':
- if (sscanf(*argv + 2, "%c%c%d", passedPty, passedPty + 1,
- &am_slave) != 3)
- Syntax(*argv);
- continue;
-#ifdef DEBUG
- case 'D':
- debug = True;
- continue;
-#endif /* DEBUG */
- case 'c': /* -class param */
- if (strcmp(argv[0] + 1, "class") == 0)
- argc--, argv++;
- else
- Syntax(*argv);
- continue;
- case 'e':
- if (argc <= 1)
- Syntax(*argv);
- command_to_exec = ++argv;
- break;
- case 'i':
- if (argc <= 1) {
- Syntax(*argv);
- } else {
- char *endPtr;
- --argc;
- ++argv;
- winToEmbedInto = (Window) strtol(argv[0], &endPtr, 10);
- }
- continue;
-
- default:
- Syntax(*argv);
- }
- break;
- }
-
- SetupMenus(toplevel, &form_top, &menu_top, &menu_high);
-
- term = (XtermWidget) XtVaCreateManagedWidget("vt100", xtermWidgetClass,
- form_top,
-#if OPT_TOOLBAR
- XtNmenuBar, menu_top,
- XtNresizable, True,
- XtNfromVert, menu_top,
- XtNleft, XawChainLeft,
- XtNright, XawChainRight,
- XtNtop, XawChainTop,
- XtNbottom, XawChainBottom,
- XtNmenuHeight, menu_high,
-#endif
- (XtPointer) 0);
- decode_keyboard_type(term, &resource);
-
- screen = TScreenOf(term);
- screen->inhibit = 0;
-
-#ifdef ALLOWLOGGING
- if (term->misc.logInhibit)
- screen->inhibit |= I_LOG;
-#endif
- if (term->misc.signalInhibit)
- screen->inhibit |= I_SIGNAL;
-#if OPT_TEK4014
- if (term->misc.tekInhibit)
- screen->inhibit |= I_TEK;
-#endif
-
- /*
- * We might start by showing the tek4014 window.
- */
-#if OPT_TEK4014
- if (screen->inhibit & I_TEK)
- TEK4014_ACTIVE(term) = False;
-
- if (TEK4014_ACTIVE(term) && !TekInit())
- SysError(ERROR_INIT);
-#endif
-
- /*
- * Start the toolbar at this point, after the first window has been setup.
- */
-#if OPT_TOOLBAR
- ShowToolbar(resource.toolBar);
-#endif
-
-#if OPT_SESSION_MGT
- if (resource.sessionMgt) {
- TRACE(("Enabling session-management callbacks\n"));
- XtAddCallback(toplevel, XtNdieCallback, die_callback, NULL);
- XtAddCallback(toplevel, XtNsaveCallback, save_callback, NULL);
- }
-#endif
-
- /*
- * Set title and icon name if not specified
- */
- if (command_to_exec) {
- Arg args[2];
-
- if (!resource.title) {
- if (command_to_exec) {
- resource.title = x_basename(command_to_exec[0]);
- } /* else not reached */
- }
-
- if (!resource.icon_name)
- resource.icon_name = resource.title;
- XtSetArg(args[0], XtNtitle, resource.title);
- XtSetArg(args[1], XtNiconName, resource.icon_name);
-
- TRACE(("setting:\n\ttitle \"%s\"\n\ticon \"%s\"\n\thint \"%s\"\n\tbased on command \"%s\"\n",
- resource.title,
- resource.icon_name,
- NonNull(resource.icon_hint),
- *command_to_exec));
-
- XtSetValues(toplevel, args, 2);
- }
-#if OPT_LUIT_PROG
- if (term->misc.callfilter) {
- int u = (term->misc.use_encoding ? 2 : 0);
- if (command_to_exec) {
- int n;
- char **c;
- for (n = 0, c = command_to_exec; *c; n++, c++) ;
- c = TypeMallocN(char *, (unsigned) (n + 3 + u));
- if (c == NULL)
- SysError(ERROR_LUMALLOC);
- memcpy(c + 2 + u, command_to_exec, (unsigned) (n + 1) * sizeof(char *));
- c[0] = term->misc.localefilter;
- if (u) {
- c[1] = "-encoding";
- c[2] = term->misc.locale_str;
- }
- c[1 + u] = "--";
- command_to_exec_with_luit = c;
- } else {
- static char *luit[6];
- luit[0] = term->misc.localefilter;
- if (u) {
- luit[1] = "-encoding";
- luit[2] = term->misc.locale_str;
- luit[3] = NULL;
- } else
- luit[1] = NULL;
- command_to_exec_with_luit = luit;
- }
- }
-#endif
-
-#ifdef DEBUG
- {
- /* Set up stderr properly. Opening this log file cannot be
- done securely by a privileged xterm process (although we try),
- so the debug feature is disabled by default. */
- char dbglogfile[TIMESTAMP_LEN + 20];
- int i = -1;
- if (debug) {
- timestamp_filename(dbglogfile, "xterm.debug.log.");
- if (creat_as(save_ruid, save_rgid, False, dbglogfile, 0600) > 0) {
- i = open(dbglogfile, O_WRONLY | O_TRUNC);
- }
- }
- if (i >= 0) {
- dup2(i, 2);
-
- /* mark this file as close on exec */
- (void) fcntl(i, F_SETFD, 1);
- }
- }
-#endif /* DEBUG */
-
- spawnXTerm(term);
-
- /* Child process is out there, let's catch its termination */
- (void) signal(SIGCHLD, reapchild);
-
- /* Realize procs have now been executed */
-
- if (am_slave >= 0) { /* Write window id so master end can read and use */
- char buf[80];
-
- buf[0] = '\0';
- sprintf(buf, "%lx\n", XtWindow(SHELL_OF(CURRENT_EMU())));
- IGNORE_RC(write(screen->respond, buf, strlen(buf)));
- }
-
- if (0 > (mode = fcntl(screen->respond, F_GETFL, 0)))
- SysError(ERROR_F_GETFL);
- mode |= O_NDELAY;
-
- if (fcntl(screen->respond, F_SETFL, mode))
- SysError(ERROR_F_SETFL);
-
- FD_ZERO(&pty_mask);
- FD_ZERO(&X_mask);
- FD_ZERO(&Select_mask);
- FD_SET(screen->respond, &pty_mask);
- FD_SET(ConnectionNumber(screen->display), &X_mask);
- FD_SET(screen->respond, &Select_mask);
- FD_SET(ConnectionNumber(screen->display), &Select_mask);
- max_plus1 = ((screen->respond < ConnectionNumber(screen->display))
- ? (1 + ConnectionNumber(screen->display))
- : (1 + screen->respond));
-
-#ifdef DEBUG
- if (debug)
- printf("debugging on\n");
-#endif /* DEBUG */
- XSetErrorHandler(xerror);
- XSetIOErrorHandler(xioerror);
-
- initPtyData(&VTbuffer);
-#ifdef ALLOWLOGGING
- if (term->misc.log_on) {
- StartLog(term);
- }
-#endif
-
- TRACE(("checking winToEmbedInto %#lx\n", winToEmbedInto));
- if (winToEmbedInto != None) {
- XtRealizeWidget(toplevel);
- /*
- * This should probably query the tree or check the attributes of
- * winToEmbedInto in order to verify that it exists, but I'm still not
- * certain what is the best way to do it -GPS
- */
- TRACE(("...reparenting toplevel %#lx into %#lx\n",
- XtWindow(toplevel),
- winToEmbedInto));
- XReparentWindow(XtDisplay(toplevel),
- XtWindow(toplevel),
- winToEmbedInto, 0, 0);
- }
-#if OPT_COLOR_RES
- TRACE(("checking reverseVideo before rv %s fg %s, bg %s\n",
- term->misc.re_verse0 ? "reverse" : "normal",
- NonNull(TScreenOf(term)->Tcolors[TEXT_FG].resource),
- NonNull(TScreenOf(term)->Tcolors[TEXT_BG].resource)));
-
- if (term->misc.re_verse0) {
- if (isDefaultForeground(TScreenOf(term)->Tcolors[TEXT_FG].resource)
- && isDefaultBackground(TScreenOf(term)->Tcolors[TEXT_BG].resource)) {
- TScreenOf(term)->Tcolors[TEXT_FG].resource = x_strdup(XtDefaultBackground);
- TScreenOf(term)->Tcolors[TEXT_BG].resource = x_strdup(XtDefaultForeground);
- } else {
- ReverseVideo(term);
- }
- term->misc.re_verse = True;
- update_reversevideo();
- TRACE(("updated reverseVideo after rv %s fg %s, bg %s\n",
- term->misc.re_verse ? "reverse" : "normal",
- NonNull(TScreenOf(term)->Tcolors[TEXT_FG].resource),
- NonNull(TScreenOf(term)->Tcolors[TEXT_BG].resource)));
- }
-#endif /* OPT_COLOR_RES */
-
-#if OPT_MAXIMIZE
- if (resource.maximized)
- RequestMaximize(term, True);
-#endif
- for (;;) {
-#if OPT_TEK4014
- if (TEK4014_ACTIVE(term))
- TekRun();
- else
-#endif
- VTRun(term);
- }
- return 0;
-}
-
-/*
- * Called from get_pty to iterate over likely pseudo terminals
- * we might allocate. Used on those systems that do not have
- * a functional interface for allocating a pty.
- * Returns 0 if found a pty, 1 if fails.
- */
-static int
-pty_search(int *pty)
-{
- char namebuf[PTMS_BUFSZ];
-
- /* ask the PTY manager */
- int fd = open("/dev/ptms$", 0);
- if (fd && ptioctl(fd, PTMS_GETPTY, namebuf) == 0) {
- strcpy(ttydev, namebuf);
- strcpy(ptydev, namebuf);
- *x_basename(ttydev) = 't';
- close(fd);
- if ((*pty = open(ptydev, O_RDWR)) >= 0) {
-#ifdef PTYDEBUG
- ptioctl(*pty, XTY_TRACE, 0);
-#endif
- return 0;
- } else {
- xtermWarning("Unable to open %s, errno=%d\n", ptydev, errno);
- }
- }
- return 1;
-}
-
-/*
- * This function opens up a pty master and stuffs its value into pty.
- *
- * If it finds one, it returns a value of 0. If it does not find one,
- * it returns a value of !0. This routine is designed to be re-entrant,
- * so that if a pty master is found and later, we find that the slave
- * has problems, we can re-enter this function and get another one.
- */
-static int
-get_pty(int *pty)
-{
- return pty_search(pty);
-}
-
-/*
- * The only difference in /etc/termcap between 4014 and 4015 is that
- * the latter has support for switching character sets. We support the
- * 4015 protocol, but ignore the character switches. Therefore, we
- * choose 4014 over 4015.
- *
- * Features of the 4014 over the 4012: larger (19") screen, 12-bit
- * graphics addressing (compatible with 4012 10-bit addressing),
- * special point plot mode, incremental plot mode (not implemented in
- * later Tektronix terminals), and 4 character sizes.
- * All of these are supported by xterm.
- */
-
-#if OPT_TEK4014
-static char *tekterm[] =
-{
- "tek4014",
- "tek4015", /* 4014 with APL character set support */
- "tek4012", /* 4010 with lower case */
- "tek4013", /* 4012 with APL character set support */
- "tek4010", /* small screen, upper-case only */
- "dumb",
- 0
-};
-#endif
-
-/* The VT102 is a VT100 with the Advanced Video Option included standard.
- * It also adds Escape sequences for insert/delete character/line.
- * The VT220 adds 8-bit character sets, selective erase.
- * The VT320 adds a 25th status line, terminal state interrogation.
- * The VT420 has up to 48 lines on the screen.
- */
-
-static const char *vtterm[] =
-{
-#ifdef USE_X11TERM
- "x11term", /* for people who want special term name */
-#endif
- DFT_TERMTYPE, /* for people who want special term name */
- "xterm", /* the prefered name, should be fastest */
- "vt102",
- "vt100",
- "ansi",
- "dumb",
- 0
-};
-
-/* ARGSUSED */
-static SIGNAL_T
-hungtty(int i GCC_UNUSED)
-{
- longjmp(env, 1);
- SIGNAL_RETURN;
-}
-
-#if OPT_PTY_HANDSHAKE
-struct {
- int rows;
- int cols;
-} handshake = {
-
- -1, -1
-};
-
-void
-first_map_occurred(void)
-{
- if (resource.wait_for_map) {
- TScreen *screen = TScreenOf(term);
- handshake.rows = screen->max_row;
- handshake.cols = screen->max_col;
- resource.wait_for_map = False;
- }
-}
-#endif /* OPT_PTY_HANDSHAKE else !OPT_PTY_HANDSHAKE */
-
-static void
-set_owner(char *device, uid_t uid, gid_t gid, mode_t mode)
-{
- int why;
-
- if (chown(device, uid, gid) < 0) {
- why = errno;
- if (why != ENOENT
- && save_ruid == 0) {
- xtermPerror("Cannot chown %s to %ld,%ld",
- device, (long) uid, (long) gid);
- }
- }
-}
-
-#define THE_PARENT 1
-#define THE_CHILD 2
-int whoami = -1;
-
-SIGNAL_T
-killit(int sig)
-{
- switch (whoami) {
- case -1:
- signal(sig, killit);
- kill(-getpid(), sig);
- break;
- case THE_PARENT:
- wait(NULL);
- signal(SIGTERM, SIG_DFL);
- kill(-getpid(), SIGTERM);
- Exit(0);
- break;
- case THE_CHILD:
- signal(SIGTERM, SIG_DFL);
- kill(-getppid(), SIGTERM);
- Exit(0);
- break;
- }
-
- SIGNAL_RETURN;
-}
-
-#define close_fd(fd) close(fd), fd = -1
-
-static int
-spawnXTerm(XtermWidget xw)
-/*
- * Inits pty and tty and forks a login process.
- * Does not close fd Xsocket.
- * If slave, the pty named in passedPty is already open for use
- */
-{
- TScreen *screen = TScreenOf(xw);
- int Xsocket = ConnectionNumber(screen->display);
-
- int ttyfd = -1;
- TERMIO_STRUCT tio;
- int status;
- Bool ok_termcap;
-
- char *TermName = NULL;
- char *ptr, *shname, buf[64];
- int i, no_dev_tty = False;
- char *dev_tty_name = (char *) 0;
- TTYSIZE_STRUCT ts;
- int pgrp = getpid();
- char numbuf[12], **envnew;
-
- screen->uid = save_ruid;
- screen->gid = save_rgid;
-
- if (am_slave >= 0) {
- screen->respond = am_slave;
- ptydev[strlen(ptydev) - 2] =
- ttydev[strlen(ttydev) - 2] = passedPty[0];
- ptydev[strlen(ptydev) - 1] =
- ttydev[strlen(ttydev) - 1] = passedPty[1];
-
- (void) xtermResetIds(screen);
- } else {
- Bool tty_got_hung;
-
- /*
- * Sometimes /dev/tty hangs on open (as in the case of a pty
- * that has gone away). Simply make up some reasonable
- * defaults.
- */
-
- signal(SIGALRM, hungtty);
- alarm(2); /* alarm(1) might return too soon */
- if (!setjmp(env)) {
- ttyfd = open("/dev/tty", O_RDWR);
- alarm(0);
- tty_got_hung = False;
- } else {
- tty_got_hung = True;
- ttyfd = -1;
- errno = ENXIO;
- }
- signal(SIGALRM, SIG_DFL);
-
- /*
- * Check results and ignore current control terminal if
- * necessary. ENXIO is what is normally returned if there is
- * no controlling terminal, but some systems (e.g. SunOS 4.0)
- * seem to return EIO. Solaris 2.3 is said to return EINVAL.
- */
- if (ttyfd < 0) {
- if (tty_got_hung || errno == ENXIO || errno == EIO ||
- errno == EINVAL || errno == ENOTTY) {
- no_dev_tty = True;
- tio = d_tio;
- } else {
- SysError(ERROR_OPDEVTTY);
- }
- } else {
-
- /* Get a copy of the current terminal's state,
- * if we can. Some systems (e.g., SVR4 and MacII)
- * may not have a controlling terminal at this point
- * if started directly from xdm or xinit,
- * in which case we just use the defaults as above.
- */
- if (ioctl(ttyfd, TCGETA, &tio) == -1)
- tio = d_tio;
-
- close_fd(ttyfd);
- }
-
- if (get_pty(&screen->respond)) {
- /* no ptys! */
- exit(ERROR_PTYS);
- }
- }
-
- /* avoid double MapWindow requests */
- XtSetMappedWhenManaged(SHELL_OF(CURRENT_EMU()), False);
-
- wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW",
- False);
-
- if (!TEK4014_ACTIVE(xw))
- VTInit(xw); /* realize now so know window size for tty driver */
-
- if (Console) {
- /*
- * Inform any running xconsole program
- * that we are going to steal the console.
- */
- XmuGetHostname(mit_console_name + MIT_CONSOLE_LEN, 255);
- mit_console = XInternAtom(screen->display, mit_console_name, False);
- /* the user told us to be the console, so we can use CurrentTime */
- XtOwnSelection(SHELL_OF(CURRENT_EMU()),
- mit_console, CurrentTime,
- ConvertConsoleSelection, NULL, NULL);
- }
-#if OPT_TEK4014
- if (TEK4014_ACTIVE(xw)) {
- envnew = tekterm;
- } else
-#endif
- {
- envnew = vtterm;
- }
-
- /*
- * This used to exit if no termcap entry was found for the specified
- * terminal name. That's a little unfriendly, so instead we'll allow
- * the program to proceed (but not to set $TERMCAP) if the termcap
- * entry is not found.
- */
- ok_termcap = True;
- if (!get_termcap(xw, TermName = resource.term_name)) {
- const char *last = NULL;
- char *next;
-
- TermName = x_strdup(*envnew);
- ok_termcap = False;
- while (*envnew != NULL) {
- if (last == NULL || strcmp(last, *envnew)) {
- next = x_strdup(*envnew);
- if (get_termcap(xw, next)) {
- free(TermName);
- TermName = next;
- ok_termcap = True;
- break;
- } else {
- free(next);
- }
- }
- last = *envnew;
- envnew++;
- }
- }
- if (ok_termcap) {
- resource.term_name = TermName;
- resize_termcap(xw);
- }
-
- /* tell tty how big window is */
-#if OPT_TEK4014
- if (TEK4014_ACTIVE(xw)) {
- TTYSIZE_ROWS(ts) = 38;
- TTYSIZE_COLS(ts) = 81;
- ts.ws_xpixel = TFullWidth(TekScreenOf(tekWidget));
- ts.ws_ypixel = TFullHeight(TekScreenOf(tekWidget));
- } else
-#endif
- {
- TTYSIZE_ROWS(ts) = MaxRows(screen);
- TTYSIZE_COLS(ts) = MaxCols(screen);
- ts.ws_xpixel = FullWidth(screen);
- ts.ws_ypixel = FullHeight(screen);
- }
-
- if (am_slave < 0) {
-
- char sema[40];
- HEV sev;
- /* start a child process
- * use an event sema for sync
- */
- sprintf(sema, "\\SEM32\\xterm%s", &ptydev[8]);
- if (DosCreateEventSem(sema, &sev, DC_SEM_SHARED, False))
- SysError(ERROR_FORK);
-
- switch ((screen->pid = fork())) {
- case -1: /* error */
- SysError(ERROR_FORK);
- default: /* parent */
- whoami = THE_PARENT;
- DosWaitEventSem(sev, 1000L);
- DosCloseEventSem(sev);
- break;
- case 0: /* child */
- whoami = THE_CHILD;
-
- opencons();
- /* we don't need the socket, or the pty master anymore */
- close(ConnectionNumber(screen->display));
- close(screen->respond);
-
- /* Now is the time to set up our process group and
- * open up the pty slave.
- */
- if ((ttyfd = open(ttydev, O_RDWR)) < 0) {
- /* dumm gelaufen */
- xtermWarning("Cannot open slave side of PTY\n");
- exit(1);
- }
-
- /* use the same tty name that everyone else will use
- * (from ttyname)
- */
-#ifdef EMXNOTBOGUS
- if ((ptr = ttyname(ttyfd)) != 0) {
- ttydev = x_strdup(ptr);
- }
-#else
- ptr = ttydev;
-#endif
- /* for safety: enable DUPs */
- ptioctl(ttyfd, XTY_ENADUP, 0);
-
- /* change ownership of tty to real group and user id */
- set_owner(ttydev, screen->uid, screen->gid,
- (resource.messages ? 0622U : 0600U));
-
- /* for the xf86sup-pty, we set the pty to bypass: OS/2 does
- * not have a line discipline structure
- */
- {
- TERMIO_STRUCT t, t1;
- if (ptioctl(ttyfd, TCGETA, (char *) &t) < 0)
- t = d_tio;
-
- t.c_iflag = ICRNL;
- t.c_oflag = OPOST | ONLCR;
- t.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK;
-
- /* ignore error code, user will see it :-) */
- ptioctl(ttyfd, TCSETA, (char *) &t);
-
- /* set the console mode */
- if (Console) {
- int on = 1;
- if (ioctl(ttyfd, TIOCCONS, (char *) &on) == -1)
- xtermPerror("cannot open console");
- }
- }
-
- signal(SIGCHLD, SIG_DFL);
- signal(SIGHUP, SIG_IGN);
-
- /* restore various signals to their defaults */
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- signal(SIGTERM, SIG_DFL);
-
- xtermCopyEnv(gblenvp);
-
- xtermSetenv("TERM", resource.term_name);
- if (!resource.term_name)
- *get_tcap_buffer(xw) = 0;
-
- sprintf(buf, "%lu",
- ((unsigned long) XtWindow(SHELL_OF(CURRENT_EMU()))));
- xtermSetenv("WINDOWID", buf);
-
- /* put the display into the environment of the shell */
- xtermSetenv("DISPLAY", XDisplayString(screen->display));
-
- xtermSetenv("XTERM_VERSION", xtermVersion());
- xtermSetenv("XTERM_LOCALE", xtermEnvLocale());
-
- signal(SIGTERM, SIG_DFL);
-
- /* this is the time to go and set up stdin, out, and err
- */
- /* dup the tty */
- for (i = 0; i <= 2; i++)
- if (i != ttyfd) {
- IGNORE_RC(close(i));
- IGNORE_RC(dup(ttyfd));
- }
-
- /* and close the tty */
- if (ttyfd > 2)
- close_fd(ttyfd);
-
- setpgrp(0, pgrp);
- (void) xtermResetIds(screen);
-
- if (handshake.rows > 0 && handshake.cols > 0) {
- TRACE(("handshake ttysize: %dx%d\n",
- handshake.rows, handshake.cols));
- set_max_row(screen, handshake.rows);
- set_max_col(screen, handshake.cols);
- TTYSIZE_ROWS(ts) = (ttySize_t) MaxRows(screen);
- TTYSIZE_COLS(ts) = (ttySize_t) MaxCols(screen);
- ts.ws_xpixel = (ttySize_t) FullWidth(screen);
- ts.ws_ypixel = (ttySize_t) FullHeight(screen);
- }
-
- sprintf(numbuf, "%d", MaxCols(screen));
- xtermSetenv("COLUMNS", numbuf);
- sprintf(numbuf, "%d", MaxRows(screen));
- xtermSetenv("LINES", numbuf);
-
- gblenvp = environ;
-
- /* need to reset after all the ioctl bashing we did above */
- ptioctl(0, TIOCSWINSZ, (char *) &ts);
-
- signal(SIGHUP, SIG_DFL);
-
- /* okay everything seems right, so tell the parent, we are going */
- {
- char sema[40];
- HEV sev;
- sprintf(sema, "\\SEM32\\xterm%s", &ttydev[8]);
- DosOpenEventSem(sema, &sev);
- DosPostEventSem(sev);
- DosCloseEventSem(sev);
- }
-
-#if OPT_LUIT_PROG
- /*
- * Use two copies of command_to_exec, in case luit is not actually
- * there, or refuses to run. In that case we will fall-through to
- * to command that the user gave anyway.
- */
- if (command_to_exec_with_luit) {
- xtermSetenv("XTERM_SHELL",
- xtermFindShell(*command_to_exec_with_luit, False));
- TRACE(("spawning command \"%s\"\n", *command_to_exec_with_luit));
- execvp(*command_to_exec_with_luit, command_to_exec_with_luit);
- xtermPerror("Can't execvp %s", *command_to_exec_with_luit);
- xtermWarning("cannot support your locale.\n");
- }
-#endif
- if (command_to_exec) {
- xtermSetenv("XTERM_SHELL",
- xtermFindShell(*command_to_exec, False));
- TRACE(("spawning command \"%s\"\n", *command_to_exec));
- execvpe(*command_to_exec, command_to_exec, gblenvp);
-
- /* print error message on screen */
- xtermWarning("Can't execvp %s\n", *command_to_exec);
- }
-
- /* use a layered mechanism to find a shell */
- ptr = x_getenv("X11SHELL");
- if (!ptr)
- ptr = x_getenv("SHELL");
- if (!ptr)
- ptr = x_getenv("OS2_SHELL");
- if (!ptr)
- ptr = "SORRY_NO_SHELL_FOUND";
- xtermSetenv("XTERM_SHELL", ptr);
-
- shname = x_basename(ptr);
- if (command_to_exec) {
- char *exargv[10]; /*XXX */
-
- exargv[0] = ptr;
- exargv[1] = "/C";
- exargv[2] = command_to_exec[0];
- exargv[3] = command_to_exec[1];
- exargv[4] = command_to_exec[2];
- exargv[5] = command_to_exec[3];
- exargv[6] = command_to_exec[4];
- exargv[7] = command_to_exec[5];
- exargv[8] = command_to_exec[6];
- exargv[9] = 0;
- execvpe(exargv[0], exargv, gblenvp);
-
- /* print error message on screen */
- xtermWarning("Can't execvp %s\n", *command_to_exec);
- } else {
- execlpe(ptr, shname, 0, gblenvp);
-
- /* Exec failed. */
- xtermWarning("Could not exec %s!\n", ptr);
- }
- sleep(5);
-
- /* preventively shoot the parent */
- kill(-getppid(), SIGTERM);
-
- exit(ERROR_EXEC);
- } /* endcase */
- }
- /* !am_slave */
- signal(SIGHUP, SIG_IGN);
-/*
- * Unfortunately, System V seems to have trouble divorcing the child process
- * from the process group of xterm. This is a problem because hitting the
- * INTR or QUIT characters on the keyboard will cause xterm to go away if we
- * don't ignore the signals. This is annoying.
- */
-
-/* signal (SIGINT, SIG_IGN);*/
- signal(SIGINT, killit);
- signal(SIGTERM, killit);
-
- /* hung shell problem */
- signal(SIGQUIT, SIG_IGN);
-/* signal (SIGTERM, SIG_IGN);*/
- return 0;
-} /* end spawnXTerm */
-
-SIGNAL_T
-Exit(int n)
-{
- XtermWidget xw = term;
- TScreen *screen = TScreenOf(xw);
- int pty = TScreenOf(xw)->respond;
- close(pty); /* close explicitly to avoid race with slave side */
-#ifdef ALLOWLOGGING
- if (screen->logging)
- CloseLog(xw);
-#endif
- if (am_slave < 0) {
- /* restore ownership of tty and pty */
- set_owner(ttydev, 0, 0, 0666U);
- set_owner(ptydev, 0, 0, 0666U);
- }
-
- /*
- * Close after releasing ownership to avoid race condition: other programs
- * grabbing it, and *then* having us release ownership....
- */
- close(screen->respond); /* close explicitly to avoid race with slave side */
-#ifdef ALLOWLOGGING
- if (screen->logging)
- CloseLog(xw);
-#endif
-
-#ifdef NO_LEAKS
- if (n == 0) {
- TRACE(("Freeing memory leaks\n"));
- if (xw != 0) {
- Display *dpy = TScreenOf(xw)->display;
-
- if (toplevel) {
- XtDestroyWidget(toplevel);
- TRACE(("destroyed top-level widget\n"));
- }
- sortedOpts(0, 0, 0);
- noleaks_charproc();
- noleaks_ptydata();
-#if OPT_WIDE_CHARS
- noleaks_CharacterClass();
-#endif
- /* XrmSetDatabase(dpy, 0); increases leaks ;-) */
- XtCloseDisplay(dpy);
- XtDestroyApplicationContext(app_con);
-#if OPT_SESSION_MGT
- IceRemoveConnectionWatch(icewatch, NULL);
-#endif
- TRACE(("closed display\n"));
- }
- TRACE_CLOSE();
- }
-#endif
-
- exit(n);
- SIGNAL_RETURN;
-}
-
-/* ARGSUSED */
-static void
-resize_termcap(XtermWidget xw)
-{
-}
-
-/*
- * Does a non-blocking wait for a child process. If the system
- * doesn't support non-blocking wait, do nothing.
- * Returns the pid of the child, or 0 or -1 if none or error.
- */
-int
-nonblocking_wait(void)
-{
- pid_t pid;
-
- pid = waitpid(-1, NULL, WNOHANG);
- return pid;
-}
-
-/* ARGSUSED */
-static SIGNAL_T
-reapchild(int n GCC_UNUSED)
-{
- int olderrno = errno;
- int pid;
-
- pid = wait(NULL);
-
- /* cannot re-enable signal before waiting for child
- * because then SVR4 loops. Sigh. HP-UX 9.01 too.
- */
- (void) signal(SIGCHLD, reapchild);
-
- do {
- if (pid == TScreenOf(term)->pid) {
-#ifdef DEBUG
- if (debug)
- fputs("Exiting\n", stderr);
-#endif
- if (!hold_screen)
- need_cleanup = True;
- }
- } while ((pid = nonblocking_wait()) > 0);
-
- errno = olderrno;
- SIGNAL_RETURN;
-}
-
-/*
- * parse_tty_modes accepts lines of the following form:
- *
- * [SETTING] ...
- *
- * where setting consists of the words in the modelist followed by a character
- * or ^char.
- */
-static int
-parse_tty_modes(char *s, struct _xttymodes *modelist)
-{
- struct _xttymodes *mp;
- int c;
- int count = 0;
-
- TRACE(("parse_tty_modes\n"));
- for (;;) {
- size_t len;
-
- while (*s && isascii(CharOf(*s)) && isspace(CharOf(*s)))
- s++;
- if (!*s)
- return count;
-
- for (len = 0; isalnum(CharOf(s[len])); ++len) ;
- for (mp = modelist; mp->name; mp++) {
- if (len == mp->len
- && strncmp(s, mp->name, mp->len) == 0)
- break;
- }
- if (!mp->name)
- return -1;
-
- s += mp->len;
- while (*s && isascii(CharOf(*s)) && isspace(CharOf(*s)))
- s++;
- if (!*s)
- return -1;
-
- if ((c = decode_keyvalue(&s, False)) != -1) {
- mp->value = c;
- mp->set = 1;
- count++;
- TRACE(("...parsed #%d: %s=%#x\n", count, mp->name, c));
- }
- }
-}
-
-int
-GetBytesAvailable(int fd)
-{
- long arg;
- ioctl(fd, FIONREAD, (char *) &arg);
- return (int) arg;
-}
-
-/* Utility function to try to hide system differences from
- everybody who used to call killpg() */
-
-int
-kill_process_group(int pid, int sig)
-{
- return kill(-pid, sig);
-}
-
-int
-ptioctl(int fd, int func, void *data)
-{
- APIRET rc;
- ULONG len;
- struct pt_termios pt;
- TERMIO_STRUCT *t;
- int i;
-
- switch (func) {
- case TCGETA:
- rc = DosDevIOCtl(fd, XFREE86_PTY, XTY_TIOCGETA,
- NULL, 0, NULL,
- (ULONG *) & pt, sizeof(struct pt_termios), &len);
- if (rc)
- return -1;
- t = (TERMIO_STRUCT *) data;
- t->c_iflag = pt.c_iflag;
- t->c_oflag = pt.c_oflag;
- t->c_cflag = pt.c_cflag;
- t->c_lflag = pt.c_lflag;
- for (i = 0; i < NCC; i++)
- t->c_cc[i] = pt.c_cc[i];
- return 0;
- case TCSETA:
- case TCSETAW:
- case TCSETAF:
- t = (TERMIO_STRUCT *) data;
- pt.c_iflag = t->c_iflag;
- pt.c_oflag = t->c_oflag;
- pt.c_cflag = t->c_cflag;
- pt.c_lflag = t->c_lflag;
-
- for (i = 0; i < NCC; i++)
- pt.c_cc[i] = t->c_cc[i];
- if (func == TCSETA)
- i = XTY_TIOCSETA;
- else if (func == TCSETAW)
- i = XTY_TIOCSETAW;
- else
- i = XTY_TIOCSETAF;
- rc = DosDevIOCtl(fd, XFREE86_PTY, i,
- (ULONG *) & pt, sizeof(struct pt_termios), &len,
- NULL, 0, NULL);
- return (rc) ? -1 : 0;
- case TIOCCONS:
- return DosDevIOCtl(fd, XFREE86_PTY, XTY_TIOCCONS,
- (ULONG *) data, sizeof(ULONG), &len,
- NULL, 0, NULL);
- case TIOCSWINSZ:
- return DosDevIOCtl(fd, XFREE86_PTY, XTY_TIOCSWINSZ,
- (ULONG *) data, sizeof(TTYSIZE_STRUCT), &len,
- NULL, 0, NULL);
- case TIOCGWINSZ:
- return DosDevIOCtl(fd, XFREE86_PTY, XTY_TIOCGWINSZ,
- NULL, 0, NULL,
- (ULONG *) data, sizeof(TTYSIZE_STRUCT), &len);
- case XTY_ENADUP:
- i = 1;
- return DosDevIOCtl(fd, XFREE86_PTY, XTY_ENADUP,
- (ULONG *) & i, sizeof(ULONG), &len,
- NULL, 0, NULL);
- case XTY_TRACE:
- i = 2;
- return DosDevIOCtl(fd, XFREE86_PTY, XTY_TRACE,
- (ULONG *) & i, sizeof(ULONG), &len,
- NULL, 0, NULL);
- case PTMS_GETPTY:
- i = 1;
- return DosDevIOCtl(fd, XFREE86_PTY, PTMS_GETPTY,
- (ULONG *) & i, sizeof(ULONG), &len,
- (UCHAR *) data, 14, &len);
- default:
- return -1;
- }
-}