1355b4669Sjacobs /* 2355b4669Sjacobs * CDDL HEADER START 3355b4669Sjacobs * 4355b4669Sjacobs * The contents of this file are subject to the terms of the 5355b4669Sjacobs * Common Development and Distribution License (the "License"). 6355b4669Sjacobs * You may not use this file except in compliance with the License. 7355b4669Sjacobs * 8355b4669Sjacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9355b4669Sjacobs * or http://www.opensolaris.org/os/licensing. 10355b4669Sjacobs * See the License for the specific language governing permissions 11355b4669Sjacobs * and limitations under the License. 12355b4669Sjacobs * 13355b4669Sjacobs * When distributing Covered Code, include this CDDL HEADER in each 14355b4669Sjacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15355b4669Sjacobs * If applicable, add the following below this CDDL HEADER, with the 16355b4669Sjacobs * fields enclosed by brackets "[]" replaced with your own identifying 17355b4669Sjacobs * information: Portions Copyright [yyyy] [name of copyright owner] 18355b4669Sjacobs * 19355b4669Sjacobs * CDDL HEADER END 20355b4669Sjacobs */ 21355b4669Sjacobs 22355b4669Sjacobs /* 23*853389e3Swendyp * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24355b4669Sjacobs * Use is subject to license terms. 25355b4669Sjacobs * 26355b4669Sjacobs */ 27355b4669Sjacobs 28355b4669Sjacobs /* $Id: lpstat.c 173 2006-05-25 04:52:06Z njacobs $ */ 29355b4669Sjacobs 30355b4669Sjacobs #pragma ident "%Z%%M% %I% %E% SMI" 31355b4669Sjacobs 32355b4669Sjacobs #include <stdio.h> 33355b4669Sjacobs #include <stdlib.h> 34355b4669Sjacobs #include <unistd.h> 35355b4669Sjacobs #include <string.h> 36355b4669Sjacobs #include <locale.h> 37355b4669Sjacobs #include <libintl.h> 3891216fe4Swendyp #include <ctype.h> 39355b4669Sjacobs #include <pwd.h> 40355b4669Sjacobs #include <papi.h> 41355b4669Sjacobs #include <uri.h> 42355b4669Sjacobs #include "common.h" 43355b4669Sjacobs 44355b4669Sjacobs static void 45355b4669Sjacobs usage(char *program) 46355b4669Sjacobs { 47355b4669Sjacobs char *name; 48355b4669Sjacobs 49355b4669Sjacobs if ((name = strrchr(program, '/')) == NULL) 50355b4669Sjacobs name = program; 51355b4669Sjacobs else 52355b4669Sjacobs name++; 53355b4669Sjacobs 54355b4669Sjacobs fprintf(stdout, gettext("Usage: %s [-d] [-r] [-s] [-t] [-a [list]] " 55355b4669Sjacobs "[-c [list]] [-o [list] [-l]] [-R [list] [-l]] " 56355b4669Sjacobs "[-p [list] [-D] [-l]] [-v [list]] [-S [list] [-l]] " 57355b4669Sjacobs "[-f [list] [-l]] [-u list]\n"), 58355b4669Sjacobs name); 59355b4669Sjacobs exit(1); 60355b4669Sjacobs } 61355b4669Sjacobs 62355b4669Sjacobs static char * 63355b4669Sjacobs nctime(time_t *t) 64355b4669Sjacobs { 65355b4669Sjacobs static char buf[64]; 66355b4669Sjacobs struct tm *tm = localtime(t); 67355b4669Sjacobs 68355b4669Sjacobs (void) strftime(buf, sizeof (buf), "%c", tm); 69355b4669Sjacobs 70355b4669Sjacobs return (buf); 71355b4669Sjacobs } 72355b4669Sjacobs 73355b4669Sjacobs static char * 74355b4669Sjacobs printer_name(papi_printer_t printer) 75355b4669Sjacobs { 76355b4669Sjacobs papi_attribute_t **attributes = papiPrinterGetAttributeList(printer); 77355b4669Sjacobs char *result = NULL; 78355b4669Sjacobs 79355b4669Sjacobs if (attributes != NULL) 80355b4669Sjacobs papiAttributeListGetString(attributes, NULL, 81355b4669Sjacobs "printer-name", &result); 82355b4669Sjacobs 83355b4669Sjacobs return (result); 84355b4669Sjacobs } 85355b4669Sjacobs 86355b4669Sjacobs static int 87355b4669Sjacobs lpstat_default_printer(papi_encryption_t encryption) 88355b4669Sjacobs { 89355b4669Sjacobs papi_status_t status; 90355b4669Sjacobs papi_service_t svc = NULL; 91355b4669Sjacobs papi_printer_t p = NULL; 92355b4669Sjacobs char *name = NULL; 93355b4669Sjacobs 94355b4669Sjacobs status = papiServiceCreate(&svc, NULL, NULL, NULL, cli_auth_callback, 95355b4669Sjacobs encryption, NULL); 96355b4669Sjacobs if (status == PAPI_OK) { 97355b4669Sjacobs char *req[] = { "printer-name", NULL }; 98355b4669Sjacobs 99355b4669Sjacobs status = papiPrinterQuery(svc, DEFAULT_DEST, req, NULL, &p); 100355b4669Sjacobs if (p != NULL) 101355b4669Sjacobs name = printer_name(p); 102355b4669Sjacobs } 103355b4669Sjacobs if (name != NULL) 104355b4669Sjacobs printf(gettext("system default printer: %s\n"), name); 105355b4669Sjacobs else 106355b4669Sjacobs printf(gettext("no system default destination\n")); 107355b4669Sjacobs papiPrinterFree(p); 108355b4669Sjacobs papiServiceDestroy(svc); 109355b4669Sjacobs 110355b4669Sjacobs return (0); 111355b4669Sjacobs } 112355b4669Sjacobs 113355b4669Sjacobs static int 114355b4669Sjacobs lpstat_service_status(papi_encryption_t encryption) 115355b4669Sjacobs { 116355b4669Sjacobs int result = 0; 117355b4669Sjacobs papi_status_t status; 118355b4669Sjacobs papi_service_t svc = NULL; 119355b4669Sjacobs char *name = NULL; 120355b4669Sjacobs 121355b4669Sjacobs if (((name = getenv("PAPI_SERVICE_URI")) == NULL) && 122355b4669Sjacobs ((name = getenv("IPP_SERVER")) == NULL) && 123355b4669Sjacobs ((name = getenv("CUPS_SERVER")) == NULL)) 124355b4669Sjacobs name = DEFAULT_SERVICE_URI; 125355b4669Sjacobs 126355b4669Sjacobs status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback, 127355b4669Sjacobs encryption, NULL); 128355b4669Sjacobs if (status != PAPI_OK) { 129355b4669Sjacobs printf(gettext("scheduler is not running\n")); 130355b4669Sjacobs result = -1; 131355b4669Sjacobs } else 132355b4669Sjacobs printf(gettext("scheduler is running\n")); 133355b4669Sjacobs papiServiceDestroy(svc); 134355b4669Sjacobs 135355b4669Sjacobs return (result); 136355b4669Sjacobs } 137355b4669Sjacobs 138355b4669Sjacobs static char * 139355b4669Sjacobs get_device_uri(papi_service_t svc, char *name) 140355b4669Sjacobs { 141355b4669Sjacobs papi_status_t status; 142355b4669Sjacobs papi_printer_t p = NULL; 143355b4669Sjacobs char *keys[] = { "device-uri", NULL }; 144355b4669Sjacobs char *result = NULL; 145355b4669Sjacobs 146355b4669Sjacobs status = papiPrinterQuery(svc, name, keys, NULL, &p); 147355b4669Sjacobs if ((status == PAPI_OK) && (p != NULL)) { 148355b4669Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(p); 149355b4669Sjacobs 150355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 151355b4669Sjacobs "device-uri", &result); 152355b4669Sjacobs if (result != NULL) 153355b4669Sjacobs result = strdup(result); 154355b4669Sjacobs 155355b4669Sjacobs papiPrinterFree(p); 156355b4669Sjacobs } 157355b4669Sjacobs 158355b4669Sjacobs return (result); 159355b4669Sjacobs } 160355b4669Sjacobs 161355b4669Sjacobs static char *report_device_keys[] = { "printer-name", "printer-uri-supported", 162355b4669Sjacobs NULL }; 163355b4669Sjacobs /* ARGSUSED2 */ 164355b4669Sjacobs static int 165355b4669Sjacobs report_device(papi_service_t svc, char *name, papi_printer_t printer, 166355b4669Sjacobs int verbose, int description) 167355b4669Sjacobs { 168355b4669Sjacobs papi_status_t status; 169355b4669Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 170355b4669Sjacobs char *uri = NULL; 171355b4669Sjacobs char *device = NULL; 172355b4669Sjacobs uri_t *u = NULL; 173355b4669Sjacobs 174355b4669Sjacobs if (name == NULL) { 175355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 176355b4669Sjacobs "printer-name", &name); 177355b4669Sjacobs if (status != PAPI_OK) 178355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 179355b4669Sjacobs "printer-uri-supported", &name); 180355b4669Sjacobs } 181355b4669Sjacobs 182355b4669Sjacobs if (name == NULL) 183355b4669Sjacobs return (-1); 184355b4669Sjacobs 185355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 186355b4669Sjacobs "printer-uri-supported", &uri); 187355b4669Sjacobs 188355b4669Sjacobs if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) { 189355b4669Sjacobs char *nodename = localhostname(); 190355b4669Sjacobs 191355b4669Sjacobs if ((u->host == NULL) || 192355b4669Sjacobs (strcasecmp(u->host, "localhost") == 0) || 193355b4669Sjacobs (strcasecmp(u->host, nodename) == 0)) 194355b4669Sjacobs device = get_device_uri(svc, name); 195355b4669Sjacobs 196355b4669Sjacobs if (device != NULL) { 197355b4669Sjacobs printf(gettext("device for %s: %s\n"), name, device); 198355b4669Sjacobs return (0); 199355b4669Sjacobs } else if (uri != NULL) { 200355b4669Sjacobs printf(gettext("system for %s: %s (as %s)\n"), name, 201355b4669Sjacobs u->host, uri); 202355b4669Sjacobs return (0); 203355b4669Sjacobs } 204355b4669Sjacobs 205355b4669Sjacobs uri_free(u); 206355b4669Sjacobs } 207355b4669Sjacobs 208355b4669Sjacobs return (0); 209355b4669Sjacobs } 210355b4669Sjacobs 211355b4669Sjacobs static char *report_accepting_keys[] = { "printer-name", 212355b4669Sjacobs "printer-uri-supported", "printer-is-accepting-jobs", 213355b4669Sjacobs "printer-up-time", "printer-state-time", 214355b4669Sjacobs "lpsched-reject-date", "lpsched-reject-reason", NULL }; 215355b4669Sjacobs /* ARGSUSED2 */ 216355b4669Sjacobs static int 217355b4669Sjacobs report_accepting(papi_service_t svc, char *name, papi_printer_t printer, 218355b4669Sjacobs int verbose, int description) 219355b4669Sjacobs { 220355b4669Sjacobs papi_status_t status; 221355b4669Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 222355b4669Sjacobs time_t curr; 223355b4669Sjacobs char boolean = PAPI_FALSE; 224355b4669Sjacobs 225355b4669Sjacobs if (name == NULL) { 226355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 227355b4669Sjacobs "printer-name", &name); 228355b4669Sjacobs if (status != PAPI_OK) 229355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 230355b4669Sjacobs "printer-uri-supported", &name); 231355b4669Sjacobs } 232355b4669Sjacobs if (name == NULL) 233355b4669Sjacobs return (-1); 234355b4669Sjacobs 235355b4669Sjacobs (void) papiAttributeListGetBoolean(attrs, NULL, 236355b4669Sjacobs "printer-is-accepting-jobs", &boolean); 237355b4669Sjacobs (void) time(&curr); 238355b4669Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 239355b4669Sjacobs "printer-up-time", &curr); 240355b4669Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 241355b4669Sjacobs "printer-state-time", &curr); 242355b4669Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 243355b4669Sjacobs "lpsched-reject-date", &curr); 244355b4669Sjacobs 245355b4669Sjacobs if (boolean == PAPI_TRUE) { 246355b4669Sjacobs printf(gettext("%s accepting requests since %s\n"), 247355b4669Sjacobs name, nctime(&curr)); 248355b4669Sjacobs } else { 249355b4669Sjacobs char *reason = "unknown reason"; 250355b4669Sjacobs 251355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 252355b4669Sjacobs "lpsched-reject-reason", &reason); 253355b4669Sjacobs 254355b4669Sjacobs printf(gettext("%s not accepting requests since %s\n\t%s\n"), 255355b4669Sjacobs name, nctime(&curr), reason); 256355b4669Sjacobs } 257355b4669Sjacobs 258355b4669Sjacobs return (0); 259355b4669Sjacobs } 260355b4669Sjacobs 261355b4669Sjacobs static char *report_class_keys[] = { "printer-name", "printer-uri-supported", 262355b4669Sjacobs "member-names", NULL }; 263355b4669Sjacobs /* ARGSUSED2 */ 264355b4669Sjacobs static int 265355b4669Sjacobs report_class(papi_service_t svc, char *name, papi_printer_t printer, 266355b4669Sjacobs int verbose, int description) 267355b4669Sjacobs { 268355b4669Sjacobs papi_status_t status; 269355b4669Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 270355b4669Sjacobs char *member = NULL; 271355b4669Sjacobs void *iter = NULL; 272355b4669Sjacobs 273355b4669Sjacobs status = papiAttributeListGetString(attrs, &iter, 274355b4669Sjacobs "member-names", &member); 275355b4669Sjacobs if (status == PAPI_NOT_FOUND) /* it's not a class */ 276355b4669Sjacobs return (0); 277355b4669Sjacobs 278355b4669Sjacobs if (name == NULL) { 279355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 280355b4669Sjacobs "printer-name", &name); 281355b4669Sjacobs if (status != PAPI_OK) 282355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 283355b4669Sjacobs "printer-uri-supported", &name); 284355b4669Sjacobs } 285355b4669Sjacobs if (name == NULL) 286355b4669Sjacobs return (-1); 287355b4669Sjacobs 288355b4669Sjacobs printf(gettext("members of class %s:\n\t%s\n"), name, member); 289355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, &member) 290355b4669Sjacobs == PAPI_OK) 291355b4669Sjacobs printf("\t%s\n", member); 292355b4669Sjacobs 293355b4669Sjacobs return (0); 294355b4669Sjacobs } 295355b4669Sjacobs 296355b4669Sjacobs static char *report_printer_keys[] = { "printer-name", 297355b4669Sjacobs "printer-uri-supported", "printer-state", 298355b4669Sjacobs "printer-up-time", "printer-state-time", 299355b4669Sjacobs "lpsched-disable-date", "printer-state-reasons", 300355b4669Sjacobs "lpsched-disable-reason", NULL }; 301355b4669Sjacobs /* ARGSUSED2 */ 302355b4669Sjacobs static int 303355b4669Sjacobs report_printer(papi_service_t svc, char *name, papi_printer_t printer, 304355b4669Sjacobs int verbose, int description) 305355b4669Sjacobs { 306355b4669Sjacobs papi_status_t status; 307355b4669Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 308355b4669Sjacobs time_t curr; 309355b4669Sjacobs int32_t pstat = 0; 310355b4669Sjacobs char *member = NULL; 311355b4669Sjacobs 312355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 313355b4669Sjacobs "member-names", &member); 314355b4669Sjacobs if (status == PAPI_OK) /* it's a class */ 315355b4669Sjacobs return (0); 316355b4669Sjacobs 317355b4669Sjacobs if (name == NULL) { 318355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 319355b4669Sjacobs "printer-name", &name); 320355b4669Sjacobs if (status != PAPI_OK) 321355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 322355b4669Sjacobs "printer-uri-supported", &name); 323355b4669Sjacobs } 324355b4669Sjacobs if (name == NULL) 325355b4669Sjacobs return (-1); 326355b4669Sjacobs 327355b4669Sjacobs printf(gettext("printer %s "), name); 328355b4669Sjacobs 329355b4669Sjacobs status = papiAttributeListGetInteger(attrs, NULL, 330355b4669Sjacobs "printer-state", &pstat); 331355b4669Sjacobs 332355b4669Sjacobs switch (pstat) { 333355b4669Sjacobs case 0x03: /* idle */ 334355b4669Sjacobs printf(gettext("idle. enabled")); 335355b4669Sjacobs break; 336355b4669Sjacobs case 0x04: { /* processing */ 337355b4669Sjacobs char *requested[] = { "job-id", NULL }; 338355b4669Sjacobs papi_job_t *j = NULL; 339355b4669Sjacobs int32_t jobid = 0; 340355b4669Sjacobs 341355b4669Sjacobs (void) papiPrinterListJobs(svc, name, requested, 0, 1, &j); 342355b4669Sjacobs if ((j != NULL) && (j[0] != NULL)) 343355b4669Sjacobs jobid = papiJobGetId(j[0]); 344355b4669Sjacobs papiJobListFree(j); 345355b4669Sjacobs 346355b4669Sjacobs printf(gettext("now printing %s-%d. enabled"), name, jobid); 347355b4669Sjacobs } 348355b4669Sjacobs break; 349355b4669Sjacobs case 0x05: /* stopped */ 350355b4669Sjacobs printf(gettext("disabled")); 351355b4669Sjacobs break; 352355b4669Sjacobs default: 353355b4669Sjacobs printf(gettext("unknown state(0x%x)."), pstat); 354355b4669Sjacobs break; 355355b4669Sjacobs } 356355b4669Sjacobs 357355b4669Sjacobs (void) time(&curr); 358355b4669Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 359355b4669Sjacobs "printer-up-time", &curr); 360355b4669Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 361355b4669Sjacobs "printer-state-time", &curr); 362355b4669Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 363355b4669Sjacobs "lpsched-disable-date", &curr); 364355b4669Sjacobs printf(gettext(" since %s. available.\n"), nctime(&curr)); 365355b4669Sjacobs 366355b4669Sjacobs if (pstat == 0x05) { 367355b4669Sjacobs char *reason = "unknown reason"; 368355b4669Sjacobs 369355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 370355b4669Sjacobs "printer-state-reasons", &reason); 371355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 372355b4669Sjacobs "lpsched-disable-reason", &reason); 373355b4669Sjacobs printf(gettext("\t%s\n"), reason); 374355b4669Sjacobs } 375355b4669Sjacobs 376355b4669Sjacobs if (verbose == 1) { 377355b4669Sjacobs void *iter; 378355b4669Sjacobs char *str; 379355b4669Sjacobs 380355b4669Sjacobs str = ""; 381355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 382355b4669Sjacobs "form-ready", &str); 383355b4669Sjacobs printf(gettext("\tForm mounted: %s\n"), str); 384355b4669Sjacobs 385355b4669Sjacobs str = ""; 386355b4669Sjacobs iter = NULL; 387355b4669Sjacobs (void) papiAttributeListGetString(attrs, &iter, 388355b4669Sjacobs "document-format-supported", &str); 389355b4669Sjacobs printf(gettext("\tContent types: %s"), str); 390355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, &str) 391355b4669Sjacobs == PAPI_OK) 392355b4669Sjacobs printf(", %s", str); 393355b4669Sjacobs printf("\n"); 394355b4669Sjacobs 395355b4669Sjacobs str = ""; 396355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 397355b4669Sjacobs "printer-info", &str); 398355b4669Sjacobs printf(gettext("\tDescription: %s\n"), str); 399355b4669Sjacobs 400355b4669Sjacobs str = ""; 401*853389e3Swendyp iter = NULL; 402*853389e3Swendyp (void) papiAttributeListGetString(attrs, &iter, 403*853389e3Swendyp "lpsched-printer-type", &str); 404*853389e3Swendyp printf(gettext("\tPrinter types: %s"), str); 405*853389e3Swendyp while (papiAttributeListGetString(attrs, &iter, NULL, &str) 406*853389e3Swendyp == PAPI_OK) 407*853389e3Swendyp printf(", %s", str); 408*853389e3Swendyp printf("\n"); 409*853389e3Swendyp 410*853389e3Swendyp str = ""; 411355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 412355b4669Sjacobs "lpsched-dial-info", &str); 413355b4669Sjacobs printf(gettext("\tConnection: %s\n"), 414355b4669Sjacobs ((str[0] != '\0') ? gettext("direct") : str)); 415355b4669Sjacobs 416355b4669Sjacobs str = ""; 417355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 418355b4669Sjacobs "lpsched-interface-script", &str); 419355b4669Sjacobs printf(gettext("\tInterface: %s\n"), str); 420355b4669Sjacobs 421355b4669Sjacobs str = NULL; 422355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 423355b4669Sjacobs "ppd-file-uri", &str); 424355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 425355b4669Sjacobs "lpsched-ppd-source-path", &str); 426355b4669Sjacobs if (str != NULL) 427355b4669Sjacobs printf(gettext("\tPPD: %s\n"), str); 428355b4669Sjacobs 429355b4669Sjacobs str = NULL; 430355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 431355b4669Sjacobs "lpsched-fault-alert-command", &str); 432355b4669Sjacobs if (str != NULL) 433355b4669Sjacobs printf(gettext("\tOn fault: %s\n"), str); 434355b4669Sjacobs 435355b4669Sjacobs str = ""; 436355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 437355b4669Sjacobs "lpsched-fault-recovery", &str); 438355b4669Sjacobs printf(gettext("\tAfter fault: %s\n"), 439355b4669Sjacobs ((str[0] == '\0') ? gettext("continue") : str)); 440355b4669Sjacobs 441355b4669Sjacobs str = "(all)"; 442355b4669Sjacobs iter = NULL; 443355b4669Sjacobs (void) papiAttributeListGetString(attrs, &iter, 444355b4669Sjacobs "requesting-user-name-allowed", &str); 445355b4669Sjacobs printf(gettext("\tUsers allowed:\n\t\t%s\n"), 446355b4669Sjacobs ((str[0] == '\0') ? gettext("(none)") : str)); 447355b4669Sjacobs if ((str != NULL) && (str[0] != '\0')) 448355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 449355b4669Sjacobs &str) == PAPI_OK) 450355b4669Sjacobs printf("\t\t%s\n", str); 451355b4669Sjacobs 452355b4669Sjacobs str = NULL; 453355b4669Sjacobs iter = NULL; 454355b4669Sjacobs (void) papiAttributeListGetString(attrs, &iter, 455355b4669Sjacobs "requesting-user-name-denied", &str); 456355b4669Sjacobs if (str != NULL) { 457355b4669Sjacobs printf(gettext("\tUsers denied:\n\t\t%s\n"), 458355b4669Sjacobs ((str[0] == '\0') ? gettext("(none)") : str)); 459355b4669Sjacobs if ((str != NULL) && (str[0] != '\0')) 460355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, 461355b4669Sjacobs NULL, &str) == PAPI_OK) 462355b4669Sjacobs printf("\t\t%s\n", str); 463355b4669Sjacobs } 464355b4669Sjacobs 465355b4669Sjacobs str = "(none)"; 466355b4669Sjacobs iter = NULL; 467355b4669Sjacobs (void) papiAttributeListGetString(attrs, &iter, 468355b4669Sjacobs "form-supported", &str); 469355b4669Sjacobs printf(gettext("\tForms allowed:\n\t\t%s\n"), 470355b4669Sjacobs ((str[0] == '\0') ? gettext("(none)") : str)); 471355b4669Sjacobs if ((str != NULL) && (str[0] != '\0')) 472355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 473355b4669Sjacobs &str) == PAPI_OK) 474355b4669Sjacobs printf("\t\t%s\n", str); 475355b4669Sjacobs 476355b4669Sjacobs str = ""; 477355b4669Sjacobs iter = NULL; 478355b4669Sjacobs (void) papiAttributeListGetString(attrs, &iter, 479355b4669Sjacobs "media-supported", &str); 480355b4669Sjacobs printf(gettext("\tMedia supported:\n\t\t%s\n"), 481355b4669Sjacobs ((str[0] == '\0') ? gettext("(none)") : str)); 482355b4669Sjacobs if ((str != NULL) && (str[0] != '\0')) 483355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 484355b4669Sjacobs &str) == PAPI_OK) 485355b4669Sjacobs printf("\t\t%s\n", str); 486355b4669Sjacobs 487355b4669Sjacobs str = ""; 488355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 489355b4669Sjacobs "job-sheets-supported", &str); 490*853389e3Swendyp if ((strcasecmp(str, "none")) == 0) 491*853389e3Swendyp str = gettext("page never printed"); 492*853389e3Swendyp else if (strcasecmp(str, "optional") == 0) 493*853389e3Swendyp str = gettext("not required"); 494*853389e3Swendyp else 495*853389e3Swendyp str = gettext("required"); 496*853389e3Swendyp 497*853389e3Swendyp printf(gettext("\tBanner %s\n"), str); 498*853389e3Swendyp 499355b4669Sjacobs 500355b4669Sjacobs str = ""; 501355b4669Sjacobs iter = NULL; 502355b4669Sjacobs (void) papiAttributeListGetString(attrs, &iter, 503355b4669Sjacobs "lpsched-print-wheels", &str); 504355b4669Sjacobs printf(gettext("\tCharacter sets:\n\t\t%s\n"), 505355b4669Sjacobs ((str[0] == '\0') ? gettext("(none)") : str)); 506355b4669Sjacobs if ((str != NULL) && (str[0] != '\0')) 507355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 508355b4669Sjacobs &str) == PAPI_OK) 509355b4669Sjacobs printf("\t\t%s\n", str); 510355b4669Sjacobs 511355b4669Sjacobs printf(gettext("\tDefault pitch:\n")); 512355b4669Sjacobs printf(gettext("\tDefault page size:\n")); 513355b4669Sjacobs printf(gettext("\tDefault port setting:\n")); 514355b4669Sjacobs 515355b4669Sjacobs str = ""; 516355b4669Sjacobs iter = NULL; 517355b4669Sjacobs (void) papiAttributeListGetString(attrs, &iter, 518355b4669Sjacobs "lpsched-options", &str); 519355b4669Sjacobs if (str != NULL) { 520355b4669Sjacobs printf(gettext("\tOptions: %s"), str); 521355b4669Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 522355b4669Sjacobs &str) == PAPI_OK) 523355b4669Sjacobs printf(", %s", str); 524355b4669Sjacobs printf("\n"); 525355b4669Sjacobs } 526355b4669Sjacobs 527355b4669Sjacobs } else if (description == 1) { 528355b4669Sjacobs char *str = ""; 529355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 530355b4669Sjacobs "printer-description", &str); 531355b4669Sjacobs printf(gettext("\tDescription: %s\n"), str); 532355b4669Sjacobs } else if (verbose > 1) 533355b4669Sjacobs papiAttributeListPrint(stdout, attrs, "\t"); 534355b4669Sjacobs 535355b4669Sjacobs if (verbose > 0) 536355b4669Sjacobs printf("\n"); 537355b4669Sjacobs 538355b4669Sjacobs return (0); 539355b4669Sjacobs } 540355b4669Sjacobs 541355b4669Sjacobs static int 542355b4669Sjacobs printer_query(char *name, int (*report)(papi_service_t, char *, papi_printer_t, 543355b4669Sjacobs int, int), papi_encryption_t encryption, 544355b4669Sjacobs int verbose, int description) 545355b4669Sjacobs { 546355b4669Sjacobs int result = 0; 547355b4669Sjacobs papi_status_t status; 548355b4669Sjacobs papi_service_t svc = NULL; 549355b4669Sjacobs 550355b4669Sjacobs status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback, 551355b4669Sjacobs encryption, NULL); 552355b4669Sjacobs if (status != PAPI_OK) { 553022ba35cSjacobs if (status == PAPI_NOT_FOUND) 554022ba35cSjacobs fprintf(stderr, gettext("%s: unknown printer\n"), 555022ba35cSjacobs name ? name : "(NULL)"); 556022ba35cSjacobs else 557355b4669Sjacobs fprintf(stderr, gettext( 558355b4669Sjacobs "Failed to contact service for %s: %s\n"), 559355b4669Sjacobs name ? name : "(NULL)", 560355b4669Sjacobs verbose_papi_message(svc, status)); 561355b4669Sjacobs papiServiceDestroy(svc); 562355b4669Sjacobs return (-1); 563355b4669Sjacobs } 564355b4669Sjacobs 565355b4669Sjacobs if (name == NULL) { /* all */ 566355b4669Sjacobs char **interest = interest_list(svc); 567355b4669Sjacobs 568355b4669Sjacobs if (interest != NULL) { 569355b4669Sjacobs int i; 570355b4669Sjacobs 571355b4669Sjacobs for (i = 0; interest[i] != NULL; i++) 572355b4669Sjacobs result += printer_query(interest[i], report, 573355b4669Sjacobs encryption, verbose, 574355b4669Sjacobs description); 575355b4669Sjacobs } 576355b4669Sjacobs } else { 577355b4669Sjacobs papi_printer_t printer = NULL; 578355b4669Sjacobs char **keys = NULL; 579355b4669Sjacobs 580355b4669Sjacobs /* 581355b4669Sjacobs * Limit the query to only required data to reduce the need 582355b4669Sjacobs * to go remote for information. 583355b4669Sjacobs */ 584355b4669Sjacobs if (report == report_device) 585355b4669Sjacobs keys = report_device_keys; 586355b4669Sjacobs else if (report == report_class) 587355b4669Sjacobs keys = report_class_keys; 588355b4669Sjacobs else if (report == report_accepting) 589355b4669Sjacobs keys = report_accepting_keys; 590355b4669Sjacobs else if ((report == report_printer) && (verbose == 0)) 591355b4669Sjacobs keys = report_printer_keys; 592355b4669Sjacobs 593355b4669Sjacobs status = papiPrinterQuery(svc, name, keys, NULL, &printer); 594355b4669Sjacobs if (status != PAPI_OK) { 595355b4669Sjacobs fprintf(stderr, gettext( 596355b4669Sjacobs "Failed to get printer info for %s: %s\n"), 597355b4669Sjacobs name, verbose_papi_message(svc, status)); 598355b4669Sjacobs papiServiceDestroy(svc); 599355b4669Sjacobs return (-1); 600355b4669Sjacobs } 601355b4669Sjacobs 602355b4669Sjacobs if (printer != NULL) 603355b4669Sjacobs result = report(svc, name, printer, verbose, 604355b4669Sjacobs description); 605355b4669Sjacobs 606355b4669Sjacobs papiPrinterFree(printer); 607355b4669Sjacobs } 608355b4669Sjacobs 609355b4669Sjacobs papiServiceDestroy(svc); 610355b4669Sjacobs 611355b4669Sjacobs return (result); 612355b4669Sjacobs } 613355b4669Sjacobs 614355b4669Sjacobs static int 615355b4669Sjacobs match_user(char *user, char **list) 616355b4669Sjacobs { 617355b4669Sjacobs int i; 618355b4669Sjacobs 619355b4669Sjacobs for (i = 0; list[i] != NULL; i++) { 620355b4669Sjacobs if (strcmp(user, list[i]) == 0) 621355b4669Sjacobs return (0); 622355b4669Sjacobs } 623355b4669Sjacobs 624355b4669Sjacobs return (-1); 625355b4669Sjacobs } 626355b4669Sjacobs 627355b4669Sjacobs static char **users = NULL; 628355b4669Sjacobs 629355b4669Sjacobs static int 630355b4669Sjacobs report_job(papi_job_t job, int show_rank, int verbose) 631355b4669Sjacobs { 632355b4669Sjacobs papi_attribute_t **attrs = papiJobGetAttributeList(job); 633355b4669Sjacobs time_t clock = 0; 634355b4669Sjacobs char date[24]; 635355b4669Sjacobs char request[26]; 636355b4669Sjacobs char *user = "unknown"; 637355b4669Sjacobs int32_t size = 0; 638355b4669Sjacobs int32_t jstate = 0; 639355b4669Sjacobs 640355b4669Sjacobs char *destination = "unknown"; 641355b4669Sjacobs int32_t id = -1; 642355b4669Sjacobs 643355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 644355b4669Sjacobs "job-originating-user-name", &user); 645355b4669Sjacobs 646355b4669Sjacobs if ((users != NULL) && (match_user(user, users) < 0)) 647355b4669Sjacobs return (0); 648355b4669Sjacobs 649355b4669Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, "job-k-octets", &size); 650355b4669Sjacobs size *= 1024; /* for the approximate byte size */ 651355b4669Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, "job-octets", &size); 652355b4669Sjacobs 653355b4669Sjacobs (void) time(&clock); 654355b4669Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 655355b4669Sjacobs "time-at-creation", (int32_t *)&clock); 656355b4669Sjacobs (void) strftime(date, sizeof (date), "%b %d %R", localtime(&clock)); 657355b4669Sjacobs 658355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 659355b4669Sjacobs "job-printer-uri", &destination); 660355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 661355b4669Sjacobs "printer-name", &destination); 662355b4669Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 663355b4669Sjacobs "job-id", &id); 664355b4669Sjacobs snprintf(request, sizeof (request), "%s-%d", destination, id); 665355b4669Sjacobs 666355b4669Sjacobs if (show_rank != 0) { 667355b4669Sjacobs int32_t rank = -1; 668355b4669Sjacobs 669355b4669Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 670355b4669Sjacobs "number-of-intervening-jobs", &rank); 671355b4669Sjacobs rank++; 672355b4669Sjacobs 673355b4669Sjacobs printf("%3d %-21s %-14s %7ld %s", 674355b4669Sjacobs rank, request, user, size, date); 675355b4669Sjacobs } else 676355b4669Sjacobs printf("%-23s %-14s %7ld %s", request, user, size, date); 677355b4669Sjacobs 678355b4669Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 679355b4669Sjacobs "job-state", &jstate); 680355b4669Sjacobs if (jstate == 0x04) 681355b4669Sjacobs printf(gettext(", being held")); 682355b4669Sjacobs else if (jstate == 0x07) 683355b4669Sjacobs printf(gettext(", cancelled")); 684355b4669Sjacobs else if (jstate == 0x09) 685355b4669Sjacobs printf(gettext(", complete")); 686355b4669Sjacobs 687355b4669Sjacobs if (verbose == 1) { 6880a44ef6dSjacobs char *form = NULL; 6890a44ef6dSjacobs 690355b4669Sjacobs (void) papiAttributeListGetString(attrs, NULL, 691355b4669Sjacobs "output-device-assigned", &destination); 692355b4669Sjacobs printf("\n\t assigned %s", destination); 6930a44ef6dSjacobs 6940a44ef6dSjacobs (void) papiAttributeListGetString(attrs, NULL, "form", &form); 6950a44ef6dSjacobs if (form != NULL) 6960a44ef6dSjacobs printf(", form %s", form); 697355b4669Sjacobs } else if (verbose > 1) { 698355b4669Sjacobs printf("\n"); 699355b4669Sjacobs papiAttributeListPrint(stdout, attrs, "\t"); 700355b4669Sjacobs } 701355b4669Sjacobs 702355b4669Sjacobs printf("\n"); 703355b4669Sjacobs 704355b4669Sjacobs return (0); 705355b4669Sjacobs } 706355b4669Sjacobs 707355b4669Sjacobs static int 708355b4669Sjacobs job_query(char *request, int (*report)(papi_job_t, int, int), 709355b4669Sjacobs papi_encryption_t encryption, int show_rank, int verbose) 710355b4669Sjacobs { 711355b4669Sjacobs int result = 0; 712355b4669Sjacobs papi_status_t status; 713355b4669Sjacobs papi_service_t svc = NULL; 714355b4669Sjacobs char *printer = NULL; 715355b4669Sjacobs int32_t id = -1; 716355b4669Sjacobs 717355b4669Sjacobs get_printer_id(request, &printer, &id); 718355b4669Sjacobs 719355b4669Sjacobs status = papiServiceCreate(&svc, printer, NULL, NULL, cli_auth_callback, 720355b4669Sjacobs encryption, NULL); 721355b4669Sjacobs if (status != PAPI_OK) { 722355b4669Sjacobs fprintf(stderr, gettext( 723355b4669Sjacobs "Failed to contact service for %s: %s\n"), 724355b4669Sjacobs (printer ? printer : "all"), 725355b4669Sjacobs verbose_papi_message(svc, status)); 726355b4669Sjacobs return (-1); 727355b4669Sjacobs } 728355b4669Sjacobs 729355b4669Sjacobs if (printer == NULL) { /* all */ 730355b4669Sjacobs char **interest = interest_list(svc); 731355b4669Sjacobs 732355b4669Sjacobs if (interest != NULL) { 733355b4669Sjacobs int i; 734355b4669Sjacobs 735355b4669Sjacobs for (i = 0; interest[i] != NULL; i++) 736355b4669Sjacobs result += job_query(interest[i], report, 737355b4669Sjacobs encryption, show_rank, verbose); 738355b4669Sjacobs } 739355b4669Sjacobs } else if (id == -1) { /* a printer */ 740355b4669Sjacobs papi_job_t *jobs = NULL; 741355b4669Sjacobs 742355b4669Sjacobs status = papiPrinterListJobs(svc, printer, NULL, 0, 0, &jobs); 743355b4669Sjacobs if (status != PAPI_OK) { 744355b4669Sjacobs fprintf(stderr, gettext( 745355b4669Sjacobs "Failed to get job list: %s\n"), 746355b4669Sjacobs verbose_papi_message(svc, status)); 747355b4669Sjacobs papiServiceDestroy(svc); 748355b4669Sjacobs return (-1); 749355b4669Sjacobs } 750355b4669Sjacobs 751355b4669Sjacobs if (jobs != NULL) { 752355b4669Sjacobs int i; 753355b4669Sjacobs 754355b4669Sjacobs for (i = 0; jobs[i] != NULL; i++) 755355b4669Sjacobs result += report(jobs[i], show_rank, verbose); 756355b4669Sjacobs } 757355b4669Sjacobs 758355b4669Sjacobs papiJobListFree(jobs); 759355b4669Sjacobs } else { /* a job */ 760355b4669Sjacobs papi_job_t job = NULL; 761355b4669Sjacobs 762355b4669Sjacobs status = papiJobQuery(svc, printer, id, NULL, &job); 763355b4669Sjacobs if (status != PAPI_OK) { 764355b4669Sjacobs fprintf(stderr, gettext( 765355b4669Sjacobs "Failed to get job info for %s: %s\n"), 766355b4669Sjacobs request, verbose_papi_message(svc, status)); 767355b4669Sjacobs papiServiceDestroy(svc); 768355b4669Sjacobs return (-1); 769355b4669Sjacobs } 770355b4669Sjacobs 771355b4669Sjacobs if (job != NULL) 772355b4669Sjacobs result = report(job, show_rank, verbose); 773355b4669Sjacobs 774355b4669Sjacobs papiJobFree(job); 775355b4669Sjacobs } 776355b4669Sjacobs 777355b4669Sjacobs papiServiceDestroy(svc); 778355b4669Sjacobs 779355b4669Sjacobs return (result); 780355b4669Sjacobs } 781355b4669Sjacobs 782355b4669Sjacobs static int 783355b4669Sjacobs report_form(char *name, papi_attribute_t **attrs, int verbose) 784355b4669Sjacobs { 785355b4669Sjacobs papi_status_t status; 786355b4669Sjacobs char *form = NULL; 787355b4669Sjacobs void *iter = NULL; 788355b4669Sjacobs 789355b4669Sjacobs for (status = papiAttributeListGetString(attrs, &iter, 790355b4669Sjacobs "form-supported", &form); 791355b4669Sjacobs status == PAPI_OK; 792355b4669Sjacobs status = papiAttributeListGetString(attrs, &iter, 793355b4669Sjacobs NULL, &form)) { 794355b4669Sjacobs if ((name == NULL) || (strcmp(name, form) == 0)) { 795355b4669Sjacobs printf(gettext("form %s is available to you\n"), form); 796355b4669Sjacobs if (verbose != 0) { 797355b4669Sjacobs char *detail = NULL; 798355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 799355b4669Sjacobs "form-supported-detail", 800355b4669Sjacobs &detail); 801355b4669Sjacobs if (status == PAPI_OK) 802355b4669Sjacobs printf("%s\n", detail); 803355b4669Sjacobs } 804355b4669Sjacobs } 805355b4669Sjacobs } 806355b4669Sjacobs 807355b4669Sjacobs return (0); 808355b4669Sjacobs } 809355b4669Sjacobs 810355b4669Sjacobs static int 811355b4669Sjacobs report_print_wheels(char *name, papi_attribute_t **attrs, int verbose) 812355b4669Sjacobs { 813355b4669Sjacobs papi_status_t status; 814355b4669Sjacobs char *pw = NULL; 815355b4669Sjacobs void *iter = NULL; 816355b4669Sjacobs 817355b4669Sjacobs for (status = papiAttributeListGetString(attrs, &iter, 818355b4669Sjacobs "pw-supported", &pw); 819355b4669Sjacobs status == PAPI_OK; 820355b4669Sjacobs status = papiAttributeListGetString(attrs, &iter, NULL, &pw)) { 821355b4669Sjacobs if ((name == NULL) || (strcmp(name, pw) == 0)) { 822355b4669Sjacobs printf(gettext("charset %s is available\n"), pw); 823355b4669Sjacobs if (verbose != 0) { 824355b4669Sjacobs char *info = NULL; 825355b4669Sjacobs status = papiAttributeListGetString(attrs, NULL, 826355b4669Sjacobs "pw-supported-extra", &info); 827355b4669Sjacobs if (status == PAPI_OK) 828355b4669Sjacobs printf("%s\n", info); 829355b4669Sjacobs } 830355b4669Sjacobs } 831355b4669Sjacobs } 832355b4669Sjacobs 833355b4669Sjacobs return (0); 834355b4669Sjacobs } 835355b4669Sjacobs 836355b4669Sjacobs static int 837355b4669Sjacobs service_query(char *name, int (*report)(char *, papi_attribute_t **, int), 838355b4669Sjacobs papi_encryption_t encryption, int verbose) 839355b4669Sjacobs { 840355b4669Sjacobs int result = 0; 841355b4669Sjacobs papi_status_t status; 842355b4669Sjacobs papi_service_t svc = NULL; 843355b4669Sjacobs papi_attribute_t **attrs = NULL; 844355b4669Sjacobs 845355b4669Sjacobs status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback, 846355b4669Sjacobs encryption, NULL); 847355b4669Sjacobs if (status != PAPI_OK) { 848355b4669Sjacobs papiServiceDestroy(svc); 849355b4669Sjacobs return (-1); 850355b4669Sjacobs } 851355b4669Sjacobs 852355b4669Sjacobs attrs = papiServiceGetAttributeList(svc); 853355b4669Sjacobs if (attrs != NULL) { 854355b4669Sjacobs result = report(name, attrs, verbose); 855355b4669Sjacobs 856355b4669Sjacobs if (verbose > 1) { 857355b4669Sjacobs printf("\n"); 858355b4669Sjacobs papiAttributeListPrint(stdout, attrs, "\t"); 859355b4669Sjacobs printf("\n"); 860355b4669Sjacobs } 861355b4669Sjacobs } 862355b4669Sjacobs 863355b4669Sjacobs papiServiceDestroy(svc); 864355b4669Sjacobs 865355b4669Sjacobs return (result); 866355b4669Sjacobs } 867355b4669Sjacobs 868355b4669Sjacobs int 869355b4669Sjacobs main(int ac, char *av[]) 870355b4669Sjacobs { 871355b4669Sjacobs int exit_code = 0; 872355b4669Sjacobs papi_encryption_t encryption = PAPI_ENCRYPT_NEVER; 873355b4669Sjacobs int rank = 0; 874355b4669Sjacobs int verbose = 0; 875355b4669Sjacobs int description = 0; 876355b4669Sjacobs int c; 877355b4669Sjacobs char **argv; 878355b4669Sjacobs 879355b4669Sjacobs (void) setlocale(LC_ALL, ""); 880355b4669Sjacobs (void) textdomain("SUNW_OST_OSCMD"); 881355b4669Sjacobs 882355b4669Sjacobs argv = (char **)calloc((ac + 1), sizeof (char *)); 88391216fe4Swendyp for (c = 0; c < ac; c++) { 88491216fe4Swendyp if ((av[c][0] == '-') && (av[c][1] == 'l') && 88591216fe4Swendyp (isalpha(av[c][2]) != 0)) { 88691216fe4Swendyp /* preserve old "-l[po...]" behavior */ 88791216fe4Swendyp argv[c] = &av[c][1]; 88891216fe4Swendyp argv[c][0] = '-'; 88991216fe4Swendyp verbose = 1; 89091216fe4Swendyp 89191216fe4Swendyp } else 892355b4669Sjacobs argv[c] = av[c]; 89391216fe4Swendyp } 89491216fe4Swendyp 895355b4669Sjacobs argv[c++] = "--"; 896355b4669Sjacobs ac = c; 897355b4669Sjacobs 898355b4669Sjacobs /* preprocess argument list looking for '-l' or '-R' so it can trail */ 899355b4669Sjacobs while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF) 900355b4669Sjacobs switch (c) { 901355b4669Sjacobs case 'l': 902355b4669Sjacobs if ((optarg == NULL) || (optarg[0] == '-')) 903355b4669Sjacobs optarg = "1"; 904355b4669Sjacobs verbose = atoi(optarg); 905355b4669Sjacobs break; 906355b4669Sjacobs case 'D': 907355b4669Sjacobs description = 1; 908355b4669Sjacobs break; 909355b4669Sjacobs case 'R': 910355b4669Sjacobs rank = 1; 911355b4669Sjacobs break; 912355b4669Sjacobs case 'E': 913355b4669Sjacobs encryption = PAPI_ENCRYPT_REQUIRED; 914355b4669Sjacobs break; 915355b4669Sjacobs default: 916355b4669Sjacobs break; 917355b4669Sjacobs } 918355b4669Sjacobs optind = 1; 919355b4669Sjacobs 920355b4669Sjacobs /* process command line arguments */ 921355b4669Sjacobs while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF) { 922355b4669Sjacobs switch (c) { /* these may or may not have an option */ 923355b4669Sjacobs case 'a': 924355b4669Sjacobs case 'c': 925355b4669Sjacobs case 'p': 926355b4669Sjacobs case 'o': 927355b4669Sjacobs case 'R': 928355b4669Sjacobs case 'u': 929355b4669Sjacobs case 'v': 930355b4669Sjacobs case 'l': 931355b4669Sjacobs case 'f': 932355b4669Sjacobs case 'S': 933355b4669Sjacobs if (optarg[0] == '-') { 934355b4669Sjacobs /* this check stop a possible infinite loop */ 935355b4669Sjacobs if ((optind > 1) && (argv[optind-1][1] != c)) 936355b4669Sjacobs optind--; 937355b4669Sjacobs optarg = NULL; 938355b4669Sjacobs } else if (strcmp(optarg, "all") == 0) 939355b4669Sjacobs optarg = NULL; 940355b4669Sjacobs } 941355b4669Sjacobs 942355b4669Sjacobs switch (c) { 943355b4669Sjacobs case 'a': 944355b4669Sjacobs exit_code += printer_query(optarg, report_accepting, 945355b4669Sjacobs encryption, verbose, 0); 946355b4669Sjacobs break; 947355b4669Sjacobs case 'c': 948355b4669Sjacobs exit_code += printer_query(optarg, report_class, 949355b4669Sjacobs encryption, verbose, 0); 950355b4669Sjacobs break; 951355b4669Sjacobs case 'p': 952355b4669Sjacobs exit_code += printer_query(optarg, report_printer, 953355b4669Sjacobs encryption, verbose, 954355b4669Sjacobs description); 955355b4669Sjacobs break; 956355b4669Sjacobs case 'd': 957355b4669Sjacobs exit_code += lpstat_default_printer(encryption); 958355b4669Sjacobs break; 959355b4669Sjacobs case 'r': 960355b4669Sjacobs exit_code += lpstat_service_status(encryption); 961355b4669Sjacobs break; 962355b4669Sjacobs case 'u': 963355b4669Sjacobs if (optarg != NULL) 964355b4669Sjacobs users = strsplit(optarg, ", \n"); 965355b4669Sjacobs exit_code += job_query(NULL, report_job, 966355b4669Sjacobs encryption, rank, verbose); 967355b4669Sjacobs if (users != NULL) { 968355b4669Sjacobs free(users); 969355b4669Sjacobs users = NULL; 970355b4669Sjacobs } 971355b4669Sjacobs break; 972355b4669Sjacobs case 'v': 973355b4669Sjacobs exit_code += printer_query(optarg, report_device, 974355b4669Sjacobs encryption, verbose, 0); 975355b4669Sjacobs break; 976355b4669Sjacobs case 'o': 977355b4669Sjacobs exit_code += job_query(optarg, report_job, 978355b4669Sjacobs encryption, rank, verbose); 979355b4669Sjacobs break; 980355b4669Sjacobs case 'f': 981355b4669Sjacobs exit_code += service_query(optarg, report_form, 982355b4669Sjacobs encryption, verbose); 983355b4669Sjacobs break; 984355b4669Sjacobs case 'S': 985355b4669Sjacobs exit_code += service_query(optarg, report_print_wheels, 986355b4669Sjacobs encryption, verbose); 987355b4669Sjacobs break; 988355b4669Sjacobs case 's': 989355b4669Sjacobs exit_code += lpstat_service_status(encryption); 990355b4669Sjacobs exit_code += lpstat_default_printer(encryption); 991355b4669Sjacobs exit_code += printer_query(NULL, report_class, 992355b4669Sjacobs encryption, verbose, 0); 993355b4669Sjacobs exit_code += printer_query(NULL, report_device, 994355b4669Sjacobs encryption, verbose, 0); 995355b4669Sjacobs exit_code += service_query(optarg, report_form, 996355b4669Sjacobs encryption, verbose); 997355b4669Sjacobs exit_code += service_query(optarg, report_print_wheels, 998355b4669Sjacobs encryption, verbose); 999355b4669Sjacobs break; 1000355b4669Sjacobs case 't': 1001355b4669Sjacobs exit_code += lpstat_service_status(encryption); 1002355b4669Sjacobs exit_code += lpstat_default_printer(encryption); 1003355b4669Sjacobs exit_code += printer_query(NULL, report_class, 1004355b4669Sjacobs encryption, verbose, 0); 1005355b4669Sjacobs exit_code += printer_query(NULL, report_device, 1006355b4669Sjacobs encryption, verbose, 0); 1007355b4669Sjacobs exit_code += printer_query(NULL, report_accepting, 1008355b4669Sjacobs encryption, verbose, 0); 1009355b4669Sjacobs exit_code += printer_query(NULL, report_printer, 1010355b4669Sjacobs encryption, verbose, 0); 1011355b4669Sjacobs exit_code += service_query(optarg, report_form, 1012355b4669Sjacobs encryption, verbose); 1013355b4669Sjacobs exit_code += service_query(optarg, report_print_wheels, 1014355b4669Sjacobs encryption, verbose); 1015355b4669Sjacobs exit_code += job_query(NULL, report_job, 1016355b4669Sjacobs encryption, rank, verbose); 1017355b4669Sjacobs break; 1018355b4669Sjacobs case 'L': /* local-only, ignored */ 1019355b4669Sjacobs case 'l': /* increased verbose level in first pass */ 1020355b4669Sjacobs case 'D': /* set "description" flag in first pass */ 1021355b4669Sjacobs case 'R': /* set "rank" flag in first pass */ 1022355b4669Sjacobs case 'E': /* set encryption in the first pass */ 1023355b4669Sjacobs break; 1024355b4669Sjacobs default: 1025355b4669Sjacobs usage(av[0]); 1026355b4669Sjacobs } 1027355b4669Sjacobs } 1028355b4669Sjacobs ac--; 1029355b4669Sjacobs 1030355b4669Sjacobs if (ac == 1) { /* report on my jobs */ 1031355b4669Sjacobs struct passwd *pw = getpwuid(getuid()); 1032355b4669Sjacobs 1033355b4669Sjacobs if (pw != NULL) 1034355b4669Sjacobs users = strsplit(pw->pw_name, ""); 1035355b4669Sjacobs exit_code += job_query(NULL, report_job, encryption, 1036355b4669Sjacobs rank, verbose); 1037355b4669Sjacobs if (users != NULL) { 1038355b4669Sjacobs free(users); 1039355b4669Sjacobs users = NULL; 1040355b4669Sjacobs } 1041355b4669Sjacobs } else { 1042355b4669Sjacobs for (c = optind; c < ac; c++) 1043355b4669Sjacobs exit_code += job_query(argv[c], report_job, encryption, 1044355b4669Sjacobs rank, verbose); 1045355b4669Sjacobs } 1046355b4669Sjacobs 1047355b4669Sjacobs 1048355b4669Sjacobs if (exit_code != 0) 1049355b4669Sjacobs exit_code = 1; 1050355b4669Sjacobs 1051355b4669Sjacobs return (exit_code); 1052355b4669Sjacobs } 1053