Further simplify the code and remove some redundant code.
[wine/gsoc_dplay.git] / tools / bug_report.pl
blob467bc03b4f1e4079ecf064bf41dca55b4c0fd276
1 #!/usr/bin/perl
2 ##Wine Quick Debug Report Maker Thingy (WQDRMK)
3 ##By Adam Sacarny
4 ##(c) 1998-1999
5 ##Do not say this is yours without my express permisson, or I will
6 ##hunt you down and kill you like the savage animal I am.
7 ##
8 ## Improvements by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
9 ## (c) 2000
11 ## Released under the WINE licence.
13 ##Changelog:
14 ##August 29, 1999 - Work around for debugger exit (or lack thereof)
15 ## - Should now put debugging output in correct place
16 ##April 19, 1999 - Much nicer way to select wine's location
17 ## - Option to disable creation of a debugging output
18 ## - Now places debugging output where it was started
19 ##April 4, 1999 - Sanity check for file locations/wine strippedness
20 ## - Various code cleanups/fixes
21 ##March 21, 1999 - Bash 2.0 STDERR workaround (Thanks Ryan Cumming!)
22 ##March 1, 1999 - Check for stripped build
23 ##February 3, 1999 - Fix to chdir to the program's directory
24 ##February 1, 1999 - Cleaned up code
25 ##January 26, 1999 - Fixed various bugs...
26 ## - Made newbie mode easier
27 ##January 25, 1999 - Initial Release
28 ## -------------------------------------------
29 ##| IRCNET/UNDERNET: jazzfan AOL: Jazzrock12 |
30 ##| E-MAIL: magicbox@bestweb.net ICQ: 19617831|
31 ##| Utah Jazz Page @ http://www.gojazz.net |
32 ##| Wine Builds @ http://www.gojazz.net/wine |
33 ## -------------------------------------------
34 sub do_var {
35 $var=$_[0];
36 $var =~ s/\t//g;
37 return $var;
39 open STDERR, ">&SAVEERR"; open STDERR, ">&STDOUT";
40 $ENV{'SHELL'}="/bin/bash";
41 $var0 = qq{
42 What is your level of WINE expertise? 1-newbie 2-intermediate 3-advanced
44 1 - Makes a debug report as defined in the WINE documentation. Best
45 for new WINE users. If you're not sure what -debugmsg is, then
46 use this mode.
47 2 - Makes a debug report that is more customizable (Example: you can
48 choose what -debugmsg 's to use). You are asked more questions in
49 this mode. May intimidate newbies.
50 3 - Just like 2, but not corner cutting. Assumes you know what you're
51 doing so it leaves out the long descriptions.
53 print do_var($var0)."\n";
54 until ($debuglevel >= 1 and $debuglevel <= 3) {
55 print "Enter your level of WINE expertise (1-3): ";
56 $debuglevel=<STDIN>;
57 chomp $debuglevel;
60 if ($debuglevel < 3) {
61 $var1 = qq{
62 This program will make a debug report for WINE developers. It does this
63 in two files. The first one has everything asked for by the bugreports
64 guide. The second has *all* of the debug output (This can go to
65 thousands of lines). To (hopefully) get the bug fixed, attach the first
66 file to a messsage sent to the comp.emulators.ms-windows.wine newsgroup.
67 The developers might ask you for "the last XX number of lines from the
68 report". If so, run the command:
69 gzip -d (output file)|tail -n (number of lines) > outfile
70 And post outfile.
71 If you do not want to create one of the files, just type in "no file"
72 and hit enter.
74 print do_var($var1);
75 } elsif ($debuglevel =~ 3) {
76 $var2 = qq{
77 This program will output to two files:
78 1. Formatted debug report you might want to post to the newsgroup
79 2. File with ALL the debug output (It will later be compressed with
80 gzip, so leave off the trailing .gz)
81 If you do not want to create one of the files, just type in "no file"
82 and I'll skip it.
84 print do_var($var2);
86 print "Enter filename for the formatted debug output (the first file):\n";
87 $outfile=<STDIN>;
88 chomp $outfile;
89 $var23 = qq{
90 I don't think you typed in the right filename. Let's try again.
92 while ($outfile =~ /^(\s)*$/) {
93 print do_var($var23);
94 $outfile=<STDIN>;
95 chomp $outfile;
97 print "Enter the filename for the full debug output (the second file):\n";
98 $dbgoutfile=<STDIN>;
99 chomp $dbgoutfile;
100 while ($dbgoutfile =~ /^(\s)*$/) {
101 print do_var($var23);
102 $dbgoutfile=<STDIN>;
103 chomp $dbgoutfile;
105 $var31 = qq{
106 Since you will only be creating the formatted report, I will need a
107 temporary place to put the full output.
108 You may not enter "no file" for this.
109 Enter the filename for the temporary file:
111 if ($outfile ne "no file" and $dbgoutfile eq "no file") {
112 print do_var($var31);
113 $tmpoutfile=<STDIN>;
114 chomp $tmpoutfile;
115 while (($tmpoutfile =~ /^(\s)*$/) or ($tmpoutfile eq "no file")) {
116 print do_var($var23);
117 $tmpoutfile=<STDIN>;
118 chomp $tmpoutfile;
122 $whereis=`whereis wine`;
123 chomp $whereis;
124 print "\nWhere is your copy of Wine located?\n\n";
125 $whereis =~ s/^wine\: //;
126 @locations = split(/\s/,$whereis);
127 print "1 - Unlisted (I'll prompt you for a new location\n";
128 print "2 - Unsure (I'll use #3, that's probably it)\n";
129 $i=2;
130 foreach $location (@locations) {
131 $i++;
132 print "$i - $location\n";
134 print "\n";
135 sub select_wineloc {
138 print "Enter the number the corresponds to Wine's location: ";
139 $wineloc=<STDIN>;
140 chomp $wineloc;
141 $i=1;
142 foreach $location (@locations) {
143 $yes = 1 if $wineloc eq $i++;
146 while ($yes ne "1");
147 if ($wineloc == 1) {
148 $var25 = qq{
149 Enter the full path to wine (Example: /usr/bin/wine):
151 $var26 = qq{
152 Please enter the full path to wine. A full path is the
153 directories leading up to a program's location, and then the
154 program. For example, if you had the program "wine" in the
155 directory "/usr/bin", you would type in "/usr/bin/wine". Now
156 try:
158 print do_var($var25) if $debuglevel == 3;
159 print do_var($var26) if $debuglevel < 3;
160 $wineloc=<STDIN>;
161 chomp $wineloc;
162 while ($wineloc =~ /^(\s)*$/) {
163 print do_var($var23);
164 $wineloc=<STDIN>;
165 chomp $wineloc;
168 elsif ($wineloc == 2) {
169 $wineloc=$locations[0];
171 else {
172 $wineloc=$locations[$wineloc-3];
175 &select_wineloc;
176 print "Checking if $wineloc is stripped...\n";
177 $ifstrip = `nm $wineloc 2>&1`;
178 while ($ifstrip =~ /no symbols/) {
179 $var24 = qq{
180 Your wine is stripped! You probably downloaded it off of the internet.
181 If you have another location of wine that may be used, enter it now.
182 Otherwise, hit control-c and download an unstripped version, then re-run
183 this script. Note: stripped versions make useless debug reports
185 print do_var($var24);
186 &select_wineloc;
187 $ifstrip = `nm $wineloc 2>&1`;
189 while ($ifstrip =~ /not recognized/) {
190 $var26 = qq{
191 Looks like you gave me something that isn't a wine binary (It could be a
192 text file). Try again.
194 print do_var($var26);
195 &select_wineloc;
196 print "Checking if $wineloc is stripped...\n";
197 $ifstrip = `nm $wineloc 2>&1`;
199 $var5 = qq{
200 What version of windows are you using with wine? 0-None, 1-Win3.x,
201 2-Win95, 3-Win98, 4-WinNT3.5x, 5-WinNT4.x, 6-WinNT5.x, 7-Other (Enter
202 0-7):
204 print do_var($var5);
205 $winver=<STDIN>;
206 until ($winver >= 0 and $winver <= 7) {
207 $var6 = qq{
208 No! Enter a number from 0 to 7 that corresponds to your windows version!
210 print do_var($var6);
211 $winver=<STDIN>;
213 chomp $winver;
214 if ($winver =~ 0) {
215 $winver="None Installed";
216 } elsif ($winver =~ 1) {
217 $winver="Windows 3.x";
218 } elsif ($winver =~ 2) {
219 $winver="Windows 95";
220 } elsif ($winver =~ 3) {
221 $winver="Windows 98";
222 } elsif ($winver =~ 4) {
223 $winver="Windows NT 3.5x";
224 } elsif ($winver =~ 5) {
225 $winver="Windows NT 4.x";
226 } elsif ($winver =~ 6) {
227 $winver="Windows NT 5.x";
228 } elsif ($winver =~ 7) {
229 print "OK. What version of Windows are you using?\n";
230 $winver=<STDIN>;
231 chomp $winver;
233 if ($debuglevel < 3) {
234 $var7 = qq{
235 Enter the full path to the program you want to run. Remember what you
236 were told before - a full path is the directories leading up to the
237 program and then the program's name, like /dos/windows/sol.exe, not
238 sol.exe:
240 print do_var($var7);
242 if ($debuglevel =~ 3) {
243 $var8 = qq{
244 Enter the full path to the program you want to run (Example:
245 /dos/windows/sol.exe, NOT sol.exe):
247 print do_var($var8);
249 $program=<STDIN>;
250 chomp $program;
251 while ($program =~ /^(\s)*$/) {
252 print do_var($var23);
253 $program=<STDIN>;
254 chomp $program;
256 $program =~ s/\"//g;
257 $var9 = qq{
258 Enter the name, version, and manufacturer of the program (Example:
259 Netscape Navigator 4.5):
261 print do_var($var9);
262 $progname=<STDIN>;
263 chomp $progname;
264 $var10 = qq{
265 Enter 0 if your program is 16 bit (Windows 3.x), 1 if your program is 32
266 bit (Windows 9x, NT3.x and up), or 2 if you are unsure:
268 print do_var($var10);
269 $progbits=<STDIN>;
270 chomp $progbits;
271 until ($progbits == 0 or $progbits == 1 or $progbits == 2) {
272 print "You must enter 0, 1 or 2!\n";
273 $progbits=<STDIN>;
274 chomp $progbits
276 if ($progbits =~ 0) {
277 $progbits=Win16
278 } elsif ($progbits =~ 1) {
279 $progbits=Win32
280 } else {
281 $progbits = "Unsure"
283 if ($debuglevel > 1) {
284 if ($debuglevel =~ 2) {
285 $var11 = qq{
286 Enter any extra debug options. Default is +relay - If you don't
287 know what options to use, just hit enter, and I'll use those (Example, the
288 developer tells you to re-run with -debugmsg +dosfs,+module you would type
289 in +dosfs,+module). Hit enter if you're not sure what to do:
291 print do_var($var11);
292 } elsif ($debuglevel =~ 3) {
293 $var12 = qq{
294 Enter any debug options you would like to use. Just enter parts after
295 -debugmsg. Default is +relay:
297 print do_var($var12);
299 $debugopts=<STDIN>;
300 chomp $debugopts;
301 if ($debugopts =~ /-debugmsg /) {
302 ($crap, $debugopts) = split / /,$debugopts;
304 if ($debugopts =~ /^\s*$/) {
305 $debugopts="+relay";
307 } elsif ($debuglevel =~ 1) {
308 $debugopts = "+relay";
310 if ($debuglevel > 1) {
311 if ($debuglevel =~ 2) {
312 $var13 = qq{
313 How many trailing lines of debugging info do you want to include in the report
314 you're going to submit (First file)? If a developer asks you to include
315 the last 1000 lines, enter 1000 here. Default is 200, which is reached by
316 pressing enter. (If you're not sure, just hit enter):
318 print do_var($var13);
319 } elsif ($debuglevel =~ 3) {
320 $var14 = qq{
321 Enter how many lines of trailing debugging output you want in your nice
322 formatted report. Default is 200:
324 print do_var($var14);
326 $lastnlines=<STDIN>;
327 chomp $lastnlines;
328 if ($lastnlines =~ /^\s*$/) {
329 $lastnlines=200;
331 } elsif ($debuglevel =~ 1) {
332 $lastnlines=200;
334 if ($debuglevel > 1) {
335 $var15 = qq{
336 Enter any extra options you want to pass to WINE. Strongly recommended you
337 include -managed:
339 print do_var($var15);
340 $extraops=<STDIN>;
341 chomp $extraops;
342 } elsif ($debuglevel =~ 1) {
343 $extraops="-managed";
345 print "Enter your distribution name (Example: Redhat 5.0):\n";
346 $dist=<STDIN>;
347 chomp $dist;
348 if ($debuglevel > 1) {
349 if ($debuglevel =~ 2) {
350 $var16 = qq{
351 When you ran ./configure to build wine, were there any special options
352 you used to do so (Example: --enable-dll)? If you didn't use any special
353 options or didn't compile WINE on your own, just hit enter:
355 print do_var($var16);
356 } elsif ($debuglevel =~ 3) {
357 $var17 = qq{
358 Enter any special options you used when running ./configure for WINE
359 (Default is none, use if you didn't compile wine yourself):
361 print do_var($var17);
363 $configopts=<STDIN>;
364 chomp $configopts;
365 if ($configopts =~ /^\s*$/) {
366 $configopts="None";
368 } elsif ($debuglevel =~ 1) {
369 $configopts="None";
371 if ($debuglevel > 1) {
372 if ($debuglevel =~ 2) {
373 $var18 = qq{
374 Is your wine version CVS or from a .tar.gz file? As in... did you download it
375 off a website/ftpsite or did you/have you run cvs on it to update it?
376 For CVS: YYMMDD, where YY is the year (99), MM is the month (01), and DD
377 is the day (14), that you last updated it (Example: 990114).
378 For tar.gz: Just hit enter and I'll figure out the version for you:
380 print do_var($var18);
381 } elsif ($debuglevel =~ 3) {
382 $var19 = qq{
383 Is your wine from CVS? Enter the last CVS update date for it here, in
384 YYMMDD form (If it's from a tarball, just hit enter):
386 print do_var($var19);
388 $winever=<STDIN>;
389 chomp $winever;
390 if ($winever =~ /[0-9]+/) {
391 $winever .= " CVS";
393 else {
394 $winever = `$wineloc -v 2>&1`;
395 chomp $winever;
397 } elsif ($debuglevel =~ 1) {
398 $winever=`$wineloc -v 2>&1`;
399 chomp $winever;
401 $gccver=`gcc -v 2>&1`;
402 ($leftover,$gccver) = split /\n/,$gccver;
403 chomp $gccver;
404 $cpu=`uname -m`;
405 chomp $cpu;
406 $kernelver=`uname -r`;
407 chomp $kernelver;
408 $ostype=`uname -s`;
409 chomp $ostype;
410 $wineneeds=`ldd $wineloc`;
411 if ($debuglevel < 3) {
412 $var20 = qq{
413 OK, now I'm going to run WINE. I will close it for you once the wine
414 debugger comes up. NOTE: You won't see ANY debug messages. Don't
415 worry, they are being output to a file. Since there are so many, it's
416 not a good idea to have them all output to a terminal (Speed slowdown
417 mainly).
418 WINE will still run much slower than normal, because there will be so
419 many debug messages being output to file.
421 print do_var($var20);
422 } elsif ($debuglevel =~ 3) {
423 $var21 = qq{
424 OK, now it's time to run WINE. I will close down WINE for you after
425 the debugger is finished doing its thing.
427 print do_var($var21);
429 $bashver=qw("/bin/bash -version");
430 if ($bashver =~ /2\./) { $outflags = "2>" }
431 else { $outflags = ">\&" }
432 print "Hit enter to start wine!\n";
433 $blank=<STDIN>;
434 $dir=$program;
435 $dir=~m#(.*)/#;
436 $dir=$1;
437 use Cwd;
438 $nowdir=getcwd;
439 chdir($dir);
440 if (!($outfile =~ /\//) and $outfile ne "no file") {
441 $outfile = "$nowdir/$outfile";
443 if (!($dbgoutfile =~ /\//) and $dbgoutfile ne "no file") {
444 $dbgoutfile = "$nowdir/$dbgoutfile";
446 if (!($tmpoutfile =~ /\//)) {
447 $tmpoutfile = "$nowdir/$tmpoutfile";
449 $SIG{CHLD}=$SIG{CLD}=sub { wait };
450 if ($dbgoutfile ne "no file") {
451 unlink("$dbgoutfile");
452 if ($pid=fork()) {
454 elsif (defined $pid) {
455 close(0);close(1);close(2);
456 exec "echo quit | $wineloc -debugmsg $debugopts $extraops \"$program\" > $dbgoutfile 2>&1";
458 else {
459 die "couldn't fork";
461 while (kill(0, $pid)) {
462 sleep(5);
463 $last = `tail -n 5 $dbgoutfile | grep Wine-dbg`;
464 if ($last =~ /Wine-dbg/) {
465 kill "TERM", $pid;
466 break;
469 if ($outfile ne "no file") {
470 $lastlines=`tail -n $lastnlines $dbgoutfile`;
471 system("gzip $dbgoutfile");
472 &generate_outfile;
474 else {
475 system("gzip $dbgoutfile");
478 elsif ($outfile ne "no file" and $dbgoutfile eq "no file") {
479 if ($pid=fork()) {
481 elsif (defined $pid) {
482 close(0);close(1);close(2);
483 exec "echo quit | $wineloc -debugmsg $debugopts $extraops \"$program\" 2>&1| tee $tmpoutfile | tail -n $lastnlines > $outfile";
485 else {
486 die "couldn't fork";
488 print "$outfile $tmpoutfile";
489 while (kill(0, $pid)) {
490 sleep(5);
491 $last = `tail -n 5 $tmpoutfile | grep Wine-dbg`;
492 if ($last =~ /Wine-dbg/) {
493 kill "TERM", $pid;
494 break;
497 unlink($tmpoutfile);
498 open(OUTFILE, "$outfile");
499 while (<OUTFILE>) {
500 $lastlines .= $_;
502 close(OUTFILE);
503 unlink($outfile);
504 &generate_outfile;
506 else {
507 $var27 = qq{
508 I guess you don't want me to make any debugging output. I'll send
509 it to your terminal. This will be a *lot* of output -- hit enter to
510 continue, control-c to quit.
511 Repeat: this will be a lot of output!
513 print do_var($var27);
514 $blah=<STDIN>;
515 system("$wineloc -debugmsg $debugmsg $extraops \"$program\"");
517 sub generate_outfile {
518 open(OUTFILE,">$outfile");
519 print OUTFILE <<EOM;
520 Auto-generated debug report by Wine Quick Debug Report Maker Thingy:
521 WINE Version: $winever
522 Windows Version: $winver
523 Distribution: $dist
524 Kernel Version: $kernelver
525 OS Type: $ostype
526 CPU: $cpu
527 GCC Version: $gccver
528 Program: $progname
529 Program Type: $progbits
530 Debug Options: -debugmsg $debugopts
531 Other Extra Commands Passed: $extraops
532 Extra ./configure Commands: $configopts
533 Wine Dependencies:
534 $wineneeds
535 Last $lastnlines lines of debug output follows:
536 $lastlines
537 I have a copy of the full debug report, if it is needed.
538 Thank you!
541 $var22 = qq{
542 Great! We're finished making the debug report. Do whatever with it.
544 $var28 = qq{
545 The filename for the formatted report is:
546 $outfile
548 $var29 = qq{
549 The filename for the compressed full debug is:
550 $dbgoutfile.gz
551 Note that it is $dbgoutfile.gz, since I compressed it with gzip for you.
553 $var30 = qq{
554 Having problems with the script? Tell the wine newsgroup
555 (comp.emulators.ms-windows.wine).
557 print do_var($var22);
558 print do_var($var28) if $outfile ne "no file";
559 print do_var($var29) if $dbgoutfile ne "no file";
560 print do_var($var30);