in systemv/lpstat.c [22:503]
static void check_dest(const char *command, const char *name,
int *num_dests, cups_dest_t **dests);
static int match_list(const char *list, const char *name);
static int show_accepting(const char *printers, int num_dests,
cups_dest_t *dests);
static int show_classes(const char *dests);
static void show_default(cups_dest_t *dest);
static int show_devices(const char *printers, int num_dests,
cups_dest_t *dests);
static int show_jobs(const char *dests, const char *users, int long_status,
int ranking, const char *which);
static int show_printers(const char *printers, int num_dests,
cups_dest_t *dests, int long_status);
static void show_scheduler(void);
static void usage(void) _CUPS_NORETURN;
/*
* 'main()' - Parse options and show status information.
*/
int
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
int i, /* Looping var */
status; /* Exit status */
char *opt; /* Option pointer */
int num_dests; /* Number of user destinations */
cups_dest_t *dests; /* User destinations */
int long_status; /* Long status report? */
int ranking; /* Show job ranking? */
const char *which; /* Which jobs to show? */
char op; /* Last operation on command-line */
_cupsSetLocale(argv);
/*
* Parse command-line options...
*/
num_dests = 0;
dests = NULL;
long_status = 0;
ranking = 0;
status = 0;
which = "not-completed";
op = 0;
for (i = 1; i < argc; i ++)
{
if (!strcmp(argv[i], "--help"))
usage();
else if (argv[i][0] == '-')
{
for (opt = argv[i] + 1; *opt; opt ++)
{
switch (*opt)
{
case 'D' : /* Show description */
long_status = 1;
break;
case 'E' : /* Encrypt */
#ifdef HAVE_SSL
cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
#else
_cupsLangPrintf(stderr,
_("%s: Sorry, no encryption support."),
argv[0]);
#endif /* HAVE_SSL */
break;
case 'H' : /* Show server and port */
if (cupsServer()[0] == '/')
_cupsLangPuts(stdout, cupsServer());
else
_cupsLangPrintf(stdout, "%s:%d", cupsServer(), ippPort());
op = 'H';
break;
case 'P' : /* Show paper types */
op = 'P';
break;
case 'R' : /* Show ranking */
ranking = 1;
break;
case 'S' : /* Show charsets */
op = 'S';
if (!argv[i][2])
i ++;
break;
case 'U' : /* Username */
if (opt[1] != '\0')
{
cupsSetUser(opt + 1);
opt += strlen(opt) - 1;
}
else
{
i ++;
if (i >= argc)
{
_cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
usage();
}
cupsSetUser(argv[i]);
}
break;
case 'W' : /* Show which jobs? */
if (opt[1] != '\0')
{
which = opt + 1;
opt += strlen(opt) - 1;
}
else
{
i ++;
if (i >= argc)
{
_cupsLangPrintf(stderr, _("%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."), argv[0]);
usage();
}
which = argv[i];
}
if (strcmp(which, "completed") && strcmp(which, "not-completed") && strcmp(which, "all"))
{
_cupsLangPrintf(stderr, _("%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."), argv[0]);
usage();
}
break;
case 'a' : /* Show acceptance status */
op = 'a';
if (opt[1] != '\0')
{
check_dest(argv[0], opt + 1, &num_dests, &dests);
status |= show_accepting(opt + 1, num_dests, dests);
opt += strlen(opt) - 1;
}
else if ((i + 1) < argc && argv[i + 1][0] != '-')
{
i ++;
check_dest(argv[0], argv[i], &num_dests, &dests);
status |= show_accepting(argv[i], num_dests, dests);
}
else
{
if (num_dests <= 1)
{
cupsFreeDests(num_dests, dests);
num_dests = cupsGetDests(&dests);
if (num_dests == 0 && (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);
}
}
status |= show_accepting(NULL, num_dests, dests);
}
break;
case 'c' : /* Show classes and members */
op = 'c';
if (opt[1] != '\0')
{
check_dest(argv[0], opt + 1, &num_dests, &dests);
status |= show_classes(opt + 1);
opt += strlen(opt) - 1;
}
else if ((i + 1) < argc && argv[i + 1][0] != '-')
{
i ++;
check_dest(argv[0], argv[i], &num_dests, &dests);
status |= show_classes(argv[i]);
}
else
status |= show_classes(NULL);
break;
case 'd' : /* Show default destination */
op = 'd';
if (num_dests != 1 || !dests[0].is_default)
{
cupsFreeDests(num_dests, dests);
dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
num_dests = dests ? 1 : 0;
if (num_dests == 0 &&
(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);
}
}
show_default(dests);
break;
case 'e' : /* List destinations */
{
cups_dest_t *temp = NULL, *dest;
int j, num_temp = cupsGetDests(&temp);
op = 'e';
for (j = num_temp, dest = temp; j > 0; j --, dest ++)
{
if (dest->instance)
printf("%s/%s", dest->name, dest->instance);
else
fputs(dest->name, stdout);
if (long_status)
{
const char *printer_uri_supported = cupsGetOption("printer-uri-supported", dest->num_options, dest->options);
const char *printer_is_temporary = cupsGetOption("printer-is-temporary", dest->num_options, dest->options);
const char *type = "network";
if (printer_is_temporary && !strcmp(printer_is_temporary, "true"))
type = "temporary";
else if (printer_uri_supported)
type = "permanent";
printf(" %s %s %s\n", type, printer_uri_supported ? printer_uri_supported : "none", cupsGetOption("device-uri", dest->num_options, dest->options));
}
else
putchar('\n');
}
cupsFreeDests(num_temp, temp);
}
break;
case 'f' : /* Show forms */
op = 'f';
if (opt[1] != '\0')
{
opt += strlen(opt) - 1;
}
else
{
i ++;
if (i >= argc)
return (1);
}
break;
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);
}
cupsSetServer(argv[i]);
}
break;
case 'l' : /* Long status or long job status */
long_status = 2;
break;
case 'o' : /* Show jobs by destination */
op = 'o';
if (opt[1])
{
check_dest(argv[0], opt + 1, &num_dests, &dests);
status |= show_jobs(opt + 1, NULL, long_status, ranking, which);
opt += strlen(opt) - 1;
}
else if ((i + 1) < argc && argv[i + 1][0] != '-')
{
i ++;
check_dest(argv[0], argv[i], &num_dests, &dests);
status |= show_jobs(argv[i], NULL, long_status, ranking, which);
}
else
status |= show_jobs(NULL, NULL, long_status, ranking, which);
break;
case 'p' : /* Show printers */
op = 'p';
if (opt[1] != '\0')
{
check_dest(argv[0], opt + 1, &num_dests, &dests);
status |= show_printers(opt + 1, num_dests, dests,
long_status);
opt += strlen(opt) - 1;
}
else if ((i + 1) < argc && argv[i + 1][0] != '-')
{
i ++;
check_dest(argv[0], argv[i], &num_dests, &dests);
status |= show_printers(argv[i], num_dests, dests, long_status);
}
else
{
if (num_dests <= 1)
{
cupsFreeDests(num_dests, dests);
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
(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);
}
}
status |= show_printers(NULL, num_dests, dests, long_status);
}
break;
case 'r' : /* Show scheduler status */
op = 'r';
show_scheduler();
break;
case 's' : /* Show summary */
op = 's';
if (num_dests <= 1)
{
cupsFreeDests(num_dests, dests);
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
(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);
}
}
show_default(cupsGetDest(NULL, NULL, num_dests, dests));
status |= show_classes(NULL);
status |= show_devices(NULL, num_dests, dests);
break;
case 't' : /* Show all info */
op = 't';
if (num_dests <= 1)
{
cupsFreeDests(num_dests, dests);
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
(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);
}
}
show_scheduler();
show_default(cupsGetDest(NULL, NULL, num_dests, dests));
status |= show_classes(NULL);
status |= show_devices(NULL, num_dests, dests);
status |= show_accepting(NULL, num_dests, dests);
status |= show_printers(NULL, num_dests, dests, long_status);
status |= show_jobs(NULL, NULL, long_status, ranking, which);
break;
case 'u' : /* Show jobs by user */
op = 'u';
if (opt[1] != '\0')
{
status |= show_jobs(NULL, opt + 1, long_status, ranking, which);
opt += strlen(opt) - 1;
}
else if ((i + 1) < argc && argv[i + 1][0] != '-')
{
i ++;
status |= show_jobs(NULL, argv[i], long_status, ranking, which);
}
else
status |= show_jobs(NULL, NULL, long_status, ranking, which);
break;
case 'v' : /* Show printer devices */
op = 'v';
if (opt[1] != '\0')
{
check_dest(argv[0], opt + 1, &num_dests, &dests);
status |= show_devices(opt + 1, num_dests, dests);
opt += strlen(opt) - 1;
}
else if ((i + 1) < argc && argv[i + 1][0] != '-')
{
i ++;
check_dest(argv[0], argv[i], &num_dests, &dests);
status |= show_devices(argv[i], num_dests, dests);
}
else
{
if (num_dests <= 1)
{
cupsFreeDests(num_dests, dests);
num_dests = cupsGetDests(&dests);
if (num_dests == 0 &&
(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);
}
}
status |= show_devices(NULL, num_dests, dests);
}
break;
default :
_cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], argv[i][1]);
usage();
}
}
}
else
{
status |= show_jobs(argv[i], NULL, long_status, ranking, which);
op = 'o';
}
}
if (!op)
status |= show_jobs(NULL, cupsUser(), long_status, ranking, which);
return (status);
}