XFree86 3.9Ag - xterm patch #74 - 1998/4/27 - T.Dickey 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 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 +Copyright 1997,1998 by Thomas E. Dickey 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). + +

Patch #74 - 1998/4/27 - XFree86 3.9Ag and 3.3.2

+ +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. +

Patch #73 - 1998/4/25 - XFree86 3.9Ag and 3.3.2

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