i3 - improved tiling WM


Testcases: Use Xephyr instead of XDummy

Patch status: merged

Patch by Tony Crisci

Long description:

Replace the XDummy script with Xephyr. This is done because of some
changes in the Xorg server that make XDummy difficult to use.

Rename library internal variables and function names to replace "xdummy"
with "xserver" to show this change (except for renaming the package and
lib file for better git history).

Rename the switch `--keep-xdummy-output` to `--keep-xserver-output`.
This switch should now be rarely used because Xephyr requires less set
up.

Replace "xdummy" with "xephyr" in comments and utility help
information. Update docs to show the new dependency.

fixes #1367

To apply this patch, use:
curl http://cr.i3wm.org/patch/649/raw.patch | git am

b/docs/testsuite

34
@@ -74,6 +74,9 @@ client, simply called +cpan+. It comes with every Perl installation and can be
35
 used to install the testsuite. Many users prefer to use the more modern
36
 +cpanminus+ instead, though (because it asks no questions and just works):
37
 
38
+The tests additionally require +Xephyr(1)+ to run a nested X server. Install
39
++xserver-xephyr+ on Debian or +xorg-xserver-xephyr+ on Arch Linux.
40
+
41
 .Installing testsuite dependencies using cpanminus (preferred)
42
 --------------------------------------------------------------------------------
43
 $ cd ~/i3/testcases
44
@@ -102,7 +105,7 @@ more testcases. Also, it takes care of starting up a separate instance of i3
45
 with an appropriate configuration file and creates a folder for each run
46
 containing the appropriate i3 logfile for each testcase. The latest folder can
47
 always be found under the symlink +latest/+. Unless told differently, it will
48
-run the tests on a separate X server instance (using the Xdummy script).
49
+run the tests on a separate X server instance (using Xephyr).
50
 
51
 .Example invocation of complete-run.pl+
52
 ---------------------------------------
53
@@ -146,12 +149,11 @@ $ less latest/i3-log-for-04-floating.t
54
 If your attempt to run the tests with a bare call to ./complete-run.pl fails, try this:
55
 
56
 ---------------------------------------------------
57
-$ ./complete-run.pl --parallel=1 --keep-xdummy-output
58
+$ ./complete-run.pl --parallel=1 --keep-xserver-output
59
 ---------------------------------------------------
60
 
61
-One common cause of failures is not having the X dummy server module
62
-installed.  Under Debian and Ubuntu this is the package
63
-+xserver-xorg-video-dummy+.
64
+This will show the output of Xephyr, which is the X server implementation we
65
+use for testing.
66
 
67
 ==== IPC interface
68
 
69
@@ -175,10 +177,9 @@ manager.
70
 === Filesystem structure
71
 
72
 In the git root of i3, the testcases live in the folder +testcases+. This
73
-folder contains the +complete-run.pl+ and +Xdummy+ scripts and a base
74
-configuration file which will be used for the tests. The different testcases
75
-(their file extension is .t, not .pl) themselves can be found in the
76
-conventionally named subfolder +t+:
77
+folder contains the +complete-run.pl+ and a base configuration file which will
78
+be used for the tests. The different testcases (their file extension is .t, not
79
+.pl) themselves can be found in the conventionally named subfolder +t+:
80
 
81
 .Filesystem structure
82
 --------------------------------------------
83
@@ -197,7 +198,6 @@ conventionally named subfolder +t+:
84
 │   │   ├── omitted for brevity
85
 │   │   ├── ...
86
 │   │   └── 74-regress-focus-toggle.t
87
-│   └── Xdummy
88
 --------------------------------------------
89
 
90
 == Anatomy of a testcase

b/testcases/.gitignore

95
@@ -8,4 +8,3 @@ inc
96
 META.yml
97
 i3-cfg-for-*
98
 -
99
-Xdummy.so

/dev/null

105
@@ -1,1930 +0,0 @@
106
-#!/bin/sh
107
-# ----------------------------------------------------------------------
108
-#    Copyright (C) 2005-2010 Karl J. Runge <runge@karlrunge.com> 
109
-#    All rights reserved.
110
-# 
111
-# This file is part of Xdummy.
112
-# 
113
-# Xdummy is free software; you can redistribute it and/or modify
114
-# it under the terms of the GNU General Public License as published by
115
-# the Free Software Foundation; either version 2 of the License, or (at
116
-# your option) any later version.
117
-# 
118
-# Xdummy is distributed in the hope that it will be useful,
119
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
120
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
121
-# GNU General Public License for more details.
122
-# 
123
-# You should have received a copy of the GNU General Public License
124
-# along with Xdummy; if not, write to the Free Software
125
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
126
-# or see <http://www.gnu.org/licenses/>.
127
-# ----------------------------------------------------------------------
128
-# 
129
-# 
130
-# Xdummy: an LD_PRELOAD hack to run a stock Xorg(1) or XFree86(1) server
131
-# with the "dummy" video driver to make it avoid Linux VT switching, etc.
132
-#
133
-# Run "Xdummy -help" for more info.
134
-#
135
-install=""
136
-uninstall=""
137
-runit=1
138
-prconf=""
139
-notweak=""
140
-root=""
141
-nosudo=""
142
-xserver=""
143
-geom=""
144
-nomodelines=""
145
-depth=""
146
-debug=""
147
-strace=""
148
-cmdline_config=""
149
-
150
-PATH=$PATH:/bin:/usr/bin
151
-export PATH
152
-
153
-program=`basename "$0"`
154
-
155
-help () {
156
-	${PAGER:-more} << END
157
-$program:
158
-
159
-    A hack to run a stock Xorg(1) or XFree86(1) X server with the "dummy"
160
-    (RAM-only framebuffer) video driver such that it AVOIDS the Linux VT
161
-    switching, opening device files in /dev, keyboard and mouse conflicts,
162
-    and other problems associated with the normal use of "dummy".
163
-
164
-    In other words, it tries to make Xorg/XFree86 with the "dummy"
165
-    device driver act more like Xvfb(1).
166
-
167
-    The primary motivation for the Xdummy script is to provide a virtual X
168
-    server for x11vnc but with more features than Xvfb (or Xvnc); however
169
-    it could be used for other reasons (e.g. better automated testing
170
-    than with Xvfb.)  One nice thing is the dummy server supports RANDR
171
-    dynamic resizing while Xvfb does not.
172
-
173
-    So, for example, x11vnc+Xdummy terminal services are a little better
174
-    than x11vnc+Xvfb.
175
-
176
-    To achieve this, while running the real Xserver $program intercepts
177
-    system and library calls via the LD_PRELOAD method and modifies
178
-    the behavior to make it work correctly (e.g. avoid the VT stuff.)
179
-    LD_PRELOAD tricks are usually "clever hacks" and so might not work
180
-    in all situations or break when something changes.
181
-
182
-    WARNING: Take care in using Xdummy, although it never has it is
183
-    possible that it could damage hardware.  One can use the -prconf
184
-    option to have it print out the xorg.conf config that it would use
185
-    and then inspect it carefully before actually using it.
186
-
187
-    This program no longer needs to be run as root as of 12/2009.
188
-    However, if there are problems for certain situations (usually older
189
-    servers) it may perform better if run as root (use the -root option.)
190
-    When running as root remember the previous paragraph and that Xdummy
191
-    comes without any warranty.
192
-
193
-    gcc/cc and other build tools are required for this script to be able
194
-    to compile the LD_PRELOAD shared object.  Be sure they are installed
195
-    on the system.  See -install and -uninstall described below.
196
-
197
-    Your Linux distribution may not install the dummy driver by default,
198
-    e.g:
199
-
200
-        /usr/lib/xorg/modules/drivers/dummy_drv.so
201
-    
202
-    some have it in a package named xserver-xorg-video-dummy you that
203
-    need to install.
204
-
205
-Usage:
206
-
207
-	$program <${program}-args> <Xserver-args>
208
-
209
-	(actually, the arguments can be supplied in any order.)
210
-
211
-Examples:
212
-
213
-	$program -install
214
-
215
-	$program :1
216
-
217
-	$program -debug :1
218
-
219
-	$program -tmpdir ~/mytmp :1 -nolisten tcp
220
-
221
-startx example:
222
-
223
-	startx -e bash -- $program :2 -depth 16
224
-
225
-	(if startx needs to be run as root, you can su(1) to a normal
226
-	user in the bash shell and then launch ~/.xinitrc or ~/.xsession,
227
-	gnome-session, startkde, startxfce4, etc.)
228
-
229
-xdm example:
230
-
231
-	xdm -config /usr/local/dummy/xdm-config -nodaemon
232
-
233
-	where the xdm-config file has line:
234
-
235
-	     DisplayManager.servers:         /usr/local/dummy/Xservers
236
-
237
-	and /usr/local/dummy/Xservers has lines:
238
-
239
-	     :1 local /usr/local/dummy/Xdummy :1 -debug
240
-	     :2 local /usr/local/dummy/Xdummy :2 -debug
241
-
242
-        (-debug is optional)
243
-
244
-gdm/kdm example:
245
-
246
-	TBD.
247
-
248
-Root permission and x11vnc:
249
-
250
-	Update: as of 12/2009 this program no longer must be run as root.
251
-	So try it as non-root before running it as root and/or the
252
-	following schemes.
253
-
254
-	In some circumstances X server program may need to be run as root.
255
-	If so, one could run x11vnc as root with -unixpw (it switches
256
-	to the user that logs in) and that may be OK, some other ideas:
257
-
258
-	- add this to sudo via visudo:
259
-
260
-		ALL ALL = NOPASSWD: /usr/local/bin/Xdummy
261
-
262
-	- use this little suid wrapper:
263
-/* 
264
- * xdummy.c
265
- *
266
-   cc -o ./xdummy xdummy.c
267
-   sudo cp ./xdummy /usr/local/bin/xdummy
268
-   sudo chown root:root /usr/local/bin/xdummy
269
-   sudo chmod u+s /usr/local/bin/xdummy
270
- *
271
- */
272
-#include <unistd.h>
273
-#include <stdlib.h>
274
-#include <sys/types.h>
275
-#include <stdio.h>
276
-
277
-int main (int argc, char *argv[]) {
278
-	extern char **environ;
279
-	char str[100];
280
-	sprintf(str, "XDUMMY_UID=%d", (int) getuid());
281
-	putenv(str);
282
-	setuid(0);  
283
-	setgid(0);
284
-	execv("/usr/local/bin/Xdummy", argv); 
285
-	exit(1);
286
-	return 1;
287
-}
288
-
289
-
290
-Options:
291
-
292
-    ${program}-args:
293
-
294
-	-install	Compile the LD_PRELOAD shared object and install it
295
-			next to the $program script file as:
296
-
297
-			  $0.so
298
-
299
-			When that file exists it is used as the LD_PRELOAD
300
-			shared object without recompiling.  Otherwise,
301
-			each time $program is run the LD_PRELOAD shared
302
-			object is compiled as a file in /tmp (or -tmpdir)
303
-
304
-			If you set the environment variable
305
-			INTERPOSE_GETUID=1 when building, then when
306
-			$program is run as an ordinary user, the shared
307
-			object will interpose getuid() calls and pretend
308
-			to be root.  Otherwise it doesn't pretend to
309
-			be root.
310
-
311
-			You can also set the CFLAGS environment variable
312
-			to anything else you want on the compile cmdline.
313
-
314
-	-uninstall	Remove the file:
315
-
316
-			  $0.so
317
-
318
-			The LD_PRELOAD shared object will then be compiled
319
-			each time this program is run.
320
-
321
-	The X server is not started under -install, -uninstall, or -prconf.
322
-
323
-
324
-	:N		The DISPLAY (e.g. :15) is often the first
325
-			argument.  It is passed to the real X server and
326
-			also used by the Xdummy script as an identifier.
327
-
328
-	-geom geom1[,geom2...]	Take the geometry (e.g. 1024x768) or list
329
-			of geometries and insert them into the Screen
330
-			section of the tweaked X server config file.
331
-			Use this to have a different geometry than the
332
-			one(s) in the system config file.
333
-
334
-			The option -geometry can be used instead of -geom;
335
-			x11vnc calls Xdummy and Xvfb this way.
336
-
337
-	-nomodelines	When you specify -geom/-geometry, $program will
338
-			create Modelines for each geometry and put them
339
-			in the Monitor section.  If you do not want this
340
-			then supply -nomodelines.
341
-
342
-	-depth n	Use pixel color depth n (e.g. 8, 16, or 24). This
343
-			makes sure the X config file has a Screen.Display
344
-			subsection of this depth.  Note this option is
345
-			ALSO passed to the X server.
346
-
347
-	-DEPTH n	Same as -depth, except not passed to X server.
348
-
349
-	-tmpdir dir	Specify a temporary directory, owned by you and
350
-			only writable by you.  This is used in place of
351
-			/tmp/Xdummy.\$USER/..  to place the $program.so
352
-			shared object, tweaked config files, etc.
353
-
354
-	-nonroot	Run in non-root mode (working 12/2009, now default)
355
-
356
-	-root		Run as root (may still be needed in some
357
-			environments.)  Same as XDUMMY_RUN_AS_ROOT=1.
358
-
359
-	-nosudo		Do not try to use sudo(1) when re-running as root,
360
-			use su(1) instead.
361
-
362
-	-xserver path	Specify the path to the Xserver to use.  Default
363
-			is to try "Xorg" first and then "XFree86".  If
364
-			those are not in \$PATH, it tries these locations:
365
-				/usr/bin/Xorg
366
-				/usr/X11R6/bin/Xorg
367
-				/usr/X11R6/bin/XFree86
368
-
369
-	-n		Do not run the command to start the X server,
370
-			just show the command that $program would run.
371
-			The LD_PRELOAD shared object will be built,
372
-			if needed.  Also note any XDUMMY* environment
373
-			variables that need to be set.
374
-
375
-	-prconf		Print, to stdout, the tweaked Xorg/XFree86
376
-			config file (-config and -xf86config server
377
-			options, respectively.)  The Xserver is not
378
-			started.
379
-
380
-	-notweak	Do not tweak (modify) the Xorg/XFree86 config file
381
-			(system or server command line) at all.  The -geom
382
-			and similar config file modifications are ignored.
383
-
384
-			It is up to you to make sure it is a working
385
-			config file (e.g. "dummy" driver, etc.)
386
-			Perhaps you want to use a file based on the
387
-			-prconf output.
388
-
389
-	-debug		Extra debugging output.
390
-
391
-	-strace		strace(1) the Xserver process (for troubleshooting.)
392
-	-ltrace		ltrace(1) instead of strace (can be slow.)
393
-
394
-	-h, -help	Print out this help.
395
-
396
-
397
-    Xserver-args:
398
-
399
-	Most of the Xorg and XFree86 options will work and are simply
400
-	passed along if you supply them.  Important ones that may be
401
-	supplied if missing:
402
-
403
-	:N		X Display number for server to use.
404
-
405
-	vtNN		Linux virtual terminal (VT) to use (a VT is currently
406
-			still used, just not switched to and from.)
407
-
408
-	-config file		Driver "dummy" tweaked config file, a
409
-	-xf86config file	number of settings are tweaked besides Driver.
410
-
411
-	If -config/-xf86config is not given, the system one
412
-	(e.g. /etc/X11/xorg.conf) is used.  If the system one cannot be
413
-	found, a built-in one is used.	Any settings in the config file
414
-	that are not consistent with "dummy" mode will be overwritten
415
-	(unless -notweak is specified.)
416
-
417
-	Use -config xdummy-builtin to force usage of the builtin config.
418
-
419
-	If "file" is only a basename (e.g. "xorg.dummy.conf") with no /'s,
420
-	then no tweaking of it is done: the X server will look for that
421
-	basename via its normal search algorithm.  If the found file does
422
-	not refer to the "dummy" driver, etc, then the X server will fail.
423
-
424
-Notes:
425
-
426
-    The Xorg/XFree86 "dummy" driver is currently undocumented.  It works
427
-    well in this mode, but it is evidently not intended for end-users.
428
-    So it could be removed or broken at any time.
429
-
430
-    If the display Xserver-arg (e.g. :1) is not given, or ":" is given
431
-    that indicates $program should try to find a free one (based on
432
-    tcp ports.)
433
-
434
-    If the display virtual terminal, VT, (e.g. vt9) is not given that
435
-    indicates $program should try to find a free one (or guess a high one.) 
436
-    
437
-    This program is not completely secure WRT files in /tmp (but it tries
438
-    to a good degree.)  Better is to use the -tmpdir option to supply a
439
-    directory only writable by you.  Even better is to get rid of users
440
-    on the local machine you do not trust :-)
441
-
442
-    Set XDUMMY_SET_XV=1 to turn on debugging output for this script.
443
-
444
-END
445
-}
446
-
447
-warn() {
448
-	echo "$*" 1>&2
449
-}
450
-
451
-if [ "X$XDUMMY_SET_XV" != "X" ]; then
452
-	set -xv
453
-fi
454
-
455
-if [ "X$XDUMMY_UID" = "X" ]; then
456
-	XDUMMY_UID=`id -u`
457
-	export XDUMMY_UID
458
-fi
459
-if [ "X$XDUMMY_UID" = "X0" ]; then
460
-	if [ "X$SUDO_UID" != "X" ]; then
461
-		XDUMMY_UID=$SUDO_UID
462
-		export XDUMMY_UID
463
-	fi
464
-fi
465
-
466
-# check if root=1 first:
467
-#
468
-if [ "X$XDUMMY_RUN_AS_ROOT" = "X1" ]; then
469
-	root=1
470
-fi
471
-for arg in $*
472
-do
473
-	if [ "X$arg" = "X-nonroot" ]; then
474
-		root=""
475
-	elif [ "X$arg" = "X-root" ]; then
476
-		root=1
477
-	fi
478
-done
479
-
480
-# See if it really needs to be run as root:
481
-#
482
-if [ "X$XDUMMY_SU_EXEC" = "X" -a "X$root" = "X1" -a "X`id -u`" != "X0"  ]; then
483
-	# this is to prevent infinite loop in case su/sudo doesn't work:
484
-	XDUMMY_SU_EXEC=1
485
-	export XDUMMY_SU_EXEC
486
-
487
-	dosu=1
488
-	nosudo=""
489
-
490
-	for arg in $*
491
-	do
492
-		if [ "X$arg" = "X-nonroot" ]; then
493
-			dosu=""
494
-		elif [ "X$arg" = "X-nosudo" ]; then
495
-			nosudo="1"
496
-		elif [ "X$arg" = "X-help" ]; then
497
-			dosu=""
498
-		elif [ "X$arg" = "X-h" ]; then
499
-			dosu=""
500
-		elif [ "X$arg" = "X-install" ]; then
501
-			dosu=""
502
-		elif [ "X$arg" = "X-uninstall" ]; then
503
-			dosu=""
504
-		elif [ "X$arg" = "X-n" ]; then
505
-			dosu=""
506
-		elif [ "X$arg" = "X-prconf" ]; then
507
-			dosu=""
508
-		fi
509
-	done
510
-	if [ $dosu ]; then
511
-		# we need to restart it with su/sudo:
512
-		if type sudo > /dev/null 2>&1; then
513
-			:
514
-		else
515
-			nosudo=1
516
-		fi
517
-		if [ "X$nosudo" = "X" ]; then
518
-			warn "$program: supply the sudo password to restart as root:"
519
-			if [ "X$XDUMMY_UID" != "X" ]; then
520
-				exec sudo $0 -uid $XDUMMY_UID "$@"
521
-			else
522
-				exec sudo $0 "$@"
523
-			fi
524
-		else
525
-			warn "$program: supply the root password to restart as root:"
526
-			if [ "X$XDUMMY_UID" != "X" ]; then
527
-				exec su -c "$0 -uid $XDUMMY_UID $*"
528
-			else
529
-				exec su -c "$0 $*"
530
-			fi
531
-		fi
532
-		# DONE:
533
-		exit
534
-	fi
535
-fi
536
-
537
-# This will hold the X display, e.g. :20
538
-#
539
-disp=""
540
-args=""
541
-cmdline_config=""
542
-
543
-# Process Xdummy args:
544
-#
545
-while [ "X$1" != "X" ]
546
-do
547
-    if [ "X$1" = "X-config" -o "X$1" = "X-xf86config" ]; then
548
-    	cmdline_config="$2"
549
-    fi
550
-    case $1 in 
551
-	":"*)	disp=$1
552
-                ;;
553
-	"-install") install=1; runit=""
554
-                ;;
555
-	"-uninstall") uninstall=1; runit=""
556
-                ;;
557
-	"-n")  runit=""
558
-                ;;
559
-	"-no") runit=""
560
-                ;;
561
-	"-norun") runit=""
562
-                ;;
563
-	"-prconf") prconf=1; runit=""
564
-                ;;
565
-	"-notweak") notweak=1
566
-                ;;
567
-	"-noconf")  notweak=1
568
-                ;;
569
-	"-nonroot") root=""
570
-                ;;
571
-	"-root")    root=1
572
-                ;;
573
-	"-nosudo") nosudo=1
574
-                ;;
575
-	"-xserver") xserver="$2"; shift
576
-                ;;
577
-	"-uid") XDUMMY_UID="$2"; shift
578
-		export XDUMMY_UID
579
-                ;;
580
-	"-geom")     geom="$2"; shift
581
-                ;;
582
-	"-geometry") geom="$2"; shift
583
-                ;;
584
-	"-nomodelines") nomodelines=1
585
-                ;;
586
-	"-depth") depth="$2"; args="$args -depth $2";
587
-		  shift
588
-                ;;
589
-	"-DEPTH") depth="$2"; shift
590
-                ;;
591
-	"-tmpdir") XDUMMY_TMPDIR="$2"; shift
592
-                ;;
593
-	"-debug")   debug=1
594
-                ;;
595
-	"-nodebug") debug=""
596
-                ;;
597
-	"-strace") strace=1
598
-                ;;
599
-	"-ltrace") strace=2
600
-                ;;
601
-	"-h")	 help; exit 0
602
-                ;;
603
-	"-help") help; exit 0
604
-                ;;
605
-	*)	args="$args $1"
606
-                ;;
607
-    esac
608
-    shift
609
-done
610
-
611
-# Try to get a username for use in our tmp directory, etc.
612
-#
613
-user=""
614
-if [ X`id -u` = "X0"  ]; then
615
-	user=root	# this will also be used below for id=0
616
-elif [ "X$USER" != "X" ]; then
617
-	user=$USER
618
-elif [ "X$LOGNAME" != "X" ]; then
619
-	user=$LOGNAME
620
-fi
621
-
622
-# Keep trying...
623
-#
624
-if [ "X$user" = "X" ]; then
625
-	user=`whoami 2>/dev/null`
626
-fi
627
-if [ "X$user" = "X" ]; then
628
-	user=`basename "$HOME"`
629
-fi
630
-if [ "X$user" = "X" -o "X$user" = "X." ]; then
631
-	user="u$$"
632
-fi
633
-
634
-if [ "X$debug" = "X1" -a "X$runit" != "X" ]; then
635
-	echo ""
636
-	echo "/usr/bin/env:"
637
-	env | egrep -v '^(LS_COLORS|TERMCAP)' | sort
638
-	echo ""
639
-fi
640
-
641
-# Function to compile the LD_PRELOAD shared object:
642
-#
643
-make_so() {
644
-	# extract code embedded in this script into a tmp C file: 
645
-	n1=`grep -n '^#code_begin' $0 | head -1 | awk -F: '{print $1}'`
646
-	n2=`grep -n '^#code_end'   $0 | head -1 | awk -F: '{print $1}'`
647
-	n1=`expr $n1 + 1`
648
-	dn=`expr $n2 - $n1`
649
-
650
-	tmp=$tdir/Xdummy.$RANDOM$$.c
651
-	rm -f $tmp
652
-	if [ -e $tmp -o -h $tmp ]; then
653
-		warn "$tmp still exists."
654
-		exit 1
655
-	fi
656
-	touch $tmp || exit 1
657
-	tail -n +$n1 $0 | head -n $dn > $tmp
658
-
659
-	# compile it to Xdummy.so:
660
-	if [ -f "$SO" ]; then
661
-		mv $SO $SO.$$
662
-		rm -f $SO.$$
663
-	fi
664
-	rm -f $SO
665
-	touch $SO
666
-	if [ ! -f "$SO" ]; then
667
-		SO=$tdir/Xdummy.$user.so
668
-		warn "warning switching LD_PRELOAD shared object to: $SO"
669
-	fi
670
-
671
-	if [ -f "$SO" ]; then
672
-		mv $SO $SO.$$
673
-		rm -f $SO.$$
674
-	fi
675
-	rm -f $SO
676
-
677
-	# we assume gcc:
678
-	if [ "X$INTERPOSE_GETUID" = "X1" ]; then
679
-		CFLAGS="$CFLAGS -DINTERPOSE_GETUID"
680
-	fi
681
-	echo "$program:" cc -shared -fPIC $CFLAGS -o $SO $tmp
682
-                         cc -shared -fPIC $CFLAGS -o $SO $tmp
683
-	rc=$?
684
-	rm -f $tmp
685
-	if [ $rc != 0 ]; then
686
-		warn "$program: cannot build $SO"
687
-		exit 1
688
-	fi
689
-	if [ "X$debug" != "X" -o "X$install" != "X" ]; then
690
-		warn "$program: created  $SO"
691
-		ls -l "$SO"
692
-	fi
693
-}
694
-
695
-# Set tdir to tmp dir for make_so():
696
-if [ "X$XDUMMY_TMPDIR" != "X" ]; then
697
-	tdir=$XDUMMY_TMPDIR
698
-	mkdir -p $tdir
699
-else
700
-	tdir="/tmp"
701
-fi
702
-
703
-# Handle -install/-uninstall case:
704
-SO=$0.so
705
-if [ "X$install" != "X" -o "X$uninstall" != "X" ]; then
706
-	if [ -e "$SO" -o -h "$SO" ]; then
707
-		warn "$program: removing $SO"
708
-	fi
709
-	if [ -f "$SO" ]; then
710
-		mv $SO $SO.$$
711
-		rm -f $SO.$$
712
-	fi
713
-	rm -f $SO
714
-	if [ -e "$SO" -o -h "$SO" ]; then
715
-		warn "warning: $SO still exists."
716
-		exit 1
717
-	fi
718
-	if [ $install ]; then
719
-		make_so
720
-		if [ ! -f "$SO" ]; then
721
-			exit 1
722
-		fi
723
-	fi
724
-	exit 0
725
-fi
726
-
727
-# We need a tmp directory for the .so, tweaked config file, and for
728
-# redirecting filenames we cannot create (under -nonroot)
729
-#
730
-tack=""
731
-if [ "X$XDUMMY_TMPDIR" = "X" ]; then
732
-	XDUMMY_TMPDIR="/tmp/Xdummy.$user"
733
-
734
-	# try to tack on a unique subdir (display number or pid)
735
-	# to allow multiple instances
736
-	#
737
-	if [ "X$disp" != "X" ]; then
738
-		t0=$disp
739
-	else
740
-		t0=$1
741
-	fi
742
-	tack=`echo "$t0" | sed -e 's/^.*://'`
743
-	if echo "$tack" | grep '^[0-9][0-9]*$' > /dev/null; then
744
-		:
745
-	else
746
-		tack=$$
747
-	fi
748
-	if [ "X$tack" != "X" ]; then
749
-		XDUMMY_TMPDIR="$XDUMMY_TMPDIR/$tack"
750
-	fi
751
-fi
752
-
753
-tmp=$XDUMMY_TMPDIR
754
-if echo "$tmp" | grep '^/tmp' > /dev/null; then
755
-	if [ "X$tmp" != "X/tmp" -a "X$tmp" != "X/tmp/" ]; then
756
-		# clean this subdir of /tmp out, otherwise leave it...
757
-		rm -rf $XDUMMY_TMPDIR
758
-		if [ -e $XDUMMY_TMPDIR ]; then
759
-			warn "$XDUMMY_TMPDIR still exists"
760
-			exit 1
761
-		fi
762
-	fi
763
-fi
764
-
765
-mkdir -p $XDUMMY_TMPDIR
766
-chmod 700 $XDUMMY_TMPDIR
767
-if [ "X$tack" != "X" ]; then
768
-	chmod 700 `dirname "$XDUMMY_TMPDIR"` 2>/dev/null
769
-fi
770
-
771
-# See if we can write something there:
772
-#
773
-tfile="$XDUMMY_TMPDIR/test.file"
774
-touch $tfile
775
-if [ ! -f "$tfile" ]; then
776
-	XDUMMY_TMPDIR="/tmp/Xdummy.$$.$USER"
777
-	warn "warning: setting tmpdir to $XDUMMY_TMPDIR ..."
778
-	rm -rf $XDUMMY_TMPDIR || exit 1
779
-	mkdir -p $XDUMMY_TMPDIR || exit 1
780
-fi
781
-rm -f $tfile
782
-
783
-export XDUMMY_TMPDIR
784
-
785
-# Compile the LD_PRELOAD shared object if needed (needs XDUMMY_TMPDIR)
786
-#
787
-if [ ! -f "$SO" ]; then
788
-	SO="$XDUMMY_TMPDIR/Xdummy.so"
789
-	make_so
790
-fi
791
-
792
-# Decide which X server to use:
793
-#
794
-if [ "X$xserver" = "X" ]; then
795
-	if type Xorg >/dev/null 2>&1; then
796
-		xserver="Xorg"
797
-	elif type XFree86 >/dev/null 2>&1; then
798
-		xserver="XFree86"
799
-	elif -x /usr/bin/Xorg; then
800
-		xserver="/usr/bin/Xorg"
801
-	elif -x /usr/X11R6/bin/Xorg; then
802
-		xserver="/usr/X11R6/bin/Xorg"
803
-	elif -x /usr/X11R6/bin/XFree86; then
804
-		xserver="/usr/X11R6/bin/XFree86"
805
-	fi
806
-	if [ "X$xserver" = "X" ]; then
807
-		# just let it fail below.
808
-		xserver="/usr/bin/Xorg"
809
-		warn "$program: cannot locate a stock Xserver... assuming $xserver"
810
-	fi
811
-fi
812
-
813
-# See if the binary is suid or not readable under -nonroot mode:
814
-#
815
-if [ "X$BASH_VERSION" != "X" ]; then
816
-	xserver_path=`type -p $xserver 2>/dev/null`
817
-else
818
-	xserver_path=`type $xserver 2>/dev/null | awk '{print $NF}'`
819
-fi
820
-if [ -e "$xserver_path" -a "X$root" = "X" -a "X$runit" != "X" ]; then
821
-	if [ ! -r $xserver_path -o -u $xserver_path -o -g $xserver_path ]; then
822
-		# XXX not quite correct with rm -rf $XDUMMY_TMPDIR ...
823
-		# we keep on a filesystem we know root can write to.
824
-		base=`basename "$xserver_path"`
825
-		new="/tmp/$base.$user.bin"
826
-		if [ -e $new ]; then
827
-			snew=`ls -l $new          | awk '{print $5}' | grep '^[0-9][0-9]*$'`
828
-			sold=`ls -l $xserver_path | awk '{print $5}' | grep '^[0-9][0-9]*$'`
829
-			if [ "X$snew" != "X" -a "X$sold" != "X" -a "X$sold" != "X$snew" ]; then
830
-				warn "removing different sized copy:"
831
-				ls -l $new $xserver_path
832
-				rm -f $new
833
-			fi
834
-		fi
835
-		if [ ! -e $new -o ! -s $new ]; then
836
-			rm -f $new
837
-			touch $new || exit 1
838
-			chmod 700 $new || exit 1
839
-			if [ ! -r $xserver_path ]; then
840
-				warn ""
841
-				warn "NEED TO COPY UNREADABLE $xserver_path to $new as root:"
842
-				warn ""
843
-				ls -l $xserver_path 1>&2
844
-				warn ""
845
-				warn "This only needs to be done once:"
846
-				warn "    cat $xserver_path > $new"
847
-				warn ""
848
-				nos=$nosudo
849
-				if type sudo > /dev/null 2>&1; then
850
-					:
851
-				else
852
-					nos=1
853
-				fi
854
-				if [ "X$nos" = "X1" ]; then
855
-					warn "Please supply root passwd to 'su -c'"
856
-					su -c "cat $xserver_path > $new"
857
-				else
858
-					warn "Please supply the sudo passwd if asked:"
859
-					sudo /bin/sh -c "cat $xserver_path > $new"
860
-				fi
861
-			else
862
-				warn ""
863
-				warn "COPYING SETUID $xserver_path to $new"
864
-				warn ""
865
-				ls -l $xserver_path 1>&2
866
-				warn ""
867
-				cat $xserver_path > $new
868
-			fi
869
-			ls -l $new
870
-			if [ -s $new ]; then
871
-				:
872
-			else
873
-				rm -f $new
874
-				ls -l $new
875
-				exit 1
876
-			fi
877
-			warn ""
878
-			warn "Please restart Xdummy now."
879
-			exit 0
880
-		fi
881
-		if [ ! -O $new ]; then
882
-			warn "file \"$new\" not owned by us!"
883
-			ls -l $new
884
-			exit 1
885
-		fi
886
-		xserver=$new
887
-	fi 
888
-fi
889
-
890
-# Work out display:
891
-#
892
-if [ "X$disp" != "X" ]; then
893
-	:
894
-elif [ "X$1" != "X" ]; then
895
-	if echo "$1" | grep '^:[0-9]' > /dev/null; then
896
-		disp=$1
897
-		shift
898
-	elif [ "X$1" = "X:" ]; then
899
-		# ":" means for us to find one.
900
-		shift
901
-	fi
902
-fi
903
-if [ "X$disp" = "X" -o "X$disp" = "X:" ]; then
904
-	# try to find an open display port:
905
-	# (tcp outdated...)
906
-	ports=`netstat -ant | grep LISTEN | awk '{print $4}' | sed -e 's/^.*://'`
907
-	n=0
908
-	while [ $n -le 20 ]
909
-	do
910
-		port=`printf "60%02d" $n`
911
-		if echo "$ports" | grep "^${port}\$" > /dev/null; then
912
-			:
913
-		else
914
-			disp=":$n"
915
-			warn "$program: auto-selected DISPLAY $disp"
916
-			break	
917
-		fi
918
-		n=`expr $n + 1`
919
-	done
920
-fi
921
-
922
-# Work out which vt to use, try to find/guess an open one if necessary.
923
-#
924
-vt=""
925
-for arg in $*
926
-do
927
-	if echo "$arg" | grep '^vt' > /dev/null; then
928
-		vt=$arg
929
-		break
930
-	fi
931
-done
932
-if [ "X$vt" = "X" ]; then
933
-	if [ "X$user" = "Xroot" ]; then
934
-		# root can user fuser(1) to see if it is in use:
935
-		if type fuser >/dev/null 2>&1; then
936
-			# try /dev/tty17 thru /dev/tty32
937
-			n=17
938
-			while [ $n -le 32 ]
939
-			do
940
-				dev="/dev/tty$n"
941
-				if fuser $dev >/dev/null 2>&1; then
942
-					:
943
-				else
944
-					vt="vt$n"
945
-					warn "$program: auto-selected VT $vt => $dev"
946
-					break
947
-				fi
948
-				n=`expr $n + 1`
949
-			done
950
-		fi
951
-	fi
952
-	if [ "X$vt" = "X" ]; then
953
-		# take a wild guess...
954
-		vt=vt16
955
-		warn "$program: selected fallback VT $vt"
956
-	fi
957
-else
958
-	vt=""
959
-fi
960
-
961
-# Decide flavor of Xserver:
962
-#
963
-stype=`basename "$xserver"`
964
-if echo "$stype" | grep -i xfree86 > /dev/null; then
965
-	stype=xfree86
966
-else
967
-	stype=xorg
968
-fi
969
-
970
-tweak_config() {
971
-    in="$1"
972
-    config2="$XDUMMY_TMPDIR/xdummy_modified_xconfig.conf"
973
-    if [ "X$disp" != "X" ]; then
974
-    	d=`echo "$disp" | sed -e 's,/,,g' -e 's/:/_/g'`
975
-	config2="$config2$d"
976
-    fi
977
-    
978
-    # perl script to tweak the config file... add/delete options, etc.
979
-    #
980
-    env XDUMMY_GEOM=$geom \
981
-        XDUMMY_DEPTH=$depth \
982
-        XDUMMY_NOMODELINES=$nomodelines \
983
-        perl > $config2 < $in -e '
984
-    $n = 0;
985
-    $geom  = $ENV{XDUMMY_GEOM};
986
-    $depth = $ENV{XDUMMY_DEPTH};
987
-    $nomodelines = $ENV{XDUMMY_NOMODELINES};
988
-    $mode_str = "";
989
-    $videoram = "24000";
990
-    $HorizSync   = "30.0 - 130.0";
991
-    $VertRefresh = "50.0 - 250.0";
992
-    if ($geom ne "") {
993
-    	my $tmp = "";
994
-	foreach $g (split(/,/, $geom)) {
995
-		$tmp .= "\"$g\" ";
996
-		if (!$nomodelines && $g =~ /(\d+)x(\d+)/) {
997
-			my $w = $1;
998
-			my $h = $2;
999
-			$mode_str .= "  Modeline \"$g\" ";
1000
-			my $dot = sprintf("%.2f", $w * $h * 70 * 1.e-6);
1001
-			$mode_str .= $dot;
1002
-			$mode_str .= " " . $w;
1003
-			$mode_str .= " " . int(1.02 * $w);
1004
-			$mode_str .= " " . int(1.10 * $w);
1005
-			$mode_str .= " " . int(1.20 * $w);
1006
-			$mode_str .= " " . $h;
1007
-			$mode_str .= " " . int($h + 1);
1008
-			$mode_str .= " " . int($h + 3);
1009
-			$mode_str .= " " . int($h + 20);
1010
-			$mode_str .= "\n";
1011
-		}
1012
-	}
1013
-	$tmp =~ s/\s*$//;
1014
-	$geom = $tmp;
1015
-    }
1016
-    while (<>) {
1017
-	if ($ENV{XDUMMY_NOTWEAK}) {
1018
-		print $_;
1019
-		next;
1020
-	}
1021
-	$n++;
1022
-	if (/^\s*#/) {
1023
-		# pass comments straight thru
1024
-		print;
1025
-		next;
1026
-	}
1027
-	if (/^\s*Section\s+(\S+)/i) {
1028
-		# start of Section
1029
-		$sect = $1;
1030
-		$sect =~ s/\W//g;
1031
-		$sect =~ y/A-Z/a-z/;
1032
-		$sects{$sect} = 1;
1033
-		print;
1034
-		next;
1035
-	}
1036
-	if (/^\s*EndSection/i) {
1037
-		# end of Section
1038
-		if ($sect eq "serverflags") {
1039
-			if (!$got_DontVTSwitch) {
1040
-				print "  ##Xdummy:##\n";
1041
-				print "  Option \"DontVTSwitch\" \"true\"\n";
1042
-			}
1043
-			if (!$got_AllowMouseOpenFail) {
1044
-				print "  ##Xdummy:##\n";
1045
-				print "  Option \"AllowMouseOpenFail\" \"true\"\n";
1046
-			}
1047
-			if (!$got_PciForceNone) {
1048
-				print "  ##Xdummy:##\n";
1049
-				print "  Option \"PciForceNone\" \"true\"\n";
1050
-			}
1051
-		} elsif ($sect eq "device") {
1052
-			if (!$got_Driver) {
1053
-				print "  ##Xdummy:##\n";
1054
-				print "  Driver \"dummy\"\n";
1055
-			}
1056
-			if (!$got_VideoRam) {
1057
-				print "  ##Xdummy:##\n";
1058
-				print "  VideoRam $videoram\n";
1059
-			}
1060
-		} elsif ($sect eq "screen") {
1061
-			if ($depth ne "" && !got_DefaultDepth) {
1062
-				print "  ##Xdummy:##\n";
1063
-				print "  DefaultDepth $depth\n";
1064
-			}
1065
-			if ($got_Monitor eq "") {
1066
-				print "  ##Xdummy:##\n";
1067
-				print "  Monitor \"Monitor0\"\n";
1068
-			}
1069
-		} elsif ($sect eq "monitor") {
1070
-			if (!got_HorizSync) {
1071
-				print "  ##Xdummy:##\n";
1072
-				print "  HorizSync   $HorizSync\n";
1073
-			}
1074
-			if (!got_VertRefresh) {
1075
-				print "  ##Xdummy:##\n";
1076
-				print "  VertRefresh $VertRefresh\n";
1077
-			}
1078
-			if (!$nomodelines) {
1079
-				print "  ##Xdummy:##\n";
1080
-				print $mode_str;
1081
-			}
1082
-		}
1083
-		$sect = "";
1084
-		print;
1085
-		next;
1086
-	}
1087
-
1088
-	if (/^\s*SubSection\s+(\S+)/i) {
1089
-		# start of Section
1090
-		$subsect = $1;
1091
-		$subsect =~ s/\W//g;
1092
-		$subsect =~ y/A-Z/a-z/;
1093
-		$subsects{$subsect} = 1;
1094
-		if ($sect eq "screen" && $subsect eq "display") {
1095
-			$got_Modes = 0;
1096
-		}
1097
-		print;
1098
-		next;
1099
-	}
1100
-	if (/^\s*EndSubSection/i) {
1101
-		# end of SubSection
1102
-		if ($sect eq "screen") {
1103
-			if ($subsect eq "display") {
1104
-				if ($depth ne "" && !$set_Depth) {
1105
-					print "          ##Xdummy:##\n";
1106
-					print "          Depth\t$depth\n";
1107
-				}
1108
-				if ($geom ne "" && ! $got_Modes) {
1109
-					print "          ##Xdummy:##\n";
1110
-					print "          Modes\t$geom\n";
1111
-				}
1112
-			}
1113
-		}
1114
-		$subsect = "";
1115
-		print;
1116
-		next;
1117
-	}
1118
-
1119
-	$l = $_;
1120
-	$l =~ s/#.*$//;
1121
-	if ($sect eq "serverflags") {
1122
-		if ($l =~ /^\s*Option.*DontVTSwitch/i) {
1123
-			$_ =~ s/false/true/ig;
1124
-			$got_DontVTSwitch = 1;
1125
-		}
1126
-		if ($l =~ /^\s*Option.*AllowMouseOpenFail/i) {
1127
-			$_ =~ s/false/true/ig;
1128
-			$got_AllowMouseOpenFail = 1;
1129
-		}
1130
-		if ($l =~ /^\s*Option.*PciForceNone/i) {
1131
-			$_ =~ s/false/true/ig;
1132
-			$got_PciForceNone= 1;
1133
-		}
1134
-	}
1135
-	if ($sect eq "module") {
1136
-		if ($l =~ /^\s*Load.*\b(dri|fbdevhw)\b/i) {
1137
-			$_ = "##Xdummy## $_";
1138
-		}
1139
-	}
1140
-	if ($sect eq "monitor") {
1141
-		if ($l =~ /^\s*HorizSync/i) {
1142
-			$got_HorizSync = 1;
1143
-		}
1144
-		if ($l =~ /^\s*VertRefresh/i) {
1145
-			$got_VertRefresh = 1;
1146
-		}
1147
-	}
1148
-	if ($sect eq "device") {
1149
-		if ($l =~ /^(\s*Driver)\b/i) {
1150
-			$_ = "$1 \"dummy\"\n";
1151
-			$got_Driver = 1;
1152
-		}
1153
-		if ($l =~ /^\s*VideoRam/i) {
1154
-			$got_VideoRam= 1;
1155
-		}
1156
-	}
1157
-	if ($sect eq "inputdevice") {
1158
-		if ($l =~ /^\s*Option.*\bDevice\b/i) {
1159
-			print "  ##Xdummy:##\n";
1160
-			$_ = "  Option \"Device\" \"/dev/dilbert$n\"\n";
1161
-		}
1162
-	}
1163
-	if ($sect eq "screen") {
1164
-		if ($l =~ /^\s*DefaultDepth\s+(\d+)/i) {
1165
-			if ($depth ne "") {
1166
-				print "  ##Xdummy:##\n";
1167
-				$_ = "  DefaultDepth\t$depth\n";
1168
-			}
1169
-			$got_DefaultDepth = 1;
1170
-		}
1171
-		if ($l =~ /^\s*Monitor\s+(\S+)/i) {
1172
-			$got_Monitor = $1;
1173
-			$got_Monitor =~ s/"//g;
1174
-		}
1175
-		if ($subsect eq "display") {
1176
-			if ($geom ne "") {
1177
-				if ($l =~ /^(\s*Modes)\b/i) {
1178
-					print "          ##Xdummy:##\n";
1179
-					$_ = "$1 $geom\n";
1180
-					$got_Modes = 1;
1181
-				}
1182
-			}
1183
-			if ($l =~ /^\s*Depth\s+(\d+)/i) {
1184
-				my $d = $1;
1185
-				if (!$set_Depth && $depth ne "") {
1186
-					$set_Depth = 1;
1187
-					if ($depth != $d) {
1188
-						print "          ##Xdummy:##\n";
1189
-						$_ =  "          Depth\t$depth\n";
1190
-					}
1191
-				}
1192
-			}
1193
-		}
1194
-	}
1195
-	print;
1196
-    }
1197
-    if ($ENV{XDUMMY_NOTWEAK}) {
1198
-	exit;
1199
-    }
1200
-    # create any crucial sections that are missing:
1201
-    if (! exists($sects{serverflags})) {
1202
-	print "\n##Xdummy:##\n";
1203
-    	print "Section \"ServerFlags\"\n";
1204
-    	print "  Option \"DontVTSwitch\" \"true\"\n";
1205
-    	print "  Option \"AllowMouseOpenFail\" \"true\"\n";
1206
-    	print "  Option \"PciForceNone\" \"true\"\n";
1207
-    	print "EndSection\n";
1208
-    }
1209
-    if (! exists($sects{device})) {
1210
-	print "\n##Xdummy:##\n";
1211
-    	print "Section \"Device\"\n";
1212
-    	print "  Identifier \"Videocard0\"\n";
1213
-    	print "  Driver \"dummy\"\n";
1214
-	print "  VideoRam $videoram\n";
1215
-    	print "EndSection\n";
1216
-    }
1217
-    if (! exists($sects{monitor})) {
1218
-	print "\n##Xdummy:##\n";
1219
-    	print "Section \"Monitor\"\n";
1220
-    	print "  Identifier \"Monitor0\"\n";
1221
-    	print "  HorizSync   $HorizSync\n";
1222
-    	print "  VertRefresh $VertRefresh\n";
1223
-    	print "EndSection\n";
1224
-    }
1225
-    if (! exists($sects{screen})) {
1226
-	print "\n##Xdummy:##\n";
1227
-    	print "Section \"Screen\"\n";
1228
-    	print "  Identifier \"Screen0\"\n";
1229
-    	print "  Device \"Videocard0\"\n";
1230
-	if ($got_Monitor ne "") {
1231
-    		print "  Monitor \"$got_Monitor\"\n";
1232
-	} else {
1233
-    		print "  Monitor \"Monitor0\"\n";
1234
-	}
1235
-	if ($depth ne "") {
1236
-    		print "  DefaultDepth $depth\n";
1237
-	} else {
1238
-    		print "  DefaultDepth 24\n";
1239
-	}
1240
-    	print "  SubSection \"Display\"\n";
1241
-    	print "    Viewport 0 0\n";
1242
-    	print "    Depth 24\n";
1243
-	if ($got_Modes) {
1244
-		;
1245
-	} elsif ($geom ne "") {
1246
-    		print "    Modes $geom\n";
1247
-	} else {
1248
-    		print "    Modes \"1280x1024\" \"1024x768\" \"800x600\"\n";
1249
-	}
1250
-    	print "  EndSubSection\n";
1251
-    	print "EndSection\n";
1252
-    }
1253
-';
1254
-}
1255
-
1256
-# Work out config file and tweak it.
1257
-#
1258
-if [ "X$cmdline_config" = "X" ]; then
1259
-	:
1260
-elif [ "X$cmdline_config" = "Xxdummy-builtin" ]; then
1261
-	:
1262
-elif echo "$cmdline_config" | grep '/' > /dev/null; then
1263
-	:
1264
-else
1265
-	# ignore basename only case (let server handle it)
1266
-	cmdline_config=""
1267
-	notweak=1
1268
-fi
1269
-
1270
-config=$cmdline_config
1271
-
1272
-if [ "X$notweak" = "X1" -a "X$root" = "X" -a  -f "$cmdline_config" ]; then
1273
-	# if not root we need to copy (but not tweak) the specified config.
1274
-	XDUMMY_NOTWEAK=1
1275
-	export XDUMMY_NOTWEAK
1276
-	notweak=""
1277
-fi
1278
-
1279
-if [ ! $notweak ]; then
1280
-	# tweaked config will be put in $config2:
1281
-	config2=""
1282
-	if [ "X$config" = "X" ]; then
1283
-		# use the default one:
1284
-		if [ "X$stype" = "Xxorg" ]; then
1285
-			config=/etc/X11/xorg.conf
1286
-		else
1287
-			if [ -f "/etc/X11/XF86Config-4" ]; then
1288
-				config="/etc/X11/XF86Config-4"
1289
-			else
1290
-				config="/etc/X11/XF86Config"
1291
-			fi
1292
-		fi
1293
-		if [ ! -f "$config" ]; then
1294
-			for c in /etc/X11/xorg.conf /etc/X11/XF86Config-4 /etc/X11/XF86Config
1295
-			do
1296
-				if [ -f $c ]; then
1297
-					config=$c
1298
-					break
1299
-				fi
1300
-			done
1301
-		fi
1302
-	fi
1303
-
1304
-	if [ "X$config" = "Xxdummy-builtin" ]; then
1305
-		config=""
1306
-	fi
1307
-
1308
-	if [ ! -f "$config" ]; then
1309
-		config="$XDUMMY_TMPDIR/xorg.conf"
1310
-		warn "$program: using minimal built-in xorg.conf settings."
1311
-		cat > $config <<END
1312
-
1313
-Section "ServerLayout"
1314
-    Identifier     "Layout0"
1315
-    Screen      0  "Screen0"
1316
-    InputDevice    "Keyboard0" "CoreKeyboard"
1317
-    InputDevice    "Mouse0" "CorePointer"
1318
-EndSection
1319
-
1320
-Section "Files"
1321
-EndSection
1322
-
1323
-Section "Module"
1324
-    Load           "dbe"
1325
-    Load           "extmod"
1326
-    Load           "freetype"
1327
-    Load           "glx"
1328
-EndSection
1329
-
1330
-Section "InputDevice"
1331
-    Identifier     "Mouse0"
1332
-    Driver         "mouse"
1333
-    Option         "Protocol" "auto"
1334
-    Option         "Device" "/dev/psaux"
1335
-    Option         "Emulate3Buttons" "no"
1336
-    Option         "ZAxisMapping" "4 5"
1337
-EndSection
1338
-
1339
-Section "InputDevice"
1340
-    Identifier     "Keyboard0"
1341
-    Driver         "kbd"
1342
-EndSection
1343
-
1344
-Section "Monitor"
1345
-    Identifier     "Monitor0"
1346
-    VendorName     "Unknown"
1347
-    ModelName      "Unknown"
1348
-    HorizSync       30.0 - 130.0
1349
-    VertRefresh     50.0 - 250.0
1350
-    Option         "DPMS"
1351
-EndSection
1352
-
1353
-Section "Device"
1354
-    Identifier     "Device0"
1355
-    Driver         "foovideo"
1356
-    VendorName     "foovideo Corporation"
1357
-EndSection
1358
-
1359
-Section "Screen"
1360
-    Identifier     "Screen0"
1361
-    Device         "Device0"
1362
-    Monitor        "Monitor0"
1363
-    DefaultDepth    24
1364
-    SubSection     "Display"
1365
-        Depth       24
1366
-        Modes           "1280x1024"
1367
-    EndSubSection
1368
-EndSection
1369
-
1370
-END
1371
-	fi
1372
-
1373
-	if [ -f "$config" ]; then
1374
-		tweak_config $config
1375
-	fi
1376
-
1377
-	# now we need to get our tweaked config file onto the command line:
1378
-	if [ "X$cmdline_config" = "X" ]; then
1379
-		# append to cmdline (FUBAR will be substituted below.)
1380
-		if [ "X$stype" = "Xxorg" ]; then
1381
-			args="$args -config FUBAR"
1382
-		else
1383
-			args="$args -xf86config FUBAR"
1384
-		fi
1385
-	fi
1386
-	if [ "X$config2" != "X" ]; then
1387
-		# or modify $args:
1388
-		c2=$config2
1389
-		if [ "X$root" = "X" ]; then
1390
-			# ordinary user cannot use absolute path.
1391
-			c2=`basename $config2`
1392
-		fi
1393
-		args=`echo "$args" | sed \
1394
-			-e "s,-config  *[^ ][^ ]*,-config $c2,g" \
1395
-			-e "s,-xf86config  *[^ ][^ ]*,-xf86config $c2,g"`
1396
-	fi
1397
-fi
1398
-
1399
-if [ $prconf ]; then
1400
-	warn ""
1401
-	warn "Printing out the Xorg/XFree86 server config file:"
1402
-	warn ""
1403
-	if [ "X$config2" = "X" ]; then
1404
-		warn "NO CONFIG GENERATED."
1405
-		exit 1
1406
-	else
1407
-		cat "$config2"
1408
-	fi
1409
-	exit 0
1410
-fi
1411
-
1412
-if [ $debug ]; then
1413
-	XDUMMY_DEBUG=1
1414
-	export XDUMMY_DEBUG
1415
-fi
1416
-if [ $root ]; then
1417
-	XDUMMY_ROOT=1
1418
-	export XDUMMY_ROOT
1419
-fi
1420
-
1421
-# Finally, run it:
1422
-#
1423
-if [ "X$debug" != "X" -o "X$runit" = "X" ]; then
1424
-	if [ ! $runit ]; then
1425
-		echo ""
1426
-		echo "/usr/bin/env:"
1427
-		env | egrep -v '^(LS_COLORS|TERMCAP)' | sort
1428
-		echo ""
1429
-		echo "XDUMMY*:"
1430
-		env | grep '^XDUMMY' | sort
1431
-		echo ""
1432
-	fi
1433
-	warn ""
1434
-	warn "The command to run is:"
1435
-	warn ""
1436
-	so=$SO
1437
-	pwd=`pwd`
1438
-	if echo "$so" | grep '^\./' > /dev/null; then
1439
-		so=`echo "$so" | sed -e "s,^\.,$pwd,"`
1440
-	fi
1441
-	if echo "$so" | grep '/' > /dev/null; then
1442
-		:
1443
-	else
1444
-		so="$pwd/$so"
1445
-	fi
1446
-	warn "env LD_PRELOAD=$so $xserver $disp $args $vt"
1447
-	warn ""
1448
-	if [ ! $runit ]; then
1449
-		exit 0
1450
-	fi
1451
-fi
1452
-
1453
-if [ $strace ]; then
1454
-	if [ "X$strace" = "X2" ]; then
1455
-		ltrace -f env LD_PRELOAD=$SO $xserver $disp $args $vt
1456
-	else
1457
-		strace -f env LD_PRELOAD=$SO $xserver $disp $args $vt
1458
-	fi
1459
-else
1460
-	exec env LD_PRELOAD=$SO $xserver $disp $args $vt
1461
-fi
1462
-
1463
-exit $?
1464
-
1465
-#########################################################################
1466
-
1467
-code() {
1468
-#code_begin
1469
-#include <stdio.h>
1470
-#define O_ACCMODE          0003
1471
-#define O_RDONLY             00
1472
-#define O_WRONLY             01
1473
-#define O_RDWR               02
1474
-#define O_CREAT            0100 /* not fcntl */
1475
-#define O_EXCL             0200 /* not fcntl */
1476
-#define O_NOCTTY           0400 /* not fcntl */
1477
-#define O_TRUNC           01000 /* not fcntl */
1478
-#define O_APPEND          02000
1479
-#define O_NONBLOCK        04000
1480
-#define O_NDELAY        O_NONBLOCK
1481
-#define O_SYNC           010000
1482
-#define O_FSYNC          O_SYNC
1483
-#define O_ASYNC          020000
1484
-
1485
-#include <unistd.h>
1486
-#include <stdlib.h>
1487
-#include <string.h>
1488
-
1489
-#include <linux/vt.h>
1490
-#include <linux/kd.h>
1491
-
1492
-#define __USE_GNU
1493
-#include <dlfcn.h>
1494
-
1495
-static char tmpdir[4096];
1496
-static char str1[4096];
1497
-static char str2[4096];
1498
-
1499
-static char devs[256][1024];
1500
-static int debug = -1;
1501
-static int root = -1;
1502
-static int changed_uid = 0;
1503
-static int saw_fonts = 0;
1504
-static int saw_lib_modules = 0;
1505
-
1506
-static time_t start = 0; 
1507
-
1508
-void check_debug(void) {
1509
-	if (debug < 0) {
1510
-		if (getenv("XDUMMY_DEBUG") != NULL) {
1511
-			debug = 1;
1512
-		} else {
1513
-			debug = 0;
1514
-		}
1515
-		/* prevent other processes using the preload: */
1516
-		putenv("LD_PRELOAD=");
1517
-	}
1518
-}
1519
-void check_root(void) {
1520
-	if (root < 0) {
1521
-		/* script tells us if we are root */
1522
-		if (getenv("XDUMMY_ROOT") != NULL) {
1523
-			root = 1;
1524
-		} else {
1525
-			root = 0;
1526
-		}
1527
-	}
1528
-}
1529
-
1530
-void check_uid(void) {
1531
-	if (start == 0) {
1532
-		start = time(NULL);
1533
-		if (debug) fprintf(stderr, "START: %u\n", (unsigned int) start);
1534
-		return;
1535
-	} else if (changed_uid == 0) {
1536
-		if (saw_fonts || time(NULL) > start + 20) {
1537
-			if (getenv("XDUMMY_UID")) {
1538
-				int uid = atoi(getenv("XDUMMY_UID"));
1539
-				if (debug) fprintf(stderr, "SETREUID: %d saw_fonts=%d\n", uid, saw_fonts);
1540
-				if (uid >= 0) {
1541
-					/* this will simply fail in -nonroot mode: */
1542
-					setreuid(uid, -1);
1543
-				}
1544
-			}
1545
-			changed_uid = 1;
1546
-		}
1547
-	}
1548
-}
1549
-
1550
-#define CHECKIT if (debug < 0) check_debug(); \
1551
-		if (root  < 0) check_root(); \
1552
-		check_uid();
1553
-
1554
-static void set_tmpdir(void) {
1555
-	char *s;
1556
-	static int didset = 0;
1557
-	if (didset) {
1558
-		return;
1559
-	}
1560
-	s = getenv("XDUMMY_TMPDIR");
1561
-	if (! s) {
1562
-		s = "/tmp";
1563
-	}
1564
-	tmpdir[0] = '\0';
1565
-	strcat(tmpdir, s);
1566
-	strcat(tmpdir, "/");
1567
-	didset = 1;
1568
-}
1569
-
1570
-static char *tmpdir_path(const char *path) {
1571
-	char *str;
1572
-	set_tmpdir();
1573
-	strcpy(str2, path);
1574
-	str = str2;
1575
-	while (*str) {
1576
-		if (*str == '/') {
1577
-			*str = '_';
1578
-		}
1579
-		str++;
1580
-	}
1581
-	strcpy(str1, tmpdir);
1582
-	strcat(str1, str2);
1583
-	return str1;
1584
-}
1585
-
1586
-int open(const char *pathname, int flags, unsigned short mode) {
1587
-	int fd;
1588
-	char *store_dev = NULL;
1589
-	static int (*real_open)(const char *, int , unsigned short) = NULL;
1590
-
1591
-	CHECKIT
1592
-	if (! real_open) {
1593
-		real_open = (int (*)(const char *, int , unsigned short))
1594
-			dlsym(RTLD_NEXT, "open");
1595
-	}
1596
-
1597
-	if (strstr(pathname, "lib/modules/")) {
1598
-		/* not currently used. */
1599
-		saw_lib_modules = 1;
1600
-	}
1601
-
1602
-	if (!root) {
1603
-		if (strstr(pathname, "/dev/") == pathname) {
1604
-			store_dev = strdup(pathname);
1605
-		}
1606
-		if (strstr(pathname, "/dev/tty") == pathname && strcmp(pathname, "/dev/tty")) {
1607
-			pathname = tmpdir_path(pathname);
1608
-			if (debug) fprintf(stderr, "OPEN: %s -> %s (as FIFO)\n", store_dev, pathname);
1609
-			/* we make it a FIFO so ioctl on it does not fail */
1610
-			unlink(pathname);
1611
-			mkfifo(pathname, 0666);
1612
-		} else if (0) {
1613
-			/* we used to handle more /dev files ... */
1614
-			fd = real_open(pathname, O_WRONLY|O_CREAT, 0777);
1615
-			close(fd);
1616
-		}
1617
-	}
1618
-
1619
-	fd = real_open(pathname, flags, mode);
1620
-
1621
-	if (debug) fprintf(stderr, "OPEN: %s %d %d fd=%d\n", pathname, flags, mode, fd);
1622
-
1623
-	if (! root) {
1624
-		if (store_dev) {
1625
-			if (fd < 256) {
1626
-				strcpy(devs[fd], store_dev);
1627
-			}
1628
-			free(store_dev);
1629
-		}
1630
-	}
1631
-
1632
-	return(fd);
1633
-}
1634
-
1635
-int open64(const char *pathname, int flags, unsigned short mode) {
1636
-	int fd;
1637
-
1638
-	CHECKIT
1639
-	if (debug) fprintf(stderr, "OPEN64: %s %d %d\n", pathname, flags, mode);
1640
-
1641
-	fd = open(pathname, flags, mode);
1642
-	return(fd);
1643
-}
1644
-
1645
-int rename(const char *oldpath, const char *newpath) {
1646
-	static int (*real_rename)(const char *, const char *) = NULL;
1647
-
1648
-	CHECKIT
1649
-	if (! real_rename) {
1650
-		real_rename = (int (*)(const char *, const char *))
1651
-			dlsym(RTLD_NEXT, "rename");
1652
-	}
1653
-
1654
-	if (debug) fprintf(stderr, "RENAME: %s %s\n", oldpath, newpath);
1655
-
1656
-	if (root) {
1657
-		return(real_rename(oldpath, newpath));
1658
-	}
1659
-
1660
-	if (strstr(oldpath, "/var/log") == oldpath) {
1661
-		if (debug) fprintf(stderr, "RENAME: returning 0\n");
1662
-		return 0;
1663
-	}
1664
-	return(real_rename(oldpath, newpath));
1665
-}
1666
-
1667
-FILE *fopen(const char *pathname, const char *mode) {
1668
-	static FILE* (*real_fopen)(const char *, const char *) = NULL;
1669
-	char *str;
1670
-
1671
-	if (! saw_fonts) {
1672
-		if (strstr(pathname, "/fonts/")) {
1673
-			if (strstr(pathname, "fonts.dir")) {
1674
-				saw_fonts = 1;
1675
-			} else if (strstr(pathname, "fonts.alias")) {
1676
-				saw_fonts = 1;
1677
-			}
1678
-		}
1679
-	}
1680
-
1681
-	CHECKIT
1682
-	if (! real_fopen) {
1683
-		real_fopen = (FILE* (*)(const char *, const char *))
1684
-			dlsym(RTLD_NEXT, "fopen");
1685
-	}
1686
-
1687
-	if (debug) fprintf(stderr, "FOPEN: %s %s\n", pathname, mode);
1688
-
1689
-	if (strstr(pathname, "xdummy_modified_xconfig.conf")) {
1690
-		/* make our config appear to be in /etc/X11, etc. */
1691
-		char *q = strrchr(pathname, '/');
1692
-		if (q != NULL && getenv("XDUMMY_TMPDIR") != NULL) {
1693
-			strcpy(str1, getenv("XDUMMY_TMPDIR"));
1694
-			strcat(str1, q);
1695
-			if (debug) fprintf(stderr, "FOPEN: %s -> %s\n", pathname, str1);
1696
-			pathname = str1;
1697
-		}
1698
-	}
1699
-
1700
-	if (root) {
1701
-		return(real_fopen(pathname, mode));
1702
-	}
1703
-
1704
-	str = (char *) pathname;
1705
-	if (strstr(pathname, "/var/log") == pathname) {
1706
-		str = tmpdir_path(pathname);
1707
-		if (debug) fprintf(stderr, "FOPEN: %s -> %s\n", pathname, str);
1708
-	}
1709
-	return(real_fopen(str, mode));
1710
-}
1711
-
1712
-
1713
-#define RETURN0 if (debug) \
1714
-	{fprintf(stderr, "IOCTL: covered %d 0x%x\n", fd, req);} return 0;
1715
-#define RETURN1 if (debug) \
1716
-	{fprintf(stderr, "IOCTL: covered %d 0x%x\n", fd, req);} return -1;
1717
-
1718
-int ioctl(int fd, int req, void *ptr) {
1719
-	static int closed_xf86Info_consoleFd = 0;
1720
-	static int (*real_ioctl)(int, int , void *) = NULL;
1721
-
1722
-	CHECKIT
1723
-	if (! real_ioctl) {
1724
-		real_ioctl = (int (*)(int, int , void *))
1725
-			dlsym(RTLD_NEXT, "open");
1726
-	}
1727
-	if (debug) fprintf(stderr, "IOCTL: %d 0x%x %p\n", fd, req, ptr);
1728
-
1729
-	/* based on xorg-x11-6.8.1-dualhead.patch */
1730
-	if (req == VT_GETMODE) {
1731
-		/* close(xf86Info.consoleFd) */
1732
-		if (0 && ! closed_xf86Info_consoleFd) {
1733
-			/* I think better not to close it... */
1734
-			close(fd);
1735
-			closed_xf86Info_consoleFd = 1;
1736
-		}
1737
-		RETURN0
1738
-	} else if (req == VT_SETMODE) {
1739
-		RETURN0
1740
-	} else if (req == VT_GETSTATE) {
1741
-		RETURN0
1742
-	} else if (req == KDSETMODE) {
1743
-		RETURN0
1744
-	} else if (req == KDSETLED) {
1745
-		RETURN0
1746
-	} else if (req == KDGKBMODE) {
1747
-		RETURN0
1748
-	} else if (req == KDSKBMODE) {
1749
-		RETURN0
1750
-	} else if (req == VT_ACTIVATE) {
1751
-		RETURN0
1752
-	} else if (req == VT_WAITACTIVE) {
1753
-		RETURN0
1754
-	} else if (req == VT_RELDISP) {
1755
-		if (ptr == (void *) 1) {
1756
-			RETURN1
1757
-		} else if (ptr == (void *) VT_ACKACQ) {
1758
-			RETURN0
1759
-		}
1760
-	}
1761
-
1762
-	return(real_ioctl(fd, req, ptr));
1763
-}
1764
-
1765
-typedef void (*sighandler_t)(int);
1766
-#define SIGUSR1       10
1767
-#define SIG_DFL       ((sighandler_t)0)
1768
-
1769
-sighandler_t signal(int signum, sighandler_t handler) {
1770
-	static sighandler_t (*real_signal)(int, sighandler_t) = NULL;
1771
-
1772
-	CHECKIT
1773
-	if (! real_signal) {
1774
-		real_signal = (sighandler_t (*)(int, sighandler_t))
1775
-			dlsym(RTLD_NEXT, "signal");
1776
-	}
1777
-
1778
-	if (debug) fprintf(stderr, "SIGNAL: %d %p\n", signum, handler);
1779
-
1780
-	if (signum == SIGUSR1) {
1781
-		if (debug) fprintf(stderr, "SIGNAL: skip SIGUSR1\n");
1782
-		return SIG_DFL;
1783
-	}
1784
-	
1785
-	return(real_signal(signum, handler));
1786
-}
1787
-
1788
-int close(int fd) {
1789
-	static int (*real_close)(int) = NULL;
1790
-
1791
-	CHECKIT
1792
-	if (! real_close) {
1793
-		real_close = (int (*)(int)) dlsym(RTLD_NEXT, "close");
1794
-	}
1795
-
1796
-	if (debug) fprintf(stderr, "CLOSE: %d\n", fd);
1797
-	if (!root) {
1798
-		if (fd < 256) {
1799
-			devs[fd][0] = '\0';
1800
-		}
1801
-	}
1802
-	return(real_close(fd));
1803
-}
1804
-
1805
-struct stat {
1806
-	int foo;
1807
-};
1808
-
1809
-int stat(const char *path, struct stat *buf) {
1810
-	static int (*real_stat)(const char *, struct stat *) = NULL;
1811
-
1812
-	CHECKIT
1813
-	if (! real_stat) {
1814
-		real_stat = (int (*)(const char *, struct stat *))
1815
-			dlsym(RTLD_NEXT, "stat");
1816
-	}
1817
-
1818
-	if (debug) fprintf(stderr, "STAT: %s\n", path);
1819
-
1820
-	return(real_stat(path, buf));
1821
-}
1822
-
1823
-int stat64(const char *path, struct stat *buf) {
1824
-	static int (*real_stat64)(const char *, struct stat *) = NULL;
1825
-
1826
-	CHECKIT
1827
-	if (! real_stat64) {
1828
-		real_stat64 = (int (*)(const char *, struct stat *))
1829
-			dlsym(RTLD_NEXT, "stat64");
1830
-	}
1831
-
1832
-	if (debug) fprintf(stderr, "STAT64: %s\n", path);
1833
-
1834
-	return(real_stat64(path, buf));
1835
-}
1836
-
1837
-int chown(const char *path, uid_t owner, gid_t group) {
1838
-	static int (*real_chown)(const char *, uid_t, gid_t) = NULL;
1839
-
1840
-	CHECKIT
1841
-	if (! real_chown) {
1842
-		real_chown = (int (*)(const char *, uid_t, gid_t))
1843
-			dlsym(RTLD_NEXT, "chown");
1844
-	}
1845
-
1846
-	if (root) {
1847
-		return(real_chown(path, owner, group));
1848
-	}
1849
-
1850
-	if (debug) fprintf(stderr, "CHOWN: %s %d %d\n", path, owner, group);
1851
-
1852
-	if (strstr(path, "/dev") == path) {
1853
-		if (debug) fprintf(stderr, "CHOWN: return 0\n");
1854
-		return 0;
1855
-	}
1856
-
1857
-	return(real_chown(path, owner, group));
1858
-}
1859
-
1860
-extern int *__errno_location (void);
1861
-#ifndef ENODEV
1862
-#define ENODEV 19
1863
-#endif
1864
-
1865
-int ioperm(unsigned long from, unsigned long num, int turn_on) {
1866
-	static int (*real_ioperm)(unsigned long, unsigned long, int) = NULL;
1867
-
1868
-	CHECKIT
1869
-	if (! real_ioperm) {
1870
-		real_ioperm = (int (*)(unsigned long, unsigned long, int))
1871
-			dlsym(RTLD_NEXT, "ioperm");
1872
-	}
1873
-	if (debug) fprintf(stderr, "IOPERM: %d %d %d\n", (int) from, (int) num, turn_on);
1874
-	if (root) {
1875
-		return(real_ioperm(from, num, turn_on));
1876
-	}
1877
-	if (from == 0 && num == 1024 && turn_on == 1) {
1878
-		/* we want xf86EnableIO to fail */
1879
-		if (debug) fprintf(stderr, "IOPERM: setting ENODEV.\n");
1880
-		*__errno_location() = ENODEV;
1881
-		return -1;
1882
-	}
1883
-	return 0;
1884
-}
1885
-
1886
-int iopl(int level) {
1887
-	static int (*real_iopl)(int) = NULL;
1888
-
1889
-	CHECKIT
1890
-	if (! real_iopl) {
1891
-		real_iopl = (int (*)(int)) dlsym(RTLD_NEXT, "iopl");
1892
-	}
1893
-	if (debug) fprintf(stderr, "IOPL: %d\n", level);
1894
-	if (root) {
1895
-		return(real_iopl(level));
1896
-	}
1897
-	return 0;
1898
-}
1899
-
1900
-#ifdef INTERPOSE_GETUID 
1901
-
1902
-/*
1903
- * we got things to work w/o pretending to be root.
1904
- * so we no longer interpose getuid(), etc.
1905
- */
1906
-
1907
-uid_t getuid(void) {
1908
-	static uid_t (*real_getuid)(void) = NULL;
1909
-	CHECKIT
1910
-	if (! real_getuid) {
1911
-		real_getuid = (uid_t (*)(void)) dlsym(RTLD_NEXT, "getuid");
1912
-	}
1913
-	if (root) {
1914
-		return(real_getuid());
1915
-	}
1916
-	if (debug) fprintf(stderr, "GETUID: 0\n");
1917
-	return 0;
1918
-}
1919
-uid_t geteuid(void) {
1920
-	static uid_t (*real_geteuid)(void) = NULL;
1921
-	CHECKIT
1922
-	if (! real_geteuid) {
1923
-		real_geteuid = (uid_t (*)(void)) dlsym(RTLD_NEXT, "geteuid");
1924
-	}
1925
-	if (root) {
1926
-		return(real_geteuid());
1927
-	}
1928
-	if (debug) fprintf(stderr, "GETEUID: 0\n");
1929
-	return 0;
1930
-}
1931
-uid_t geteuid_kludge1(void) {
1932
-	static uid_t (*real_geteuid)(void) = NULL;
1933
-	CHECKIT
1934
-	if (! real_geteuid) {
1935
-		real_geteuid = (uid_t (*)(void)) dlsym(RTLD_NEXT, "geteuid");
1936
-	}
1937
-	if (debug) fprintf(stderr, "GETEUID: 0 saw_libmodules=%d\n", saw_lib_modules);
1938
-	if (root && !saw_lib_modules) {
1939
-		return(real_geteuid());
1940
-	} else {
1941
-		saw_lib_modules = 0;
1942
-		return 0;
1943
-	}
1944
-}
1945
-
1946
-uid_t getuid32(void) {
1947
-	static uid_t (*real_getuid32)(void) = NULL;
1948
-	CHECKIT
1949
-	if (! real_getuid32) {
1950
-		real_getuid32 = (uid_t (*)(void)) dlsym(RTLD_NEXT, "getuid32");
1951
-	}
1952
-	if (root) {
1953
-		return(real_getuid32());
1954
-	}
1955
-	if (debug) fprintf(stderr, "GETUID32: 0\n");
1956
-	return 0;
1957
-}
1958
-uid_t geteuid32(void) {
1959
-	static uid_t (*real_geteuid32)(void) = NULL;
1960
-	CHECKIT
1961
-	if (! real_geteuid32) {
1962
-		real_geteuid32 = (uid_t (*)(void)) dlsym(RTLD_NEXT, "geteuid32");
1963
-	}
1964
-	if (root) {
1965
-		return(real_geteuid32());
1966
-	}
1967
-	if (debug) fprintf(stderr, "GETEUID32: 0\n");
1968
-	return 0;
1969
-}
1970
-
1971
-gid_t getgid(void) {
1972
-	static gid_t (*real_getgid)(void) = NULL;
1973
-	CHECKIT
1974
-	if (! real_getgid) {
1975
-		real_getgid = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getgid");
1976
-	}
1977
-	if (root) {
1978
-		return(real_getgid());
1979
-	}
1980
-	if (debug) fprintf(stderr, "GETGID: 0\n");
1981
-	return 0;
1982
-}
1983
-gid_t getegid(void) {
1984
-	static gid_t (*real_getegid)(void) = NULL;
1985
-	CHECKIT
1986
-	if (! real_getegid) {
1987
-		real_getegid = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getegid");
1988
-	}
1989
-	if (root) {
1990
-		return(real_getegid());
1991
-	}
1992
-	if (debug) fprintf(stderr, "GETEGID: 0\n");
1993
-	return 0;
1994
-}
1995
-gid_t getgid32(void) {
1996
-	static gid_t (*real_getgid32)(void) = NULL;
1997
-	CHECKIT
1998
-	if (! real_getgid32) {
1999
-		real_getgid32 = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getgid32");
2000
-	}
2001
-	if (root) {
2002
-		return(real_getgid32());
2003
-	}
2004
-	if (debug) fprintf(stderr, "GETGID32: 0\n");
2005
-	return 0;
2006
-}
2007
-gid_t getegid32(void) {
2008
-	static gid_t (*real_getegid32)(void) = NULL;
2009
-	CHECKIT
2010
-	if (! real_getegid32) {
2011
-		real_getegid32 = (gid_t (*)(void)) dlsym(RTLD_NEXT, "getegid32");
2012
-	}
2013
-	if (root) {
2014
-		return(real_getegid32());
2015
-	}
2016
-	if (debug) fprintf(stderr, "GETEGID32: 0\n");
2017
-	return 0;
2018
-}
2019
-#endif
2020
-
2021
-#if 0
2022
-/* maybe we need to interpose on strcmp someday... here is the template */
2023
-int strcmp(const char *s1, const char *s2) {
2024
-	static int (*real_strcmp)(const char *, const char *) = NULL;
2025
-	CHECKIT
2026
-	if (! real_strcmp) {
2027
-		real_strcmp = (int (*)(const char *, const char *)) dlsym(RTLD_NEXT, "strcmp");
2028
-	}
2029
-	if (debug) fprintf(stderr, "STRCMP: '%s' '%s'\n", s1, s2);
2030
-	return(real_strcmp(s1, s2));
2031
-}
2032
-#endif
2033
-
2034
-#code_end
2035
-}

b/testcases/complete-run.pl

2040
@@ -43,7 +43,7 @@ sub Log { say $log "@_" }
2041
 
2042
 my %timings;
2043
 my $help = 0;
2044
-# Number of tests to run in parallel. Important to know how many Xdummy
2045
+# Number of tests to run in parallel. Important to know how many Xephyr
2046
 # instances we need to start (unless @displays are given). Defaults to
2047
 # num_cores * 2.
2048
 my $parallel = undef;
2049
@@ -55,11 +55,11 @@ my %options = (
2050
     coverage => 0,
2051
     restart => 0,
2052
 );
2053
-my $keep_xdummy_output = 0;
2054
+my $keep_xserver_output = 0;
2055
 
2056
 my $result = GetOptions(
2057
     "coverage-testing" => \$options{coverage},
2058
-    "keep-xdummy-output" => \$keep_xdummy_output,
2059
+    "keep-xserver-output" => \$keep_xserver_output,
2060
     "valgrind" => \$options{valgrind},
2061
     "strace" => \$options{strace},
2062
     "xtrace" => \$options{xtrace},
2063
@@ -86,6 +86,9 @@ foreach my $binary (@binaries) {
2064
     die "$binary is not an executable" unless -x $binary;
2065
 }
2066
 
2067
+qx(Xephyr -help 2>&1);
2068
+die "Xephyr was not found in your path. Please install Xephyr (xserver-xephyr on Debian)." if $?;
2069
+
2070
 @displays = split(/,/, join(',', @displays));
2071
 @displays = map { s/ //g; $_ } @displays;
2072
 
2073
@@ -97,9 +100,9 @@ my @testfiles = @ARGV;
2074
 
2075
 my $numtests = scalar @testfiles;
2076
 
2077
-# No displays specified, let’s start some Xdummy instances.
2078
+# No displays specified, let’s start some Xephyr instances.
2079
 if (@displays == 0) {
2080
-    @displays = start_xdummy($parallel, $numtests, $keep_xdummy_output);
2081
+    @displays = start_xserver($parallel, $numtests, $keep_xserver_output);
2082
 }
2083
 
2084
 # 1: create an output directory for this test-run
2085
@@ -115,8 +118,7 @@ symlink("$outdir", "latest") or die "Could not symlink latest to $outdir";
2086
 # connect to all displays for two reasons:
2087
 # 1: check if the display actually works
2088
 # 2: keep the connection open so that i3 is not the only client. this prevents
2089
-#    the X server from exiting (Xdummy will restart it, but not quick enough
2090
-#    sometimes)
2091
+#    the X server from exiting
2092
 my @single_worker;
2093
 for my $display (@displays) {
2094
     my $screen;
2095
@@ -346,7 +348,7 @@ complete-run.pl [files...]
2096
 
2097
 =head1 EXAMPLE
2098
 
2099
-To run the whole testsuite on a reasonable number of Xdummy instances (your
2100
+To run the whole testsuite on a reasonable number of Xephyr instances (your
2101
 running X11 will not be touched), run:
2102
   ./complete-run.pl
2103
 
2104
@@ -365,11 +367,11 @@ will parallelize the tests:
2105
   # Run tests on the second X server
2106
   ./complete-run.pl -d :1
2107
 
2108
-  # Run four tests in parallel on some Xdummy servers
2109
+  # Run four tests in parallel on some Xephyr servers
2110
   ./complete-run.pl -d :1,:2,:3,:4
2111
 
2112
 Note that it is not necessary to specify this anymore. If omitted,
2113
-complete-run.pl will start (num_cores * 2) Xdummy instances.
2114
+complete-run.pl will start (num_cores * 2) Xephyr instances.
2115
 
2116
 =item B<--valgrind>
2117
 
2118
@@ -392,8 +394,8 @@ Exits i3 cleanly (instead of kill -9) to make coverage testing work properly.
2119
 
2120
 =item B<--parallel>
2121
 
2122
-Number of Xdummy instances to start (if you don’t want to start num_cores * 2
2123
+Number of Xephyr instances to start (if you don’t want to start num_cores * 2
2124
 instances for some reason).
2125
 
2126
-  # Run all tests on a single Xdummy instance
2127
+  # Run all tests on a single Xephyr instance
2128
   ./complete-run.pl -p 1

b/testcases/lib/StartXDummy.pm

2133
@@ -7,7 +7,7 @@ use Exporter 'import';
2134
 use Time::HiRes qw(sleep);
2135
 use v5.10;
2136
 
2137
-our @EXPORT = qw(start_xdummy);
2138
+our @EXPORT = qw(start_xserver);
2139
 
2140
 my @pids;
2141
 my $x_socketpath = '/tmp/.X11-unix/X';
2142
@@ -19,15 +19,15 @@ sub slurp {
2143
     <$fh>;
2144
 }
2145
 
2146
-# forks an Xdummy or Xdmx process
2147
+# forks an X server process
2148
 sub fork_xserver {
2149
-    my $keep_xdummy_output = shift;
2150
+    my $keep_xserver_output = shift;
2151
     my $displaynum = shift;
2152
     my $pid = fork();
2153
     die "Could not fork: $!" unless defined($pid);
2154
     if ($pid == 0) {
2155
-        # Child, close stdout/stderr, then start Xdummy.
2156
-        if (!$keep_xdummy_output) {
2157
+        # Child, close stdout/stderr, then start Xephyr
2158
+        if (!$keep_xserver_output) {
2159
             close STDOUT;
2160
             close STDERR;
2161
         }
2162
@@ -60,16 +60,17 @@ sub wait_for_x {
2163
     }
2164
 }
2165
 
2166
-=head2 start_xdummy($parallel)
2167
+=head2 start_xserver($parallel)
2168
 
2169
-Starts C<$parallel> (or number of cores * 2 if undef) Xdummy processes (see
2170
-the file ./Xdummy) and returns two arrayrefs: a list of X11 display numbers to
2171
-the Xdummy processes and a list of PIDs of the processes.
2172
+Starts C<$parallel> (or number of cores * 2 if undef) Xephyr processes (see
2173
+http://www.freedesktop.org/wiki/Software/Xephyr/) and returns two arrayrefs: a
2174
+list of X11 display numbers to the Xephyr processes and a list of PIDs of the
2175
+processes.
2176
 
2177
 =cut
2178
 
2179
-sub start_xdummy {
2180
-    my ($parallel, $numtests, $keep_xdummy_output) = @_;
2181
+sub start_xserver {
2182
+    my ($parallel, $numtests, $keep_xserver_output) = @_;
2183
 
2184
     my @displays = ();
2185
     my @childpids = ();
2186
@@ -78,11 +79,8 @@ sub start_xdummy {
2187
         my $child = waitpid -1, POSIX::WNOHANG;
2188
         @pids = grep { $_ != $child } @pids;
2189
         return unless @pids == 0;
2190
-        print STDERR "All Xdummy processes died.\n";
2191
-        print STDERR "Use ./complete-run.pl --parallel 1 --keep-xdummy-output\n";
2192
-        print STDERR "";
2193
-        print STDERR "A frequent cause for this is missing the DUMMY Xorg module,\n";
2194
-        print STDERR "package xserver-xorg-video-dummy on Debian.\n";
2195
+        print STDERR "All X server processes died.\n";
2196
+        print STDERR "Use ./complete-run.pl --parallel 1 --keep-xserver-output\n";
2197
         exit 1;
2198
     };
2199
 
2200
@@ -104,16 +102,13 @@ sub start_xdummy {
2201
     my ($displaynum) = map { /(\d+)$/ } reverse sort glob($x_socketpath . '*');
2202
     $displaynum++;
2203
 
2204
-    say "Starting $parallel Xdummy instances, starting at :$displaynum...";
2205
+    say "Starting $parallel Xephyr instances, starting at :$displaynum...";
2206
 
2207
     my @sockets_waiting;
2208
     for (1 .. $parallel) {
2209
-        # We use -config /dev/null to prevent Xdummy from using the system
2210
-        # Xorg configuration. The tests should be independant from the
2211
-        # actual system X configuration.
2212
-        my $socket = fork_xserver($keep_xdummy_output, $displaynum,
2213
-                './Xdummy', ":$displaynum", '-config', '/dev/null',
2214
-                '-configdir', '/dev/null', '-nolisten', 'tcp');
2215
+        my $socket = fork_xserver($keep_xserver_output, $displaynum,
2216
+                'Xephyr', ":$displaynum", '-screen', '1280x800',
2217
+                '-nolisten', 'tcp');
2218
         push(@displays, ":$displaynum");
2219
         push(@sockets_waiting, $socket);
2220
         $displaynum++;

b/testcases/t/112-floating-resize.t

2225
@@ -69,7 +69,7 @@ cmd 'border 1pixel';
2226
 test_resize;
2227
 
2228
 ################################################################################
2229
-# Check if we can position a floating window out of bounds. The XDummy screen
2230
+# Check if we can position a floating window out of bounds. The Xephyr screen
2231
 # is 1280x1024, so x=2864, y=893 is out of bounds.
2232
 ################################################################################
2233