summaryrefslogtreecommitdiff
path: root/berkeley/lpr.c
diff options
context:
space:
mode:
authorMichael Sweet <michael.r.sweet@gmail.com>2016-05-25 19:33:42 -0400
committerMichael Sweet <michael.r.sweet@gmail.com>2016-05-25 19:33:42 -0400
commitbdbfacc73eb01dc0bb79842da2b0da47d7c6aaab (patch)
tree14f87441a02472042927fcf3b242cdaff2ff2aea /berkeley/lpr.c
parent9e6d7a0f879c7fb58209be4ba242b6131693964a (diff)
downloadcups-bdbfacc73eb01dc0bb79842da2b0da47d7c6aaab.tar.gz
Support POSIX option processing (Issue #4813)
Diffstat (limited to 'berkeley/lpr.c')
-rw-r--r--berkeley/lpr.c407
1 files changed, 208 insertions, 199 deletions
diff --git a/berkeley/lpr.c b/berkeley/lpr.c
index eb58c8bd9..418ef4b55 100644
--- a/berkeley/lpr.c
+++ b/berkeley/lpr.c
@@ -1,7 +1,7 @@
/*
* "lpr" command for CUPS.
*
- * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2007-2016 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
@@ -30,7 +30,8 @@ main(int argc, /* I - Number of command-line arguments */
int job_id; /* Job ID */
char ch; /* Option character */
char *printer, /* Destination printer or class */
- *instance; /* Instance */
+ *instance, /* Instance */
+ *opt; /* Option pointer */
const char *title, /* Job title */
*val; /* Environment variable name */
int num_copies; /* Number of copies per file */
@@ -54,229 +55,235 @@ main(int argc, /* I - Number of command-line arguments */
title = NULL;
for (i = 1; i < argc; i ++)
+ {
if (argv[i][0] == '-')
{
- switch (ch = argv[i][1])
+ for (opt = argv[i] + 1; *opt; opt ++)
{
- case 'E' : /* Encrypt */
+ switch (ch = *opt)
+ {
+ case 'E' : /* Encrypt */
#ifdef HAVE_SSL
- cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
+ cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
#else
- _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
- argv[0]);
+ _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
#endif /* HAVE_SSL */
- break;
-
- case 'U' : /* Username */
- if (argv[i][2] != '\0')
- cupsSetUser(argv[i] + 2);
- else
- {
- i ++;
- if (i >= argc)
+ break;
+
+ case 'U' : /* Username */
+ if (opt[1] != '\0')
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected username after "
- "\"-U\" option."), argv[0]);
- return (1);
+ cupsSetUser(opt + 1);
+ opt += strlen(opt) - 1;
}
+ else
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
+ return (1);
+ }
+
+ cupsSetUser(argv[i]);
+ }
+ break;
- cupsSetUser(argv[i]);
- }
- break;
-
- case 'H' : /* Connect to host */
- if (argv[i][2] != '\0')
- cupsSetServer(argv[i] + 2);
- else
- {
- i ++;
+ case 'H' : /* Connect to host */
+ if (opt[1] != '\0')
+ {
+ cupsSetServer(opt + 1);
+ opt += strlen(opt) - 1;
+ }
+ else
+ {
+ i ++;
+
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-H\" option."), argv[0]);
+ return (1);
+ }
+ else
+ cupsSetServer(argv[i]);
+ }
+ break;
+
+ case '1' : /* TROFF font set 1 */
+ case '2' : /* TROFF font set 2 */
+ case '3' : /* TROFF font set 3 */
+ case '4' : /* TROFF font set 4 */
+ case 'i' : /* indent */
+ case 'w' : /* width */
+ if (opt[1] != '\0')
+ {
+ opt += strlen(opt) - 1;
+ }
+ else
+ {
+ i ++;
+
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr,
+ _("%s: Error - expected value after \"-%c\" "
+ "option."), argv[0], ch);
+ return (1);
+ }
+ }
- if (i >= argc)
+ case 'c' : /* CIFPLOT */
+ case 'd' : /* DVI */
+ case 'f' : /* FORTRAN */
+ case 'g' : /* plot */
+ case 'n' : /* Ditroff */
+ case 't' : /* Troff */
+ case 'v' : /* Raster image */
+ _cupsLangPrintf(stderr, _("%s: Warning - \"%c\" format modifier not supported - output may not be correct."), argv[0], ch);
+ break;
+
+ case 'o' : /* Option */
+ if (opt[1] != '\0')
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected hostname after "
- "\"-H\" option."), argv[0]);
- return (1);
- }
+ num_options = cupsParseOptions(opt + 1, num_options, &options);
+ opt += strlen(opt) - 1;
+ }
else
- cupsSetServer(argv[i]);
- }
- break;
-
- case '1' : /* TROFF font set 1 */
- case '2' : /* TROFF font set 2 */
- case '3' : /* TROFF font set 3 */
- case '4' : /* TROFF font set 4 */
- case 'i' : /* indent */
- case 'w' : /* width */
- if (argv[i][2] == '\0')
- {
- i ++;
-
- if (i >= argc)
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected value after \"-%c\" "
- "option."), argv[0], ch);
- return (1);
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected option=value after \"-o\" option."), argv[0]);
+ return (1);
+ }
+
+ num_options = cupsParseOptions(argv[i], num_options, &options);
}
- }
-
- case 'c' : /* CIFPLOT */
- case 'd' : /* DVI */
- case 'f' : /* FORTRAN */
- case 'g' : /* plot */
- case 'n' : /* Ditroff */
- case 't' : /* Troff */
- case 'v' : /* Raster image */
- _cupsLangPrintf(stderr,
- _("%s: Warning - \"%c\" format modifier not "
- "supported - output may not be correct."),
- argv[0], ch);
- break;
-
- case 'o' : /* Option */
- if (argv[i][2] != '\0')
- num_options = cupsParseOptions(argv[i] + 2, num_options, &options);
- else
- {
- i ++;
- if (i >= argc)
+ break;
+
+ case 'l' : /* Literal/raw */
+ num_options = cupsAddOption("raw", "true", num_options, &options);
+ break;
+
+ case 'p' : /* Prettyprint */
+ num_options = cupsAddOption("prettyprint", "true", num_options, &options);
+ break;
+
+ case 'h' : /* Suppress burst page */
+ num_options = cupsAddOption("job-sheets", "none", num_options, &options);
+ break;
+
+ case 's' : /* Don't use symlinks */
+ break;
+
+ case 'm' : /* Mail on completion */
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected option=value after "
- "\"-o\" option."), argv[0]);
- return (1);
+ char email[1024]; /* EMail address */
+
+ snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(), httpGetHostname(NULL, buffer, sizeof(buffer)));
+ num_options = cupsAddOption("notify-recipient-uri", email, num_options, &options);
+ }
+ break;
+
+ case 'q' : /* Queue file but don't print */
+ num_options = cupsAddOption("job-hold-until", "indefinite", num_options, &options);
+ break;
+
+ case 'r' : /* Remove file after printing */
+ deletefile = 1;
+ break;
+
+ case 'P' : /* Destination printer or class */
+ if (opt[1] != '\0')
+ {
+ printer = opt + 1;
+ opt += strlen(opt) - 1;
+ }
+ else
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected destination after \"-P\" option."), argv[0]);
+ return (1);
+ }
+
+ printer = argv[i];
}
- num_options = cupsParseOptions(argv[i], num_options, &options);
- }
- break;
-
- case 'l' : /* Literal/raw */
- num_options = cupsAddOption("raw", "true", num_options, &options);
- break;
-
- case 'p' : /* Prettyprint */
- num_options = cupsAddOption("prettyprint", "true", num_options,
- &options);
- break;
-
- case 'h' : /* Suppress burst page */
- num_options = cupsAddOption("job-sheets", "none", num_options,
- &options);
- break;
-
- case 's' : /* Don't use symlinks */
- break;
-
- case 'm' : /* Mail on completion */
- {
- char email[1024]; /* EMail address */
-
-
- snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(),
- httpGetHostname(NULL, buffer, sizeof(buffer)));
- num_options = cupsAddOption("notify-recipient-uri", email,
- num_options, &options);
- }
- break;
-
- case 'q' : /* Queue file but don't print */
- num_options = cupsAddOption("job-hold-until", "indefinite",
- num_options, &options);
- break;
-
- case 'r' : /* Remove file after printing */
- deletefile = 1;
- break;
-
- case 'P' : /* Destination printer or class */
- if (argv[i][2] != '\0')
- printer = argv[i] + 2;
- else
- {
- i ++;
- if (i >= argc)
+ if ((instance = strrchr(printer, '/')) != NULL)
+ *instance++ = '\0';
+
+ if ((dest = cupsGetNamedDest(NULL, printer, instance)) != NULL)
+ {
+ for (j = 0; j < dest->num_options; j ++)
+ if (cupsGetOption(dest->options[j].name, num_options,
+ options) == NULL)
+ num_options = cupsAddOption(dest->options[j].name,
+ dest->options[j].value,
+ num_options, &options);
+ }
+ else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected destination after "
- "\"-P\" option."), argv[0]);
+ _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
return (1);
}
+ break;
- printer = argv[i];
- }
-
- if ((instance = strrchr(printer, '/')) != NULL)
- *instance++ = '\0';
-
- if ((dest = cupsGetNamedDest(NULL, printer, instance)) != NULL)
- {
- for (j = 0; j < dest->num_options; j ++)
- if (cupsGetOption(dest->options[j].name, num_options,
- options) == NULL)
- num_options = cupsAddOption(dest->options[j].name,
- dest->options[j].value,
- num_options, &options);
- }
- else if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
- cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
- {
- _cupsLangPrintf(stderr,
- _("%s: Error - add '/version=1.1' to server "
- "name."), argv[0]);
- return (1);
- }
- break;
-
- case '#' : /* Number of copies */
- if (argv[i][2] != '\0')
- num_copies = atoi(argv[i] + 2);
- else
- {
- i ++;
- if (i >= argc)
+ case '#' : /* Number of copies */
+ if (opt[1] != '\0')
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected copies after "
- "\"-#\" option."), argv[0]);
- return (1);
+ num_copies = atoi(opt + 1);
+ opt += strlen(opt) - 1;
+ }
+ else
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected copies after \"-#\" option."), argv[0]);
+ return (1);
+ }
+
+ num_copies = atoi(argv[i]);
}
- num_copies = atoi(argv[i]);
- }
-
- sprintf(buffer, "%d", num_copies);
- num_options = cupsAddOption("copies", buffer, num_options, &options);
- break;
-
- case 'C' : /* Class */
- case 'J' : /* Job name */
- case 'T' : /* Title */
- if (argv[i][2] != '\0')
- title = argv[i] + 2;
- else
- {
- i ++;
- if (i >= argc)
+ if (num_copies < 1)
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected name after \"-%c\" "
- "option."), argv[0], ch);
+ _cupsLangPrintf(stderr, _("%s: Error - copies must be 1 or more."), argv[0]);
return (1);
}
- title = argv[i];
- }
- break;
+ sprintf(buffer, "%d", num_copies);
+ num_options = cupsAddOption("copies", buffer, num_options, &options);
+ break;
+
+ case 'C' : /* Class */
+ case 'J' : /* Job name */
+ case 'T' : /* Title */
+ if (opt[1] != '\0')
+ {
+ title = opt + 1;
+ opt += strlen(opt) - 1;
+ }
+ else
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected name after \"-%c\" option."), argv[0], ch);
+ return (1);
+ }
+
+ title = argv[i];
+ }
+ break;
- default :
- _cupsLangPrintf(stderr,
- _("%s: Error - unknown option \"%c\"."), argv[0],
- argv[i][1]);
- return (1);
+ default :
+ _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt);
+ return (1);
+ }
}
}
else if (num_files < 1000)
@@ -305,9 +312,11 @@ main(int argc, /* I - Number of command-line arguments */
}
}
else
- _cupsLangPrintf(stderr,
- _("%s: Error - too many files - \"%s\"."), argv[0],
- argv[i]);
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - too many files - \"%s\"."), argv[0], argv[i]);
+ }
+ }
+
/*
* See if we have any files to print; if not, print from stdin...
*/