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
 +         <VikasA@att.com> 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