12264Sjacobs /* 22264Sjacobs * CDDL HEADER START 32264Sjacobs * 42264Sjacobs * The contents of this file are subject to the terms of the 52264Sjacobs * Common Development and Distribution License (the "License"). 62264Sjacobs * You may not use this file except in compliance with the License. 72264Sjacobs * 82264Sjacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 92264Sjacobs * or http://www.opensolaris.org/os/licensing. 102264Sjacobs * See the License for the specific language governing permissions 112264Sjacobs * and limitations under the License. 122264Sjacobs * 132264Sjacobs * When distributing Covered Code, include this CDDL HEADER in each 142264Sjacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 152264Sjacobs * If applicable, add the following below this CDDL HEADER, with the 162264Sjacobs * fields enclosed by brackets "[]" replaced with your own identifying 172264Sjacobs * information: Portions Copyright [yyyy] [name of copyright owner] 182264Sjacobs * 192264Sjacobs * CDDL HEADER END 202264Sjacobs */ 212264Sjacobs 222264Sjacobs /* 238534SSonam.Gupta@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 242264Sjacobs * Use is subject to license terms. 252264Sjacobs * 262264Sjacobs */ 272264Sjacobs 282264Sjacobs /* $Id: lpstat.c 173 2006-05-25 04:52:06Z njacobs $ */ 292264Sjacobs 302264Sjacobs 312264Sjacobs #include <stdio.h> 322264Sjacobs #include <stdlib.h> 332264Sjacobs #include <unistd.h> 342264Sjacobs #include <string.h> 352264Sjacobs #include <locale.h> 362264Sjacobs #include <libintl.h> 374286Swendyp #include <ctype.h> 382264Sjacobs #include <pwd.h> 392264Sjacobs #include <papi.h> 402264Sjacobs #include <uri.h> 412264Sjacobs #include "common.h" 422264Sjacobs 432264Sjacobs static void 442264Sjacobs usage(char *program) 452264Sjacobs { 462264Sjacobs char *name; 472264Sjacobs 482264Sjacobs if ((name = strrchr(program, '/')) == NULL) 492264Sjacobs name = program; 502264Sjacobs else 512264Sjacobs name++; 522264Sjacobs 532264Sjacobs fprintf(stdout, gettext("Usage: %s [-d] [-r] [-s] [-t] [-a [list]] " 548962SSonam.Gupta@Sun.COM "[-c [list]] [-o [list] [-l]] [-R [list] [-l]] " 558962SSonam.Gupta@Sun.COM "[-p [list] [-D] [-l]] [-v [list]] [-S [list] [-l]] " 568962SSonam.Gupta@Sun.COM "[-f [list] [-l]] [-u list]\n"), 578962SSonam.Gupta@Sun.COM name); 582264Sjacobs exit(1); 592264Sjacobs } 602264Sjacobs 612264Sjacobs static char * 622264Sjacobs nctime(time_t *t) 632264Sjacobs { 642264Sjacobs static char buf[64]; 652264Sjacobs struct tm *tm = localtime(t); 662264Sjacobs 672264Sjacobs (void) strftime(buf, sizeof (buf), "%c", tm); 682264Sjacobs 692264Sjacobs return (buf); 702264Sjacobs } 712264Sjacobs 722264Sjacobs static char * 732264Sjacobs printer_name(papi_printer_t printer) 742264Sjacobs { 752264Sjacobs papi_attribute_t **attributes = papiPrinterGetAttributeList(printer); 762264Sjacobs char *result = NULL; 772264Sjacobs 782264Sjacobs if (attributes != NULL) 792264Sjacobs papiAttributeListGetString(attributes, NULL, 808962SSonam.Gupta@Sun.COM "printer-name", &result); 812264Sjacobs 822264Sjacobs return (result); 832264Sjacobs } 842264Sjacobs 852264Sjacobs static int 862264Sjacobs lpstat_default_printer(papi_encryption_t encryption) 872264Sjacobs { 882264Sjacobs papi_status_t status; 892264Sjacobs papi_service_t svc = NULL; 902264Sjacobs papi_printer_t p = NULL; 912264Sjacobs char *name = NULL; 922264Sjacobs 932264Sjacobs status = papiServiceCreate(&svc, NULL, NULL, NULL, cli_auth_callback, 948962SSonam.Gupta@Sun.COM encryption, NULL); 952264Sjacobs if (status == PAPI_OK) { 962264Sjacobs char *req[] = { "printer-name", NULL }; 972264Sjacobs 982264Sjacobs status = papiPrinterQuery(svc, DEFAULT_DEST, req, NULL, &p); 992264Sjacobs if (p != NULL) 1002264Sjacobs name = printer_name(p); 1012264Sjacobs } 1022264Sjacobs if (name != NULL) 1032264Sjacobs printf(gettext("system default printer: %s\n"), name); 1042264Sjacobs else 1052264Sjacobs printf(gettext("no system default destination\n")); 1062264Sjacobs papiPrinterFree(p); 1072264Sjacobs papiServiceDestroy(svc); 1082264Sjacobs 1092264Sjacobs return (0); 1102264Sjacobs } 1112264Sjacobs 1122264Sjacobs static int 1132264Sjacobs lpstat_service_status(papi_encryption_t encryption) 1142264Sjacobs { 1152264Sjacobs int result = 0; 1162264Sjacobs papi_status_t status; 1172264Sjacobs papi_service_t svc = NULL; 1182264Sjacobs char *name = NULL; 1192264Sjacobs 1202264Sjacobs if (((name = getenv("PAPI_SERVICE_URI")) == NULL) && 1212264Sjacobs ((name = getenv("IPP_SERVER")) == NULL) && 1222264Sjacobs ((name = getenv("CUPS_SERVER")) == NULL)) 1232264Sjacobs name = DEFAULT_SERVICE_URI; 1242264Sjacobs 1252264Sjacobs status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback, 1268962SSonam.Gupta@Sun.COM encryption, NULL); 1272264Sjacobs if (status != PAPI_OK) { 1282264Sjacobs printf(gettext("scheduler is not running\n")); 1292264Sjacobs result = -1; 1302264Sjacobs } else 1312264Sjacobs printf(gettext("scheduler is running\n")); 1322264Sjacobs papiServiceDestroy(svc); 1332264Sjacobs 1342264Sjacobs return (result); 1352264Sjacobs } 1362264Sjacobs 1372264Sjacobs static char * 1382264Sjacobs get_device_uri(papi_service_t svc, char *name) 1392264Sjacobs { 1402264Sjacobs papi_status_t status; 1412264Sjacobs papi_printer_t p = NULL; 1422264Sjacobs char *keys[] = { "device-uri", NULL }; 1432264Sjacobs char *result = NULL; 1442264Sjacobs 1452264Sjacobs status = papiPrinterQuery(svc, name, keys, NULL, &p); 1462264Sjacobs if ((status == PAPI_OK) && (p != NULL)) { 1472264Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(p); 1482264Sjacobs 1492264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 1508962SSonam.Gupta@Sun.COM "device-uri", &result); 1512264Sjacobs if (result != NULL) 1522264Sjacobs result = strdup(result); 1532264Sjacobs 1542264Sjacobs papiPrinterFree(p); 1552264Sjacobs } 1562264Sjacobs 1572264Sjacobs return (result); 1582264Sjacobs } 1592264Sjacobs 1608534SSonam.Gupta@Sun.COM static void 1618534SSonam.Gupta@Sun.COM print_description(papi_attribute_t **list, char *printer_name) 1628534SSonam.Gupta@Sun.COM { 1638534SSonam.Gupta@Sun.COM char *str = ""; 1648534SSonam.Gupta@Sun.COM 1658534SSonam.Gupta@Sun.COM (void) papiAttributeListGetString(list, NULL, 1668534SSonam.Gupta@Sun.COM "printer-info", &str); 1678534SSonam.Gupta@Sun.COM 1688534SSonam.Gupta@Sun.COM /* 1698534SSonam.Gupta@Sun.COM * If no printer-info is read then 1708534SSonam.Gupta@Sun.COM * by default the printer-info is <printer-name>@<server> 1718534SSonam.Gupta@Sun.COM */ 1728534SSonam.Gupta@Sun.COM if (str[0] == '\0') { 1738534SSonam.Gupta@Sun.COM char *uri = NULL; 1748534SSonam.Gupta@Sun.COM uri_t *u = NULL; 1758534SSonam.Gupta@Sun.COM 1768534SSonam.Gupta@Sun.COM (void) papiAttributeListGetString(list, NULL, 1778534SSonam.Gupta@Sun.COM "printer-uri-supported", &uri); 1788534SSonam.Gupta@Sun.COM 1798534SSonam.Gupta@Sun.COM if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) { 1808534SSonam.Gupta@Sun.COM char *nodename = localhostname(); 1818534SSonam.Gupta@Sun.COM 1828534SSonam.Gupta@Sun.COM if ((u->host == NULL) || 1838534SSonam.Gupta@Sun.COM (strcasecmp(u->host, "localhost") == 0) || 1848534SSonam.Gupta@Sun.COM (strcasecmp(u->host, nodename) == 0)) 1858534SSonam.Gupta@Sun.COM printf(gettext("\tDescription:\n")); 1868534SSonam.Gupta@Sun.COM else 1878534SSonam.Gupta@Sun.COM printf(gettext("\tDescription: %s@%s\n"), 1888534SSonam.Gupta@Sun.COM printer_name, u->host); 1898534SSonam.Gupta@Sun.COM 1908534SSonam.Gupta@Sun.COM uri_free(u); 1918534SSonam.Gupta@Sun.COM } else 1928534SSonam.Gupta@Sun.COM printf(gettext("\tDescription:\n")); 1938534SSonam.Gupta@Sun.COM } else 1948534SSonam.Gupta@Sun.COM printf(gettext("\tDescription: %s\n"), str); 1958534SSonam.Gupta@Sun.COM } 1968534SSonam.Gupta@Sun.COM 1972264Sjacobs static char *report_device_keys[] = { "printer-name", "printer-uri-supported", 1982264Sjacobs NULL }; 1992264Sjacobs /* ARGSUSED2 */ 2002264Sjacobs static int 2012264Sjacobs report_device(papi_service_t svc, char *name, papi_printer_t printer, 2022264Sjacobs int verbose, int description) 2032264Sjacobs { 2042264Sjacobs papi_status_t status; 2052264Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 2062264Sjacobs char *uri = NULL; 2072264Sjacobs char *device = NULL; 2082264Sjacobs uri_t *u = NULL; 2092264Sjacobs 2102264Sjacobs if (name == NULL) { 2112264Sjacobs status = papiAttributeListGetString(attrs, NULL, 2128962SSonam.Gupta@Sun.COM "printer-name", &name); 2132264Sjacobs if (status != PAPI_OK) 2142264Sjacobs status = papiAttributeListGetString(attrs, NULL, 2158962SSonam.Gupta@Sun.COM "printer-uri-supported", &name); 2162264Sjacobs } 2172264Sjacobs 2182264Sjacobs if (name == NULL) 2192264Sjacobs return (-1); 2202264Sjacobs 2212264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 2228962SSonam.Gupta@Sun.COM "printer-uri-supported", &uri); 2232264Sjacobs 2242264Sjacobs if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) { 2252264Sjacobs char *nodename = localhostname(); 2262264Sjacobs 2272264Sjacobs if ((u->host == NULL) || 2282264Sjacobs (strcasecmp(u->host, "localhost") == 0) || 2292264Sjacobs (strcasecmp(u->host, nodename) == 0)) 2302264Sjacobs device = get_device_uri(svc, name); 2312264Sjacobs 2322264Sjacobs if (device != NULL) { 2332264Sjacobs printf(gettext("device for %s: %s\n"), name, device); 2342264Sjacobs return (0); 2352264Sjacobs } else if (uri != NULL) { 2362264Sjacobs printf(gettext("system for %s: %s (as %s)\n"), name, 2378962SSonam.Gupta@Sun.COM u->host, uri); 2382264Sjacobs return (0); 2392264Sjacobs } 2402264Sjacobs 2412264Sjacobs uri_free(u); 2422264Sjacobs } 2432264Sjacobs 2442264Sjacobs return (0); 2452264Sjacobs } 2462264Sjacobs 2472264Sjacobs static char *report_accepting_keys[] = { "printer-name", 2482264Sjacobs "printer-uri-supported", "printer-is-accepting-jobs", 2492264Sjacobs "printer-up-time", "printer-state-time", 2502264Sjacobs "lpsched-reject-date", "lpsched-reject-reason", NULL }; 2512264Sjacobs /* ARGSUSED2 */ 2522264Sjacobs static int 2532264Sjacobs report_accepting(papi_service_t svc, char *name, papi_printer_t printer, 2542264Sjacobs int verbose, int description) 2552264Sjacobs { 2562264Sjacobs papi_status_t status; 2572264Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 2582264Sjacobs time_t curr; 2592264Sjacobs char boolean = PAPI_FALSE; 2602264Sjacobs 2612264Sjacobs if (name == NULL) { 2622264Sjacobs status = papiAttributeListGetString(attrs, NULL, 2638962SSonam.Gupta@Sun.COM "printer-name", &name); 2642264Sjacobs if (status != PAPI_OK) 2652264Sjacobs status = papiAttributeListGetString(attrs, NULL, 2668962SSonam.Gupta@Sun.COM "printer-uri-supported", &name); 2672264Sjacobs } 2682264Sjacobs if (name == NULL) 2692264Sjacobs return (-1); 2702264Sjacobs 2712264Sjacobs (void) papiAttributeListGetBoolean(attrs, NULL, 2728962SSonam.Gupta@Sun.COM "printer-is-accepting-jobs", &boolean); 2732264Sjacobs (void) time(&curr); 2742264Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 2758962SSonam.Gupta@Sun.COM "printer-up-time", &curr); 2762264Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 2778962SSonam.Gupta@Sun.COM "printer-state-time", &curr); 2782264Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 2798962SSonam.Gupta@Sun.COM "lpsched-reject-date", &curr); 2802264Sjacobs 2812264Sjacobs if (boolean == PAPI_TRUE) { 2822264Sjacobs printf(gettext("%s accepting requests since %s\n"), 2838962SSonam.Gupta@Sun.COM name, nctime(&curr)); 2842264Sjacobs } else { 2852264Sjacobs char *reason = "unknown reason"; 2862264Sjacobs 2872264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 2888962SSonam.Gupta@Sun.COM "lpsched-reject-reason", &reason); 2892264Sjacobs 2902264Sjacobs printf(gettext("%s not accepting requests since %s\n\t%s\n"), 2918962SSonam.Gupta@Sun.COM name, nctime(&curr), reason); 2922264Sjacobs } 2932264Sjacobs 2942264Sjacobs return (0); 2952264Sjacobs } 2962264Sjacobs 2972264Sjacobs static char *report_class_keys[] = { "printer-name", "printer-uri-supported", 2982264Sjacobs "member-names", NULL }; 2992264Sjacobs /* ARGSUSED2 */ 3002264Sjacobs static int 3012264Sjacobs report_class(papi_service_t svc, char *name, papi_printer_t printer, 3022264Sjacobs int verbose, int description) 3032264Sjacobs { 3042264Sjacobs papi_status_t status; 3052264Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 3062264Sjacobs char *member = NULL; 3072264Sjacobs void *iter = NULL; 3082264Sjacobs 3092264Sjacobs status = papiAttributeListGetString(attrs, &iter, 3108962SSonam.Gupta@Sun.COM "member-names", &member); 3112264Sjacobs if (status == PAPI_NOT_FOUND) /* it's not a class */ 3122264Sjacobs return (0); 3132264Sjacobs 3142264Sjacobs if (name == NULL) { 3152264Sjacobs status = papiAttributeListGetString(attrs, NULL, 3168962SSonam.Gupta@Sun.COM "printer-name", &name); 3172264Sjacobs if (status != PAPI_OK) 3182264Sjacobs status = papiAttributeListGetString(attrs, NULL, 3198962SSonam.Gupta@Sun.COM "printer-uri-supported", &name); 3202264Sjacobs } 3212264Sjacobs if (name == NULL) 3222264Sjacobs return (-1); 3232264Sjacobs 3242264Sjacobs printf(gettext("members of class %s:\n\t%s\n"), name, member); 3252264Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, &member) 3268962SSonam.Gupta@Sun.COM == PAPI_OK) 3272264Sjacobs printf("\t%s\n", member); 3282264Sjacobs 3292264Sjacobs return (0); 3302264Sjacobs } 3312264Sjacobs 3322264Sjacobs static char *report_printer_keys[] = { "printer-name", 3332264Sjacobs "printer-uri-supported", "printer-state", 3342264Sjacobs "printer-up-time", "printer-state-time", 3352264Sjacobs "lpsched-disable-date", "printer-state-reasons", 3362264Sjacobs "lpsched-disable-reason", NULL }; 3372264Sjacobs /* ARGSUSED2 */ 3382264Sjacobs static int 3392264Sjacobs report_printer(papi_service_t svc, char *name, papi_printer_t printer, 3402264Sjacobs int verbose, int description) 3412264Sjacobs { 3422264Sjacobs papi_status_t status; 3432264Sjacobs papi_attribute_t **attrs = papiPrinterGetAttributeList(printer); 3442264Sjacobs time_t curr; 3452264Sjacobs int32_t pstat = 0; 3462264Sjacobs char *member = NULL; 3478962SSonam.Gupta@Sun.COM papi_job_t *j = NULL; 3482264Sjacobs 3492264Sjacobs status = papiAttributeListGetString(attrs, NULL, 3508962SSonam.Gupta@Sun.COM "member-names", &member); 3512264Sjacobs if (status == PAPI_OK) /* it's a class */ 3522264Sjacobs return (0); 3532264Sjacobs 3542264Sjacobs if (name == NULL) { 3552264Sjacobs status = papiAttributeListGetString(attrs, NULL, 3568962SSonam.Gupta@Sun.COM "printer-name", &name); 3572264Sjacobs if (status != PAPI_OK) 3582264Sjacobs status = papiAttributeListGetString(attrs, NULL, 3598962SSonam.Gupta@Sun.COM "printer-uri-supported", &name); 3602264Sjacobs } 3612264Sjacobs if (name == NULL) 3622264Sjacobs return (-1); 3632264Sjacobs 3642264Sjacobs printf(gettext("printer %s "), name); 3652264Sjacobs 3662264Sjacobs status = papiAttributeListGetInteger(attrs, NULL, 3678962SSonam.Gupta@Sun.COM "printer-state", &pstat); 3682264Sjacobs 3692264Sjacobs switch (pstat) { 3702264Sjacobs case 0x03: /* idle */ 3712264Sjacobs printf(gettext("idle. enabled")); 3722264Sjacobs break; 3738962SSonam.Gupta@Sun.COM case 0x04: /* processing */ 3748962SSonam.Gupta@Sun.COM status = papiPrinterListJobs(svc, name, NULL, 3758962SSonam.Gupta@Sun.COM 0, 0, &j); 3768962SSonam.Gupta@Sun.COM 3778962SSonam.Gupta@Sun.COM if (status == PAPI_OK) { 3788962SSonam.Gupta@Sun.COM if (j != NULL) { 3798962SSonam.Gupta@Sun.COM int i = 0; 3808962SSonam.Gupta@Sun.COM int32_t jobid = 0; 3818962SSonam.Gupta@Sun.COM int32_t jstate = 0; 3828962SSonam.Gupta@Sun.COM int flag = 0; 3838962SSonam.Gupta@Sun.COM 3848962SSonam.Gupta@Sun.COM for (i = 0; j[i] != NULL; ++i) { 3859206SSonam.Gupta@Sun.COM papi_attribute_t **attr = 3869206SSonam.Gupta@Sun.COM papiJobGetAttributeList(j[i]); 3878962SSonam.Gupta@Sun.COM 3889206SSonam.Gupta@Sun.COM papiAttributeListGetInteger(attr, 3898962SSonam.Gupta@Sun.COM NULL, "job-state", &jstate); 3909206SSonam.Gupta@Sun.COM papiAttributeListGetInteger(attr, 3918962SSonam.Gupta@Sun.COM NULL, "job-id", &jobid); 3922264Sjacobs 3938962SSonam.Gupta@Sun.COM /* 394*9257SGowtham.Thommandra@Sun.COM * If the job-state is in 395*9257SGowtham.Thommandra@Sun.COM * RS_PRINTING then only print. 3968962SSonam.Gupta@Sun.COM */ 397*9257SGowtham.Thommandra@Sun.COM if (jstate == 0x0008) { 3988962SSonam.Gupta@Sun.COM if (flag == 0) 3998962SSonam.Gupta@Sun.COM printf(gettext 4008962SSonam.Gupta@Sun.COM ("now printing"\ 4018962SSonam.Gupta@Sun.COM " %s-%d. enabled"), 4028962SSonam.Gupta@Sun.COM name, jobid); 4038962SSonam.Gupta@Sun.COM flag = 1; 4048962SSonam.Gupta@Sun.COM } 4058962SSonam.Gupta@Sun.COM } 4068962SSonam.Gupta@Sun.COM papiJobListFree(j); 4078962SSonam.Gupta@Sun.COM } 4082264Sjacobs } 4092264Sjacobs break; 4102264Sjacobs case 0x05: /* stopped */ 4112264Sjacobs printf(gettext("disabled")); 4122264Sjacobs break; 4132264Sjacobs default: 4142264Sjacobs printf(gettext("unknown state(0x%x)."), pstat); 4152264Sjacobs break; 4162264Sjacobs } 4172264Sjacobs 4182264Sjacobs (void) time(&curr); 4192264Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 4208962SSonam.Gupta@Sun.COM "printer-up-time", &curr); 4212264Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 4228962SSonam.Gupta@Sun.COM "printer-state-time", &curr); 4232264Sjacobs (void) papiAttributeListGetDatetime(attrs, NULL, 4248962SSonam.Gupta@Sun.COM "lpsched-disable-date", &curr); 4252264Sjacobs printf(gettext(" since %s. available.\n"), nctime(&curr)); 4262264Sjacobs 4272264Sjacobs if (pstat == 0x05) { 4282264Sjacobs char *reason = "unknown reason"; 4292264Sjacobs 4302264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4318962SSonam.Gupta@Sun.COM "printer-state-reasons", &reason); 4322264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4338962SSonam.Gupta@Sun.COM "lpsched-disable-reason", &reason); 4342264Sjacobs printf(gettext("\t%s\n"), reason); 4352264Sjacobs } 4362264Sjacobs 4372264Sjacobs if (verbose == 1) { 4382264Sjacobs void *iter; 4392264Sjacobs char *str; 4402264Sjacobs 4412264Sjacobs str = ""; 4422264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4438962SSonam.Gupta@Sun.COM "form-ready", &str); 4442264Sjacobs printf(gettext("\tForm mounted: %s\n"), str); 4452264Sjacobs 4462264Sjacobs str = ""; 4472264Sjacobs iter = NULL; 4482264Sjacobs (void) papiAttributeListGetString(attrs, &iter, 4498962SSonam.Gupta@Sun.COM "document-format-supported", &str); 4502264Sjacobs printf(gettext("\tContent types: %s"), str); 4512264Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, &str) 4528962SSonam.Gupta@Sun.COM == PAPI_OK) 4532264Sjacobs printf(", %s", str); 4542264Sjacobs printf("\n"); 4552264Sjacobs 4568534SSonam.Gupta@Sun.COM /* Display the printer description */ 4578534SSonam.Gupta@Sun.COM print_description(attrs, name); 4582264Sjacobs 4592264Sjacobs str = ""; 4606676Swendyp iter = NULL; 4616676Swendyp (void) papiAttributeListGetString(attrs, &iter, 4626676Swendyp "lpsched-printer-type", &str); 4636676Swendyp printf(gettext("\tPrinter types: %s"), str); 4646676Swendyp while (papiAttributeListGetString(attrs, &iter, NULL, &str) 4656676Swendyp == PAPI_OK) 4666676Swendyp printf(", %s", str); 4676676Swendyp printf("\n"); 4686676Swendyp 4696676Swendyp str = ""; 4702264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4718962SSonam.Gupta@Sun.COM "lpsched-dial-info", &str); 4722264Sjacobs printf(gettext("\tConnection: %s\n"), 4737653SJonathan.Ca@Sun.COM ((str[0] == '\0') ? gettext("direct") : str)); 4742264Sjacobs 4752264Sjacobs str = ""; 4762264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4778962SSonam.Gupta@Sun.COM "lpsched-interface-script", &str); 4782264Sjacobs printf(gettext("\tInterface: %s\n"), str); 4792264Sjacobs 4802264Sjacobs str = NULL; 4812264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4828962SSonam.Gupta@Sun.COM "ppd-file-uri", &str); 4832264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4848962SSonam.Gupta@Sun.COM "lpsched-ppd-source-path", &str); 4852264Sjacobs if (str != NULL) 4862264Sjacobs printf(gettext("\tPPD: %s\n"), str); 4872264Sjacobs 4882264Sjacobs str = NULL; 4892264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4908962SSonam.Gupta@Sun.COM "lpsched-fault-alert-command", &str); 4912264Sjacobs if (str != NULL) 4922264Sjacobs printf(gettext("\tOn fault: %s\n"), str); 4932264Sjacobs 4942264Sjacobs str = ""; 4952264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 4968962SSonam.Gupta@Sun.COM "lpsched-fault-recovery", &str); 4972264Sjacobs printf(gettext("\tAfter fault: %s\n"), 4988962SSonam.Gupta@Sun.COM ((str[0] == '\0') ? gettext("continue") : str)); 4992264Sjacobs 5002264Sjacobs str = "(all)"; 5012264Sjacobs iter = NULL; 5022264Sjacobs (void) papiAttributeListGetString(attrs, &iter, 5038962SSonam.Gupta@Sun.COM "requesting-user-name-allowed", &str); 5042264Sjacobs printf(gettext("\tUsers allowed:\n\t\t%s\n"), 5058962SSonam.Gupta@Sun.COM ((str[0] == '\0') ? gettext("(none)") : str)); 5062264Sjacobs if ((str != NULL) && (str[0] != '\0')) 5072264Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 5088962SSonam.Gupta@Sun.COM &str) == PAPI_OK) 5092264Sjacobs printf("\t\t%s\n", str); 5102264Sjacobs 5112264Sjacobs str = NULL; 5122264Sjacobs iter = NULL; 5132264Sjacobs (void) papiAttributeListGetString(attrs, &iter, 5148962SSonam.Gupta@Sun.COM "requesting-user-name-denied", &str); 5152264Sjacobs if (str != NULL) { 5162264Sjacobs printf(gettext("\tUsers denied:\n\t\t%s\n"), 5178962SSonam.Gupta@Sun.COM ((str[0] == '\0') ? gettext("(none)") : str)); 5182264Sjacobs if ((str != NULL) && (str[0] != '\0')) 5192264Sjacobs while (papiAttributeListGetString(attrs, &iter, 5208962SSonam.Gupta@Sun.COM NULL, &str) == PAPI_OK) 5212264Sjacobs printf("\t\t%s\n", str); 5222264Sjacobs } 5232264Sjacobs 5248238SSonam.Gupta@Sun.COM str = "none"; 5252264Sjacobs iter = NULL; 5262264Sjacobs (void) papiAttributeListGetString(attrs, &iter, 5278962SSonam.Gupta@Sun.COM "form-supported", &str); 5288238SSonam.Gupta@Sun.COM printf(gettext("\tForms allowed:\n\t\t(%s)\n"), 5298962SSonam.Gupta@Sun.COM ((str[0] == '\0') ? gettext("none") : str)); 5302264Sjacobs if ((str != NULL) && (str[0] != '\0')) 5312264Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 5328962SSonam.Gupta@Sun.COM &str) == PAPI_OK) 5338238SSonam.Gupta@Sun.COM printf("\t\t(%s)\n", str); 5342264Sjacobs 5352264Sjacobs str = ""; 5362264Sjacobs iter = NULL; 5372264Sjacobs (void) papiAttributeListGetString(attrs, &iter, 5388962SSonam.Gupta@Sun.COM "media-supported", &str); 5392264Sjacobs printf(gettext("\tMedia supported:\n\t\t%s\n"), 5408962SSonam.Gupta@Sun.COM ((str[0] == '\0') ? gettext("(none)") : str)); 5412264Sjacobs if ((str != NULL) && (str[0] != '\0')) 5422264Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 5438962SSonam.Gupta@Sun.COM &str) == PAPI_OK) 5442264Sjacobs printf("\t\t%s\n", str); 5452264Sjacobs 5462264Sjacobs str = ""; 5472264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 5488962SSonam.Gupta@Sun.COM "job-sheets-supported", &str); 5496676Swendyp if ((strcasecmp(str, "none")) == 0) 5506676Swendyp str = gettext("page never printed"); 5516676Swendyp else if (strcasecmp(str, "optional") == 0) 5526676Swendyp str = gettext("not required"); 5536676Swendyp else 5546676Swendyp str = gettext("required"); 5556676Swendyp 5566676Swendyp printf(gettext("\tBanner %s\n"), str); 5576676Swendyp 5582264Sjacobs 5592264Sjacobs str = ""; 5602264Sjacobs iter = NULL; 5612264Sjacobs (void) papiAttributeListGetString(attrs, &iter, 5628962SSonam.Gupta@Sun.COM "lpsched-print-wheels", &str); 5632264Sjacobs printf(gettext("\tCharacter sets:\n\t\t%s\n"), 5648962SSonam.Gupta@Sun.COM ((str[0] == '\0') ? gettext("(none)") : str)); 5652264Sjacobs if ((str != NULL) && (str[0] != '\0')) 5662264Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 5678962SSonam.Gupta@Sun.COM &str) == PAPI_OK) 5682264Sjacobs printf("\t\t%s\n", str); 5692264Sjacobs 5702264Sjacobs printf(gettext("\tDefault pitch:\n")); 5712264Sjacobs printf(gettext("\tDefault page size:\n")); 5722264Sjacobs printf(gettext("\tDefault port setting:\n")); 5732264Sjacobs 5742264Sjacobs str = ""; 5752264Sjacobs iter = NULL; 5762264Sjacobs (void) papiAttributeListGetString(attrs, &iter, 5778962SSonam.Gupta@Sun.COM "lpsched-options", &str); 5782264Sjacobs if (str != NULL) { 5792264Sjacobs printf(gettext("\tOptions: %s"), str); 5802264Sjacobs while (papiAttributeListGetString(attrs, &iter, NULL, 5818962SSonam.Gupta@Sun.COM &str) == PAPI_OK) 5822264Sjacobs printf(", %s", str); 5832264Sjacobs printf("\n"); 5842264Sjacobs } 5852264Sjacobs 5868534SSonam.Gupta@Sun.COM } else if (description == 1) 5878534SSonam.Gupta@Sun.COM /* Display printer description */ 5888534SSonam.Gupta@Sun.COM print_description(attrs, name); 5898534SSonam.Gupta@Sun.COM else if (verbose > 1) 5902264Sjacobs papiAttributeListPrint(stdout, attrs, "\t"); 5912264Sjacobs 5922264Sjacobs if (verbose > 0) 5932264Sjacobs printf("\n"); 5942264Sjacobs 5952264Sjacobs return (0); 5962264Sjacobs } 5972264Sjacobs 5982264Sjacobs static int 5992264Sjacobs printer_query(char *name, int (*report)(papi_service_t, char *, papi_printer_t, 6002264Sjacobs int, int), papi_encryption_t encryption, 6012264Sjacobs int verbose, int description) 6022264Sjacobs { 6032264Sjacobs int result = 0; 6042264Sjacobs papi_status_t status; 6052264Sjacobs papi_service_t svc = NULL; 6062264Sjacobs 6072264Sjacobs status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback, 6088962SSonam.Gupta@Sun.COM encryption, NULL); 6092264Sjacobs if (status != PAPI_OK) { 6104062Sjacobs if (status == PAPI_NOT_FOUND) 6114062Sjacobs fprintf(stderr, gettext("%s: unknown printer\n"), 6128962SSonam.Gupta@Sun.COM name ? name : "(NULL)"); 6134062Sjacobs else 6144062Sjacobs fprintf(stderr, gettext( 6158962SSonam.Gupta@Sun.COM "Failed to contact service for %s: %s\n"), 6168962SSonam.Gupta@Sun.COM name ? name : "(NULL)", 6178962SSonam.Gupta@Sun.COM verbose_papi_message(svc, status)); 6182264Sjacobs papiServiceDestroy(svc); 6192264Sjacobs return (-1); 6202264Sjacobs } 6212264Sjacobs 6222264Sjacobs if (name == NULL) { /* all */ 6232264Sjacobs char **interest = interest_list(svc); 6242264Sjacobs 6252264Sjacobs if (interest != NULL) { 6262264Sjacobs int i; 6272264Sjacobs 6282264Sjacobs for (i = 0; interest[i] != NULL; i++) 6292264Sjacobs result += printer_query(interest[i], report, 6308962SSonam.Gupta@Sun.COM encryption, verbose, 6318962SSonam.Gupta@Sun.COM description); 6322264Sjacobs } 6332264Sjacobs } else { 6342264Sjacobs papi_printer_t printer = NULL; 6352264Sjacobs char **keys = NULL; 6362264Sjacobs 6372264Sjacobs /* 6382264Sjacobs * Limit the query to only required data to reduce the need 6392264Sjacobs * to go remote for information. 6402264Sjacobs */ 6412264Sjacobs if (report == report_device) 6422264Sjacobs keys = report_device_keys; 6432264Sjacobs else if (report == report_class) 6442264Sjacobs keys = report_class_keys; 6452264Sjacobs else if (report == report_accepting) 6462264Sjacobs keys = report_accepting_keys; 6472264Sjacobs else if ((report == report_printer) && (verbose == 0)) 6482264Sjacobs keys = report_printer_keys; 6492264Sjacobs 6502264Sjacobs status = papiPrinterQuery(svc, name, keys, NULL, &printer); 6512264Sjacobs if (status != PAPI_OK) { 6522264Sjacobs fprintf(stderr, gettext( 6538962SSonam.Gupta@Sun.COM "Failed to get printer info for %s: %s\n"), 6548962SSonam.Gupta@Sun.COM name, verbose_papi_message(svc, status)); 6552264Sjacobs papiServiceDestroy(svc); 6562264Sjacobs return (-1); 6572264Sjacobs } 6582264Sjacobs 6592264Sjacobs if (printer != NULL) 6602264Sjacobs result = report(svc, name, printer, verbose, 6618962SSonam.Gupta@Sun.COM description); 6622264Sjacobs 6632264Sjacobs papiPrinterFree(printer); 6642264Sjacobs } 6652264Sjacobs 6662264Sjacobs papiServiceDestroy(svc); 6672264Sjacobs 6682264Sjacobs return (result); 6692264Sjacobs } 6702264Sjacobs 6712264Sjacobs static int 6722264Sjacobs match_user(char *user, char **list) 6732264Sjacobs { 6742264Sjacobs int i; 6752264Sjacobs 6762264Sjacobs for (i = 0; list[i] != NULL; i++) { 6772264Sjacobs if (strcmp(user, list[i]) == 0) 6782264Sjacobs return (0); 6792264Sjacobs } 6802264Sjacobs 6812264Sjacobs return (-1); 6822264Sjacobs } 6832264Sjacobs 6842264Sjacobs static char **users = NULL; 6852264Sjacobs 6862264Sjacobs static int 6879256SSonam.Gupta@Sun.COM report_job(char *printer, papi_job_t job, int show_rank, int verbose) 6882264Sjacobs { 6892264Sjacobs papi_attribute_t **attrs = papiJobGetAttributeList(job); 6902264Sjacobs time_t clock = 0; 6912264Sjacobs char date[24]; 6922264Sjacobs char request[26]; 6932264Sjacobs char *user = "unknown"; 6948321SSonam.Gupta@Sun.COM char *host = NULL; 6952264Sjacobs int32_t size = 0; 6962264Sjacobs int32_t jstate = 0; 6978321SSonam.Gupta@Sun.COM char User[50]; 6982264Sjacobs 6992264Sjacobs char *destination = "unknown"; 7002264Sjacobs int32_t id = -1; 7019152SSonam.Gupta@Sun.COM static int check = 0; 7029152SSonam.Gupta@Sun.COM static char *uri = NULL; 7032264Sjacobs 7042264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 7058962SSonam.Gupta@Sun.COM "job-originating-user-name", &user); 7062264Sjacobs 7072264Sjacobs if ((users != NULL) && (match_user(user, users) < 0)) 7082264Sjacobs return (0); 7092264Sjacobs 7108321SSonam.Gupta@Sun.COM (void) papiAttributeListGetString(attrs, NULL, 7118321SSonam.Gupta@Sun.COM "job-originating-host-name", &host); 7128321SSonam.Gupta@Sun.COM 7139152SSonam.Gupta@Sun.COM if (check == 0) { 7149152SSonam.Gupta@Sun.COM /* 7159152SSonam.Gupta@Sun.COM * Read the attribute "job-printer-uri" 7169152SSonam.Gupta@Sun.COM * just once 7179152SSonam.Gupta@Sun.COM */ 7189152SSonam.Gupta@Sun.COM (void) papiAttributeListGetString(attrs, NULL, 7199152SSonam.Gupta@Sun.COM "job-printer-uri", &uri); 7209152SSonam.Gupta@Sun.COM check = 1; 7219152SSonam.Gupta@Sun.COM } 7229152SSonam.Gupta@Sun.COM 7239152SSonam.Gupta@Sun.COM if (host) { 7249152SSonam.Gupta@Sun.COM /* Check if it is local printer or remote printer */ 7259152SSonam.Gupta@Sun.COM uri_t *u = NULL; 7269152SSonam.Gupta@Sun.COM 7279152SSonam.Gupta@Sun.COM if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) { 7289152SSonam.Gupta@Sun.COM char *nodename = localhostname(); 7299152SSonam.Gupta@Sun.COM 7309152SSonam.Gupta@Sun.COM if ((u->host == NULL) || 7319152SSonam.Gupta@Sun.COM (strcasecmp(u->host, "localhost") == 0) || 7329152SSonam.Gupta@Sun.COM (strcasecmp(u->host, nodename) == 0)) { 7338321SSonam.Gupta@Sun.COM 7349152SSonam.Gupta@Sun.COM if (strcasecmp(host, nodename) == 0) { 7359152SSonam.Gupta@Sun.COM /* 7369152SSonam.Gupta@Sun.COM * Request submitted locally 7379152SSonam.Gupta@Sun.COM * for the local queue. 7389152SSonam.Gupta@Sun.COM * Hostname will not be displayed 7399152SSonam.Gupta@Sun.COM */ 7409152SSonam.Gupta@Sun.COM snprintf(User, sizeof (User), "%s", 7419152SSonam.Gupta@Sun.COM user); 7429152SSonam.Gupta@Sun.COM } 7439152SSonam.Gupta@Sun.COM else 7449152SSonam.Gupta@Sun.COM snprintf(User, sizeof (User), "%s@%s", 7459152SSonam.Gupta@Sun.COM user, host); 7469152SSonam.Gupta@Sun.COM } else if (uri != NULL) { 7479152SSonam.Gupta@Sun.COM /* 7489152SSonam.Gupta@Sun.COM * It's a remote printer. 7499152SSonam.Gupta@Sun.COM * In case of remote printers hostname is 7509152SSonam.Gupta@Sun.COM * always displayed. 7519152SSonam.Gupta@Sun.COM */ 7529152SSonam.Gupta@Sun.COM snprintf(User, sizeof (User), "%s@%s", 7539152SSonam.Gupta@Sun.COM user, host); 7549152SSonam.Gupta@Sun.COM } 7559152SSonam.Gupta@Sun.COM uri_free(u); 7569152SSonam.Gupta@Sun.COM } else { 7579152SSonam.Gupta@Sun.COM /* 7589152SSonam.Gupta@Sun.COM * If attribute "job-printer-uri" 7599152SSonam.Gupta@Sun.COM * cannot be read 7609152SSonam.Gupta@Sun.COM * by default append the hostname 7619152SSonam.Gupta@Sun.COM */ 7629152SSonam.Gupta@Sun.COM snprintf(User, sizeof (User), "%s@%s", user, host); 7639152SSonam.Gupta@Sun.COM } 7649152SSonam.Gupta@Sun.COM } else { 7659152SSonam.Gupta@Sun.COM /* 7669152SSonam.Gupta@Sun.COM * When print server is s10u4 and ipp service is used 7679152SSonam.Gupta@Sun.COM * "job-originating-hostname" attribute is not set 7689152SSonam.Gupta@Sun.COM * So get the host information from the uri 7699152SSonam.Gupta@Sun.COM */ 7709152SSonam.Gupta@Sun.COM uri_t *u = NULL; 7719152SSonam.Gupta@Sun.COM if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) { 7729152SSonam.Gupta@Sun.COM if ((u != NULL) && (u->host != NULL)) 7739152SSonam.Gupta@Sun.COM snprintf(User, sizeof (User), "%s@%s", 7749152SSonam.Gupta@Sun.COM user, u->host); 7759152SSonam.Gupta@Sun.COM else 7769152SSonam.Gupta@Sun.COM snprintf(User, sizeof (User), "%s", user); 7779152SSonam.Gupta@Sun.COM 7789152SSonam.Gupta@Sun.COM uri_free(u); 7799152SSonam.Gupta@Sun.COM } else 7809152SSonam.Gupta@Sun.COM snprintf(User, sizeof (User), "%s", user); 7819152SSonam.Gupta@Sun.COM } 7822264Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, "job-k-octets", &size); 7832264Sjacobs size *= 1024; /* for the approximate byte size */ 7842264Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, "job-octets", &size); 7852264Sjacobs 7862264Sjacobs (void) time(&clock); 7872264Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 7888962SSonam.Gupta@Sun.COM "time-at-creation", (int32_t *)&clock); 7892264Sjacobs (void) strftime(date, sizeof (date), "%b %d %R", localtime(&clock)); 7902264Sjacobs 7912264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 7928962SSonam.Gupta@Sun.COM "job-printer-uri", &destination); 7932264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 7948962SSonam.Gupta@Sun.COM "printer-name", &destination); 7952264Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 7968962SSonam.Gupta@Sun.COM "job-id", &id); 7979256SSonam.Gupta@Sun.COM 7989256SSonam.Gupta@Sun.COM snprintf(request, sizeof (request), "%s-%d", printer, id); 7992264Sjacobs 8002264Sjacobs if (show_rank != 0) { 8012264Sjacobs int32_t rank = -1; 8022264Sjacobs 8032264Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 8048962SSonam.Gupta@Sun.COM "number-of-intervening-jobs", &rank); 8052264Sjacobs rank++; 8062264Sjacobs 8072264Sjacobs printf("%3d %-21s %-14s %7ld %s", 8088321SSonam.Gupta@Sun.COM rank, request, User, size, date); 8092264Sjacobs } else 8108321SSonam.Gupta@Sun.COM printf("%-23s %-14s %7ld %s", request, User, size, date); 8112264Sjacobs 8122264Sjacobs (void) papiAttributeListGetInteger(attrs, NULL, 8138962SSonam.Gupta@Sun.COM "job-state", &jstate); 814*9257SGowtham.Thommandra@Sun.COM 815*9257SGowtham.Thommandra@Sun.COM if (jstate == 0x0001) 816*9257SGowtham.Thommandra@Sun.COM printf(gettext(" being held")); 817*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x0800) 818*9257SGowtham.Thommandra@Sun.COM printf(gettext(" notifying user")); 819*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x0040) 820*9257SGowtham.Thommandra@Sun.COM printf(gettext(" cancelled")); 821*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x0010) 822*9257SGowtham.Thommandra@Sun.COM printf(gettext(" finished printing")); 823*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x0008) 824*9257SGowtham.Thommandra@Sun.COM printf(gettext(" on %s"), destination); 825*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x2000) 826*9257SGowtham.Thommandra@Sun.COM printf(gettext(" held by admin")); 827*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x0002) 828*9257SGowtham.Thommandra@Sun.COM printf(gettext(" being filtered")); 829*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x0004) 830*9257SGowtham.Thommandra@Sun.COM printf(gettext(" filtered")); 831*9257SGowtham.Thommandra@Sun.COM else if (jstate == 0x0020) 832*9257SGowtham.Thommandra@Sun.COM printf(gettext(" held for change")); 8332264Sjacobs 8342264Sjacobs if (verbose == 1) { 8353125Sjacobs char *form = NULL; 8363125Sjacobs 8372264Sjacobs (void) papiAttributeListGetString(attrs, NULL, 8388962SSonam.Gupta@Sun.COM "output-device-assigned", &destination); 8392264Sjacobs printf("\n\t assigned %s", destination); 8403127Sjacobs 8413125Sjacobs (void) papiAttributeListGetString(attrs, NULL, "form", &form); 8423125Sjacobs if (form != NULL) 8433125Sjacobs printf(", form %s", form); 8442264Sjacobs } else if (verbose > 1) { 8452264Sjacobs printf("\n"); 8462264Sjacobs papiAttributeListPrint(stdout, attrs, "\t"); 8472264Sjacobs } 8482264Sjacobs 8492264Sjacobs printf("\n"); 8502264Sjacobs 8512264Sjacobs return (0); 8522264Sjacobs } 8532264Sjacobs 8542264Sjacobs static int 8559256SSonam.Gupta@Sun.COM job_query(char *request, int (*report)(char *, papi_job_t, int, int), 8562264Sjacobs papi_encryption_t encryption, int show_rank, int verbose) 8572264Sjacobs { 8582264Sjacobs int result = 0; 8592264Sjacobs papi_status_t status; 8602264Sjacobs papi_service_t svc = NULL; 8618295SSonam.Gupta@Sun.COM char *printer = request; 8622264Sjacobs int32_t id = -1; 8638295SSonam.Gupta@Sun.COM int flag1 = 0; 8648295SSonam.Gupta@Sun.COM int flag = 1; 8658295SSonam.Gupta@Sun.COM int print_flag = 0; 8662264Sjacobs 8678295SSonam.Gupta@Sun.COM do { 8688295SSonam.Gupta@Sun.COM status = papiServiceCreate(&svc, printer, NULL, NULL, 8698962SSonam.Gupta@Sun.COM cli_auth_callback, encryption, NULL); 8702264Sjacobs 8718295SSonam.Gupta@Sun.COM if ((status == PAPI_OK) && (printer != NULL)) 8728295SSonam.Gupta@Sun.COM print_flag = 1; 8732264Sjacobs 8748295SSonam.Gupta@Sun.COM /* <name>-# printer name does not exist */ 8758295SSonam.Gupta@Sun.COM if (status != PAPI_OK) { 8768295SSonam.Gupta@Sun.COM /* 8778295SSonam.Gupta@Sun.COM * Check if <name>-# is a request-id 8788295SSonam.Gupta@Sun.COM * Once this check is done flag1 is set 8798295SSonam.Gupta@Sun.COM */ 8808295SSonam.Gupta@Sun.COM if (flag1 == 1) 8818295SSonam.Gupta@Sun.COM break; 8828295SSonam.Gupta@Sun.COM 8838295SSonam.Gupta@Sun.COM get_printer_id(printer, &printer, &id); 8842264Sjacobs 8858295SSonam.Gupta@Sun.COM status = papiServiceCreate(&svc, printer, NULL, NULL, 8868962SSonam.Gupta@Sun.COM cli_auth_callback, encryption, NULL); 8872264Sjacobs 8888295SSonam.Gupta@Sun.COM if (status != PAPI_OK) { 8898295SSonam.Gupta@Sun.COM fprintf(stderr, gettext( 8908295SSonam.Gupta@Sun.COM "Failed to contact service for %s: %s\n"), 8918295SSonam.Gupta@Sun.COM (printer ? printer : "all"), 8928295SSonam.Gupta@Sun.COM verbose_papi_message(svc, status)); 8938295SSonam.Gupta@Sun.COM return (-1); 8948295SSonam.Gupta@Sun.COM } 8952264Sjacobs } 8962264Sjacobs 8978295SSonam.Gupta@Sun.COM if (printer == NULL) { /* all */ 8988295SSonam.Gupta@Sun.COM char **interest = interest_list(svc); 8998295SSonam.Gupta@Sun.COM 9008295SSonam.Gupta@Sun.COM if (interest != NULL) { 9018295SSonam.Gupta@Sun.COM int i; 9028295SSonam.Gupta@Sun.COM 9038295SSonam.Gupta@Sun.COM for (i = 0; interest[i] != NULL; i++) 9048295SSonam.Gupta@Sun.COM result += job_query(interest[i], report, 9058962SSonam.Gupta@Sun.COM encryption, show_rank, verbose); 9068295SSonam.Gupta@Sun.COM } 9078295SSonam.Gupta@Sun.COM } else if (id == -1) { /* a printer */ 9088295SSonam.Gupta@Sun.COM papi_job_t *jobs = NULL; 9098295SSonam.Gupta@Sun.COM 9108295SSonam.Gupta@Sun.COM status = papiPrinterListJobs(svc, printer, NULL, 9118962SSonam.Gupta@Sun.COM 0, 0, &jobs); 9128295SSonam.Gupta@Sun.COM if (status != PAPI_OK) { 9138295SSonam.Gupta@Sun.COM fprintf(stderr, gettext( 9148295SSonam.Gupta@Sun.COM "Failed to get job list: %s\n"), 9158295SSonam.Gupta@Sun.COM verbose_papi_message(svc, status)); 9168295SSonam.Gupta@Sun.COM papiServiceDestroy(svc); 9178295SSonam.Gupta@Sun.COM return (-1); 9188295SSonam.Gupta@Sun.COM } 9198295SSonam.Gupta@Sun.COM 9208295SSonam.Gupta@Sun.COM if (jobs != NULL) { 9218295SSonam.Gupta@Sun.COM int i; 9222264Sjacobs 9238295SSonam.Gupta@Sun.COM for (i = 0; jobs[i] != NULL; i++) 9249256SSonam.Gupta@Sun.COM result += report(printer, 9259256SSonam.Gupta@Sun.COM jobs[i], show_rank, 9269256SSonam.Gupta@Sun.COM verbose); 9278295SSonam.Gupta@Sun.COM } 9288295SSonam.Gupta@Sun.COM 9298295SSonam.Gupta@Sun.COM papiJobListFree(jobs); 9308295SSonam.Gupta@Sun.COM } else { /* a job */ 9318295SSonam.Gupta@Sun.COM papi_job_t job = NULL; 9328295SSonam.Gupta@Sun.COM 9338295SSonam.Gupta@Sun.COM /* Once a job has been found stop processing */ 9348295SSonam.Gupta@Sun.COM flag = 0; 9358295SSonam.Gupta@Sun.COM 9368295SSonam.Gupta@Sun.COM status = papiJobQuery(svc, printer, id, NULL, &job); 9378295SSonam.Gupta@Sun.COM if (status != PAPI_OK) { 9388295SSonam.Gupta@Sun.COM if (!print_flag) 9398295SSonam.Gupta@Sun.COM fprintf(stderr, gettext( 9408962SSonam.Gupta@Sun.COM "Failed to get job"\ 9418962SSonam.Gupta@Sun.COM " info for %s: %s\n"), 9428962SSonam.Gupta@Sun.COM request, 9438962SSonam.Gupta@Sun.COM verbose_papi_message(svc, status)); 9448295SSonam.Gupta@Sun.COM papiServiceDestroy(svc); 9458295SSonam.Gupta@Sun.COM return (-1); 9468295SSonam.Gupta@Sun.COM } 9478295SSonam.Gupta@Sun.COM 9488295SSonam.Gupta@Sun.COM if (job != NULL) 9499256SSonam.Gupta@Sun.COM result = report(printer, job, 9509256SSonam.Gupta@Sun.COM show_rank, verbose); 9518295SSonam.Gupta@Sun.COM 9528295SSonam.Gupta@Sun.COM papiJobFree(job); 9532264Sjacobs } 9542264Sjacobs 9558295SSonam.Gupta@Sun.COM if (flag) { 9568295SSonam.Gupta@Sun.COM id = -1; 9578295SSonam.Gupta@Sun.COM get_printer_id(printer, &printer, &id); 9588295SSonam.Gupta@Sun.COM if (id == -1) 9598295SSonam.Gupta@Sun.COM flag = 0; 9608295SSonam.Gupta@Sun.COM else 9618295SSonam.Gupta@Sun.COM flag1 = 1; 9622264Sjacobs } 9638295SSonam.Gupta@Sun.COM } while (flag); 9642264Sjacobs 9652264Sjacobs papiServiceDestroy(svc); 9662264Sjacobs 9672264Sjacobs return (result); 9682264Sjacobs } 9692264Sjacobs 9702264Sjacobs static int 9712264Sjacobs report_form(char *name, papi_attribute_t **attrs, int verbose) 9722264Sjacobs { 9732264Sjacobs papi_status_t status; 9742264Sjacobs char *form = NULL; 9752264Sjacobs void *iter = NULL; 9762264Sjacobs 9772264Sjacobs for (status = papiAttributeListGetString(attrs, &iter, 9788962SSonam.Gupta@Sun.COM "form-supported", &form); 9798962SSonam.Gupta@Sun.COM status == PAPI_OK; 9808962SSonam.Gupta@Sun.COM status = papiAttributeListGetString(attrs, &iter, 9818962SSonam.Gupta@Sun.COM NULL, &form)) { 9822264Sjacobs if ((name == NULL) || (strcmp(name, form) == 0)) { 9832264Sjacobs printf(gettext("form %s is available to you\n"), form); 9842264Sjacobs if (verbose != 0) { 9852264Sjacobs char *detail = NULL; 9862264Sjacobs status = papiAttributeListGetString(attrs, NULL, 9878962SSonam.Gupta@Sun.COM "form-supported-detail", &detail); 9882264Sjacobs if (status == PAPI_OK) 9892264Sjacobs printf("%s\n", detail); 9902264Sjacobs } 9912264Sjacobs } 9922264Sjacobs } 9932264Sjacobs 9942264Sjacobs return (0); 9952264Sjacobs } 9962264Sjacobs 9972264Sjacobs static int 9982264Sjacobs report_print_wheels(char *name, papi_attribute_t **attrs, int verbose) 9992264Sjacobs { 10002264Sjacobs papi_status_t status; 10012264Sjacobs char *pw = NULL; 10022264Sjacobs void *iter = NULL; 10032264Sjacobs 10042264Sjacobs for (status = papiAttributeListGetString(attrs, &iter, 10058962SSonam.Gupta@Sun.COM "pw-supported", &pw); 10068962SSonam.Gupta@Sun.COM status == PAPI_OK; 10078962SSonam.Gupta@Sun.COM status = papiAttributeListGetString(attrs, &iter, NULL, &pw)) { 10082264Sjacobs if ((name == NULL) || (strcmp(name, pw) == 0)) { 10092264Sjacobs printf(gettext("charset %s is available\n"), pw); 10102264Sjacobs if (verbose != 0) { 10112264Sjacobs char *info = NULL; 10122264Sjacobs status = papiAttributeListGetString(attrs, NULL, 10138962SSonam.Gupta@Sun.COM "pw-supported-extra", &info); 10142264Sjacobs if (status == PAPI_OK) 10152264Sjacobs printf("%s\n", info); 10162264Sjacobs } 10172264Sjacobs } 10182264Sjacobs } 10192264Sjacobs 10202264Sjacobs return (0); 10212264Sjacobs } 10222264Sjacobs 10232264Sjacobs static int 10242264Sjacobs service_query(char *name, int (*report)(char *, papi_attribute_t **, int), 10252264Sjacobs papi_encryption_t encryption, int verbose) 10262264Sjacobs { 10272264Sjacobs int result = 0; 10282264Sjacobs papi_status_t status; 10292264Sjacobs papi_service_t svc = NULL; 10302264Sjacobs papi_attribute_t **attrs = NULL; 10312264Sjacobs 10322264Sjacobs status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback, 10338962SSonam.Gupta@Sun.COM encryption, NULL); 10342264Sjacobs if (status != PAPI_OK) { 10352264Sjacobs papiServiceDestroy(svc); 10362264Sjacobs return (-1); 10372264Sjacobs } 10382264Sjacobs 10392264Sjacobs attrs = papiServiceGetAttributeList(svc); 10402264Sjacobs if (attrs != NULL) { 10412264Sjacobs result = report(name, attrs, verbose); 10422264Sjacobs 10432264Sjacobs if (verbose > 1) { 10442264Sjacobs printf("\n"); 10452264Sjacobs papiAttributeListPrint(stdout, attrs, "\t"); 10462264Sjacobs printf("\n"); 10472264Sjacobs } 10482264Sjacobs } 10492264Sjacobs 10502264Sjacobs papiServiceDestroy(svc); 10512264Sjacobs 10522264Sjacobs return (result); 10532264Sjacobs } 10542264Sjacobs 10552264Sjacobs int 10562264Sjacobs main(int ac, char *av[]) 10572264Sjacobs { 10582264Sjacobs int exit_code = 0; 10592264Sjacobs papi_encryption_t encryption = PAPI_ENCRYPT_NEVER; 10602264Sjacobs int rank = 0; 10612264Sjacobs int verbose = 0; 10622264Sjacobs int description = 0; 10632264Sjacobs int c; 10642264Sjacobs char **argv; 10652264Sjacobs 10662264Sjacobs (void) setlocale(LC_ALL, ""); 10672264Sjacobs (void) textdomain("SUNW_OST_OSCMD"); 10682264Sjacobs 10692264Sjacobs argv = (char **)calloc((ac + 1), sizeof (char *)); 10704286Swendyp for (c = 0; c < ac; c++) { 10714286Swendyp if ((av[c][0] == '-') && (av[c][1] == 'l') && 10728962SSonam.Gupta@Sun.COM (isalpha(av[c][2]) != 0)) { 10734286Swendyp /* preserve old "-l[po...]" behavior */ 10744286Swendyp argv[c] = &av[c][1]; 10754286Swendyp argv[c][0] = '-'; 10764286Swendyp verbose = 1; 10774286Swendyp 10784286Swendyp } else 10794286Swendyp argv[c] = av[c]; 10804286Swendyp } 10814286Swendyp 10822264Sjacobs argv[c++] = "--"; 10832264Sjacobs ac = c; 10842264Sjacobs 10852264Sjacobs /* preprocess argument list looking for '-l' or '-R' so it can trail */ 10862264Sjacobs while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF) 10872264Sjacobs switch (c) { 10882264Sjacobs case 'l': 10892264Sjacobs if ((optarg == NULL) || (optarg[0] == '-')) 10902264Sjacobs optarg = "1"; 10912264Sjacobs verbose = atoi(optarg); 10922264Sjacobs break; 10932264Sjacobs case 'D': 10942264Sjacobs description = 1; 10952264Sjacobs break; 10962264Sjacobs case 'R': 10972264Sjacobs rank = 1; 10982264Sjacobs break; 10992264Sjacobs case 'E': 11002264Sjacobs encryption = PAPI_ENCRYPT_REQUIRED; 11012264Sjacobs break; 11022264Sjacobs default: 11032264Sjacobs break; 11042264Sjacobs } 11052264Sjacobs optind = 1; 11062264Sjacobs 11072264Sjacobs /* process command line arguments */ 11082264Sjacobs while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF) { 11092264Sjacobs switch (c) { /* these may or may not have an option */ 11102264Sjacobs case 'a': 11112264Sjacobs case 'c': 11122264Sjacobs case 'p': 11132264Sjacobs case 'o': 11142264Sjacobs case 'R': 11152264Sjacobs case 'u': 11162264Sjacobs case 'v': 11172264Sjacobs case 'l': 11182264Sjacobs case 'f': 11192264Sjacobs case 'S': 11202264Sjacobs if (optarg[0] == '-') { 11212264Sjacobs /* this check stop a possible infinite loop */ 11222264Sjacobs if ((optind > 1) && (argv[optind-1][1] != c)) 11232264Sjacobs optind--; 11242264Sjacobs optarg = NULL; 11252264Sjacobs } else if (strcmp(optarg, "all") == 0) 11262264Sjacobs optarg = NULL; 11272264Sjacobs } 11282264Sjacobs 11292264Sjacobs switch (c) { 11302264Sjacobs case 'a': 11312264Sjacobs exit_code += printer_query(optarg, report_accepting, 11328962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11332264Sjacobs break; 11342264Sjacobs case 'c': 11352264Sjacobs exit_code += printer_query(optarg, report_class, 11368962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11372264Sjacobs break; 11382264Sjacobs case 'p': 11392264Sjacobs exit_code += printer_query(optarg, report_printer, 11408962SSonam.Gupta@Sun.COM encryption, verbose, description); 11412264Sjacobs break; 11422264Sjacobs case 'd': 11432264Sjacobs exit_code += lpstat_default_printer(encryption); 11442264Sjacobs break; 11452264Sjacobs case 'r': 11462264Sjacobs exit_code += lpstat_service_status(encryption); 11472264Sjacobs break; 11482264Sjacobs case 'u': 11492264Sjacobs if (optarg != NULL) 11502264Sjacobs users = strsplit(optarg, ", \n"); 11512264Sjacobs exit_code += job_query(NULL, report_job, 11528962SSonam.Gupta@Sun.COM encryption, rank, verbose); 11532264Sjacobs if (users != NULL) { 11542264Sjacobs free(users); 11552264Sjacobs users = NULL; 11562264Sjacobs } 11572264Sjacobs break; 11582264Sjacobs case 'v': 11592264Sjacobs exit_code += printer_query(optarg, report_device, 11608962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11612264Sjacobs break; 11628604SGowtham.Thommandra@Sun.COM case 'R': /* set "rank" flag in first pass */ 11632264Sjacobs case 'o': 11642264Sjacobs exit_code += job_query(optarg, report_job, 11658962SSonam.Gupta@Sun.COM encryption, rank, verbose); 11662264Sjacobs break; 11672264Sjacobs case 'f': 11682264Sjacobs exit_code += service_query(optarg, report_form, 11698962SSonam.Gupta@Sun.COM encryption, verbose); 11702264Sjacobs break; 11712264Sjacobs case 'S': 11722264Sjacobs exit_code += service_query(optarg, report_print_wheels, 11738962SSonam.Gupta@Sun.COM encryption, verbose); 11742264Sjacobs break; 11752264Sjacobs case 's': 11762264Sjacobs exit_code += lpstat_service_status(encryption); 11772264Sjacobs exit_code += lpstat_default_printer(encryption); 11782264Sjacobs exit_code += printer_query(NULL, report_class, 11798962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11802264Sjacobs exit_code += printer_query(NULL, report_device, 11818962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11822264Sjacobs exit_code += service_query(optarg, report_form, 11838962SSonam.Gupta@Sun.COM encryption, verbose); 11842264Sjacobs exit_code += service_query(optarg, report_print_wheels, 11858962SSonam.Gupta@Sun.COM encryption, verbose); 11862264Sjacobs break; 11872264Sjacobs case 't': 11882264Sjacobs exit_code += lpstat_service_status(encryption); 11892264Sjacobs exit_code += lpstat_default_printer(encryption); 11902264Sjacobs exit_code += printer_query(NULL, report_class, 11918962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11922264Sjacobs exit_code += printer_query(NULL, report_device, 11938962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11942264Sjacobs exit_code += printer_query(NULL, report_accepting, 11958962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11962264Sjacobs exit_code += printer_query(NULL, report_printer, 11978962SSonam.Gupta@Sun.COM encryption, verbose, 0); 11982264Sjacobs exit_code += service_query(optarg, report_form, 11998962SSonam.Gupta@Sun.COM encryption, verbose); 12002264Sjacobs exit_code += service_query(optarg, report_print_wheels, 12018962SSonam.Gupta@Sun.COM encryption, verbose); 12022264Sjacobs exit_code += job_query(NULL, report_job, 12038962SSonam.Gupta@Sun.COM encryption, rank, verbose); 12042264Sjacobs break; 12052264Sjacobs case 'L': /* local-only, ignored */ 12062264Sjacobs case 'l': /* increased verbose level in first pass */ 12072264Sjacobs case 'D': /* set "description" flag in first pass */ 12082264Sjacobs case 'E': /* set encryption in the first pass */ 12092264Sjacobs break; 12102264Sjacobs default: 12112264Sjacobs usage(av[0]); 12122264Sjacobs } 12132264Sjacobs } 12142264Sjacobs ac--; 12152264Sjacobs 12162264Sjacobs if (ac == 1) { /* report on my jobs */ 12172264Sjacobs struct passwd *pw = getpwuid(getuid()); 12182264Sjacobs 12192264Sjacobs if (pw != NULL) 12202264Sjacobs users = strsplit(pw->pw_name, ""); 12212264Sjacobs exit_code += job_query(NULL, report_job, encryption, 12228962SSonam.Gupta@Sun.COM rank, verbose); 12232264Sjacobs if (users != NULL) { 12242264Sjacobs free(users); 12252264Sjacobs users = NULL; 12262264Sjacobs } 12272264Sjacobs } else { 12282264Sjacobs for (c = optind; c < ac; c++) 12292264Sjacobs exit_code += job_query(argv[c], report_job, encryption, 12308962SSonam.Gupta@Sun.COM rank, verbose); 12312264Sjacobs } 12322264Sjacobs 12332264Sjacobs 12342264Sjacobs if (exit_code != 0) 12352264Sjacobs exit_code = 1; 12362264Sjacobs 12372264Sjacobs return (exit_code); 12382264Sjacobs } 1239