#!@PERL@ # -*- perl -*- # $Revision$ # This is a little Ghostscript regularization script. It massages # arguments to make Ghostscript execute properly as a filter, with # output on stdout and errors etc on stderr. # Arbitrary other option processing could happen here, too. # IT WOULD BE WRONG to have this file do any processing of the input # or output data. Such job transforms belong in actual filters, or # inside Ghostscript itself. my $prefix = "@prefix@"; my $configpath = "@sysconfdir@/foomatic"; # Read config file if present %conf = readConfFile("$configpath/filter.conf"); # Set Ghostscript path my $gspath = "gs"; $gspath = $conf{gspath} if defined(%conf) and defined $conf{gspath}; my $execpath = "@EXECPATH@"; # Get execution path from config file $execpath = $conf{execpath} if defined(%conf) and defined $conf{execpath}; $ENV{'PATH'} = $execpath; # Check whether we have a Ghostscript version with redirection of the # standard output of the PostScript programs via '-sstdout=%stderr' my $gswithstdoutredirection = 0; if (`$gspath -dQUIET -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOMEDIAATTRS -sDEVICE=pswrite -sstdout=%stderr -sOutputFile=/dev/null -c '(hello\n) print flush' 2>&1` =~ /hello/) { $gswithstdoutredirection = 1; } grep (m!\-sOutputFile=\-! && do { # If Ghostscript does not support redirecting the standard output # of the PostScript program to standard error with # '-sstdout=%stderr', sen the job output data to fd 3; errors # will be on 2(stderr) and job ps program interpreter output on # 1(stdout). $_ = ($gswithstdoutredirection ? '-sOutputFile=%stdout' : '-sOutputFile=/dev/fd/3'); # quoted properly below... }, @ARGV); grep (((m!^\-$!) || (m!^\-_$!) || (m!^/dev/fd/0$!)) && do { # Use always buffered input. This works around a Ghostscript # bug which prevents printing encrypted PDF files with Adobe # Reader 8.1.1 and Ghostscript built as shared library # (Ghostscript bug #689577, Ubuntu bug #172264) $_ = "-_"; }, @ARGV); # Turn *off* -q (quiet!); now that stderr is useful! :) my @myargs = grep (! m!^\-q$!, @ARGV); # Escape any quotes, and then quote everything just to be sure... # Escaping a single quote inside single quotes is a bit complex as the shell # takes everything literal there. So we have to assemble it by concatinating # different quoted strings. # Finally we get e.g.: 'x'"'"'y' or ''"'"'xy' or 'xy'"'"'' or ... grep (s/\'/\'\"\'\"\'/g, @myargs); my $args = "'" . join("' '", @myargs) . "'"; # Execute Ghostscript, with both job and gs errors on stderr, and job # output on stdout... if ($gswithstdoutredirection) { $args = "'-sstdout=\%stderr' $args"; print STDERR "foomatic-gswrapper: $gspath $args\n"; exec "$gspath $args"; } else { print STDERR "foomatic-gswrapper: $gspath $args 3>&1 1>&2\n"; exec "$gspath $args 3>&1 1>&2"; } die "Failed to execute Ghostscript?!"; # Read the config file sub readConfFile { my ($file) = @_; my %conf; # Read config file if present if (open CONF, "< $file") { while () { $conf{$1}="$2" if (m/^\s*([^\#\s]\S*)\s*:\s*(.*?)\s*$/); } close CONF; } return %conf; }