xterm-74.patch.txt

XFree86 3.9Ag - xterm patch #74 - 1998/4/27 - T.Dickey <dickey@clark.net>
 
This corrects a couple of recent bugs and adds a new resource:
 
        + modify definition of TRACE_CHILD so that it does not conflict with
          ifdef's for USE_USG_PTYS in main.c (reported by Vikas Agnihotri
          <VikasA@att.com> and Stefan Dalibor).
 
        + correct ownership of file (actually pipe) written by the print
          controls.  When undoing the setuid changes in patch #69, I overlooked
          this.  Now xterm forks a process which resets setuid and routes the
          printer data as the real user.
 
        + add a new resource, "printAttributes", which controls whether
          color attributes (or any attributes) are sent to the printer.
 
# ------------------------------------------------------------------------------
#  charproc.c     |  321 +++++++++++++++++++++++++++++--------------------------
#  main.c         |    2 
#  misc.c         |    2 
#  print.c        |   55 +++++++--
#  ptyx.h         |    7 -
#  trace.h        |    2 
#  version.h      |    2 
#  xterm.log.html |   18 +++
#  xterm.man      |   10 +
#  9 files changed, 252 insertions, 167 deletions
# ------------------------------------------------------------------------------
Index: charproc.c
--- xterm-73+/charproc.c        Sat Apr 25 10:51:07 1998
+++ xterm-74/charproc.c Mon Apr 27 19:33:59 1998
@@ -162,161 +162,168 @@
 #define TRACKTIMEUSEC  0L
 #define BELLSUPPRESSMSEC 200
 
-#define XtNalwaysHighlight "alwaysHighlight"
-#define XtNappcursorDefault "appcursorDefault"
-#define XtNappkeypadDefault "appkeypadDefault"
-#define XtNbackarrowKey "backarrowKey"
-#define XtNbellSuppressTime "bellSuppressTime"
-#define XtNboldFont "boldFont"
-#define XtNc132 "c132"
-#define XtNcharClass "charClass"
-#define XtNcurses "curses"
-#define XtNhpLowerleftBugCompat "hpLowerleftBugCompat"
-#define XtNxmcGlitch "xmcGlitch"
-#define XtNxmcAttributes "xmcAttributes"
-#define XtNxmcInline "xmcInline"
-#define XtNxmcMoveSGR "xmcMoveSGR"
-#define XtNcursorColor "cursorColor"
-#define XtNcursorBlinkTime "cursorBlinkTime"
-#define XtNcutNewline "cutNewline"
-#define XtNcutToBeginningOfLine "cutToBeginningOfLine"
-#define XtNeightBitInput "eightBitInput"
-#define XtNeightBitOutput "eightBitOutput"
-#define XtNeightBitControl "eightBitControl"
-#define XtNhighlightSelection "highlightSelection"
-#ifdef NO_ACTIVE_ICON
-#define XtNgeometry "geometry"
-#endif /* NO_ACTIVE_ICON */
-#define XtNtekGeometry "tekGeometry"
-#define XtNinternalBorder "internalBorder"
-#define XtNjumpScroll "jumpScroll"
+#define XtNallowSendEvents     "allowSendEvents"
+#define XtNalwaysHighlight     "alwaysHighlight"
+#define XtNappcursorDefault    "appcursorDefault"
+#define XtNappkeypadDefault    "appkeypadDefault"
+#define XtNautoWrap            "autoWrap"
+#define XtNawaitInput          "awaitInput"
+#define XtNbackarrowKey                "backarrowKey"
+#define XtNbellSuppressTime    "bellSuppressTime"
+#define XtNboldColors          "boldColors"
+#define XtNboldFont            "boldFont"
+#define XtNc132                        "c132"
+#define XtNcharClass           "charClass"
+#define XtNcolor0              "color0"
+#define XtNcolor1              "color1"
+#define XtNcolor10             "color10"
+#define XtNcolor11             "color11"
+#define XtNcolor12             "color12"
+#define XtNcolor13             "color13"
+#define XtNcolor14             "color14"
+#define XtNcolor15             "color15"
+#define XtNcolor2              "color2"
+#define XtNcolor3              "color3"
+#define XtNcolor4              "color4"
+#define XtNcolor5              "color5"
+#define XtNcolor6              "color6"
+#define XtNcolor7              "color7"
+#define XtNcolor8              "color8"
+#define XtNcolor9              "color9"
+#define XtNcolorAttrMode       "colorAttrMode"
+#define XtNcolorBD             "colorBD"
+#define XtNcolorBDMode         "colorBDMode"
+#define XtNcolorBL             "colorBL"
+#define XtNcolorBLMode         "colorBLMode"
+#define XtNcolorMode           "colorMode"
+#define XtNcolorUL             "colorUL"
+#define XtNcolorULMode         "colorULMode"
+#define XtNcurses              "curses"
+#define XtNcursorBlinkTime     "cursorBlinkTime"
+#define XtNcursorColor         "cursorColor"
+#define XtNcutNewline          "cutNewline"
+#define XtNcutToBeginningOfLine        "cutToBeginningOfLine"
+#define XtNdecTerminalID       "decTerminalID"
+#define XtNdynamicColors       "dynamicColors"
+#define XtNeightBitControl     "eightBitControl"
+#define XtNeightBitInput       "eightBitInput"
+#define XtNeightBitOutput      "eightBitOutput"
+#define XtNhighlightSelection  "highlightSelection"
+#define XtNhpLowerleftBugCompat        "hpLowerleftBugCompat"
+#define XtNinternalBorder      "internalBorder"
+#define XtNjumpScroll          "jumpScroll"
+#define XtNloginShell          "loginShell"
+#define XtNmarginBell          "marginBell"
+#define XtNmultiClickTime      "multiClickTime"
+#define XtNmultiScroll         "multiScroll"
+#define XtNnMarginBell         "nMarginBell"
+#define XtNpointerColor                "pointerColor"
+#define XtNpointerColorBackground      "pointerColorBackground"
+#define XtNpointerShape                "pointerShape"
+#define XtNprintAttributes     "printAttributes"
+#define XtNprinterCommand      "printerCommand"
+#define XtNprinterControlMode  "printerControlMode"
+#define XtNprinterExtent       "printerExtent"
+#define XtNprinterFormFeed     "printerFormFeed"
+#define XtNresizeGravity       "resizeGravity"
+#define XtNreverseWrap         "reverseWrap"
+#define XtNrightScrollBar      "rightScrollBar"
+#define XtNsaveLines           "saveLines"
+#define XtNscrollBar           "scrollBar"
+#define XtNscrollKey           "scrollKey"
+#define XtNscrollLines         "scrollLines"
+#define XtNscrollPos           "scrollPos"
+#define XtNscrollTtyOutput     "scrollTtyOutput"
+#define XtNsignalInhibit       "signalInhibit"
+#define XtNtekGeometry         "tekGeometry"
+#define XtNtekInhibit          "tekInhibit"
+#define XtNtekSmall            "tekSmall"
+#define XtNtekStartup          "tekStartup"
+#define XtNtiteInhibit         "titeInhibit"
+#define XtNunderLine           "underLine"
+#define XtNvisualBell          "visualBell"
+#define XtNxmcAttributes       "xmcAttributes"
+#define XtNxmcGlitch           "xmcGlitch"
+#define XtNxmcInline           "xmcInline"
+#define XtNxmcMoveSGR          "xmcMoveSGR"
+
 #ifdef ALLOWLOGGING
-#define XtNlogFile "logFile"
-#define XtNlogging "logging"
-#define XtNlogInhibit "logInhibit"
-#endif
-#define XtNloginShell "loginShell"
-#define XtNmarginBell "marginBell"
-#define XtNpointerColor "pointerColor"
-#define XtNpointerColorBackground "pointerColorBackground"
-#define XtNpointerShape "pointerShape"
-#define XtNprinterControlMode "printerControlMode"
-#define XtNprinterCommand "printerCommand"
-#define XtNprinterExtent "printerExtent"
-#define XtNprinterFormFeed "printerFormFeed"
-#define XtNmultiClickTime "multiClickTime"
-#define XtNmultiScroll "multiScroll"
-#define XtNnMarginBell "nMarginBell"
-#define XtNresizeGravity "resizeGravity"
-#define XtNreverseWrap "reverseWrap"
-#define XtNautoWrap "autoWrap"
-#define XtNsaveLines "saveLines"
-#define XtNscrollBar "scrollBar"
-#define XtNrightScrollBar "rightScrollBar"
-#define XtNscrollTtyOutput "scrollTtyOutput"
-#define XtNscrollKey "scrollKey"
-#define XtNscrollLines "scrollLines"
-#define XtNscrollPos "scrollPos"
-#define XtNsignalInhibit "signalInhibit"
-#define XtNtekInhibit "tekInhibit"
-#define XtNtekSmall "tekSmall"
-#define XtNtekStartup "tekStartup"
-#define XtNtiteInhibit "titeInhibit"
-#define XtNvisualBell "visualBell"
-#define XtNallowSendEvents "allowSendEvents"
-#define XtNawaitInput "awaitInput"
-#define XtNcolor0 "color0"
-#define XtNcolor1 "color1"
-#define XtNcolor2 "color2"
-#define XtNcolor3 "color3"
-#define XtNcolor4 "color4"
-#define XtNcolor5 "color5"
-#define XtNcolor6 "color6"
-#define XtNcolor7 "color7"
-#define XtNcolor8 "color8"
-#define XtNcolor9 "color9"
-#define XtNcolor10 "color10"
-#define XtNcolor11 "color11"
-#define XtNcolor12 "color12"
-#define XtNcolor13 "color13"
-#define XtNcolor14 "color14"
-#define XtNcolor15 "color15"
-#define XtNcolorBD "colorBD"
-#define XtNcolorBL "colorBL"
-#define XtNcolorUL "colorUL"
-#define XtNcolorMode "colorMode"
-#define XtNcolorULMode "colorULMode"
-#define XtNcolorBDMode "colorBDMode"
-#define XtNcolorBLMode "colorBLMode"
-#define XtNcolorAttrMode "colorAttrMode"
-#define XtNboldColors "boldColors"
-#define XtNdynamicColors "dynamicColors"
-#if OPT_HIGHLIGHT_COLOR
-#define XtNhighlightColor "highlightColor"
-#endif /* OPT_HIGHLIGHT_COLOR */
-#define XtNunderLine "underLine"
-#define XtNdecTerminalID "decTerminalID"
+#define XtNlogFile             "logFile"
+#define XtNlogInhibit          "logInhibit"
+#define XtNlogging             "logging"
+#endif
 
-#define XtCAlwaysHighlight "AlwaysHighlight"
-#define XtCAppcursorDefault "AppcursorDefault"
-#define XtCAppkeypadDefault "AppkeypadDefault"
-#define XtCBackarrowKey "BackarrowKey"
-#define XtCBellSuppressTime "BellSuppressTime"
-#define XtCBoldFont "BoldFont"
-#define XtCC132 "C132"
-#define XtCCharClass "CharClass"
-#define XtCCurses "Curses"
-#define XtCHpLowerleftBugCompat "HpLowerleftBugCompat"
-#define XtCXmcGlitch "XmcGlitch"
-#define XtCXmcAttributes "XmcAttributes"
-#define XtCXmcInline "XmcInline"
-#define XtCXmcMoveSGR "XmcMoveSGR"
-#define XtCCutNewline "CutNewline"
-#define XtCCutToBeginningOfLine "CutToBeginningOfLine"
-#define XtCCursorBlinkTime "CursorBlinkTime"
-#define XtCEightBitInput "EightBitInput"
-#define XtCEightBitOutput "EightBitOutput"
-#define XtCEightBitControl "EightBitControl"
-#define XtCHighlightSelection "HighlightSelection"
 #ifdef NO_ACTIVE_ICON
-#define XtCGeometry "Geometry"
-#endif /* NO_ACTIVE_ICON */
-#define XtCJumpScroll "JumpScroll"
+#define XtNgeometry            "geometry"
+#endif
+
+#if OPT_HIGHLIGHT_COLOR
+#define XtNhighlightColor      "highlightColor"
+#endif
+
+#define XtCAllowSendEvents     "AllowSendEvents"
+#define XtCAlwaysHighlight     "AlwaysHighlight"
+#define XtCAppcursorDefault    "AppcursorDefault"
+#define XtCAppkeypadDefault    "AppkeypadDefault"
+#define XtCAutoWrap            "AutoWrap"
+#define XtCAwaitInput          "AwaitInput"
+#define XtCBackarrowKey                "BackarrowKey"
+#define XtCBellSuppressTime    "BellSuppressTime"
+#define XtCBoldFont            "BoldFont"
+#define XtCC132                        "C132"
+#define XtCCharClass           "CharClass"
+#define XtCColorMode           "ColorMode"
+#define XtCColumn              "Column"
+#define XtCCurses              "Curses"
+#define XtCCursorBlinkTime     "CursorBlinkTime"
+#define XtCCutNewline          "CutNewline"
+#define XtCCutToBeginningOfLine        "CutToBeginningOfLine"
+#define XtCDecTerminalID       "DecTerminalID"
+#define XtCDynamicColors       "DynamicColors"
+#define XtCEightBitControl     "EightBitControl"
+#define XtCEightBitInput       "EightBitInput"
+#define XtCEightBitOutput      "EightBitOutput"
+#define XtCHighlightSelection  "HighlightSelection"
+#define XtCHpLowerleftBugCompat        "HpLowerleftBugCompat"
+#define XtCJumpScroll          "JumpScroll"
+#define XtCLoginShell          "LoginShell"
+#define XtCMarginBell          "MarginBell"
+#define XtCMultiClickTime      "MultiClickTime"
+#define XtCMultiScroll         "MultiScroll"
+#define XtCPrintAttributes     "PrintAttributes"
+#define XtCPrinterCommand      "PrinterCommand"
+#define XtCPrinterControlMode  "PrinterControlMode"
+#define XtCPrinterExtent       "PrinterExtent"
+#define XtCPrinterFormFeed     "PrinterFormFeed"
+#define XtCResizeGravity       "ResizeGravity"
+#define XtCReverseWrap         "ReverseWrap"
+#define XtCRightScrollBar      "RightScrollBar"
+#define XtCSaveLines           "SaveLines"
+#define XtCScrollBar           "ScrollBar"
+#define XtCScrollCond          "ScrollCond"
+#define XtCScrollLines         "ScrollLines"
+#define XtCScrollPos           "ScrollPos"
+#define XtCSignalInhibit       "SignalInhibit"
+#define XtCTekInhibit          "TekInhibit"
+#define XtCTekSmall            "TekSmall"
+#define XtCTekStartup          "TekStartup"
+#define XtCTiteInhibit         "TiteInhibit"
+#define XtCUnderLine           "UnderLine"
+#define XtCVisualBell          "VisualBell"
+#define XtCXmcAttributes       "XmcAttributes"
+#define XtCXmcGlitch           "XmcGlitch"
+#define XtCXmcInline           "XmcInline"
+#define XtCXmcMoveSGR          "XmcMoveSGR"
+
 #ifdef ALLOWLOGGING
-#define XtCLogfile "Logfile"
-#define XtCLogging "Logging"
-#define XtCLogInhibit "LogInhibit"
-#endif
-#define XtCLoginShell "LoginShell"
-#define XtCMarginBell "MarginBell"
-#define XtCMultiClickTime "MultiClickTime"
-#define XtCMultiScroll "MultiScroll"
-#define XtCColumn "Column"
-#define XtCResizeGravity "ResizeGravity"
-#define XtCReverseWrap "ReverseWrap"
-#define XtCAutoWrap "AutoWrap"
-#define XtCPrinterControlMode "PrinterControlMode"
-#define XtCPrinterCommand "PrinterCommand"
-#define XtCPrinterExtent "PrinterExtent"
-#define XtCPrinterFormFeed "PrinterFormFeed"
-#define XtCSaveLines "SaveLines"
-#define XtCScrollBar "ScrollBar"
-#define XtCRightScrollBar "RightScrollBar"
-#define XtCScrollLines "ScrollLines"
-#define XtCScrollPos "ScrollPos"
-#define XtCScrollCond "ScrollCond"
-#define XtCSignalInhibit "SignalInhibit"
-#define XtCTekInhibit "TekInhibit"
-#define XtCTekSmall "TekSmall"
-#define XtCTekStartup "TekStartup"
-#define XtCTiteInhibit "TiteInhibit"
-#define XtCVisualBell "VisualBell"
-#define XtCAllowSendEvents "AllowSendEvents"
-#define XtCAwaitInput "AwaitInput"
-#define XtCColorMode "ColorMode"
-#define XtCDynamicColors "DynamicColors"
-#define XtCUnderLine "UnderLine"
-#define XtCDecTerminalID "DecTerminalID"
+#define XtCLogInhibit          "LogInhibit"
+#define XtCLogfile             "Logfile"
+#define XtCLogging             "Logging"
+#endif
+
+#ifdef NO_ACTIVE_ICON
+#define XtCGeometry            "Geometry"
+#endif
 
 #define        doinput()               (bcnt-- > 0 ? *bptr++ : in_put())
 
@@ -365,6 +372,10 @@
 static  int    defaultBlinkTime = 0;
 #endif
 
+#if OPT_PRINT_COLORS
+static  int    defaultONE = 1;
+#endif
+
 /*
  * Warning, the following must be kept under 1024 bytes or else some
  * compilers (particularly AT&T 6386 SVR3.2) will barf).  Workaround is to
@@ -585,6 +596,11 @@
 {XtNpointerShape,XtCCursor, XtRCursor, sizeof(Cursor),
        XtOffsetOf(XtermWidgetRec, screen.pointer_cursor),
        XtRString, (XtPointer) "xterm"},
+#ifdef OPT_PRINT_COLORS
+{XtNprintAttributes,XtCPrintAttributes, XtRInt, sizeof(int),
+       XtOffsetOf(XtermWidgetRec, screen.print_attributes),
+       XtRInt, (XtPointer) &defaultONE},
+#endif
 {XtNprinterControlMode, XtCPrinterControlMode, XtRInt, sizeof(int),
        XtOffsetOf(XtermWidgetRec, screen.printer_controlmode),
         XtRInt, (XtPointer) &defaultZERO},
@@ -3710,6 +3726,9 @@
    new->screen.printer_extent = request->screen.printer_extent;
    new->screen.printer_formfeed = request->screen.printer_formfeed;
    new->screen.printer_controlmode = request->screen.printer_controlmode;
+#ifdef OPT_PRINT_COLORS
+   new->screen.print_attributes = request->screen.print_attributes;
+#endif
 
    new->screen.input_eight_bits = request->screen.input_eight_bits;
    new->screen.output_eight_bits = request->screen.output_eight_bits;
Index: main.c
--- xterm-73+/main.c    Sat Apr 25 12:12:47 1998
+++ xterm-74/main.c     Mon Apr 27 18:45:32 1998
@@ -2442,6 +2442,7 @@
                /*
                 * now in child process
                 */
+               TRACE_CHILD
 #if defined(_POSIX_SOURCE) || defined(SVR4) || defined(__convex__) || defined(SCO325)
                int pgrp = setsid();
 #else
@@ -2451,7 +2452,6 @@
                char* ptyname;
                char* ptynameptr = 0;
 #endif
-               TRACE_CHILD;
 
 #ifdef USE_USG_PTYS
 #if defined(SYSV) && defined(i386) && !defined(SVR4)
Index: misc.c
--- xterm-73+/misc.c    Sat Apr 25 11:50:52 1998
+++ xterm-74/misc.c     Mon Apr 27 19:14:14 1998
@@ -591,8 +591,6 @@
 /*
  * Logging is a security hole, since it allows a setuid program to write
  * arbitrary data to an arbitrary file.  So it is disabled by default.
- * (However, this version of xterm resets the setuid before opening the
- * logfile).
  */
 
 #ifdef ALLOWLOGFILEEXEC
Index: print.c
--- xterm-73+/print.c   Sat Apr 25 10:51:07 1998
+++ xterm-74/print.c    Mon Apr 27 19:25:35 1998
@@ -4,7 +4,7 @@
 
 /************************************************************
 
-Copyright 1997 by Thomas E. Dickey <dickey@clark.net>
+Copyright 1997,1998 by Thomas E. Dickey <dickey@clark.net>
 
                         All Rights Reserved
 
@@ -42,8 +42,10 @@
 
 #include "ptyx.h"
 #include "data.h"
+#include "error.h"
 #include "xterm.h"
 
+#define isForm(c) ((c) == '\r' || (c) == '\n' || (c) == '\f')
 #define Strlen(a) strlen((char *)a)
 #define Strcmp(a,b) strcmp((char *)a,(char *)b)
 #define Strncmp(a,b,c) strncmp((char *)a,(char *)b,c)
@@ -99,13 +101,21 @@
                        break;
        }
        if (last) {
-               send_CharSet(row);      /* FIXME: is this needed? */
-               send_SGR(0,-1,-1);
+               if (screen->print_attributes) {
+                       send_CharSet(row);
+                       send_SGR(0,-1,-1);
+               }
                for (col = 0; col < last; col++) {
 #if OPT_PRINT_COLORS
                        if_OPT_ISO_COLORS(screen,{
-                               fg = (a[col] & FG_COLOR) ? extract_fg(fb[col], a[col]) : -1;
-                               bg = (a[col] & BG_COLOR) ? extract_bg(fb[col]) : -1;
+                               if (screen->print_attributes > 1) {
+                                       fg = (a[col] & FG_COLOR)
+                                               ? extract_fg(fb[col], a[col])
+                                               : -1;
+                                       bg = (a[col] & BG_COLOR)
+                                               ? extract_bg(fb[col])
+                                               : -1;
+                               }
                        })
 #endif
                        if ((((a[col] & SGR_MASK) != attr)
@@ -117,11 +127,13 @@
                                attr = (a[col] & SGR_MASK);
                                last_fg = fg;
                                last_bg = bg;
-                               send_SGR(attr, fg, bg);
+                               if (screen->print_attributes)
+                                       send_SGR(attr, fg, bg);
                        }
                        charToPrinter(c[col] ? c[col] : ' ');
                }
-               send_SGR(0,-1,-1);
+               if (screen->print_attributes)
+                       send_SGR(0,-1,-1);
        }
        charToPrinter('\r');
        charToPrinter(chr);
@@ -202,13 +214,38 @@
 {
        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 (isForm(c))
+                                       fflush(Printer);
+                       }
+                       exit(0);
+               } else {
+                       close(my_pipe[0]);      /* won't read from printer */
+                       Printer = fdopen(my_pipe[1], "w");
+               }
                initialized++;
        }
        if (Printer != 0) {
                fputc(chr, Printer);
-               if (chr == '\r' || chr == '\n' || chr == '\f')
+               if (isForm(chr))
                        fflush(Printer);
        }
 }
Index: ptyx.h
--- xterm-73+/ptyx.h    Sat Apr 25 12:10:46 1998
+++ xterm-74/ptyx.h     Mon Apr 27 18:34:14 1998
@@ -636,10 +636,13 @@
 #endif /* NO_ACTIVE_ICON */
        Cursor pointer_cursor;          /* pointer cursor in window     */
 
-       String printer_command;         /* pipe/shell command string    */
+       String  printer_command;        /* pipe/shell command string    */
        Boolean printer_extent;         /* print complete page          */
        Boolean printer_formfeed;       /* print formfeed per function  */
-       int printer_controlmode;        /* 0=off, 1=auto, 2=controller  */
+       int     printer_controlmode;    /* 0=off, 1=auto, 2=controller  */
+#ifdef OPT_PRINT_COLORS
+       int     print_attributes;       /* 0=off, 1=normal, 2=color     */
+#endif
 
        Boolean         fnt_prop;       /* true if proportional fonts   */
        XFontStruct     *fnt_norm;      /* normal font of terminal      */
Index: trace.h
--- xterm-73+/trace.h   Sat Apr 25 12:11:25 1998
+++ xterm-74/trace.h    Mon Apr 27 18:45:40 1998
@@ -43,6 +43,6 @@
 #define TRACE(p) Trace p;
 
 extern char    *trace_who;
-#define TRACE_CHILD trace_who = "child"
+#define TRACE_CHILD int tracing_child = (trace_who = "child") != 0;
 
 #endif /* included_trace_h */
Index: version.h
--- xterm-73+/version.h Fri Apr 24 20:30:23 1998
+++ xterm-74/version.h  Mon Apr 27 19:15:09 1998
@@ -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.9Ag(73)"
+#define XTERM_VERSION "XFree86 3.9Ag(74)"
Index: xterm.log.html
--- xterm-73+/xterm.log.html    Sat Apr 25 18:04:06 1998
+++ xterm-74/xterm.log.html     Mon Apr 27 20:00:23 1998
@@ -41,6 +41,7 @@
 xc/programs/Xserver/hw/xfree86).
 
 <UL>
+<LI><A HREF="#xterm_74">Patch #74 - 1998/4/27 - XFree86 3.9Ag and 3.3.2</A>
 <LI><A HREF="#xterm_73">Patch #73 - 1998/4/25 - XFree86 3.9Ag and 3.3.2</A>
 <LI><A HREF="#xterm_72">Patch #72 - 1998/4/17 - XFree86 3.9Ag and 3.3.2</A>
 <LI><A HREF="#xterm_71">Patch #71 - 1998/4/12 - XFree86 3.9Ag and 3.3.2</A>
@@ -115,6 +116,23 @@
 <LI><A HREF="#xterm_02">Patch #2 - 1996/1/7</A>
 <LI><A HREF="#xterm_01">Patch #1 - 1996/1/6</A>
 </UL>
+
+<H1><A NAME="xterm_74">Patch #74 - 1998/4/27 - XFree86 3.9Ag and 3.3.2</A></H1>
+
+This corrects a couple of recent bugs and adds a new resource:
+<ul>
+       <li>modify definition of TRACE_CHILD so that it does not conflict with
+         ifdef's for USE_USG_PTYS in main.c (reported by Vikas Agnihotri
+         &lt;VikasA@att.com&gt; and Stefan Dalibor).
+
+       <li>correct ownership of file (actually pipe) written by the print
+         controls.  When undoing the setuid changes in patch #69, I overlooked
+         this.  Now xterm forks a process which resets setuid and routes the
+         printer data as the real user.
+
+       <li>add a new resource, "printAttributes", which controls whether
+         color attributes (or any attributes) are sent to the printer.
+</ul>
 
 <H1><A NAME="xterm_73">Patch #73 - 1998/4/25 - XFree86 3.9Ag and 3.3.2</A></H1>
 
Index: xterm.man
--- xterm-73+/xterm.man Fri Apr 24 20:29:02 1998
+++ xterm-74/xterm.man  Mon Apr 27 18:41:24 1998
@@ -975,6 +975,16 @@
 .B "pointerShape (\fPclass\fB Cursor)"
 Specifies the name of the shape of the pointer.  The default is ``xterm.''
 .TP 8
+.B "printAttributes (\fPclass\fB PrintAttributes)"
+Specifies whether to print graphic attributes along with the text.
+A real DEC VTxxx terminal will print the underline, highlighting codes
+but your printer may not handle these.
+A ``0'' disables the attributes.
+A ``1'' prints the normal set of attributes (bold, underline, inverse and blink)
+as VT100-style control sequences.
+A ``2'' prints ANSI color attributes as well.
+The default is ``0.''
+.TP 8
 .B "printerControlMode (\fPclass\fB PrinterControlMode)"
 Specifies the printer control mode.
 A ``1'' selects autoprint mode, which causes