X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=systemv%2Flpstat.c;h=1d14cb8e07b7210d0335d898a1cbc4e320df5521;hb=87030afb3aa8735848c66a0526d06af69d7010c6;hp=e98aaa70d749b0c7ee4ed57d34b444469911a90e;hpb=5a662dc06039959a7a12925c21abf9d2e233b618;p=thirdparty%2Fcups.git diff --git a/systemv/lpstat.c b/systemv/lpstat.c index e98aaa70d..1d14cb8e0 100644 --- a/systemv/lpstat.c +++ b/systemv/lpstat.c @@ -1,44 +1,18 @@ /* - * "$Id: lpstat.c 7921 2008-09-10 15:42:24Z mike $" + * "lpstat" command for CUPS. * - * "lpstat" command for the Common UNIX Printing System (CUPS). + * Copyright © 2007-2018 by Apple Inc. + * Copyright © 1997-2006 by Easy Software Products. * - * Copyright 2007-2009 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() - Parse options and show status information. - * check_dest() - Verify that the named destination(s) exists. - * match_list() - Match a name from a list of comma or space-separated - * names. - * show_accepting() - Show acceptance status. - * show_classes() - Show printer classes. - * show_default() - Show default destination. - * show_devices() - Show printer devices. - * show_jobs() - Show active print jobs. - * show_printers() - Show printers. - * show_scheduler() - Show scheduler status. + * Licensed under Apache License v2.0. See the file "LICENSE" for more + * information. */ /* * Include necessary headers... */ -#include -#include -#include -#include -#include -#include -#include -#include +#include /* @@ -59,6 +33,7 @@ static int show_jobs(const char *dests, const char *users, int long_status, 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; /* @@ -71,6 +46,7 @@ main(int argc, /* I - Number of 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? */ @@ -94,377 +70,431 @@ main(int argc, /* I - Number of command-line arguments */ op = 0; for (i = 1; i < argc; i ++) - if (argv[i][0] == '-') - switch (argv[i][1]) + { + if (!strcmp(argv[i], "--help")) + usage(); + else if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) { - case 'D' : /* Show description */ - long_status = 1; - break; + switch (*opt) + { + case 'D' : /* Show description */ + long_status = 1; + break; - case 'E' : /* Encrypt */ + case 'E' : /* Encrypt */ #ifdef HAVE_SSL - cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else - _cupsLangPrintf(stderr, - _("%s: Sorry, no encryption support compiled in\n"), - argv[0]); + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), + argv[0]); #endif /* HAVE_SSL */ - break; + break; - case 'H' : /* Show server and port */ - if (cupsServer()[0] == '/') - _cupsLangPrintf(stdout, "%s\n", cupsServer()); - else - _cupsLangPrintf(stdout, "%s:%d\n", cupsServer(), ippPort()); - 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 (argv[i][2]) - cupsSetUser(argv[i] + 2); - else - { - i ++; - if (i >= argc) - { - _cupsLangPrintf(stderr, - _("%s: Error - expected username after " - "\'-U\' option\n"), - argv[0]); - return (1); - } + case 'H' : /* Show server and port */ + if (cupsServer()[0] == '/') + _cupsLangPuts(stdout, cupsServer()); + else + _cupsLangPrintf(stdout, "%s:%d", cupsServer(), ippPort()); + op = 'H'; + break; - cupsSetUser(argv[i]); - } - break; - - case 'W' : /* Show which jobs? */ - if (argv[i][2]) - which = argv[i] + 2; - else - { - i ++; + case 'P' : /* Show paper types */ + op = 'P'; + break; - if (i >= argc) - { - _cupsLangPrintf(stderr, - _("%s: Error - need \"completed\", " - "\"not-completed\", or \"all\" after " - "\'-W\' option\n"), - argv[0]); - return (1); - } + case 'R' : /* Show ranking */ + ranking = 1; + break; - which = argv[i]; - } + case 'S' : /* Show charsets */ + op = 'S'; + if (!argv[i][2]) + i ++; + break; - if (strcmp(which, "completed") && strcmp(which, "not-completed") && - strcmp(which, "all")) - { - _cupsLangPrintf(stderr, - _("%s: Error - need \"completed\", " - "\"not-completed\", or \"all\" after " - "\'-W\' option\n"), - argv[0]); - return (1); - } - 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(); + } - case 'a' : /* Show acceptance status */ - op = 'a'; + cupsSetUser(argv[i]); + } + break; - if (argv[i][2]) - { - check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + case 'W' : /* Show which jobs? */ + if (opt[1] != '\0') + { + which = opt + 1; + opt += strlen(opt) - 1; + } + else + { + i ++; - status |= show_accepting(argv[i] + 2, num_dests, dests); - } - else if ((i + 1) < argc && argv[i + 1][0] != '-') - { - i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, _("%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."), argv[0]); + usage(); + } - check_dest(argv[0], argv[i], &num_dests, &dests); + which = argv[i]; + } - status |= show_accepting(argv[i], num_dests, dests); - } - else - { - if (num_dests <= 1) + if (strcmp(which, "completed") && strcmp(which, "not-completed") && strcmp(which, "all")) { - cupsFreeDests(num_dests, dests); - num_dests = cupsGetDests(&dests); + _cupsLangPrintf(stderr, _("%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."), argv[0]); + usage(); } + break; - status |= show_accepting(NULL, num_dests, dests); - } - break; + case 'a' : /* Show acceptance status */ + op = 'a'; -#ifdef __sgi - case 'b' : /* Show both the local and remote status */ - op = 'b'; + if (opt[1] != '\0') + { + check_dest(argv[0], opt + 1, &num_dests, &dests); - if (argv[i][2]) - { - /* - * The local and remote status are separated by a blank line; - * since all CUPS jobs are networked, we only output the - * second list for now... In the future, we might further - * emulate this by listing the remote server's queue, but - * for now this is enough to make the SGI printstatus program - * happy... - */ - - check_dest(argv[0], argv[i] + 2, &num_dests, &dests); - - puts(""); - status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which); - } - else - { - _cupsLangPrintf(stderr, - _("%s: Error - expected destination after " - "\'-b\' option\n"), - argv[0]); + status |= show_accepting(opt + 1, num_dests, dests); + opt += strlen(opt) - 1; + } + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; - return (1); - } - break; -#endif /* __sgi */ + check_dest(argv[0], argv[i], &num_dests, &dests); - case 'c' : /* Show classes and members */ - op = 'c'; + status |= show_accepting(argv[i], num_dests, dests); + } + else + { + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); - if (argv[i][2]) - { - check_dest(argv[0], argv[i] + 2, &num_dests, &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_classes(argv[i] + 2); - } - else if ((i + 1) < argc && argv[i + 1][0] != '-') - { - i ++; + status |= show_accepting(NULL, num_dests, dests); + } + break; - check_dest(argv[0], argv[i], &num_dests, &dests); + case 'c' : /* Show classes and members */ + op = 'c'; - status |= show_classes(argv[i]); - } - else - status |= show_classes(NULL); - break; + if (opt[1] != '\0') + { + check_dest(argv[0], opt + 1, &num_dests, &dests); - case 'd' : /* Show default destination */ - op = 'd'; + status |= show_classes(opt + 1); + opt += strlen(opt) - 1; + } + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; - if (num_dests != 1 || !dests[0].is_default) - { - cupsFreeDests(num_dests, dests); + check_dest(argv[0], argv[i], &num_dests, &dests); - dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); - num_dests = dests ? 1 : 0; - } + status |= show_classes(argv[i]); + } + else + status |= show_classes(NULL); + break; - show_default(dests); - break; + case 'd' : /* Show default destination */ + op = 'd'; - case 'f' : /* Show forms */ - op = 'f'; - if (!argv[i][2]) - i ++; - break; + if (num_dests != 1 || !dests[0].is_default) + { + cupsFreeDests(num_dests, dests); - case 'h' : /* Connect to host */ - if (argv[i][2]) - cupsSetServer(argv[i] + 2); - else - { - i ++; + 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); + } + } - if (i >= argc) + show_default(dests); + break; + + case 'e' : /* List destinations */ { - _cupsLangPrintf(stderr, - _("%s: Error - expected hostname after " - "\'-h\' option\n"), - argv[0]); - return (1); + 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; - cupsSetServer(argv[i]); - } - break; + case 'f' : /* Show forms */ + op = 'f'; + if (opt[1] != '\0') + { + opt += strlen(opt) - 1; + } + else + { + i ++; + if (i >= argc) + return (1); + } + break; - case 'l' : /* Long status or long job status */ -#ifdef __sgi - op = 'l'; + case 'h' : /* Connect to host */ + if (opt[1] != '\0') + { + cupsSetServer(opt + 1); + opt += strlen(opt) - 1; + } + else + { + i ++; - if (argv[i][2]) - { - check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + if (i >= argc) + { + _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]); + return (1); + } - status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which); - } - else -#endif /* __sgi */ + cupsSetServer(argv[i]); + } + break; + + case 'l' : /* Long status or long job status */ long_status = 2; - break; + break; - case 'o' : /* Show jobs by destination */ - op = 'o'; + case 'o' : /* Show jobs by destination */ + op = 'o'; - if (argv[i][2]) - { - check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + if (opt[1]) + { + check_dest(argv[0], opt + 1, &num_dests, &dests); - status |= show_jobs(argv[i] + 2, NULL, long_status, ranking, - which); - } - else if ((i + 1) < argc && argv[i + 1][0] != '-') - { - i ++; + 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); + 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; + 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'; + case 'p' : /* Show printers */ + op = 'p'; - if (argv[i][2]) - { - check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + if (opt[1] != '\0') + { + check_dest(argv[0], opt + 1, &num_dests, &dests); - status |= show_printers(argv[i] + 2, num_dests, dests, - long_status); - } - else if ((i + 1) < argc && argv[i + 1][0] != '-') - { - i ++; + 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); + check_dest(argv[0], argv[i], &num_dests, &dests); - status |= show_printers(argv[i], num_dests, dests, long_status); - } - else - { - if (num_dests <= 1) + status |= show_printers(argv[i], num_dests, dests, long_status); + } + else { - cupsFreeDests(num_dests, dests); - num_dests = cupsGetDests(&dests); + 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; - status |= show_printers(NULL, num_dests, dests, long_status); - } - break; + case 'r' : /* Show scheduler status */ + op = 'r'; - case 'r' : /* Show scheduler status */ - op = 'r'; + show_scheduler(); + break; - show_scheduler(); - break; + case 's' : /* Show summary */ + op = 's'; - case 's' : /* Show summary */ - op = 's'; + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); - 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; + 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'; + case 't' : /* Show all info */ + op = 't'; - if (num_dests <= 1) - { - cupsFreeDests(num_dests, dests); - num_dests = cupsGetDests(&dests); - } + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); - 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 (argv[i][2]) - status |= show_jobs(NULL, argv[i] + 2, long_status, ranking, - which); - 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; + 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); + } + } - case 'v' : /* Show printer devices */ - op = 'v'; + 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; - if (argv[i][2]) - { - check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + case 'u' : /* Show jobs by user */ + op = 'u'; - status |= show_devices(argv[i] + 2, num_dests, dests); - } - else if ((i + 1) < argc && argv[i + 1][0] != '-') - { - i ++; + 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; - check_dest(argv[0], argv[i], &num_dests, &dests); + case 'v' : /* Show printer devices */ + op = 'v'; - status |= show_devices(argv[i], num_dests, dests); - } - else - { - if (num_dests <= 1) + if (opt[1] != '\0') { - cupsFreeDests(num_dests, dests); - num_dests = cupsGetDests(&dests); + 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 ++; - status |= show_devices(NULL, num_dests, dests); - } - break; + 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\'\n"), - argv[0], argv[i][1]); - return (1); + 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); @@ -507,9 +537,16 @@ check_dest(const char *command, /* I - Command name */ if ((*dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, pptr)) == NULL) { - _cupsLangPrintf(stderr, - _("%s: Invalid destination name in list \"%s\"\n"), - command, name); + 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."), + command); + else + _cupsLangPrintf(stderr, + _("%s: Invalid destination name in list \"%s\"."), + command, name); + exit(1); } else @@ -524,7 +561,7 @@ check_dest(const char *command, /* I - Command name */ * Scan the name string for printer/class name(s)... */ - for (dptr = name; *dptr;) + for (dptr = name; *dptr;) { /* * Skip leading whitespace and commas... @@ -542,12 +579,12 @@ check_dest(const char *command, /* I - Command name */ for (pptr = printer; !isspace(*dptr & 255) && *dptr != ',' && *dptr;) { - if ((pptr - printer) < (sizeof(printer) - 1)) + if ((size_t)(pptr - printer) < (sizeof(printer) - 1)) *pptr++ = *dptr++; else { _cupsLangPrintf(stderr, - _("%s: Invalid destination name in list \"%s\"\n"), + _("%s: Invalid destination name in list \"%s\"."), command, name); exit(1); } @@ -561,8 +598,15 @@ check_dest(const char *command, /* I - Command name */ if (!cupsGetDest(printer, NULL, *num_dests, *dests)) { - _cupsLangPrintf(stderr, - _("%s: Unknown destination \"%s\"\n"), command, printer); + 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."), + command); + else + _cupsLangPrintf(stderr, + _("%s: Unknown destination \"%s\"."), command, printer); + exit(1); } } @@ -587,6 +631,9 @@ match_list(const char *list, /* I - List of names */ if (!list || !*list) return (1); + if (!name) + return (0); + while (*list) { /* @@ -635,7 +682,6 @@ show_accepting(const char *printers, /* I - Destinations */ *message; /* Printer device URI */ int accepting; /* Accepting requests? */ time_t ptime; /* Printer state time */ - struct tm *pdate; /* Printer state date & time */ char printer_state_time[255];/* Printer state time */ static const char *pattrs[] = /* Attributes we need for printers... */ { @@ -646,8 +692,6 @@ show_accepting(const char *printers, /* I - Destinations */ }; - DEBUG_printf(("show_accepting(printers=\"%s\")\n", printers)); - if (printers != NULL && !strcmp(printers, "all")) printers = NULL; @@ -674,17 +718,26 @@ show_accepting(const char *printers, /* I - Destinations */ * Do the request and get back a response... */ - if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) - { - DEBUG_puts("show_accepting: request succeeded..."); + response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/"); - if (response->request.status.status_code > IPP_OK_CONFLICT) - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - ippDelete(response); - return (1); - } + 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."), + "lpstat"); + ippDelete(response); + return (1); + } + else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + if (response) + { /* * Loop through the printers returned in the list and display * their devices... @@ -747,31 +800,35 @@ show_accepting(const char *printers, /* I - Destinations */ if (match_list(printers, printer)) { - pdate = localtime(&ptime); - strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate); + _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime); if (accepting) - _cupsLangPrintf(stdout, _("%s accepting requests since %s\n"), + _cupsLangPrintf(stdout, _("%s accepting requests since %s"), printer, printer_state_time); else - _cupsLangPrintf(stdout, _("%s not accepting requests since %s -\n" - "\t%s\n"), - printer, printer_state_time, + { + _cupsLangPrintf(stdout, _("%s not accepting requests since %s -"), + printer, printer_state_time); + _cupsLangPrintf(stdout, _("\t%s"), (message == NULL || !*message) ? "reason unknown" : message); + } for (i = 0; i < num_dests; i ++) - if (!strcasecmp(dests[i].name, printer) && dests[i].instance) + if (!_cups_strcasecmp(dests[i].name, printer) && dests[i].instance) { if (accepting) - _cupsLangPrintf(stdout, _("%s/%s accepting requests since %s\n"), + _cupsLangPrintf(stdout, _("%s/%s accepting requests since %s"), printer, dests[i].instance, printer_state_time); else - _cupsLangPrintf(stdout, _("%s/%s not accepting requests since " - "%s -\n\t%s\n"), - printer, dests[i].instance, printer_state_time, + { + _cupsLangPrintf(stdout, + _("%s/%s not accepting requests since %s -"), + printer, dests[i].instance, printer_state_time); + _cupsLangPrintf(stdout, _("\t%s"), (message == NULL || !*message) ? "reason unknown" : message); + } } } @@ -781,11 +838,6 @@ show_accepting(const char *printers, /* I - Destinations */ ippDelete(response); } - else - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - return (1); - } return (0); } @@ -820,8 +872,6 @@ show_classes(const char *dests) /* I - Destinations */ }; - DEBUG_printf(("show_classes(dests=\"%s\")\n", dests)); - if (dests != NULL && !strcmp(dests, "all")) dests = NULL; @@ -848,13 +898,29 @@ show_classes(const char *dests) /* I - Destinations */ * Do the request and get back a response... */ - if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/"); + + 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."), + "lpstat"); + ippDelete(response); + return (1); + } + else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING) { - DEBUG_puts("show_classes: request succeeded..."); + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + if (response) + { if (response->request.status.status_code > IPP_OK_CONFLICT) { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); ippDelete(response); return (1); } @@ -913,7 +979,7 @@ show_classes(const char *dests) /* I - Destinations */ username, sizeof(username), server, sizeof(server), &port, resource, sizeof(resource)); - if (!strcasecmp(server, cupsServer())) + if (!_cups_strcasecmp(server, cupsServer())) http2 = CUPS_HTTP_DEFAULT; else http2 = httpConnectEncrypt(server, port, cupsEncryption()); @@ -966,16 +1032,15 @@ show_classes(const char *dests) /* I - Destinations */ if (match_list(dests, printer)) { - _cupsLangPrintf(stdout, _("members of class %s:\n"), printer); + _cupsLangPrintf(stdout, _("members of class %s:"), printer); if (members) { for (i = 0; i < members->num_values; i ++) - _cupsLangPrintf(stdout, "\t%s\n", - members->values[i].string.text); + _cupsLangPrintf(stdout, "\t%s", members->values[i].string.text); } else - _cupsLangPuts(stdout, "\tunknown\n"); + _cupsLangPuts(stdout, "\tunknown"); } if (response2) @@ -987,11 +1052,6 @@ show_classes(const char *dests) /* I - Destinations */ ippDelete(response); } - else - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - return (1); - } return (0); } @@ -1011,10 +1071,10 @@ show_default(cups_dest_t *dest) /* I - Default destination */ if (dest) { if (dest->instance) - _cupsLangPrintf(stdout, _("system default destination: %s/%s\n"), + _cupsLangPrintf(stdout, _("system default destination: %s/%s"), dest->name, dest->instance); else - _cupsLangPrintf(stdout, _("system default destination: %s\n"), + _cupsLangPrintf(stdout, _("system default destination: %s"), dest->name); } else @@ -1037,10 +1097,10 @@ show_default(cups_dest_t *dest) /* I - Default destination */ if (printer) _cupsLangPrintf(stdout, _("lpstat: error - %s environment variable names " - "non-existent destination \"%s\"\n"), + "non-existent destination \"%s\"."), val, printer); else - _cupsLangPuts(stdout, _("no system default destination\n")); + _cupsLangPuts(stdout, _("no system default destination")); } } @@ -1069,8 +1129,6 @@ show_devices(const char *printers, /* I - Destinations */ }; - DEBUG_printf(("show_devices(printers=\"%s\")\n", printers)); - if (printers != NULL && !strcmp(printers, "all")) printers = NULL; @@ -1097,17 +1155,26 @@ show_devices(const char *printers, /* I - Destinations */ * Do the request and get back a response... */ - if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) - { - DEBUG_puts("show_devices: request succeeded..."); + response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/"); - if (response->request.status.status_code > IPP_OK_CONFLICT) - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - ippDelete(response); - return (1); - } + 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."), + "lpstat"); + ippDelete(response); + return (1); + } + else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + if (response) + { /* * Loop through the printers returned in the list and display * their devices... @@ -1168,76 +1235,31 @@ show_devices(const char *printers, /* I - Destinations */ if (match_list(printers, printer)) { -#ifdef __osf__ /* Compaq/Digital like to do it their own way... */ - char scheme[HTTP_MAX_URI], /* Components of printer URI */ - username[HTTP_MAX_URI], - hostname[HTTP_MAX_URI], - resource[HTTP_MAX_URI]; - int port; - - if (device == NULL) - { - httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), - username, sizeof(username), hostname, - sizeof(hostname), &port, resource, sizeof(resource)); - _cupsLangPrintf(stdout, - _("Output for printer %s is sent to remote " - "printer %s on %s\n"), - printer, strrchr(resource, '/') + 1, hostname); - } - else if (!strncmp(device, "file:", 5)) - _cupsLangPrintf(stdout, - _("Output for printer %s is sent to %s\n"), - printer, device + 5); - else - _cupsLangPrintf(stdout, - _("Output for printer %s is sent to %s\n"), - printer, device); - - for (i = 0; i < num_dests; i ++) - if (!strcasecmp(printer, dests[i].name) && dests[i].instance) - { - if (device == NULL) - _cupsLangPrintf(stdout, - _("Output for printer %s/%s is sent to " - "remote printer %s on %s\n"), - printer, dests[i].instance, - strrchr(resource, '/') + 1, hostname); - else if (!strncmp(device, "file:", 5)) - _cupsLangPrintf(stdout, - _("Output for printer %s/%s is sent to %s\n"), - printer, dests[i].instance, device + 5); - else - _cupsLangPrintf(stdout, - _("Output for printer %s/%s is sent to %s\n"), - printer, dests[i].instance, device); - } -#else - if (device == NULL) - _cupsLangPrintf(stdout, _("device for %s: %s\n"), + _cupsLangPrintf(stdout, _("device for %s: %s"), printer, uri); else if (!strncmp(device, "file:", 5)) - _cupsLangPrintf(stdout, _("device for %s: %s\n"), + _cupsLangPrintf(stdout, _("device for %s: %s"), printer, device + 5); else - _cupsLangPrintf(stdout, _("device for %s: %s\n"), + _cupsLangPrintf(stdout, _("device for %s: %s"), printer, device); for (i = 0; i < num_dests; i ++) - if (!strcasecmp(printer, dests[i].name) && dests[i].instance) + { + if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance) { if (device == NULL) - _cupsLangPrintf(stdout, _("device for %s/%s: %s\n"), + _cupsLangPrintf(stdout, _("device for %s/%s: %s"), printer, dests[i].instance, uri); else if (!strncmp(device, "file:", 5)) - _cupsLangPrintf(stdout, _("device for %s/%s: %s\n"), + _cupsLangPrintf(stdout, _("device for %s/%s: %s"), printer, dests[i].instance, device + 5); else - _cupsLangPrintf(stdout, _("device for %s/%s: %s\n"), + _cupsLangPrintf(stdout, _("device for %s/%s: %s"), printer, dests[i].instance, device); } -#endif /* __osf__ */ + } } if (attr == NULL) @@ -1246,11 +1268,6 @@ show_devices(const char *printers, /* I - Destinations */ ippDelete(response); } - else - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - return (1); - } return (0); } @@ -1274,12 +1291,12 @@ show_jobs(const char *dests, /* I - Destinations */ *reasons; /* Job state reasons attribute */ const char *dest, /* Pointer into job-printer-uri */ *username, /* Pointer to job-originating-user-name */ - *title; /* Pointer to job-name */ + *message, /* Pointer to job-printer-state-message */ + *time_at; /* time-at-xxx attribute name to use */ int rank, /* Rank in queue */ jobid, /* job-id */ size; /* job-k-octets */ time_t jobtime; /* time-at-creation */ - struct tm *jobdate; /* Date & time */ char temp[255], /* Temporary buffer */ date[255]; /* Date buffer */ static const char *jattrs[] = /* Attributes we need for jobs... */ @@ -1288,16 +1305,14 @@ show_jobs(const char *dests, /* I - Destinations */ "job-k-octets", "job-name", "job-originating-user-name", + "job-printer-state-message", "job-printer-uri", "job-state-reasons", - "time-at-creation" + "time-at-creation", + "time-at-completed" }; - DEBUG_printf(("show_jobs(dests=\"%s\", users=\"%s\", long_status=%d, " - "ranking=%d, which=\"%s\")\n", dests, users, long_status, - ranking, which)); - if (dests != NULL && !strcmp(dests, "all")) dests = NULL; @@ -1332,18 +1347,36 @@ show_jobs(const char *dests, /* I - Destinations */ * Do the request and get back a response... */ - if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/"); + + 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."), + "lpstat"); + ippDelete(response); + return (1); + } + else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + if (response) { /* * Loop through the job list and display them... */ - if (response->request.status.status_code > IPP_OK_CONFLICT) - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - ippDelete(response); - return (1); - } + if (!strcmp(which, "aborted") || + !strcmp(which, "canceled") || + !strcmp(which, "completed")) + time_at = "time-at-completed"; + else + time_at = "time-at-creation"; rank = -1; @@ -1368,7 +1401,7 @@ show_jobs(const char *dests, /* I - Destinations */ username = NULL; dest = NULL; jobtime = 0; - title = "no title"; + message = NULL; reasons = NULL; while (attr != NULL && attr->group_tag == IPP_TAG_JOB) @@ -1376,30 +1409,25 @@ show_jobs(const char *dests, /* I - Destinations */ if (!strcmp(attr->name, "job-id") && attr->value_tag == IPP_TAG_INTEGER) jobid = attr->values[0].integer; - - if (!strcmp(attr->name, "job-k-octets") && - attr->value_tag == IPP_TAG_INTEGER) + else if (!strcmp(attr->name, "job-k-octets") && + attr->value_tag == IPP_TAG_INTEGER) size = attr->values[0].integer; - - if (!strcmp(attr->name, "time-at-creation") && - attr->value_tag == IPP_TAG_INTEGER) + else if (!strcmp(attr->name, time_at) && attr->value_tag == IPP_TAG_INTEGER) jobtime = attr->values[0].integer; - - if (!strcmp(attr->name, "job-printer-uri") && - attr->value_tag == IPP_TAG_URI) + else if (!strcmp(attr->name, "job-printer-state-message") && + attr->value_tag == IPP_TAG_TEXT) + message = attr->values[0].string.text; + else if (!strcmp(attr->name, "job-printer-uri") && + attr->value_tag == IPP_TAG_URI) + { if ((dest = strrchr(attr->values[0].string.text, '/')) != NULL) dest ++; - - if (!strcmp(attr->name, "job-originating-user-name") && - attr->value_tag == IPP_TAG_NAME) + } + else if (!strcmp(attr->name, "job-originating-user-name") && + attr->value_tag == IPP_TAG_NAME) username = attr->values[0].string.text; - - if (!strcmp(attr->name, "job-name") && - attr->value_tag == IPP_TAG_NAME) - title = attr->values[0].string.text; - - if (!strcmp(attr->name, "job-state-reasons") && - attr->value_tag == IPP_TAG_KEYWORD) + else if (!strcmp(attr->name, "job-state-reasons") && + attr->value_tag == IPP_TAG_KEYWORD) reasons = attr; attr = attr->next; @@ -1423,49 +1451,44 @@ show_jobs(const char *dests, /* I - Destinations */ rank ++; - if (match_list(dests, dest) || match_list(users, username)) + if (match_list(dests, dest) && match_list(users, username)) { - jobdate = localtime(&jobtime); snprintf(temp, sizeof(temp), "%s-%d", dest, jobid); - if (long_status == 3) - { - /* - * Show the consolidated output format for the SGI tools... - */ - - if (!strftime(date, sizeof(date), "%b %d %H:%M", jobdate)) - strcpy(date, "Unknown"); + _cupsStrDate(date, sizeof(date), jobtime); - _cupsLangPrintf(stdout, "%s;%s;%d;%s;%s\n", - temp, username ? username : "unknown", - size, title ? title : "unknown", date); - } + if (ranking) + _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s", + rank, temp, username ? username : "unknown", + 1024.0 * size, date); else + _cupsLangPrintf(stdout, "%-23s %-13s %8.0f %s", + temp, username ? username : "unknown", + 1024.0 * size, date); + if (long_status) { - if (!strftime(date, sizeof(date), "%c", jobdate)) - strcpy(date, "Unknown"); - - if (ranking) - _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s\n", - rank, temp, username ? username : "unknown", - 1024.0 * size, date); - else - _cupsLangPrintf(stdout, "%-23s %-13s %8.0f %s\n", - temp, username ? username : "unknown", - 1024.0 * size, date); - if (long_status) - { - if (reasons) + if (message) + _cupsLangPrintf(stdout, _("\tStatus: %s"), message); + + if (reasons) + { + char alerts[1024], /* Alerts string */ + *aptr; /* Pointer into alerts string */ + + for (i = 0, aptr = alerts; i < reasons->num_values; i ++) { - _cupsLangPuts(stdout, _("\tAlerts:")); - for (i = 0; i < reasons->num_values; i ++) - _cupsLangPrintf(stdout, " %s", - reasons->values[i].string.text); - _cupsLangPuts(stdout, "\n"); + if (i) + snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text); + else + strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts)); + + aptr += strlen(aptr); } - _cupsLangPrintf(stdout, _("\tqueued for %s\n"), dest); + + _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts); } + + _cupsLangPrintf(stdout, _("\tqueued for %s"), dest); } } @@ -1475,11 +1498,6 @@ show_jobs(const char *dests, /* I - Destinations */ ippDelete(response); } - else - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - return (1); - } return (0); } @@ -1513,12 +1531,11 @@ show_printers(const char *printers, /* I - Destinations */ ipp_pstate_t pstate; /* Printer state */ cups_ptype_t ptype; /* Printer type */ time_t ptime; /* Printer state time */ - struct tm *pdate; /* Printer state date & time */ int jobid; /* Job ID of current job */ char printer_uri[HTTP_MAX_URI], /* Printer URI */ printer_state_time[255];/* Printer state time */ - const char *root; /* Server root directory... */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ static const char *pattrs[] = /* Attributes we need for printers... */ { "printer-name", @@ -1536,16 +1553,11 @@ show_printers(const char *printers, /* I - Destinations */ }; static const char *jattrs[] = /* Attributes we need for jobs... */ { - "job-id" + "job-id", + "job-state" }; - DEBUG_printf(("show_printers(printers=\"%s\", num_dests=%d, dests=%p, " - "long_status=%d)\n", printers, num_dests, dests, long_status)); - - if ((root = getenv("CUPS_SERVERROOT")) == NULL) - root = CUPS_SERVERROOT; - if (printers != NULL && !strcmp(printers, "all")) printers = NULL; @@ -1572,17 +1584,26 @@ show_printers(const char *printers, /* I - Destinations */ * Do the request and get back a response... */ - if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) - { - DEBUG_puts("show_printers: request succeeded..."); + response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/"); - if (response->request.status.status_code > IPP_OK_CONFLICT) - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - ippDelete(response); - return (1); - } + 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."), + "lpstat"); + ippDelete(response); + return (1); + } + else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + if (response) + { /* * Loop through the printers returned in the list and display * their status... @@ -1734,7 +1755,7 @@ show_printers(const char *printers, /* I - Destinations */ jobid = jobattr->values[0].integer; else if (!strcmp(jobattr->name, "job-state") && jobattr->value_tag == IPP_TAG_ENUM) - jobstate = jobattr->values[0].integer; + jobstate = (ipp_jstate_t)jobattr->values[0].integer; } if (jobstate != IPP_JOB_PROCESSING) @@ -1748,137 +1769,139 @@ show_printers(const char *printers, /* I - Destinations */ * Display it... */ - pdate = localtime(&ptime); - strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate); + _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime); switch (pstate) { case IPP_PRINTER_IDLE : - _cupsLangPrintf(stdout, - _("printer %s is idle. enabled since %s\n"), - printer, printer_state_time); + if (ippContainsString(reasons, "hold-new-jobs")) + _cupsLangPrintf(stdout, _("printer %s is holding new jobs. enabled since %s"), printer, printer_state_time); + else + _cupsLangPrintf(stdout, _("printer %s is idle. enabled since %s"), printer, printer_state_time); break; case IPP_PRINTER_PROCESSING : - _cupsLangPrintf(stdout, - _("printer %s now printing %s-%d. " - "enabled since %s\n"), - printer, printer, jobid, printer_state_time); + _cupsLangPrintf(stdout, _("printer %s now printing %s-%d. enabled since %s"), printer, printer, jobid, printer_state_time); break; case IPP_PRINTER_STOPPED : - _cupsLangPrintf(stdout, - _("printer %s disabled since %s -\n"), - printer, printer_state_time); + _cupsLangPrintf(stdout, _("printer %s disabled since %s -"), printer, printer_state_time); break; } if ((message && *message) || pstate == IPP_PRINTER_STOPPED) { if (!message || !*message) - _cupsLangPuts(stdout, _("\treason unknown\n")); + _cupsLangPuts(stdout, _("\treason unknown")); else - _cupsLangPrintf(stdout, "\t%s\n", message); + _cupsLangPrintf(stdout, "\t%s", message); } if (long_status > 1) - _cupsLangPuts(stdout, - _("\tForm mounted:\n" - "\tContent types: any\n" - "\tPrinter types: unknown\n")); + { + _cupsLangPuts(stdout, _("\tForm mounted:")); + _cupsLangPuts(stdout, _("\tContent types: any")); + _cupsLangPuts(stdout, _("\tPrinter types: unknown")); + } if (long_status) { - _cupsLangPrintf(stdout, _("\tDescription: %s\n"), + _cupsLangPrintf(stdout, _("\tDescription: %s"), description ? description : ""); if (reasons) { - _cupsLangPuts(stdout, _("\tAlerts:")); - for (j = 0; j < reasons->num_values; j ++) - _cupsLangPrintf(stdout, " %s", - reasons->values[j].string.text); - _cupsLangPuts(stdout, "\n"); + char alerts[1024], /* Alerts string */ + *aptr; /* Pointer into alerts string */ + + for (i = 0, aptr = alerts; i < reasons->num_values; i ++) + { + if (i) + snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text); + else + strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts)); + + aptr += strlen(aptr); + } + + _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts); } } if (long_status > 1) { - _cupsLangPrintf(stdout, _("\tLocation: %s\n"), + _cupsLangPrintf(stdout, _("\tLocation: %s"), location ? location : ""); if (ptype & CUPS_PRINTER_REMOTE) { - _cupsLangPuts(stdout, _("\tConnection: remote\n")); + _cupsLangPuts(stdout, _("\tConnection: remote")); if (make_model && !strstr(make_model, "System V Printer") && !strstr(make_model, "Raw Printer") && uri) - _cupsLangPrintf(stdout, _("\tInterface: %s.ppd\n"), + _cupsLangPrintf(stdout, _("\tInterface: %s.ppd"), uri); } else { - _cupsLangPuts(stdout, _("\tConnection: direct\n")); + _cupsLangPuts(stdout, _("\tConnection: direct")); - if (make_model && strstr(make_model, "System V Printer")) - _cupsLangPrintf(stdout, - _("\tInterface: %s/interfaces/%s\n"), - root, printer); - else if (make_model && !strstr(make_model, "Raw Printer")) + if (make_model && !strstr(make_model, "Raw Printer")) _cupsLangPrintf(stdout, - _("\tInterface: %s/ppd/%s.ppd\n"), root, printer); + _("\tInterface: %s/ppd/%s.ppd"), + cg->cups_serverroot, printer); } - _cupsLangPuts(stdout, _("\tOn fault: no alert\n")); - _cupsLangPuts(stdout, _("\tAfter fault: continue\n")); + _cupsLangPuts(stdout, _("\tOn fault: no alert")); + _cupsLangPuts(stdout, _("\tAfter fault: continue")); /* TODO update to use printer-error-policy */ if (allowed) { - _cupsLangPuts(stdout, _("\tUsers allowed:\n")); + _cupsLangPuts(stdout, _("\tUsers allowed:")); for (j = 0; j < allowed->num_values; j ++) - _cupsLangPrintf(stdout, "\t\t%s\n", + _cupsLangPrintf(stdout, "\t\t%s", allowed->values[j].string.text); } else if (denied) { - _cupsLangPuts(stdout, _("\tUsers denied:\n")); + _cupsLangPuts(stdout, _("\tUsers denied:")); for (j = 0; j < denied->num_values; j ++) - _cupsLangPrintf(stdout, "\t\t%s\n", + _cupsLangPrintf(stdout, "\t\t%s", denied->values[j].string.text); } else { - _cupsLangPuts(stdout, _("\tUsers allowed:\n")); - _cupsLangPuts(stdout, _("\t\t(all)\n")); + _cupsLangPuts(stdout, _("\tUsers allowed:")); + _cupsLangPuts(stdout, _("\t\t(all)")); } - _cupsLangPuts(stdout, _("\tForms allowed:\n")); - _cupsLangPuts(stdout, _("\t\t(none)\n")); - _cupsLangPuts(stdout, _("\tBanner required\n")); - _cupsLangPuts(stdout, _("\tCharset sets:\n")); - _cupsLangPuts(stdout, _("\t\t(none)\n")); - _cupsLangPuts(stdout, _("\tDefault pitch:\n")); - _cupsLangPuts(stdout, _("\tDefault page size:\n")); - _cupsLangPuts(stdout, _("\tDefault port settings:\n")); + _cupsLangPuts(stdout, _("\tForms allowed:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tBanner required")); + _cupsLangPuts(stdout, _("\tCharset sets:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tDefault pitch:")); + _cupsLangPuts(stdout, _("\tDefault page size:")); + _cupsLangPuts(stdout, _("\tDefault port settings:")); } for (i = 0; i < num_dests; i ++) - if (!strcasecmp(printer, dests[i].name) && dests[i].instance) + if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance) { switch (pstate) { case IPP_PRINTER_IDLE : _cupsLangPrintf(stdout, _("printer %s/%s is idle. " - "enabled since %s\n"), + "enabled since %s"), printer, dests[i].instance, printer_state_time); break; case IPP_PRINTER_PROCESSING : _cupsLangPrintf(stdout, _("printer %s/%s now printing %s-%d. " - "enabled since %s\n"), + "enabled since %s"), printer, dests[i].instance, printer, jobid, printer_state_time); break; case IPP_PRINTER_STOPPED : _cupsLangPrintf(stdout, - _("printer %s/%s disabled since %s -\n"), + _("printer %s/%s disabled since %s -"), printer, dests[i].instance, printer_state_time); break; @@ -1887,87 +1910,93 @@ show_printers(const char *printers, /* I - Destinations */ if ((message && *message) || pstate == IPP_PRINTER_STOPPED) { if (!message || !*message) - _cupsLangPuts(stdout, _("\treason unknown\n")); + _cupsLangPuts(stdout, _("\treason unknown")); else - _cupsLangPrintf(stdout, "\t%s\n", message); + _cupsLangPrintf(stdout, "\t%s", message); } if (long_status > 1) - _cupsLangPuts(stdout, - _("\tForm mounted:\n" - "\tContent types: any\n" - "\tPrinter types: unknown\n")); + { + _cupsLangPuts(stdout, _("\tForm mounted:")); + _cupsLangPuts(stdout, _("\tContent types: any")); + _cupsLangPuts(stdout, _("\tPrinter types: unknown")); + } if (long_status) { - _cupsLangPrintf(stdout, _("\tDescription: %s\n"), + _cupsLangPrintf(stdout, _("\tDescription: %s"), description ? description : ""); if (reasons) { - _cupsLangPuts(stdout, _("\tAlerts:")); - for (j = 0; j < reasons->num_values; j ++) - _cupsLangPrintf(stdout, " %s", - reasons->values[j].string.text); - _cupsLangPuts(stdout, "\n"); + char alerts[1024], /* Alerts string */ + *aptr; /* Pointer into alerts string */ + + for (i = 0, aptr = alerts; i < reasons->num_values; i ++) + { + if (i) + snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text); + else + strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts)); + + aptr += strlen(aptr); + } + + _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts); } } if (long_status > 1) { - _cupsLangPrintf(stdout, _("\tLocation: %s\n"), + _cupsLangPrintf(stdout, _("\tLocation: %s"), location ? location : ""); if (ptype & CUPS_PRINTER_REMOTE) { - _cupsLangPuts(stdout, _("\tConnection: remote\n")); + _cupsLangPuts(stdout, _("\tConnection: remote")); if (make_model && !strstr(make_model, "System V Printer") && !strstr(make_model, "Raw Printer") && uri) - _cupsLangPrintf(stdout, _("\tInterface: %s.ppd\n"), - uri); + _cupsLangPrintf(stdout, _("\tInterface: %s.ppd"), uri); } else { - _cupsLangPuts(stdout, _("\tConnection: direct\n")); + _cupsLangPuts(stdout, _("\tConnection: direct")); - if (make_model && strstr(make_model, "System V Printer")) - _cupsLangPrintf(stdout, - _("\tInterface: %s/interfaces/%s\n"), - root, printer); - else if (make_model && !strstr(make_model, "Raw Printer")) + if (make_model && !strstr(make_model, "Raw Printer")) _cupsLangPrintf(stdout, - _("\tInterface: %s/ppd/%s.ppd\n"), root, printer); + _("\tInterface: %s/ppd/%s.ppd"), + cg->cups_serverroot, printer); } - _cupsLangPuts(stdout, _("\tOn fault: no alert\n")); - _cupsLangPuts(stdout, _("\tAfter fault: continue\n")); + _cupsLangPuts(stdout, _("\tOn fault: no alert")); + _cupsLangPuts(stdout, _("\tAfter fault: continue")); /* TODO update to use printer-error-policy */ if (allowed) { - _cupsLangPuts(stdout, _("\tUsers allowed:\n")); + _cupsLangPuts(stdout, _("\tUsers allowed:")); for (j = 0; j < allowed->num_values; j ++) - _cupsLangPrintf(stdout, "\t\t%s\n", + _cupsLangPrintf(stdout, "\t\t%s", allowed->values[j].string.text); } else if (denied) { - _cupsLangPuts(stdout, _("\tUsers denied:\n")); + _cupsLangPuts(stdout, _("\tUsers denied:")); for (j = 0; j < denied->num_values; j ++) - _cupsLangPrintf(stdout, "\t\t%s\n", + _cupsLangPrintf(stdout, "\t\t%s", denied->values[j].string.text); } else { - _cupsLangPuts(stdout, _("\tUsers allowed:\n")); - _cupsLangPuts(stdout, _("\t\t(all)\n")); + _cupsLangPuts(stdout, _("\tUsers allowed:")); + _cupsLangPuts(stdout, _("\t\t(all)")); } - _cupsLangPuts(stdout, _("\tForms allowed:\n")); - _cupsLangPuts(stdout, _("\t\t(none)\n")); - _cupsLangPuts(stdout, _("\tBanner required\n")); - _cupsLangPuts(stdout, _("\tCharset sets:\n")); - _cupsLangPuts(stdout, _("\t\t(none)\n")); - _cupsLangPuts(stdout, _("\tDefault pitch:\n")); - _cupsLangPuts(stdout, _("\tDefault page size:\n")); - _cupsLangPuts(stdout, _("\tDefault port settings:\n")); + _cupsLangPuts(stdout, _("\tForms allowed:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tBanner required")); + _cupsLangPuts(stdout, _("\tCharset sets:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tDefault pitch:")); + _cupsLangPuts(stdout, _("\tDefault page size:")); + _cupsLangPuts(stdout, _("\tDefault port settings:")); } } } @@ -1978,11 +2007,6 @@ show_printers(const char *printers, /* I - Destinations */ ippDelete(response); } - else - { - _cupsLangPrintf(stderr, "lpstat: %s\n", cupsLastErrorString()); - return (1); - } return (0); } @@ -2001,14 +2025,43 @@ show_scheduler(void) if ((http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption())) != NULL) { - _cupsLangPuts(stdout, _("scheduler is running\n")); + _cupsLangPuts(stdout, _("scheduler is running")); httpClose(http); } else - _cupsLangPuts(stdout, _("scheduler is not running\n")); + _cupsLangPuts(stdout, _("scheduler is not running")); } /* - * End of "$Id: lpstat.c 7921 2008-09-10 15:42:24Z mike $". + * 'usage()' - Show program usage and exit. */ + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: lpstat [options]")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _("-E Encrypt the connection to the server")); + _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port")); + _cupsLangPuts(stdout, _("-l Show verbose (long) output")); + _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication")); + + _cupsLangPuts(stdout, _("-H Show the default server and port")); + _cupsLangPuts(stdout, _("-W completed Show completed jobs")); + _cupsLangPuts(stdout, _("-W not-completed Show pending jobs")); + _cupsLangPuts(stdout, _("-a [destination(s)] Show the accepting state of destinations")); + _cupsLangPuts(stdout, _("-c [class(es)] Show classes and their member printers")); + _cupsLangPuts(stdout, _("-d Show the default destination")); + _cupsLangPuts(stdout, _("-e Show available destinations on the network")); + _cupsLangPuts(stdout, _("-o [destination(s)] Show jobs")); + _cupsLangPuts(stdout, _("-p [printer(s)] Show the processing state of destinations")); + _cupsLangPuts(stdout, _("-r Show whether the CUPS server is running")); + _cupsLangPuts(stdout, _("-R Show the ranking of jobs")); + _cupsLangPuts(stdout, _("-s Show a status summary")); + _cupsLangPuts(stdout, _("-t Show all status information")); + _cupsLangPuts(stdout, _("-u [user(s)] Show jobs queued by the current or specified users")); + _cupsLangPuts(stdout, _("-v [printer(s)] Show the devices for each destination")); + + exit(1); +}