diff options
Diffstat (limited to 'foomaticrip.c')
-rw-r--r-- | foomaticrip.c | 83 |
1 files changed, 66 insertions, 17 deletions
diff --git a/foomaticrip.c b/foomaticrip.c index 8c5b352..b548b1e 100644 --- a/foomaticrip.c +++ b/foomaticrip.c @@ -1,3 +1,25 @@ +/* foomaticrip.c + * + * Copyright (C) 2008 Till Kamppeter <till.kamppeter@gmail.com> + * Copyright (C) 2008 Lars Uebernickel <larsuebernickel@gmx.de> + * + * This file is part of foomatic-rip. + * + * Foomatic-rip is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Foomatic-rip is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ #include "foomaticrip.h" #include "util.h" @@ -965,10 +987,13 @@ int print_file(const char *filename, int convert) n = fread(buf, 1, sizeof(buf) - 1, file); buf[n] = '\0'; type = guess_file_type(buf, n, &startpos); - if (startpos > 0) { + /* We do not use any JCL preceeded to the inputr data, as it is simply + the PJL commands from the PPD file, and these commands we can also + generate, end we even merge them with PJl from the driver */ + /*if (startpos > 0) { jobhasjcl = 1; write_output(buf, startpos); - } + }*/ if (file != stdin) rewind(file); @@ -983,26 +1008,48 @@ int print_file(const char *filename, int convert) char pdf2ps_cmd[PATH_MAX]; FILE *out, *in; int renderer_pid; + char tmpfilename[PATH_MAX] = ""; _log("Driver does not understand PDF input, " "converting to PostScript\n"); pdfconvertedtops = 1; + + /* If reading from stdin, write everything into a temporary file */ + if (file == stdin) + { + int fd; + FILE *tmpfile; + + snprintf(tmpfilename, PATH_MAX, "%s/foomatic-XXXXXX", temp_dir()); + fd = mkstemp(tmpfilename); + if (fd < 0) { + _log("Could not create temporary file: %s\n", strerror(errno)); + return EXIT_PRNERR_NORETRY_BAD_SETTINGS; + } + tmpfile = fdopen(fd, "r+"); + copy_file(tmpfile, stdin, buf, n); + fclose(tmpfile); + + filename = tmpfilename; + } + + /* If the spooler is CUPS we remove the /usr/lib/cups/filter + (CUPS filter directory, can be different, but ends with + "/cups/filter") which CUPS adds to the beginning of $PATH, + so that Poppler's/XPDF's pdftops filter is called and not + the one of CUPS, as the one of CUPS has a different command + line and does undesired page management operations */ snprintf(pdf2ps_cmd, PATH_MAX, - "gs -q -sstdout=%%stderr -sDEVICE=pswrite -sOutputFile=- " - "-dBATCH -dNOPAUSE -dPARANOIDSAFER %s", - file == stdin ? "-" : filename); + "%spdftops -level2 -origpagesizes %s - 2>/dev/null || " + "gs -q -sstdout=%%stderr -sDEVICE=pswrite -sOutputFile=- " + "-dBATCH -dNOPAUSE -dPARANOIDSAFER %s 2>/dev/null", + (spooler == SPOOLER_CUPS ? + "PATH=${PATH#*/cups/filter:} " : ""), + filename, filename); renderer_pid = start_system_process("pdf-to-ps", pdf2ps_cmd, &in, &out); - if (file == stdin) - { - fwrite(buf, 1, n, in); - while ((n = fread(buf, 1, sizeof(buf), file))) - fwrite(buf, 1, n, in); - fclose(in); - } - if (dup2(fileno(out), fileno(stdin)) < 0) rip_die(EXIT_PRNERR_NORETRY_BAD_SETTINGS, "Couldn't dup stdout of pdf-to-ps\n"); @@ -1192,12 +1239,13 @@ int main(int argc, char** argv) spooler = SPOOLER_LPRNG; if ((str = strstr(getenv("PRINTCAP_ENTRY"), "ppd="))) str += 4; - else if ((str = strstr(getenv("PRINTCAP_ENTRY"), "ppdfile="))); - str += 8; + else if ((str = strstr(getenv("PRINTCAP_ENTRY"), "ppdfile="))) + str += 8; if (str) { while (isspace(*str)) str++; p = job->ppdfile; - while (*str != '\0' && !isspace(*str) && *str != '\n') { + while (*str != '\0' && !isspace(*str) && *str != '\n' && + *str != ':') { if (isprint(*str) && strchr(shellescapes, *str) == NULL) *p++ = *str; str++; @@ -1306,8 +1354,9 @@ int main(int argc, char** argv) init_cups(arglist, filelist, job); break; - case SPOOLER_LPD: case SPOOLER_LPRNG: + if (job->ppdfile[0] != '\0') break; + case SPOOLER_LPD: case SPOOLER_GNULPR: /* Get PPD file name as the last command line argument */ if (arglist->last) |