(void) setuid (screen->uid);  (void) setgid (screen->gid); done_setuid = 1;
static char *base_name PROTO((char *name));static int pty_search PROTO((int *pty));static int remove_termcap_entry PROTO((char *buf, char *str));static int spawn PROTO((void));static void DeleteWindow PROTO_XT_ACTIONS_ARGS;static void Help PROTO((void));static void KeyboardMapping PROTO_XT_ACTIONS_ARGS;static void Syntax PROTO((char *badOption));static void Version PROTO((void));static void get_terminal PROTO((void));static void my_error_handler PROTO((String message));static void resize PROTO((TScreen *s, char *oldtc, char *newtc));static SIGNAL_T reapchild PROTO((int n));static Bool added_utmp_entry = False;static char **command_to_exec;/* 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 ('D'&037)#endif#ifndef CSUSP#define CSUSP ('Z'&037)#endif#ifndef CQUIT#define CQUIT ('\\'&037)#endif#ifndef CEOL#define CEOL 0#endif#ifndef CSWTCH#define CSWTCH 0#endif#ifndef CLNEXT#define CLNEXT ('V'&037)#endif#ifndef CWERASE#define CWERASE ('W'&037)#endif#ifndef CRPRNT#define CRPRNT ('R'&037)#endif#ifndef CFLUSH#define CFLUSH ('O'&037)#endif#ifndef CSTOP#define CSTOP ('S'&037)#endif#ifndef CSTART#define CSTART ('Q'&037)#endif/* * 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. */static int override_tty_modes = 0;struct _xttymodes {    char *name;    int len;    int set;    char value;} ttymodelist[] = {{ "intr", 4, 0, '\0' },			/* tchars.t_intrc ; VINTR */#define XTTYMODE_intr 0{ "quit", 4, 0, '\0' },			/* tchars.t_quitc ; VQUIT */#define XTTYMODE_quit 1{ "erase", 5, 0, '\0' },		/* sgttyb.sg_erase ; VERASE */#define XTTYMODE_erase 2{ "kill", 4, 0, '\0' },			/* sgttyb.sg_kill ; VKILL */#define XTTYMODE_kill 3{ "eof", 3, 0, '\0' },			/* tchars.t_eofc ; VEOF */#define XTTYMODE_eof 4{ "eol", 3, 0, '\0' },			/* VEOL */#define XTTYMODE_eol 5{ "swtch", 5, 0, '\0' },		/* VSWTCH */#define XTTYMODE_swtch 6{ "start", 5, 0, '\0' },		/* tchars.t_startc */#define XTTYMODE_start 7{ "stop", 4, 0, '\0' },			/* tchars.t_stopc */#define XTTYMODE_stop 8{ "brk", 3, 0, '\0' },			/* tchars.t_brkc */#define XTTYMODE_brk 9{ "susp", 4, 0, '\0' },			/* ltchars.t_suspc ; VSUSP */#define XTTYMODE_susp 10{ "dsusp", 5, 0, '\0' },		/* ltchars.t_dsuspc ; VDSUSP */#define XTTYMODE_dsusp 11{ "rprnt", 5, 0, '\0' },		/* ltchars.t_rprntc ; VREPRINT */#define XTTYMODE_rprnt 12{ "flush", 5, 0, '\0' },		/* ltchars.t_flushc ; VDISCARD */#define XTTYMODE_flush 13{ "weras", 5, 0, '\0' },		/* ltchars.t_werasc ; VWERASE */#define XTTYMODE_weras 14{ "lnext", 5, 0, '\0' },		/* ltchars.t_lnextc ; VLNEXT */#define XTTYMODE_lnext 15{ NULL, 0, 0, '\0' },			/* end of data */};static int parse_tty_modes PROTO((char *s, struct _xttymodes *modelist));static int inhibit;static char passedPty[2];	/* name if pty if slave */#ifdef __EMX__#define TIOCCONS	108#endifstatic 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;char *ProgramName;static struct _resource {    char *xterm_name;    char *icon_geometry;    char *title;    char *icon_name;    char *term_name;    char *tty_modes;    Boolean utmpInhibit;    Boolean sunFunctionKeys;	/* %%% should be widget resource? */#if OPT_SUNPC_KBD    Boolean sunKeyboard;#endif    Boolean wait_for_map;    Boolean useInsertMode;} resource;/* used by VT (charproc.c) */#define offset(field)	XtOffsetOf(struct _resource, field)static XtResource application_resources[] = {    {"name", "Name", XtRString, sizeof(char *),	offset(xterm_name), XtRString, DFT_TERMTYPE},    {"iconGeometry", "IconGeometry", XtRString, sizeof(char *),	offset(icon_geometry), XtRString, (caddr_t) NULL},    {XtNtitle, XtCTitle, XtRString, sizeof(char *),	offset(title), XtRString, (caddr_t) NULL},    {XtNiconName, XtCIconName, XtRString, sizeof(char *),	offset(icon_name), XtRString, (caddr_t) NULL},    {"termName", "TermName", XtRString, sizeof(char *),	offset(term_name), XtRString, (caddr_t) NULL},    {"ttyModes", "TtyModes", XtRString, sizeof(char *),	offset(tty_modes), XtRString, (caddr_t) NULL},    {"utmpInhibit", "UtmpInhibit", XtRBoolean, sizeof (Boolean),	offset(utmpInhibit), XtRString, "false"},    {"sunFunctionKeys", "SunFunctionKeys", XtRBoolean, sizeof (Boolean),	offset(sunFunctionKeys), XtRString, "false"},#if OPT_SUNPC_KBD    {"sunKeyboard", "SunKeyboard", XtRBoolean, sizeof (Boolean),	offset(sunKeyboard), XtRString, "false"},#endif    {"waitForMap", "WaitForMap", XtRBoolean, sizeof (Boolean),        offset(wait_for_map), XtRString, "false"},    {"useInsertMode", "UseInsertMode", XtRBoolean, sizeof (Boolean),        offset(useInsertMode), XtRString, "false"},};#undef offsetstatic char *fallback_resources[] = {    "XTerm*SimpleMenu*menuLabel.vertSpace: 100",    "XTerm*SimpleMenu*HorizontalMargins: 16",    "XTerm*SimpleMenu*Sme.height: 16",    "XTerm*SimpleMenu*Cursor: left_ptr",    "XTerm*mainMenu.Label:  Main Options (no app-defaults)",    "XTerm*vtMenu.Label:  VT Options (no app-defaults)",    "XTerm*fontMenu.Label:  VT Fonts (no app-defaults)",#if OPT_TEK4014    "XTerm*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. */static XrmOptionDescRec optionDescList[] = {{"-geometry",	"*vt100.geometry",XrmoptionSepArg,	(caddr_t) NULL},{"-132",	"*c132",	XrmoptionNoArg,		(caddr_t) "on"},{"+132",	"*c132",	XrmoptionNoArg,		(caddr_t) "off"},{"-ah",		"*alwaysHighlight", XrmoptionNoArg,	(caddr_t) "on"},{"+ah",		"*alwaysHighlight", XrmoptionNoArg,	(caddr_t) "off"},{"-aw",		"*autoWrap",	XrmoptionNoArg,		(caddr_t) "on"},{"+aw",		"*autoWrap",	XrmoptionNoArg,		(caddr_t) "off"},#ifndef NO_ACTIVE_ICON{"-ai",		"*activeIcon",	XrmoptionNoArg,		(caddr_t) "off"},{"+ai",		"*activeIcon",	XrmoptionNoArg,		(caddr_t) "on"},#endif /* NO_ACTIVE_ICON */{"-b",		"*internalBorder",XrmoptionSepArg,	(caddr_t) NULL},{"-bdc",	"*colorBDMode",	XrmoptionNoArg,		(caddr_t) "off"},{"+bdc",	"*colorBDMode",	XrmoptionNoArg,		(caddr_t) "on"},{"-cb",		"*cutToBeginningOfLine", XrmoptionNoArg, (caddr_t) "off"},{"+cb",		"*cutToBeginningOfLine", XrmoptionNoArg, (caddr_t) "on"},{"-cc",		"*charClass",	XrmoptionSepArg,	(caddr_t) NULL},{"-cm",		"*colorMode",	XrmoptionNoArg,		(caddr_t) "off"},{"+cm",		"*colorMode",	XrmoptionNoArg,		(caddr_t) "on"},{"-cn",		"*cutNewline",	XrmoptionNoArg,		(caddr_t) "off"},{"+cn",		"*cutNewline",	XrmoptionNoArg,		(caddr_t) "on"},{"-cr",		"*cursorColor",	XrmoptionSepArg,	(caddr_t) NULL},{"-cu",		"*curses",	XrmoptionNoArg,		(caddr_t) "on"},{"+cu",		"*curses",	XrmoptionNoArg,		(caddr_t) "off"},{"-dc",		"*dynamicColors",XrmoptionNoArg,	(caddr_t) "off"},{"+dc",		"*dynamicColors",XrmoptionNoArg,	(caddr_t) "on"},{"-e",		NULL,		XrmoptionSkipLine,	(caddr_t) NULL},{"-fb",		"*boldFont",	XrmoptionSepArg,	(caddr_t) NULL},#ifndef NO_ACTIVE_ICON{"-fi",		"*iconFont",	XrmoptionSepArg,	(caddr_t) NULL},#endif /* NO_ACTIVE_ICON */#if OPT_HIGHLIGHT_COLOR{"-hc",		"*highlightColor", XrmoptionSepArg,	(caddr_t) NULL},#endif{"-j",		"*jumpScroll",	XrmoptionNoArg,		(caddr_t) "on"},{"+j",		"*jumpScroll",	XrmoptionNoArg,		(caddr_t) "off"},/* parse logging options anyway for compatibility */{"-l",		"*logging",	XrmoptionNoArg,		(caddr_t) "on"},{"+l",		"*logging",	XrmoptionNoArg,		(caddr_t) "off"},{"-lf",		"*logFile",	XrmoptionSepArg,	(caddr_t) NULL},{"-ls",		"*loginShell",	XrmoptionNoArg,		(caddr_t) "on"},{"+ls",		"*loginShell",	XrmoptionNoArg,		(caddr_t) "off"},{"-mb",		"*marginBell",	XrmoptionNoArg,		(caddr_t) "on"},{"+mb",		"*marginBell",	XrmoptionNoArg,		(caddr_t) "off"},{"-mc",		"*multiClickTime", XrmoptionSepArg,	(caddr_t) NULL},{"-ms",		"*pointerColor",XrmoptionSepArg,	(caddr_t) NULL},{"-nb",		"*nMarginBell",	XrmoptionSepArg,	(caddr_t) NULL},{"-nul",	"*underLine",	XrmoptionNoArg,		(caddr_t) "off"},{"+nul",	"*underLine",	XrmoptionNoArg,		(caddr_t) "on"},{"-pc",		"*boldColors",	XrmoptionNoArg,		(caddr_t) "on"},{"+pc",		"*boldColors",	XrmoptionNoArg,		(caddr_t) "off"},{"-rw",		"*reverseWrap",	XrmoptionNoArg,		(caddr_t) "on"},{"+rw",		"*reverseWrap",	XrmoptionNoArg,		(caddr_t) "off"},{"-s",		"*multiScroll",	XrmoptionNoArg,		(caddr_t) "on"},{"+s",		"*multiScroll",	XrmoptionNoArg,		(caddr_t) "off"},{"-sb",		"*scrollBar",	XrmoptionNoArg,		(caddr_t) "on"},{"+sb",		"*scrollBar",	XrmoptionNoArg,		(caddr_t) "off"},#ifdef SCROLLBAR_RIGHT{"-leftbar",	"*rightScrollBar", XrmoptionNoArg,	(caddr_t) "off"},{"-rightbar",	"*rightScrollBar", XrmoptionNoArg,	(caddr_t) "on"},#endif{"-sf",		"*sunFunctionKeys", XrmoptionNoArg,	(caddr_t) "on"},{"+sf",		"*sunFunctionKeys", XrmoptionNoArg,	(caddr_t) "off"},{"-si",		"*scrollTtyOutput", XrmoptionNoArg,	(caddr_t) "off"},{"+si",		"*scrollTtyOutput", XrmoptionNoArg,	(caddr_t) "on"},{"-sk",		"*scrollKey",	XrmoptionNoArg,		(caddr_t) "on"},{"+sk",		"*scrollKey",	XrmoptionNoArg,		(caddr_t) "off"},{"-sl",		"*saveLines",	XrmoptionSepArg,	(caddr_t) NULL},#if OPT_SUNPC_KBD{"-sp",		"*sunKeyboard", XrmoptionNoArg,		(caddr_t) "on"},{"+sp",		"*sunKeyboard", XrmoptionNoArg,		(caddr_t) "off"},#endif{"-t",		"*tekStartup",	XrmoptionNoArg,		(caddr_t) "on"},{"+t",		"*tekStartup",	XrmoptionNoArg,		(caddr_t) "off"},{"-tm",		"*ttyModes",	XrmoptionSepArg,	(caddr_t) NULL},{"-tn",		"*termName",	XrmoptionSepArg,	(caddr_t) NULL},{"-ulc",	"*colorULMode",	XrmoptionNoArg,		(caddr_t) "off"},{"+ulc",	"*colorULMode",	XrmoptionNoArg,		(caddr_t) "on"},{"-ut",		"*utmpInhibit",	XrmoptionNoArg,		(caddr_t) "on"},{"+ut",		"*utmpInhibit",	XrmoptionNoArg,		(caddr_t) "off"},{"-im",		"*useInsertMode", XrmoptionNoArg,	(caddr_t) "on"},{"+im",		"*useInsertMode", XrmoptionNoArg,	(caddr_t) "off"},{"-vb",		"*visualBell",	XrmoptionNoArg,		(caddr_t) "on"},{"+vb",		"*visualBell",	XrmoptionNoArg,		(caddr_t) "off"},{"-wf",		"*waitForMap",	XrmoptionNoArg,		(caddr_t) "on"},{"+wf",		"*waitForMap",	XrmoptionNoArg,		(caddr_t) "off"},/* bogus old compatibility stuff for which there are   standard XtAppInitialize options now */{"%",		"*tekGeometry",	XrmoptionStickyArg,	(caddr_t) NULL},{"#",		".iconGeometry",XrmoptionStickyArg,	(caddr_t) NULL},{"-T",		"*title",	XrmoptionSepArg,	(caddr_t) NULL},{"-n",		"*iconName",	XrmoptionSepArg,	(caddr_t) NULL},{"-r",		"*reverseVideo",XrmoptionNoArg,		(caddr_t) "on"},{"+r",		"*reverseVideo",XrmoptionNoArg,		(caddr_t) "off"},{"-rv",		"*reverseVideo",XrmoptionNoArg,		(caddr_t) "on"},{"+rv",		"*reverseVideo",XrmoptionNoArg,		(caddr_t) "off"},{"-w",		".borderWidth", XrmoptionSepArg,	(caddr_t) NULL},};static struct _options {  char *opt;  char *desc;} options[] = {{ "-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" },{ "-iconic",               "start iconic" },{ "-name string",          "client instance, icon, and title strings" },{ "-title string",         "title string" },{ "-xrm resourcestring",   "additional resource specifications" },{ "-/+132",                "turn on/off column switch inhibiting" },{ "-/+ah",                 "turn on/off always highlight" },#ifndef NO_ACTIVE_ICON{ "-/+ai",		   "turn on/off active icon" },{ "-fi fontname",	   "icon font for active icon" },#endif /* NO_ACTIVE_ICON */{ "-b number",             "internal border in pixels" },{ "-/+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" },{ "-fb fontname",          "bold text font" },#if OPT_HIGHLIGHT_COLOR{ "-hc",		   "selection background color" },#endif{ "-/+im",		   "use insert mode for TERMCAP" },{ "-/+j",                  "turn on/off jump scroll" },#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" },{ "-ms color",             "pointer color" },{ "-nb number",            "margin bell in characters from right end" },{ "-/+nul",                "turn on/off 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{ "-/+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" },{ "-/+sp",                 "turn on/off Sun/PC Function/Keypad mapping" },#if OPT_TEK4014{ "-/+t",                  "turn on/off Tek emulation window" },#endif{ "-tm string",            "terminal mode keywords and characters" },{ "-tn name",              "TERM environment variable name" },{ "-/+ulc",                "turn off/on display of underline as color" },{ "-/+ut",                 "turn on/off utmp inhibit (not supported)" },{ "-/+vb",                 "turn on/off visual bell" },{ "-/+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" },{ "-Sxxd",                 "slave mode on \"ttyxx\", file descriptor \"d\"" },{ NULL, NULL }};/*debug FILE *confd;*//*static void opencons(){        if ((confd=fopen("/dev/console$","w")) < 0) {                fputs("!!! Cannot open console device.\n",                        stderr);                exit(1);        }}static void closecons(){	fclose(confd);}*/static 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};static void Syntax (badOption)    char *badOption;{    struct _options *opt;    int col;    fprintf (stderr, "%s:  bad command line option \"%s\"\r\n\n",	     ProgramName, badOption);    fprintf (stderr, "usage:  %s", ProgramName);    col = 8 + strlen(ProgramName);    for (opt = options; opt->opt; opt++) {	int len = 3 + 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 (){    puts (XTERM_VERSION);    exit (0);}static void Help (){    struct _options *opt;    char **cpp;    fprintf (stderr, "%s usage:\n    %s [-options ...] [-e command args]\n\n",	     XTERM_VERSION, ProgramName);    fprintf (stderr, "where options include:\n");    for (opt = options; opt->opt; opt++) {	fprintf (stderr, "    %-28s %s\n", opt->opt, opt->desc);    }    putc ('\n', stderr);    for (cpp = message; *cpp; cpp++) {	fputs (*cpp, stderr);	putc ('\n', stderr);    }    putc ('\n', stderr);    exit (0);}/* ARGSUSED */static BooleanConvertConsoleSelection(w, selection, target, type, value, length, format)    Widget w GCC_UNUSED;    Atom *selection GCC_UNUSED, *target GCC_UNUSED, *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;}Arg ourTopLevelShellArgs[] = {	{ XtNallowShellResize, (XtArgVal) TRUE },		{ XtNinput, (XtArgVal) TRUE },};int number_ourTopLevelShellArgs = 2;	Widget toplevel;Bool waiting_for_initial_map;/* * DeleteWindow(): Action proc to implement ICCCM delete_window. *//* ARGSUSED */static voidDeleteWindow(w, event, params, num_params)    Widget w;    XEvent *event GCC_UNUSED;    String *params GCC_UNUSED;    Cardinal *num_params GCC_UNUSED;{#if OPT_TEK4014  if (w == toplevel)    if (term->screen.Tshow)      hide_vt_window();    else      do_hangup(w, (XtPointer)0, (XtPointer)0);  else    if (term->screen.Vshow)      hide_tek_window();    else#endif      do_hangup(w, (XtPointer)0, (XtPointer)0);}/* ARGSUSED */static voidKeyboardMapping(w, event, params, num_params)    Widget w GCC_UNUSED;    XEvent *event;    String *params GCC_UNUSED;    Cardinal *num_params GCC_UNUSED;{    switch (event->type) {       case MappingNotify:	  XRefreshKeyboardMapping(&event->xmapping);	  break;    }}XtActionsRec actionProcs[] = {    { "DeleteWindow", DeleteWindow },    { "KeyboardMapping", KeyboardMapping },};Atom wm_delete_window;extern fd_set Select_mask;extern fd_set X_mask;extern fd_set pty_mask;#ifdef __EMX__#define XFREE86_PTY	0x76#define XTY_TIOCSETA	0x48#define XTY_TIOCSETAW	0x49#define XTY_TIOCSETAF	0x4a#define XTY_TIOCCONS	0x4d#define XTY_TIOCSWINSZ	0x53#define XTY_ENADUP	0x5a#define XTY_TRACE	0x5b#define XTY_TIOCGETA	0x65#define XTY_TIOCGWINSZ	0x66#define PTMS_GETPTY	0x64#define PTMS_BUFSZ	14#ifndef NCCS#define NCCS 11#endif#define TIOCSWINSZ	113#define TIOCGWINSZ	117struct pt_termios{        unsigned short  c_iflag;        unsigned short  c_oflag;        unsigned short  c_cflag;        unsigned short  c_lflag;        unsigned char   c_cc[NCCS];        long            _reserved_[4];};struct winsize {        unsigned short  ws_row;         /* rows, in characters */        unsigned short  ws_col;         /* columns, in characters */        unsigned short  ws_xpixel;      /* horizontal size, pixels */        unsigned short  ws_ypixel;      /* vertical size, pixels */};int ptioctl(int fd, int func, void* data){	APIRET rc;	ULONG  len;	struct pt_termios pt;	struct termio *t;	int i;	switch (func) {	case TCGETA:		rc = DosDevIOCtl(fd,XFREE86_PTY, func,		NULL, 0, NULL,		(ULONG*)&pt, sizeof(struct pt_termios), &len);		if (rc) return -1;		t = (struct termio*)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 = (struct termio*)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(struct winsize), &len,			NULL, 0, NULL);	case TIOCGWINSZ:		return DosDevIOCtl(fd,XFREE86_PTY, XTY_TIOCGWINSZ,			NULL, 0, NULL,			(ULONG*)data, sizeof(struct winsize), &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;	}}#endif /* __EMX__ */char **gblenvp;main (int argc, char** argv, char** envp){	register TScreen *screen;	int mode;	extern char **environ;	/* Do these first, since we may not be able to open the display */	ProgramName = argv[0];	if (argc > 1) {		if (!strncmp(argv[1], "-v", 2))			Version();		if (!strncmp(argv[1], "-h", 2) && strncmp(argv[1], "-hc", 3))			Help();	}	/* 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/*debug	opencons();*/	ttydev = (char *) malloc (PTMS_BUFSZ);	ptydev = (char *) malloc (PTMS_BUFSZ);	if (!ttydev || !ptydev) {	    fprintf (stderr, 	    	     "%s:  unable to allocate memory for ttydev or ptydev\n",		     ProgramName);	    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 = B9600|CS8|CREAD|PARENB|HUPCL;    	d_tio.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK;	d_tio.c_line = 0;	d_tio.c_cc[VINTR] = 'C' & 0x3f;		/* '^C'	*/	d_tio.c_cc[VERASE] = 0x7f;		/* DEL	*/	d_tio.c_cc[VKILL] = 'U' & 0x3f;		/* '^U'	*/	d_tio.c_cc[VQUIT] = CQUIT;		/* '^\'	*/    	d_tio.c_cc[VEOF] = CEOF;		/* '^D'	*/	d_tio.c_cc[VEOL] = CEOL;		/* '^@'	*/	/* Init the Toolkit. */	{	    XtSetErrorHandler(xt_error);	    toplevel = XtAppInitialize (&app_con, "XTerm", 					optionDescList,					XtNumber(optionDescList),					&argc, argv, fallback_resources,					NULL, 0);	    XtSetErrorHandler((XtErrorHandler)0);	    XtGetApplicationResources(toplevel, (XtPointer) &resource,				      application_resources,				      XtNumber(application_resources), NULL, 0);	}	waiting_for_initial_map = resource.wait_for_map;	/*	 * 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) {		fprintf (stderr, "%s:  bad tty modes \"%s\"\n",			 ProgramName, resource.tty_modes);	    } else if (n > 0) {		override_tty_modes = 1;	    }	}	xterm_name = resource.xterm_name;	sunFunctionKeys = resource.sunFunctionKeys;#if OPT_SUNPC_KBD	sunKeyboard = resource.sunKeyboard;#endif	if (strcmp(xterm_name, "-") == 0) xterm_name = DFT_TERMTYPE;	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);	/* Parse the rest of the command line */	for (argc--, argv++ ; argc > 0 ; argc--, argv++) {	    if(**argv != '-') Syntax (*argv);	    switch(argv[0][1]) {	     case 'h':		Help ();		/* NOTREACHED */	     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 == getuid()) &&			 !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 'e':		if (argc <= 1) Syntax (*argv);		command_to_exec = ++argv;		break;	     default:		Syntax (*argv);	    }	    break;	}	XawSimpleMenuAddGlobalActions (app_con);	XtRegisterGrabAction (HandlePopupMenu, True,			      (ButtonPressMask|ButtonReleaseMask),			      GrabModeAsync, GrabModeAsync);        term = (XtermWidget) XtCreateManagedWidget(	    "vt100", xtermWidgetClass, toplevel, NULL, 0);	    /* this causes the initialize method to be called */        screen = &term->screen;	if (screen->savelines < 0) screen->savelines = 0;	term->flags = 0;	if (!screen->jumpscroll) {	    term->flags |= SMOOTHSCROLL;	    update_jumpscroll();	}	if (term->misc.reverseWrap) {	    term->flags |= REVERSEWRAP;	    update_reversewrap();	}	if (term->misc.autoWrap) {	    term->flags |= WRAPAROUND;	    update_autowrap();	}	if (term->misc.re_verse) {	    term->flags |= REVERSE_VIDEO;	    update_reversevideo();	}	inhibit = 0;#ifdef ALLOWLOGGING	if (term->misc.logInhibit)		inhibit |= I_LOG;#endif	if (term->misc.signalInhibit)		inhibit |= I_SIGNAL;#if OPT_TEK4014	if (term->misc.tekInhibit)		inhibit |= I_TEK;#endif	term->initflags = term->flags;	if (term->misc.appcursorDefault) {	    term->keyboard.flags |= MODE_DECCKM;	    update_appcursor();	}	if (term->misc.appkeypadDefault) {	    term->keyboard.flags |= MODE_DECKPAM;	    update_appkeypad();	}/* * Set title and icon name if not specified */	if (command_to_exec) {	    Arg args[2];	    if (!resource.title) {		if (command_to_exec) {		    resource.title = base_name (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);			    XtSetValues (toplevel, args, 2);	}#if OPT_TEK4014	if(inhibit & I_TEK)		screen->TekEmu = FALSE;	if(screen->TekEmu && !TekInit())		exit(ERROR_INIT);#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. */	int i = -1;	if(debug) {	        creat_as (getuid(), getgid(), "xterm.debug.log", 0666);		i = open ("xterm.debug.log", O_WRONLY | O_TRUNC, 0666);	}	if(i >= 0) {		dup2(i,2);		/* mark this file as close on exec */		(void) fcntl(i, F_SETFD, 1);	}    }#endif	/* DEBUG */	/* open a terminal for client */	get_terminal ();	spawn ();	/* Child process is out there, let's catch its termination */	(void) signal (SIGCHLD, reapchild);	/* Realize procs have now been executed */	if (am_slave) { /* Write window id so master end can read and use */	    char buf[80];	    buf[0] = '\0';	    sprintf (buf, "%lx\n", XtWindow (XtParent (CURRENT_EMU(screen))));	    write (screen->respond, buf, strlen (buf));	}	screen->inhibit = inhibit;	if (0 > (mode = fcntl(screen->respond, F_GETFL, 0)))		Error(1);	mode |= O_NDELAY;	if (fcntl(screen->respond, F_SETFL, mode))		Error(1);	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);	(void) setuid (screen->uid); /* we're done with privileges... */	(void) setgid (screen->gid);	done_setuid = 1;#ifdef ALLOWLOGGING	if (term->misc.log_on) {		StartLog(screen);	}#endif	for( ; ; ) {#if OPT_TEK4014		if(screen->TekEmu)			TekRun();		else#endif			VTRun();	}}static char *base_name(name)char *name;{	register char *cp;	cp = strrchr(name, '/');	return(cp ? cp + 1 : name);}