Index: X11/xc/programs/xterm/Tekproc.c
diff -u X11/xc/programs/xterm/Tekproc.c:1.1.1.2 X11/xc/programs/xterm/Tekproc.c:1.2
--- X11/xc/programs/xterm/Tekproc.c:1.1.1.2	Sat Mar  7 09:25:14 1998
+++ X11/xc/programs/xterm/Tekproc.c	Sun May  3 01:37:57 1998
@@ -1,6 +1,6 @@
 /*
  * $XConsortium: Tekproc.c /main/120 1996/11/29 10:33:20 swick $
- * $XFree86: xc/programs/xterm/Tekproc.c,v 3.13.2.2 1998/02/15 16:09:55 hohndel Exp $
+ * $XFree86: xc/programs/xterm/Tekproc.c,v 3.13.2.4 1998/04/29 11:18:06 dawes Exp $
  *
  * Warning, there be crufty dragons here.
  */
@@ -74,6 +74,9 @@
 #include <errno.h>
 #include <setjmp.h>
 #include <signal.h>
+
+#include "xterm.h"
+
 #include "Tekparse.h"
 #include "data.h"
 #include "error.h"
@@ -121,8 +124,6 @@
 extern long time();		/* included in <time.h> by Xos.h */
 #endif
 
-#include "xterm.h"
-
 #define DefaultGCID XGContextFromGC(DefaultGC(screen->display, DefaultScreen(screen->display)))
 
 /* Tek defines */
@@ -1723,8 +1724,10 @@
 
 
 #ifndef X_NOT_POSIX
+#ifndef linux
 #define HAS_WAITPID
 #endif
+#endif
 
 #ifdef HAS_WAITPID
 #include <sys/wait.h>
@@ -1742,7 +1745,7 @@
 	int pid;
 #ifndef HAS_WAITPID
 	int waited;
-	int (*chldfunc)();
+	SIGNAL_T (*chldfunc) PROTO((int n));
 
 	chldfunc = signal(SIGCHLD, SIG_DFL);
 #endif
Index: X11/xc/programs/xterm/charproc.c
diff -u X11/xc/programs/xterm/charproc.c:1.1.1.2 X11/xc/programs/xterm/charproc.c:1.2
--- X11/xc/programs/xterm/charproc.c:1.1.1.2	Sat Mar  7 09:25:28 1998
+++ X11/xc/programs/xterm/charproc.c	Sun May  3 01:37:59 1998
@@ -1,6 +1,6 @@
 /*
  * $XConsortium: charproc.c /main/196 1996/12/03 16:52:46 swick $
- * $XFree86: xc/programs/xterm/charproc.c,v 3.42.2.5 1998/02/15 16:09:58 hohndel Exp $
+ * $XFree86: xc/programs/xterm/charproc.c,v 3.42.2.7 1998/04/29 10:51:58 dawes Exp $
  */
 
 /*
@@ -4030,7 +4030,6 @@
 	       *s,
 	       *ns,
 	       *end,
-		tmp[1024],
 	  	buf[32];
     XIM		xim = (XIM) NULL;
     XIMStyles  *xim_styles;
@@ -4045,17 +4044,18 @@
 	if ((p = XSetLocaleModifiers("@im=none")) != NULL && *p)
 	    xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL);
     } else {
-	strcpy(tmp, term->misc.input_method);
-	for(ns=s=tmp; ns && *s;) {
+	for(ns=s=term->misc.input_method; ns && *s;) { 
 	    while (*s && isspace(*s)) s++;
 	    if (!*s) break;
 	    if ((ns = end = strchr(s, ',')) == 0)
 		end = s + strlen(s);
 	    while (isspace(*end)) end--;
-	    *end = '\0';
 
 	    strcpy(buf, "@im=");
-	    strcat(buf, s);
+	    if (end - (s + (sizeof(buf) - 5)) > 0)
+		end = s + (sizeof(buf) - 5); 
+	    strncat(buf, s, end - s); 
+ 
 	    if ((p = XSetLocaleModifiers(buf)) != NULL && *p
 		&& (xim = XOpenIM(XtDisplay(term), NULL, NULL, NULL)) != NULL)
 		break;
@@ -4080,8 +4080,7 @@
     }
 
     found = False;
-    strcpy(tmp, term->misc.preedit_type);
-    for(s = tmp; s && !found;) {
+    for(s = term->misc.preedit_type; s && !found;) { 
 	while (*s && isspace(*s)) s++;
 	if (!*s) break;
 	if ((ns = end = strchr(s, ',')) != 0)
@@ -4089,13 +4088,12 @@
 	else
 	    end = s + strlen(s);
 	while (isspace(*end)) end--;
-	*end = '\0';
 
-	if (!strcmp(s, "OverTheSpot")) {
+	if (!strncmp(s, "OverTheSpot", end - s)) { 
 	    input_style = (XIMPreeditPosition | XIMStatusArea);
-	} else if (!strcmp(s, "OffTheSpot")) {
+	} else if (!strncmp(s, "OffTheSpot", end - s)) { 
 	    input_style = (XIMPreeditArea | XIMStatusArea);
-	} else if (!strcmp(s, "Root")) {
+	} else if (!strncmp(s, "Root", end - s)) { 
 	    input_style = (XIMPreeditNothing | XIMStatusNothing);
 	}
 	for (i = 0; (unsigned short)i < xim_styles->count_styles; i++)
@@ -4646,7 +4644,7 @@
 	XtOverrideTranslations(w, original);
 	return;
     }
-    (void) sprintf( mapName, "%sKeymap", params[0] );
+    (void) sprintf( mapName, "%.*sKeymap", (int)sizeof(mapName) - 10, params[0] ); 
     (void) strcpy( mapClass, mapName );
     if (islower(mapClass[0])) mapClass[0] = toupper(mapClass[0]);
     XtGetSubresources( w, (XtPointer)&keymap, mapName, mapClass,
@@ -5075,7 +5073,7 @@
      * not be set before the widget's realized, so it's tested separately).
      */
     if(screen->colorMode) {
-	if (TextWindow(screen) != 0 && (cc != bg)) {
+	if (TextWindow(screen) != 0 && (cc != bg) && (cc != fg)) {
 	    /* we might have a colored foreground/background later */
 	    xgcv.font = screen->fnt_norm->fid;
 	    mask = (GCForeground | GCBackground | GCFont);
Index: X11/xc/programs/xterm/data.c
diff -u X11/xc/programs/xterm/data.c:1.1.1.2 X11/xc/programs/xterm/data.c:1.2
--- X11/xc/programs/xterm/data.c:1.1.1.2	Sat Mar  7 09:25:33 1998
+++ X11/xc/programs/xterm/data.c	Sun May  3 01:38:00 1998
@@ -1,6 +1,6 @@
 /*
  *	$XConsortium: data.c,v 1.12 95/04/05 19:58:47 kaleb Exp $
- *	$XFree86: xc/programs/xterm/data.c,v 3.2.4.2 1998/02/15 16:10:03 hohndel Exp $
+ *	$XFree86: xc/programs/xterm/data.c,v 3.2.4.3 1998/04/29 04:18:39 dawes Exp $
  */
 
 /*
@@ -101,7 +101,6 @@
 #endif
 
 int am_slave = 0;	/* set to 1 if running as a slave process */
-int done_setuid = 0;	/* set to 1 after resetting setuid */
 int max_plus1;
 fd_set Select_mask;
 fd_set X_mask;
Index: X11/xc/programs/xterm/data.h
diff -u X11/xc/programs/xterm/data.h:1.1.1.2 X11/xc/programs/xterm/data.h:1.2
--- X11/xc/programs/xterm/data.h:1.1.1.2	Sat Mar  7 09:25:34 1998
+++ X11/xc/programs/xterm/data.h	Sun May  3 01:38:01 1998
@@ -1,6 +1,6 @@
 /*
  *	$XConsortium: data.h /main/13 1996/11/24 17:35:40 rws $
- *	$XFree86: xc/programs/xterm/data.h,v 3.3.2.1 1998/02/15 16:10:03 hohndel Exp $
+ *	$XFree86: xc/programs/xterm/data.h,v 3.3.2.2 1998/04/29 04:18:39 dawes Exp $
  */
 /*
  * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
@@ -71,7 +71,6 @@
 #endif
 extern Char buffer[];
 extern int am_slave;
-extern int done_setuid;
 extern int bcnt;
 #ifdef DEBUG
 extern int debug;
Index: X11/xc/programs/xterm/main.c
diff -u X11/xc/programs/xterm/main.c:1.2 X11/xc/programs/xterm/main.c:1.3
--- X11/xc/programs/xterm/main.c:1.2	Sat Mar 14 13:35:29 1998
+++ X11/xc/programs/xterm/main.c	Sun May  3 01:38:02 1998
@@ -64,7 +64,7 @@
 
 ******************************************************************/
 
-/* $XFree86: xc/programs/xterm/main.c,v 3.47.2.8 1998/02/27 01:29:29 dawes Exp $ */
+/* $XFree86: xc/programs/xterm/main.c,v 3.47.2.10 1998/04/29 10:52:00 dawes Exp $ */
 
 
 /* main.c */
@@ -325,9 +325,11 @@
 #endif
 #ifdef SVR4
 #define USE_POSIX_WAIT
+#define HAS_SAVED_IDS_AND_SETEUID
 #endif
 
 #ifdef linux
+#define HAS_SAVED_IDS_AND_SETEUID
 #ifndef CBAUD
 #define CBAUD 0010017
 #endif
@@ -341,6 +343,7 @@
 #define USE_POSIX_WAIT
 #define LASTLOG
 #define WTMP
+#define HAS_SAVED_IDS_AND_SETEUID
 #endif
 
 #include <stdio.h>
@@ -976,6 +979,12 @@
 "will be started.  Options that start with a plus sign (+) restore the default.",
 NULL};
 
+static int abbrev (char *tst, char *cmp)
+{
+	size_t len = strlen(tst);
+	return ((len >= 2) && (!strncmp(tst, cmp, len)));
+}
+
 static void Syntax (badOption)
     char *badOption;
 {
@@ -1115,9 +1124,9 @@
 	/* 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))
+		if (abbrev(argv[1], "-version"))
 			Version();
-		if (!strncmp(argv[1], "-h", 2) && strncmp(argv[1], "-hc", 3))
+		if (abbrev(argv[1], "-help"))
 			Help();
 	}
 
@@ -1725,15 +1734,6 @@
 	XSetErrorHandler(xerror);
 	XSetIOErrorHandler(xioerror);
 
-#ifndef HAS_SAVED_IDS_AND_SETEUID
-	(void) setuid (screen->uid); /* we're done with privileges... */
-	(void) setgid (screen->gid);
-	done_setuid = 1;
-#else
-	seteuid(screen->uid);
-	setegid(screen->gid);
-#endif
-
 #ifdef ALLOWLOGGING
 	if (term->misc.log_on) {
 		StartLog(screen);
@@ -2159,10 +2159,6 @@
 
 	screen->uid = getuid();
 	screen->gid = getgid();
-#ifdef HAS_SAVED_IDS_AND_SETEUID
-	screen->euid = geteuid();
-	screen->egid = getegid();
-#endif
 
 #ifdef linux
 	bzero(termcap, sizeof termcap);
@@ -3553,7 +3549,7 @@
     int i, n, ncap;
     errstat err;
     struct caplist *cl;
-    char buf[64], numbuf[12];
+    char buf[64];
     struct caplist *capvnew;
     int ttythread();
     int xwatchdogthread();
@@ -3892,10 +3888,6 @@
 	register int wfd;
 	struct utmp utmp;
 
-#ifdef HAS_SAVED_IDS_AND_SETEUID
-        setegid(screen->egid);
-        seteuid(screen->euid);
-#endif
 	if (!resource.utmpInhibit && added_utmp_entry &&
 	    (!am_slave && tslot > 0 && (wfd = open(etc_utmp, O_WRONLY)) >= 0)){
 		bzero((char *)&utmp, sizeof(struct utmp));
@@ -3914,10 +3906,6 @@
 		}
 #endif /* WTMP */
 	}
-#ifdef HAS_SAVED_IDS_AND_SETEUID
-	setegid(screen->gid);
-	seteuid(screen->uid);
-#endif  /* HAS_SAVED_IDS_AND_SETEUID */
 #endif	/* USE_SYSV_UTMP */
 #endif	/* UTMP */
 #ifndef AMOEBA
Index: X11/xc/programs/xterm/misc.c
diff -u X11/xc/programs/xterm/misc.c:1.1.1.2 X11/xc/programs/xterm/misc.c:1.2
--- X11/xc/programs/xterm/misc.c:1.1.1.2	Sat Mar  7 09:25:44 1998
+++ X11/xc/programs/xterm/misc.c	Sun May  3 01:38:03 1998
@@ -1,6 +1,6 @@
 /*
  *	$XConsortium: misc.c /main/112 1996/11/29 10:34:07 swick $
- *	$XFree86: xc/programs/xterm/misc.c,v 3.17.2.3 1998/02/24 13:54:37 hohndel Exp $
+ *	$XFree86: xc/programs/xterm/misc.c,v 3.17.2.4 1998/04/29 04:18:45 dawes Exp $
  */
 
 /*
@@ -48,13 +48,13 @@
 #include <X11/Xmu/SysUtil.h>
 #include <X11/Xmu/WinUtil.h>
 
+#include "xterm.h"
+
 #include "VTparse.h"
 #include "data.h"
 #include "error.h"
 #include "menu.h"
 
-#include "xterm.h"
-
 #if XtSpecificationRelease < 6
 #ifndef X_GETTIMEOFDAY
 #define X_GETTIMEOFDAY(t) gettimeofday(t,(struct timezone *)0)
@@ -534,8 +534,10 @@
 #if defined(ALLOWLOGGING) || defined(DEBUG)
 
 #ifndef X_NOT_POSIX
+#ifndef linux
 #define HAS_WAITPID
 #endif
+#endif
 
 /*
  * create a file only if we could with the permissions of the real user id.
@@ -559,18 +561,10 @@
     int pid;
 #ifndef HAS_WAITPID
     int waited;
-    int (*chldfunc)();
+    SIGNAL_T (*chldfunc)();
 
     chldfunc = signal(SIGCHLD, SIG_DFL);
 #endif
-
-    if (done_setuid) {
-	fd = open(pathname, O_WRONLY|O_CREAT|O_APPEND, mode);
-	if (fd >= 0) {
-	    close(fd);
-	}
-	return;
-    }
 
     pid = fork();
     switch (pid)
Index: X11/xc/programs/xterm/os2main.c
diff -u X11/xc/programs/xterm/os2main.c:1.1.1.2 X11/xc/programs/xterm/os2main.c:1.2
--- X11/xc/programs/xterm/os2main.c:1.1.1.2	Sat Mar  7 09:25:45 1998
+++ X11/xc/programs/xterm/os2main.c	Sun May  3 01:38:05 1998
@@ -5,7 +5,7 @@
 #ifndef lint
 static char *rid="$XConsortium: main.c,v 1.227.1.2 95/06/29 18:13:15 kaleb Exp $";
 #endif /* lint */
-/* $XFree86: xc/programs/xterm/os2main.c,v 3.5.2.3 1998/02/22 01:28:30 robin Exp $ */
+/* $XFree86: xc/programs/xterm/os2main.c,v 3.5.2.5 1998/04/29 10:52:01 dawes Exp $ */
 
 /***********************************************************
 
@@ -518,6 +518,12 @@
 "will be started.  Options that start with a plus sign (+) restore the default.",
 NULL};
 
+static int abbrev (char *tst, char *cmp)
+{
+	size_t len = strlen(tst);
+	return ((len >= 2) && (!strncmp(tst, cmp, len)));
+}
+
 static void Syntax (badOption)
     char *badOption;
 {
@@ -770,9 +776,9 @@
 	/* 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))
+		if (abbrev(argv[1], "-version"))
 			Version();
-		if (!strncmp(argv[1], "-h", 2) && strncmp(argv[1], "-hc", 3))
+		if (abbrev(argv[1], "-help"))
 			Help();
 	}
 
@@ -1064,10 +1070,6 @@
 #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) {
Index: X11/xc/programs/xterm/print.c
diff -u X11/xc/programs/xterm/print.c:1.1.1.1 X11/xc/programs/xterm/print.c:1.2
--- X11/xc/programs/xterm/print.c:1.1.1.1	Sat Mar  7 09:26:09 1998
+++ X11/xc/programs/xterm/print.c	Sun May  3 01:38:06 1998
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/programs/xterm/print.c,v 1.3.2.1 1998/02/15 16:10:08 hohndel Exp $
+ * $XFree86: xc/programs/xterm/print.c,v 1.3.2.3 1998/04/29 11:18:07 dawes Exp $
  */
 
 /************************************************************
@@ -42,6 +42,7 @@
 
 #include "ptyx.h"
 #include "data.h"
+#include "error.h"
 #include "xterm.h"
 
 #define Strlen(a) strlen((char *)a)
@@ -172,8 +173,33 @@
 {
 	static int initialized;
 	if (!initialized) {
+		FILE	*input;
+		int	my_pipe[2];
+		int	my_pid;
+		int	c;
 		register TScreen *screen = &term->screen;
-		Printer = popen(screen->printer_command, "w");
+
+	    	if (pipe(my_pipe))
+			SysError (ERROR_FORK);
+		if ((my_pid = fork()) < 0)
+			SysError (ERROR_FORK);
+
+		if (my_pid == 0) {
+			close(my_pipe[1]);	/* printer is silent */
+			setgid (screen->gid);
+			setuid (screen->uid);
+			Printer = popen(screen->printer_command, "w");
+			input = fdopen(my_pipe[0], "r");
+			while ((c = fgetc(input)) != EOF) {
+				fputc(c, Printer);
+				if (chr == '\r' || chr == '\n' || chr == '\f')
+					fflush(Printer);
+			}
+			exit(0);
+		} else {
+			close(my_pipe[0]);	/* won't read from printer */
+			Printer = fdopen(my_pipe[1], "w");
+		}
 		initialized++;
 	}
 	if (Printer != 0) {
Index: X11/xc/programs/xterm/ptyx.h
diff -u X11/xc/programs/xterm/ptyx.h:1.2 X11/xc/programs/xterm/ptyx.h:1.3
--- X11/xc/programs/xterm/ptyx.h:1.2	Sat Mar 14 13:35:31 1998
+++ X11/xc/programs/xterm/ptyx.h	Sun May  3 01:38:07 1998
@@ -529,10 +529,6 @@
 #define DoSM(code,value) screen->save_modes[code] = value
 #define DoRM(code,value) value = screen->save_modes[code]
 
-#if defined(SVR4) || defined(linux) || defined(CSRG_BASED)
-#define HAS_SAVED_IDS_AND_SETEUID
-#endif
-
 typedef struct {
 	Boolean		saved;
 	int		row;
@@ -561,10 +557,6 @@
 	long		pid;		/* pid of process on far side   */
 	int		uid;		/* user id of actual person	*/
 	int		gid;		/* group id of actual person	*/
-#ifdef HAS_SAVED_IDS_AND_SETEUID
-        int             euid;
-        int             egid;
-#endif
 	GC		cursorGC;	/* normal cursor painting	*/
 	GC		fillCursorGC;	/* special cursor painting	*/
 	GC		reversecursorGC;/* reverse cursor painting	*/
Index: X11/xc/programs/xterm/version.h
diff -u X11/xc/programs/xterm/version.h:1.1.1.1 X11/xc/programs/xterm/version.h:1.2
--- X11/xc/programs/xterm/version.h:1.1.1.1	Sat Mar  7 09:26:09 1998
+++ X11/xc/programs/xterm/version.h	Sun May  3 01:38:08 1998
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/xterm/version.h,v 3.2.2.3 1998/03/03 12:51:03 dawes Exp $ */
+/* $XFree86: xc/programs/xterm/version.h,v 3.2.2.5 1998/04/29 04:18:47 dawes Exp $ */
 
 /*
  * This is the string that's printed in response to "xterm -version", or
@@ -6,4 +6,4 @@
  * version of xterm has been built.  The number in parentheses is my patch
  * number (T.Dickey).
  */
-#define XTERM_VERSION "XFree86 3.9Ad(68)"
+#define XTERM_VERSION "XFree86 3.3.2.1"
Index: X11/xc/lib/Xaw/XawIm.c
diff -u X11/xc/lib/Xaw/XawIm.c:1.1.1.1 X11/xc/lib/Xaw/XawIm.c:1.2
--- X11/xc/lib/Xaw/XawIm.c:1.1.1.1	Fri Sep  5 02:59:50 1997
+++ X11/xc/lib/Xaw/XawIm.c	Sun May  3 01:33:11 1998
@@ -53,6 +53,7 @@
 in this Software without prior written authorization from the X Consortium.
 
 */
+/* $XFree86: xc/lib/Xaw/XawIm.c,v 1.1.1.4.2.1 1998/05/01 04:02:42 dawes Exp $ */
 
 #include <X11/IntrinsicP.h>
 #include <X11/StringDefs.h>
@@ -452,7 +453,7 @@
     } else {
 	for (i = 0; i < ve->im.im_list_num; i++) {
 	    strcpy(modifiers, "@im=");
-	    strcat(modifiers, ve->im.im_list[i]);
+	    strncat(modifiers, ve->im.im_list[i], sizeof(modifiers) - 5/*strlen("@im=")*/);
 	    if ((p = XSetLocaleModifiers(modifiers)) != NULL && *p &&
 		(xim = XOpenIM(XtDisplay(ve->parent), NULL, NULL, NULL)) != NULL)
 		break;
@@ -1354,7 +1355,7 @@
     strcpy(s, p);
     save_s = s;
 
-    while(1) {
+    while(i < (sizeof(list) / sizeof(list[0]))) {
 	list[i] = s;
 	ss = index(s, ',');
 	if (!ss) {
@@ -1645,10 +1646,10 @@
 
     if ((vw = SearchVendorShell(inwidg)) && (ve = GetExtPart(vw)) &&
 	ve->im.xim && (p = GetIcTableShared(inwidg, ve)) && p->xic) {
-	  return(XwcLookupString(p->xic, event, buffer_return, bytes_buffer,
+	  return(XwcLookupString(p->xic, event, buffer_return, bytes_buffer/sizeof(wchar_t),
 				 keysym_return, status_return));
     }
-    ret = XLookupString( event, tmp_buf, 64, keysym_return,
+    ret = XLookupString( event, tmp_buf, sizeof(tmp_buf), keysym_return,
 		         (XComposeStatus*) status_return );
     for ( i = 0, tmp_p = tmp_buf, buf_p = buffer_return; i < ret; i++ ) {
 	*buf_p++ = _Xaw_atowc(*tmp_p++);
