| ... | 
... | 
@@ -79,7 +79,7 @@ find_free_servernum() { | 
| 
79
 | 
79
 | 
 # Clean up files
  | 
| 
80
 | 
80
 | 
 clean_up() {
 | 
| 
81
 | 
81
 | 
     if [ -e "$AUTHFILE" ]; then
  | 
| 
82
 | 
 
 | 
-        XAUTHORITY=$AUTHFILE xauth remove ":$SERVERNUM" >>"$ERRORFILE" 2>&1
  | 
| 
 
 | 
82
 | 
+        XAUTHORITY=$AUTHFILE xauth remove ":$SERVERNUM" >&3 2>&3
  | 
| 
83
 | 
83
 | 
     fi
  | 
| 
84
 | 
84
 | 
     if [ -n "$XVFB_RUN_TMPDIR" ]; then
  | 
| 
85
 | 
85
 | 
         if ! rm -r "$XVFB_RUN_TMPDIR"; then
  | 
| ... | 
... | 
@@ -88,7 +88,7 @@ clean_up() { | 
| 
88
 | 
88
 | 
         fi
  | 
| 
89
 | 
89
 | 
     fi
  | 
| 
90
 | 
90
 | 
     if [ -n "$XVFBPID" ]; then
  | 
| 
91
 | 
 
 | 
-        kill "$XVFBPID" >>"$ERRORFILE" 2>&1
  | 
| 
 
 | 
91
 | 
+        kill "$XVFBPID" >&3 2>&3
  | 
| 
92
 | 
92
 | 
     fi
  | 
| 
93
 | 
93
 | 
 }
  | 
| 
94
 | 
94
 | 
 
  | 
| ... | 
... | 
@@ -139,6 +139,22 @@ if ! command -v xauth >/dev/null; then | 
| 
139
 | 
139
 | 
     exit 3
  | 
| 
140
 | 
140
 | 
 fi
  | 
| 
141
 | 
141
 | 
 
  | 
| 
 
 | 
142
 | 
+# Open fd 3 for diagnostic output from Xvfb, etc.
  | 
| 
 
 | 
143
 | 
+case "$ERRORFILE" in
  | 
| 
 
 | 
144
 | 
+    (/proc/self/fd/1 | /dev/stdout)
  | 
| 
 
 | 
145
 | 
+        # We might not actually be able to write to this if it's a file or
  | 
| 
 
 | 
146
 | 
+        # terminal owned by someone else, so duplicate the fd instead
  | 
| 
 
 | 
147
 | 
+        exec 3>&1
  | 
| 
 
 | 
148
 | 
+        ;;
  | 
| 
 
 | 
149
 | 
+    (/proc/self/fd/2 | /dev/stderr)
  | 
| 
 
 | 
150
 | 
+        # See above
  | 
| 
 
 | 
151
 | 
+        exec 3>&2
  | 
| 
 
 | 
152
 | 
+        ;;
  | 
| 
 
 | 
153
 | 
+    (*)
  | 
| 
 
 | 
154
 | 
+        exec 3>>"$ERRORFILE"
  | 
| 
 
 | 
155
 | 
+        ;;
  | 
| 
 
 | 
156
 | 
+esac
  | 
| 
 
 | 
157
 | 
+
  | 
| 
142
 | 
158
 | 
 # tidy up after ourselves
  | 
| 
143
 | 
159
 | 
 trap clean_up EXIT
  | 
| 
144
 | 
160
 | 
 
  | 
| ... | 
... | 
@@ -156,13 +172,13 @@ MCOOKIE=$(mcookie) | 
| 
156
 | 
172
 | 
 tries=10
  | 
| 
157
 | 
173
 | 
 while [ $tries -gt 0 ]; do
  | 
| 
158
 | 
174
 | 
     tries=$(( $tries - 1 ))
  | 
| 
159
 | 
 
 | 
-    XAUTHORITY=$AUTHFILE xauth source - << EOF >>"$ERRORFILE" 2>&1
  | 
| 
 
 | 
175
 | 
+    XAUTHORITY=$AUTHFILE xauth source - << EOF >&3 2>&3
  | 
| 
160
 | 
176
 | 
 add :$SERVERNUM $XAUTHPROTO $MCOOKIE
  | 
| 
161
 | 
177
 | 
 EOF
  | 
| 
162
 | 
178
 | 
     # handle SIGUSR1 so Xvfb knows to send a signal when it's ready to accept
  | 
| 
163
 | 
179
 | 
     # connections
  | 
| 
164
 | 
180
 | 
     trap : USR1
  | 
| 
165
 | 
 
 | 
-    (trap '' USR1; exec Xvfb ":$SERVERNUM" $XVFBARGS $LISTENTCP -auth $AUTHFILE >>"$ERRORFILE" 2>&1) &
  | 
| 
 
 | 
181
 | 
+    (trap '' USR1; exec Xvfb ":$SERVERNUM" $XVFBARGS $LISTENTCP -auth $AUTHFILE >&3 2>&3 3>&-) &
  | 
| 
166
 | 
182
 | 
     XVFBPID=$!
  | 
| 
167
 | 
183
 | 
 
  | 
| 
168
 | 
184
 | 
     wait || :
  | 
| ... | 
... | 
@@ -181,7 +197,7 @@ done | 
| 
181
 | 
197
 | 
 
  | 
| 
182
 | 
198
 | 
 # Start the command and save its exit status.
  | 
| 
183
 | 
199
 | 
 set +e
  | 
| 
184
 | 
 
 | 
-DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@"
  | 
| 
 
 | 
200
 | 
+DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@" 3>&-
  | 
| 
185
 | 
201
 | 
 RETVAL=$?
  | 
| 
186
 | 
202
 | 
 set -e
  | 
| 
187
 | 
203
 | 
 
  |