- Updated filters to 3.0-20080507.

This commit is contained in:
Tim Waugh 2008-05-08 08:21:29 +00:00
parent 36c2a2eee7
commit 7be961f8d3
4 changed files with 6 additions and 316 deletions

View File

@ -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

View File

@ -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};
}
}

View File

@ -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 <twaugh@redhat.com>
- Updated filters to 3.0-20080507.
* Wed May 7 2008 Tim Waugh <twaugh@redhat.com>
- Avoid busy-looping when the CUPS backend stops (bug #445555).

View File

@ -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