From 7be961f8d3a889683bed1e9f345817b32c7c7e14 Mon Sep 17 00:00:00 2001 From: Tim Waugh Date: May 08 2008 08:21:29 +0000 Subject: - Updated filters to 3.0-20080507. --- diff --git a/.cvsignore b/.cvsignore index d80e062..13d1c9c 100644 --- a/.cvsignore +++ b/.cvsignore @@ -53,3 +53,4 @@ foomatic-db-3.0-20080211.tar.gz foomatic-db-engine-3.0-20080211.tar.gz foomatic-db-hpijs-20080211.tar.gz foomatic-filters-3.0-20080211.tar.gz +foomatic-filters-3.0-20080507.tar.gz diff --git a/foomatic-clean-up-on-cancel.patch b/foomatic-clean-up-on-cancel.patch deleted file mode 100644 index 2dbd185..0000000 --- a/foomatic-clean-up-on-cancel.patch +++ /dev/null @@ -1,312 +0,0 @@ -diff -up foomatic-filters-3.0-20080211/foomatic-rip.in.clean-up-on-cancel foomatic-filters-3.0-20080211/foomatic-rip.in ---- foomatic-filters-3.0-20080211/foomatic-rip.in.clean-up-on-cancel 2008-02-11 21:16:36.000000000 +0000 -+++ foomatic-filters-3.0-20080211/foomatic-rip.in 2008-03-13 11:42:35.000000000 +0000 -@@ -155,19 +155,19 @@ my $EXIT_PRNERR_NORETRY = 2; # printer - my $EXIT_JOBERR = 3; # job is defective - my $EXIT_SIGNAL = 4; # terminated after catching signal - my $EXIT_ENGAGED = 5; # printer is otherwise engaged (connection -- # refused) -+ # refused) - my $EXIT_STARVED = 6; # starved for system resources - my $EXIT_PRNERR_NORETRY_ACCESS_DENIED = 7; # bad password? bad port -- # permissions? -+ # permissions? - my $EXIT_PRNERR_NOT_RESPONDING = 8; # just doesn't answer at all -- # (turned off?) -+ # (turned off?) - my $EXIT_PRNERR_NORETRY_BAD_SETTINGS = 9; # interface settings are invalid - my $EXIT_PRNERR_NO_SUCH_ADDRESS = 10; # address lookup failed, may be -- # transient -+ # transient - my $EXIT_PRNERR_NORETRY_NO_SUCH_ADDRESS = 11; # address lookup failed, not -- # transient -+ # transient - my $EXIT_INCAPABLE = 50; # printer wants (lacks) features -- # or resources -+ # or resources - # Standard Unix signal names - #my SIGHUP = 1; - #my SIGINT = 2; -@@ -181,6 +181,21 @@ my $EXIT_INCAPABLE = 50; - - my $ESPIPE = 29; # the errno value when seeking a pipe or socket - -+# The modern_shell() function will register the PIDs of all shell calls, -+# so that rip_die() can kill these processes -+my %pids; -+ -+# $kidgeneration stays 0 for the main process, child processes of the -+# main process get $kidgeneration = 1, their children 2, ... -+my $kidgeneration = 0; -+ -+# Catch signals -+my $retval = $EXIT_PRINTED; -+use sigtrap qw(handler set_exit_canceled normal-signals -+ handler set_exit_error error-signals -+ handler set_exit_prnerr USR1 -+ handler set_exit_prnerr_noretry USR2 -+ handler set_exit_engaged TTIN); - - - ## Some important variables -@@ -2153,7 +2168,7 @@ if ($debug) { - } - - -- -+ - ## From here on we have to repeat all the rest of the program for - ## every file to print - -@@ -3538,13 +3553,8 @@ sub getrendererhandle { - - print $logh "${added_lf}Starting renderer\n"; - -- # Catch signals -+ # Reset return value of the renderer - $retval = $EXIT_PRINTED; -- use sigtrap qw(handler set_exit_prnerr USR1 -- handler set_exit_prnerr_noretry USR2 -- handler set_exit_engaged TTIN); -- -- # Variables for the kid processes reporting their state - - # Set up a pipe for the kids to pass their exit stat to the main process - pipe KID_MESSAGE, KID_MESSAGE_IN; -@@ -3585,6 +3595,8 @@ sub getrendererhandle { - return ( *KID3, $kid3 ); - - } else { -+ $kidgeneration += 1; -+ - close KID3; - - pipe KID4_IN, KID4; -@@ -3774,6 +3786,8 @@ sub getrendererhandle { - print $logh "KID3 finished\n"; - exit $EXIT_PRINTED; - } else { -+ $kidgeneration += 1; -+ - # child, trailing task on the pipe; we write jcl stuff - close KID4; - close KID3_IN; -@@ -4112,6 +4126,8 @@ sub getfileconverterhandle { - return ( *KID1_IN, $kid1 ); - - } else { -+ $kidgeneration += 1; -+ - # We go on reading the job data and stuff it into the file - # converter - close KID1_IN; -@@ -4253,6 +4269,8 @@ sub getfileconverterhandle { - print $logh "KID1 finished\n"; - exit $EXIT_PRINTED; - } else { -+ $kidgeneration += 1; -+ - # child, first part of the pipe, reading in the data from - # standard input and stuffing it into the file converter - # after putting in the already read data (in $alreadyread) -@@ -4580,6 +4598,8 @@ sub getdocgeneratorhandle { - return ( *KID0_IN, $kid0 ); - } - -+ $kidgeneration += 1; -+ - # we are the kid; we generate the documentation page - - close KID0_IN; -@@ -4867,66 +4887,100 @@ sub rip_die { - my $errmsg = "$!"; - my $errcod = $! + 0; - -- # Close the documentation page generator (if it was used) -- if ($docgeneratorpid) { -- if ($kid0) { -- print $logh "Killing process $kid0 (KID0)\n"; -- kill(9, $kid0); -+ # Log that we are dying ... -+ print $logh "Process dying with \"$message\", exit stat: $exitstat\n\terror: $errmsg ($errcod)\n"; -+ -+ print $logh "Cleaning up ...\n"; -+ foreach my $killsignal (15, 9) { -+ -+ # Kill all registered subshells -+ foreach my $pid (keys %pids) { -+ print $logh "Killing process $pid ($pids{$pid}) and its subprocesses with signal $killsignal\n"; -+ # This call kills the process group with group ID $pid, the -+ # group which was formed from the initial process $pid which -+ # contains $pid and all its subprocesses -+ kill(-$killsignal, $pid); -+ # If the system does not support process groups and therefore -+ # the call above does not kill anything, kill at least $pid -+ kill($killsignal, $pid); - } -- $docgeneratorpid = 0; -- } - -- # Close the file converter (if it was used) -- if ($fileconverterpid) { -+ # Close the documentation page generator (if it was used) -+ if ($kid0) { -+ print $logh "Killing process $kid0 (KID0) with signal $killsignal\n"; -+ kill($killsignal, $kid0); -+ } -+ -+ # Close the file converter (if it was used) - if ($kid2) { -- print $logh "Killing process $kid2 (KID2)\n"; -- kill(9, $kid2); -+ print $logh "Killing process $kid2 (KID2) with signal $killsignal\n"; -+ kill($killsignal, $kid2); - } - if ($kid1) { -- print $logh "Killing process $kid1 (KID1)\n"; -- kill(9, $kid1); -+ print $logh "Killing process $kid1 (KID1) with signal $killsignal\n"; -+ kill($killsignal, $kid1); - } -- $fileconverterpid = 0; -- } - -- # Close the renderer -- if ($rendererpid) { -+ # Close the renderer - if ($kid4) { -- print $logh "Killing process $kid4 (KID4)\n"; -- kill(9, $kid4); -+ print $logh "Killing process $kid4 (KID4) with signal $killsignal\n"; -+ kill($killsignal, $kid4); - } - if ($kid3) { -- print $logh "Killing process $kid3 (KID3)\n"; -- kill(9, $kid3); -+ print $logh "Killing process $kid3 (KID3) with signal $killsignal\n"; -+ kill($killsignal, $kid3); - } -- $rendererpid = 0; -+ -+ # Wait some time for the processes to close -+ sleep(5 - $kidgeneration) if $killsignal != 9; - } - -- print $logh "Process dying with \"$message\", exit stat: $exitstat\n\terror: $errmsg ($errcod)\n"; -- if ($spooler eq 'ppr_int') { -- # Special error handling for PPR intefaces -- $message =~ s/\\/\\\\/; -- $message =~ s/\"/\\\"/; -- my @messagelines = split("\n", $message); -- my $firstline = "TRUE"; -- for my $line (@messagelines) { -- modern_system("lib/alert $printer $firstline \"$line\""); -- $firstline = "FALSE"; -+ # Do the debug dump and the PPR error handling only from the main process -+ if ($kidgeneration == 0) { # We are the main process -+ -+ if ($spooler eq 'ppr_int') { -+ # Special error handling for PPR intefaces -+ $message =~ s/\\/\\\\/; -+ $message =~ s/\"/\\\"/; -+ my @messagelines = split("\n", $message); -+ my $firstline = "TRUE"; -+ for my $line (@messagelines) { -+ modern_system("lib/alert $printer $firstline \"$line\""); -+ $firstline = "FALSE"; -+ } -+ } else { -+ print STDERR $message . "\n"; -+ } -+ if ($debug) { -+ use Data::Dumper; -+ local $Data::Dumper::Purity=1; -+ local $Data::Dumper::Indent=1; -+ print $logh Dumper($dat); - } -- } else { -- print STDERR $message . "\n"; -- } -- if ($debug) { -- use Data::Dumper; -- local $Data::Dumper::Purity=1; -- local $Data::Dumper::Indent=1; -- print $logh Dumper($dat); - } -+ -+ ## The End -+ print $logh "${added_lf}Closing foomatic-rip.\n"; -+ close $logh; -+ - exit $exitstat; - } - - # Signal handling routines - -+sub do_nothing { -+} -+ -+sub set_exit_canceled { -+ $retval = $EXIT_PRINTED; -+ rip_die ("Caught termination signal: Job canceled", $retval); -+} -+ -+sub set_exit_error { -+ $retval = $EXIT_SIGNAL; -+ rip_die ("Caught error signal: Error in renderer, driver, or foomatic-rip", $retval); -+} -+ - sub set_exit_prnerr { - $retval = $EXIT_PRNERR; - } -@@ -6592,20 +6646,36 @@ sub read_attribute_file { - sub modern_system { - my (@list) = @_; - -- if (($modern_shell =~ /.+/) && ($modern_shell ne '/bin/sh')) { -- # a "modern" shell other than the default shell was specified -- my $pid = fork(); -- -- ($pid < 0) && die "failed to fork()"; -- -- if ($pid == 0) { # child, execute the commands under a modern shell -- exec($modern_shell, "-c", @list); -- die "exec($modern_shell, \"-c\", @list);"; -- } else { # parent, wait for the child -- waitpid($pid, 0); -- } -- } else { # the system shell is "modern" enough. -- system(@list); -+ if ($modern_shell |~ /.+/) { -+ # No "modern" shell other than the default shell was specified -+ $modern_shell = '/bin/sh'; -+ } -+ -+ my $pid = fork(); -+ ($pid < 0) && die "failed to fork()"; -+ -+ if ($pid == 0) { # child, execute the commands under a modern shell -+ # If the system supports process groups, we create a process -+ # group of this subshell process. All the children of this -+ # process (calls of external filters, renderers, or drivers) -+ # will be members of this process group and so by killing this -+ # process group we can kill all subprocesses and so we can -+ # cleanly cancel print jobs -+ eval("setpgrp()"); -+ # Stop catching signals -+ #use sigtrap qw(die normal-signals error-signals -+ # handler do_nothing USR1 USR2 TTIN); -+ exec($modern_shell, "-c", @list); -+ rip_die("exec($modern_shell, \"-c\", @list);", -+ $EXIT_PRNERR_NORETRY_BAD_SETTINGS); -+ } else { # parent, register child's PID, wait for the child, and -+ # unregister the PID -+ $pids{$pid} = substr(join(" ", @list), 0, 100) . -+ (length(join(" ", @list)) > 100 ? "..." : ""); -+ print $logh "Starting process $pid: \"$pids{$pid}\"\n"; -+ waitpid($pid, 0); -+ print $logh "Process $pid ending: \"$pids{$pid}\"\n"; -+ delete $pids{$pid}; - } - } - diff --git a/foomatic.spec b/foomatic.spec index 4723831..e5fa7f3 100644 --- a/foomatic.spec +++ b/foomatic.spec @@ -1,6 +1,6 @@ %define dbver 20080211 %define enginever 3.0-20080211 -%define filtersver 20080211 +%define filtersver 20080507 %define hpijsver 20080211 Summary: Foomatic printer database. @@ -43,7 +43,6 @@ Patch15: foomatic-bad-utf8.patch # Missing IEEE 1284 IDs. Patch16: foomatic-ieee1284.patch -Patch17: foomatic-clean-up-on-cancel.patch Patch18: foomatic-sigpipe.patch Url: http://www.linuxprinting.org @@ -89,7 +88,6 @@ The site http://www.linuxprinting.org/ is based on this database. pushd foomatic-filters-3.0-%{filtersver} %patch1 -p1 -b .libdir %patch5 -p1 -b .fontpath -%patch17 -p1 -b .clean-up-on-cancel %patch18 -p1 -b .sigpipe ./make_configure popd @@ -250,6 +248,9 @@ rm -fr %buildroot $RPM_BUILD_DIR/%{name} %{_var}/cache/foomatic %changelog +* Thu May 8 2008 Tim Waugh +- Updated filters to 3.0-20080507. + * Wed May 7 2008 Tim Waugh - Avoid busy-looping when the CUPS backend stops (bug #445555). diff --git a/sources b/sources index 144ca96..b653478 100644 --- a/sources +++ b/sources @@ -1,4 +1,4 @@ 5d827cd3d95807c28609d49a5c412c29 foomatic-db-3.0-20080211.tar.gz ba8b08913589568f85548998f6321f95 foomatic-db-engine-3.0-20080211.tar.gz 58bef426f769219592b6b0c81357a04a foomatic-db-hpijs-20080211.tar.gz -97b517e94ac85534cdc84a446a872bc2 foomatic-filters-3.0-20080211.tar.gz +bb02f5036f73c5302ba4739ca2a7339a foomatic-filters-3.0-20080507.tar.gz