X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=scheduler%2Fcupsfilter.c;h=5a829e74552765a2303bc3dd4990c38e6fde82fe;hb=8072030b3c862315c367c73663b27f0427325919;hp=177766e5344a36a4fe15f8d64c0bf41626609aa2;hpb=f2d18633e2916a90bbbe5ae039d1f0acc430dc0b;p=thirdparty%2Fcups.git diff --git a/scheduler/cupsfilter.c b/scheduler/cupsfilter.c index 177766e53..5a829e745 100644 --- a/scheduler/cupsfilter.c +++ b/scheduler/cupsfilter.c @@ -1,34 +1,14 @@ /* - * "$Id$" + * Filtering program for CUPS. * - * Filtering program for CUPS. + * Copyright 2007-2014 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. * - * Copyright 2007-2013 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products, all rights reserved. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * Contents: - * - * main() - Main entry for the test program. - * add_printer_filter() - Add a single filters from a PPD file. - * add_printer_filters() - Add filters from a PPD file. - * check_cb() - Callback function for _cupsFileCheck. - * compare_pids() - Compare two filter PIDs... - * escape_options() - Convert an options array to a string. - * exec_filter() - Execute a single filter. - * exec_filters() - Execute filters for the given file and options. - * get_job_file() - Get the specified job file. - * open_pipe() - Create a pipe which is closed on exec. - * read_cupsd_conf() - Read the cupsd.conf file to get the filter - * settings. - * set_string() - Copy and set a string. - * sighandler() - Signal catcher for when we print from stdin... - * usage() - Show program usage... + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". */ /* @@ -99,7 +79,7 @@ static int exec_filters(mime_type_t *srctype, cups_option_t *options); static void get_job_file(const char *job); static int open_pipe(int *fds); -static int read_cupsd_conf(const char *filename); +static int read_cups_files_conf(const char *filename); static void set_string(char **s, const char *val); static void sighandler(int sig); static void usage(const char *opt) __attribute__((noreturn)); @@ -113,7 +93,8 @@ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { - int i; /* Looping vars */ + int i, /* Looping vars */ + list_filters = 0; /* Just list the filters? */ const char *command, /* Command name */ *opt, /* Current option */ *printer; /* Printer name */ @@ -129,7 +110,7 @@ main(int argc, /* I - Number of command-line args */ char mimedir[1024]; /* MIME directory */ char *infile, /* File to filter */ *outfile; /* File to create */ - char cupsdconf[1024]; /* cupsd.conf file */ + char cupsfilesconf[1024]; /* cups-files.conf file */ const char *server_root; /* CUPS_SERVERROOT environment variable */ mime_type_t *src, /* Source type */ *dst; /* Destination type */ @@ -173,7 +154,7 @@ main(int argc, /* I - Number of command-line args */ if ((server_root = getenv("CUPS_SERVERROOT")) == NULL) server_root = CUPS_SERVERROOT; - snprintf(cupsdconf, sizeof(cupsdconf), "%s/cupsd.conf", server_root); + snprintf(cupsfilesconf, sizeof(cupsfilesconf), "%s/cups-files.conf", server_root); /* * Process command-line arguments... @@ -182,168 +163,175 @@ main(int argc, /* I - Number of command-line args */ _cupsSetLocale(argv); for (i = 1; i < argc; i ++) + { if (argv[i][0] == '-') { - for (opt = argv[i] + 1; *opt; opt ++) - switch (*opt) + if (!strcmp(argv[i], "--list-filters")) + { + list_filters = 1; + } + else if (!strcmp(argv[i], "--")) + { + i ++; + if (i < argc && !infile) + infile = argv[i]; + else + usage(NULL); + } + else + { + for (opt = argv[i] + 1; *opt; opt ++) { - case '-' : /* Next argument is a filename... */ - i ++; - if (i < argc && !infile) - infile = argv[i]; - else - usage(opt); - break; - - case 'a' : /* Specify option... */ - i ++; - if (i < argc) - num_options = cupsParseOptions(argv[i], num_options, &options); - else - usage(opt); - break; - - case 'c' : /* Specify cupsd.conf file location... */ - i ++; - if (i < argc) - { - if (!strcmp(command, "convert")) - num_options = cupsAddOption("copies", argv[i], num_options, - &options); + switch (*opt) + { + case 'a' : /* Specify option... */ + i ++; + if (i < argc) + num_options = cupsParseOptions(argv[i], num_options, &options); + else + usage(opt); + break; + + case 'c' : /* Specify cups-files.conf file location... */ + i ++; + if (i < argc) + { + if (!strcmp(command, "convert")) + num_options = cupsAddOption("copies", argv[i], num_options, &options); + else + strlcpy(cupsfilesconf, argv[i], sizeof(cupsfilesconf)); + } + else + usage(opt); + break; + + case 'd' : /* Specify the real printer name */ + i ++; + if (i < argc) + printer = argv[i]; else - strlcpy(cupsdconf, argv[i], sizeof(cupsdconf)); - } - else - usage(opt); - break; - - case 'd' : /* Specify the real printer name */ - i ++; - if (i < argc) - printer = argv[i]; - else - usage(opt); - break; - - case 'D' : /* Delete input file after conversion */ - removeinfile = 1; - break; - - case 'e' : /* Use every filter from the PPD file */ - all_filters = 1; - break; - - case 'f' : /* Specify input file... */ - i ++; - if (i < argc && !infile) - infile = argv[i]; - else - usage(opt); - break; - - case 'i' : /* Specify source MIME type... */ - i ++; - if (i < argc) - { - if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2) usage(opt); + break; + + case 'D' : /* Delete input file after conversion */ + removeinfile = 1; + break; + + case 'e' : /* Use every filter from the PPD file */ + all_filters = 1; + break; - srctype = argv[i]; - } - else - usage(opt); - break; + case 'f' : /* Specify input file... */ + i ++; + if (i < argc && !infile) + infile = argv[i]; + else + usage(opt); + break; - case 'j' : /* Get job file or specify destination MIME type... */ - if (strcmp(command, "convert")) - { - i ++; + case 'i' : /* Specify source MIME type... */ + i ++; if (i < argc) { - get_job_file(argv[i]); - infile = TempFile; + if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2) + usage(opt); + + srctype = argv[i]; } else usage(opt); + break; + + case 'j' : /* Get job file or specify destination MIME type... */ + if (strcmp(command, "convert")) + { + i ++; + if (i < argc) + { + get_job_file(argv[i]); + infile = TempFile; + } + else + usage(opt); + + break; + } + + case 'm' : /* Specify destination MIME type... */ + i ++; + if (i < argc) + { + if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2) + usage(opt); - break; - } + dsttype = argv[i]; + } + else + usage(opt); + break; - case 'm' : /* Specify destination MIME type... */ - i ++; - if (i < argc) - { - if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2) + case 'n' : /* Specify number of copies... */ + i ++; + if (i < argc) + num_options = cupsAddOption("copies", argv[i], num_options, &options); + else usage(opt); + break; - dsttype = argv[i]; - } - else - usage(opt); - break; - - case 'n' : /* Specify number of copies... */ - i ++; - if (i < argc) - num_options = cupsAddOption("copies", argv[i], num_options, - &options); - else - usage(opt); - break; - - case 'o' : /* Specify option(s) or output filename */ - i ++; - if (i < argc) - { - if (!strcmp(command, "convert")) + case 'o' : /* Specify option(s) or output filename */ + i ++; + if (i < argc) { - if (outfile) - usage(NULL); + if (!strcmp(command, "convert")) + { + if (outfile) + usage(NULL); + else + outfile = argv[i]; + } else - outfile = argv[i]; + num_options = cupsParseOptions(argv[i], num_options, &options); } else - num_options = cupsParseOptions(argv[i], num_options, - &options); - } - else - usage(opt); - break; - - case 'p' : /* Specify PPD file... */ - case 'P' : /* Specify PPD file... */ - i ++; - if (i < argc) - ppdfile = argv[i]; - else - usage(opt); - break; - - case 't' : /* Specify title... */ - case 'J' : /* Specify title... */ - i ++; - if (i < argc) - title = argv[i]; - else - usage(opt); - break; - - case 'u' : /* Delete PPD file after conversion */ - removeppd = 1; - break; - - case 'U' : /* Specify username... */ - i ++; - if (i < argc) - user = argv[i]; - else - usage(opt); - break; - - default : /* Something we don't understand... */ - usage(opt); - break; + usage(opt); + break; + + case 'p' : /* Specify PPD file... */ + case 'P' : /* Specify PPD file... */ + i ++; + if (i < argc) + ppdfile = argv[i]; + else + usage(opt); + break; + + case 't' : /* Specify title... */ + case 'J' : /* Specify title... */ + i ++; + if (i < argc) + title = argv[i]; + else + usage(opt); + break; + + case 'u' : /* Delete PPD file after conversion */ + removeppd = 1; + break; + + case 'U' : /* Specify username... */ + i ++; + if (i < argc) + user = argv[i]; + else + usage(opt); + break; + + default : /* Something we don't understand... */ + usage(opt); + break; + } } + } } else if (!infile) { @@ -358,6 +346,7 @@ main(int argc, /* I - Number of command-line args */ _("cupsfilter: Only one filename can be specified.")); usage(NULL); } + } if (!infile && !srctype) usage(NULL); @@ -373,10 +362,10 @@ main(int argc, /* I - Number of command-line args */ } /* - * Load the cupsd.conf file and create the MIME database... + * Load the cups-files.conf file and create the MIME database... */ - if (read_cupsd_conf(cupsdconf)) + if (read_cups_files_conf(cupsfilesconf)) return (1); snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir); @@ -491,12 +480,31 @@ main(int argc, /* I - Number of command-line args */ filters = prefilters; } - /* - * Do it! - */ + if (list_filters) + { + /* + * List filters... + */ + + mime_filter_t *filter; /* Current filter */ + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + if (strcmp(filter->filter, "-")) + _cupsLangPuts(stdout, filter->filter); + + status = 0; + } + else + { + /* + * Run filters... + */ - status = exec_filters(src, filters, infile, outfile, ppdfile, printer, user, - title, num_options, options); + status = exec_filters(src, filters, infile, outfile, ppdfile, printer, user, + title, num_options, options); + } /* * Remove files as needed, then exit... @@ -576,7 +584,7 @@ add_printer_filter( { char *ptr; /* Pointer into maxsize(nnnn) program */ - maxsize = strtoll(program + 8, &ptr, 10); + maxsize = (size_t)strtoll(program + 8, &ptr, 10); if (*ptr != ')') { @@ -745,7 +753,7 @@ escape_options( { int i; /* Looping var */ cups_option_t *option; /* Current option */ - int bytes; /* Number of bytes needed */ + size_t bytes; /* Number of bytes needed */ char *s, /* Option string */ *sptr, /* Pointer into string */ *vptr; /* Pointer into value */ @@ -773,7 +781,7 @@ escape_options( if (sptr > s) *sptr++ = ' '; - strlcpy(sptr, option->name, bytes - (sptr - s)); + strlcpy(sptr, option->name, bytes - (size_t)(sptr - s)); sptr += strlen(sptr); *sptr++ = '='; @@ -812,7 +820,7 @@ exec_filter(const char *filter, /* I - Filter to execute */ /* - * Add special voodoo magic for MacOS X - this allows MacOS X + * Add special voodoo magic for MacmacOS - this allows MacmacOS * programs to access their bundle resources properly... */ @@ -1354,13 +1362,14 @@ open_pipe(int *fds) /* O - Pipe file descriptors (2) */ /* - * 'read_cupsd_conf()' - Read the cupsd.conf file to get the filter settings. + * 'read_cups_files_conf()' - Read the cups-files.conf file to get the filter settings. */ static int /* O - 0 on success, 1 on error */ -read_cupsd_conf(const char *filename) /* I - File to read */ +read_cups_files_conf( + const char *filename) /* I - File to read */ { - cups_file_t *fp; /* cupsd.conf file */ + cups_file_t *fp; /* cups-files.conf file */ const char *temp; /* Temporary string */ char line[1024], /* Line from file */ *ptr; /* Pointer into line */ @@ -1413,9 +1422,7 @@ read_cupsd_conf(const char *filename) /* I - File to read */ cupsFileClose(fp); } - snprintf(line, sizeof(line), - "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", - ServerBin); + snprintf(line, sizeof(line), "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", ServerBin); set_string(&Path, line); return (0); @@ -1467,38 +1474,25 @@ static void usage(const char *opt) /* I - Incorrect option, if any */ { if (opt) - _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), "cupsfilter", - *opt); + _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), "cupsfilter", *opt); - _cupsLangPuts(stdout, _("Usage: cupsfilter [ options ] filename")); + _cupsLangPuts(stdout, _("Usage: cupsfilter [ options ] [ -- ] filename")); _cupsLangPuts(stdout, _("Options:")); - _cupsLangPuts(stdout, _(" -D Remove the input file " - "when finished.")); + _cupsLangPuts(stdout, _(" --list-filters List filters that will be used.")); + _cupsLangPuts(stdout, _(" -D Remove the input file when finished.")); _cupsLangPuts(stdout, _(" -P filename.ppd Set PPD file.")); _cupsLangPuts(stdout, _(" -U username Specify username.")); - _cupsLangPuts(stdout, _(" -c cupsd.conf Set cupsd.conf file to " - "use.")); - _cupsLangPuts(stdout, _(" -d printer Use the named " - "printer.")); - _cupsLangPuts(stdout, _(" -e Use every filter from " - "the PPD file.")); - _cupsLangPuts(stdout, _(" -i mime/type Set input MIME type " - "(otherwise auto-typed).")); - _cupsLangPuts(stdout, _(" -j job-id[,N] Filter file N from the " - "specified job (default is file 1).")); - _cupsLangPuts(stdout, _(" -m mime/type Set output MIME type " - "(otherwise application/pdf).")); + _cupsLangPuts(stdout, _(" -c cups-files.conf Set cups-files.conf file to use.")); + _cupsLangPuts(stdout, _(" -d printer Use the named printer.")); + _cupsLangPuts(stdout, _(" -e Use every filter from the PPD file.")); + _cupsLangPuts(stdout, _(" -i mime/type Set input MIME type (otherwise auto-typed).")); + _cupsLangPuts(stdout, _(" -j job-id[,N] Filter file N from the specified job (default is file 1).")); + _cupsLangPuts(stdout, _(" -m mime/type Set output MIME type (otherwise application/pdf).")); _cupsLangPuts(stdout, _(" -n copies Set number of copies.")); _cupsLangPuts(stdout, _(" -o name=value Set option(s).")); _cupsLangPuts(stdout, _(" -p filename.ppd Set PPD file.")); _cupsLangPuts(stdout, _(" -t title Set title.")); - _cupsLangPuts(stdout, _(" -u Remove the PPD file " - "when finished.")); + _cupsLangPuts(stdout, _(" -u Remove the PPD file when finished.")); exit(1); } - - -/* - * End of "$Id$". - */