/*
- * "$Id: lpoptions.c 7669 2008-06-17 22:02:33Z mike $"
+ * "$Id$"
*
- * Printer option program for the Common UNIX Printing System (CUPS).
+ * Printer option program for CUPS.
*
- * Copyright 2007-2008 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * 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.
- * list_group() - List printer-specific options from the PPD group.
- * list_options() - List printer-specific options from the PPD file.
- * usage() - Show program usage and exit.
+ * 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/".
*/
/*
* Include necessary headers...
*/
-#include <cups/string.h>
-#include <cups/cups.h>
-#include <cups/i18n.h>
-#include <stdlib.h>
-#include <errno.h>
+#include <cups/cups-private.h>
/*
static void list_group(ppd_file_t *ppd, ppd_group_t *group);
static void list_options(cups_dest_t *dest);
-static void usage(void);
+static void usage(void) __attribute__((noreturn));
/*
cups_dest_t *dests; /* Destinations */
cups_dest_t *dest; /* Current destination */
char *printer, /* Printer name */
- *instance, /* Instance name */
+ *instance, /* Instance name */
*option; /* Current option */
(dest = cupsGetDest(printer, instance, num_dests,
dests)) == NULL)
{
- _cupsLangPuts(stderr,
- _("lpoptions: Unknown printer or class!\n"));
+ _cupsLangPuts(stderr, _("lpoptions: Unknown printer or class."));
return (1);
}
cupsSetDests(num_dests, dests);
for (j = 0; j < dest->num_options; j ++)
- if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
+ if (cupsGetOption(dest->options[j].name, num_options,
+ options) == NULL)
num_options = cupsAddOption(dest->options[j].name,
dest->options[j].value,
num_options, &options);
}
if (dest == NULL)
- _cupsLangPuts(stderr, _("lpoptions: No printers!?!\n"));
+ _cupsLangPuts(stderr, _("lpoptions: No printers."));
else
list_options(dest);
if (dest == NULL)
{
- _cupsLangPuts(stderr, _("lpoptions: No printers!?!\n"));
+ _cupsLangPuts(stderr, _("lpoptions: No printers."));
return (1);
}
{
_cupsLangPrintf(stderr,
_("lpoptions: Unable to add printer or "
- "instance: %s\n"),
+ "instance: %s"),
strerror(errno));
return (1);
}
if (dest == NULL)
{
- _cupsLangPuts(stderr, _("lpoptions: No printers!?!\n"));
+ _cupsLangPuts(stderr, _("lpoptions: No printers."));
return (1);
}
for (j = 0; j < dest->num_options; j ++)
- if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
+ if (cupsGetOption(dest->options[j].name, num_options,
+ options) == NULL)
num_options = cupsAddOption(dest->options[j].name,
dest->options[j].value,
num_options, &options);
}
for (j = 0; j < num_options; j ++)
- if (!strcasecmp(options[j].name, option))
+ if (!_cups_strcasecmp(options[j].name, option))
{
/*
* Remove this option...
num_options --;
if (j < num_options)
- memcpy(options + j, options + j + 1,
- sizeof(cups_option_t) * (num_options - j));
+ memmove(options + j, options + j + 1, sizeof(cups_option_t) * (size_t)(num_options - j));
break;
}
if (num_dests == 0)
num_dests = cupsGetDests(&dests);
- if ((dest = cupsGetDest(printer, instance, num_dests, dests)) != NULL)
+ if ((dest = cupsGetDest(printer, instance, num_dests,
+ dests)) != NULL)
{
cupsFreeOptions(dest->num_options, dest->options);
j = dest - dests;
if (j < num_dests)
- memcpy(dest, dest + 1, (num_dests - j) * sizeof(cups_dest_t));
+ memmove(dest, dest + 1, (size_t)(num_dests - j) * sizeof(cups_dest_t));
}
}
}
else if (changes == 0)
{
+ char buffer[10240], /* String for options */
+ *ptr; /* Pointer into string */
+
num_options = dest->num_options;
options = dest->options;
- for (i = 0; i < num_options; i ++)
+ for (i = 0, ptr = buffer;
+ ptr < (buffer + sizeof(buffer) - 1) && i < num_options;
+ i ++)
{
if (i)
- _cupsLangPuts(stdout, " ");
+ *ptr++ = ' ';
if (!options[i].value[0])
- _cupsLangPrintf(stdout, "%s", options[i].name);
+ strlcpy(ptr, options[i].name, sizeof(buffer) - (size_t)(ptr - buffer));
else if (strchr(options[i].value, ' ') != NULL ||
strchr(options[i].value, '\t') != NULL)
- _cupsLangPrintf(stdout, "%s=\'%s\'", options[i].name,
- options[i].value);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s=\'%s\'", options[i].name, options[i].value);
else
- _cupsLangPrintf(stdout, "%s=%s", options[i].name,
- options[i].value);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s=%s", options[i].name, options[i].value);
+
+ ptr += strlen(ptr);
}
- _cupsLangPuts(stdout, "\n");
+ _cupsLangPuts(stdout, buffer);
}
return (0);
ppd_option_t *option; /* Current option */
ppd_choice_t *choice; /* Current choice */
ppd_group_t *subgroup; /* Current subgroup */
+ char buffer[10240], /* Option string buffer */
+ *ptr; /* Pointer into option string */
for (i = group->num_options, option = group->options; i > 0; i --, option ++)
{
- if (!strcasecmp(option->keyword, "PageRegion"))
+ if (!_cups_strcasecmp(option->keyword, "PageRegion"))
continue;
- _cupsLangPrintf(stdout, "%s/%s:", option->keyword, option->text);
+ snprintf(buffer, sizeof(buffer), "%s/%s:", option->keyword, option->text);
- for (j = option->num_choices, choice = option->choices;
- j > 0;
+ for (j = option->num_choices, choice = option->choices,
+ ptr = buffer + strlen(buffer);
+ j > 0 && ptr < (buffer + sizeof(buffer) - 1);
j --, choice ++)
- if (!strcasecmp(choice->choice, "Custom"))
+ {
+ if (!_cups_strcasecmp(choice->choice, "Custom"))
{
ppd_coption_t *coption; /* Custom option */
ppd_cparam_t *cparam; /* Custom parameter */
if ((coption = ppdFindCustomOption(ppd, option->keyword)) == NULL ||
cupsArrayCount(coption->params) == 0)
- _cupsLangPrintf(stdout, " %sCustom", choice->marked ? "*" : "");
- else if (!strcasecmp(option->keyword, "PageSize") ||
- !strcasecmp(option->keyword, "PageRegion"))
- _cupsLangPrintf(stdout, " %sCustom.WIDTHxHEIGHT",
- choice->marked ? "*" : "");
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom", choice->marked ? "*" : "");
+ else if (!_cups_strcasecmp(option->keyword, "PageSize") ||
+ !_cups_strcasecmp(option->keyword, "PageRegion"))
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom.WIDTHxHEIGHT", choice->marked ? "*" : "");
else
{
cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params);
if (cupsArrayCount(coption->params) == 1)
- _cupsLangPrintf(stdout, " %sCustom.%s", choice->marked ? "*" : "",
- types[cparam->type]);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %sCustom.%s", choice->marked ? "*" : "", types[cparam->type]);
else
{
const char *prefix; /* Prefix string */
while (cparam)
{
- _cupsLangPrintf(stdout, "%s%s=%s", prefix, cparam->name,
- types[cparam->type]);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), "%s%s=%s", prefix, cparam->name, types[cparam->type]);
cparam = (ppd_cparam_t *)cupsArrayNext(coption->params);
prefix = " ";
+ ptr += strlen(ptr);
}
- _cupsLangPuts(stdout, "}");
+ if (ptr < (buffer + sizeof(buffer) - 1))
+ strlcpy(ptr, "}", sizeof(buffer) - (size_t)(ptr - buffer));
}
}
}
else if (choice->marked)
- _cupsLangPrintf(stdout, " *%s", choice->choice);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " *%s", choice->choice);
else
- _cupsLangPrintf(stdout, " %s", choice->choice);
+ snprintf(ptr, sizeof(buffer) - (size_t)(ptr - buffer), " %s", choice->choice);
+
+ ptr += strlen(ptr);
+ }
- _cupsLangPuts(stdout, "\n");
+ _cupsLangPuts(stdout, buffer);
}
for (i = group->num_subgroups, subgroup = group->subgroups; i > 0; i --, subgroup ++)
if ((filename = cupsGetPPD(dest->name)) == NULL)
{
- _cupsLangPrintf(stderr,
- _("lpoptions: Unable to get PPD file for %s: %s\n"),
+ _cupsLangPrintf(stderr, _("lpoptions: Unable to get PPD file for %s: %s"),
dest->name, cupsLastErrorString());
return;
}
if ((ppd = ppdOpenFile(filename)) == NULL)
{
unlink(filename);
- _cupsLangPrintf(stderr,
- _("lpoptions: Unable to open PPD file for %s!\n"),
+ _cupsLangPrintf(stderr, _("lpoptions: Unable to open PPD file for %s."),
dest->name);
return;
}
" lpoptions [-h server] [-E] [-p printer] -l\n"
" lpoptions [-h server] [-E] -p printer -o "
"option[=value] ...\n"
- " lpoptions [-h server] [-E] -x printer\n"));
+ " lpoptions [-h server] [-E] -x printer"));
exit(1);
}
/*
- * End of "$Id: lpoptions.c 7669 2008-06-17 22:02:33Z mike $".
+ * End of "$Id$".
*/