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]] "
54*8962SSonam.Gupta@Sun.COM 	    "[-c [list]] [-o [list] [-l]] [-R [list] [-l]] "
55*8962SSonam.Gupta@Sun.COM 	    "[-p [list] [-D] [-l]] [-v [list]] [-S [list] [-l]] "
56*8962SSonam.Gupta@Sun.COM 	    "[-f [list] [-l]] [-u list]\n"),
57*8962SSonam.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,
80*8962SSonam.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,
94*8962SSonam.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,
126*8962SSonam.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,
150*8962SSonam.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,
212*8962SSonam.Gupta@Sun.COM 		    "printer-name", &name);
2132264Sjacobs 		if (status != PAPI_OK)
2142264Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
215*8962SSonam.Gupta@Sun.COM 			    "printer-uri-supported", &name);
2162264Sjacobs 	}
2172264Sjacobs 
2182264Sjacobs 	if (name == NULL)
2192264Sjacobs 		return (-1);
2202264Sjacobs 
2212264Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
222*8962SSonam.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,
237*8962SSonam.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,
263*8962SSonam.Gupta@Sun.COM 		    "printer-name", &name);
2642264Sjacobs 		if (status != PAPI_OK)
2652264Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
266*8962SSonam.Gupta@Sun.COM 			    "printer-uri-supported", &name);
2672264Sjacobs 	}
2682264Sjacobs 	if (name == NULL)
2692264Sjacobs 		return (-1);
2702264Sjacobs 
2712264Sjacobs 	(void) papiAttributeListGetBoolean(attrs, NULL,
272*8962SSonam.Gupta@Sun.COM 	    "printer-is-accepting-jobs", &boolean);
2732264Sjacobs 	(void) time(&curr);
2742264Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
275*8962SSonam.Gupta@Sun.COM 	    "printer-up-time", &curr);
2762264Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
277*8962SSonam.Gupta@Sun.COM 	    "printer-state-time", &curr);
2782264Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
279*8962SSonam.Gupta@Sun.COM 	    "lpsched-reject-date", &curr);
2802264Sjacobs 
2812264Sjacobs 	if (boolean == PAPI_TRUE) {
2822264Sjacobs 		printf(gettext("%s accepting requests since %s\n"),
283*8962SSonam.Gupta@Sun.COM 		    name, nctime(&curr));
2842264Sjacobs 	} else {
2852264Sjacobs 		char *reason = "unknown reason";
2862264Sjacobs 
2872264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
288*8962SSonam.Gupta@Sun.COM 		    "lpsched-reject-reason", &reason);
2892264Sjacobs 
2902264Sjacobs 		printf(gettext("%s not accepting requests since %s\n\t%s\n"),
291*8962SSonam.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,
310*8962SSonam.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,
316*8962SSonam.Gupta@Sun.COM 		    "printer-name", &name);
3172264Sjacobs 		if (status != PAPI_OK)
3182264Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
319*8962SSonam.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)
326*8962SSonam.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;
347*8962SSonam.Gupta@Sun.COM 	papi_job_t *j = NULL;
3482264Sjacobs 
3492264Sjacobs 	status = papiAttributeListGetString(attrs, NULL,
350*8962SSonam.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,
356*8962SSonam.Gupta@Sun.COM 		    "printer-name", &name);
3572264Sjacobs 		if (status != PAPI_OK)
3582264Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
359*8962SSonam.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,
367*8962SSonam.Gupta@Sun.COM 	    "printer-state", &pstat);
3682264Sjacobs 
3692264Sjacobs 	switch (pstat) {
3702264Sjacobs 	case 0x03:	/* idle */
3712264Sjacobs 		printf(gettext("idle. enabled"));
3722264Sjacobs 		break;
373*8962SSonam.Gupta@Sun.COM 	case 0x04: /* processing */
374*8962SSonam.Gupta@Sun.COM 		status = papiPrinterListJobs(svc, name, NULL,
375*8962SSonam.Gupta@Sun.COM 		    0, 0, &j);
376*8962SSonam.Gupta@Sun.COM 
377*8962SSonam.Gupta@Sun.COM 		if (status == PAPI_OK) {
378*8962SSonam.Gupta@Sun.COM 			if (j != NULL) {
379*8962SSonam.Gupta@Sun.COM 				int i = 0;
380*8962SSonam.Gupta@Sun.COM 				int32_t jobid = 0;
381*8962SSonam.Gupta@Sun.COM 				int32_t jstate = 0;
382*8962SSonam.Gupta@Sun.COM 				int flag = 0;
383*8962SSonam.Gupta@Sun.COM 
384*8962SSonam.Gupta@Sun.COM 				for (i = 0; j[i] != NULL; ++i) {
385*8962SSonam.Gupta@Sun.COM 					attrs = papiJobGetAttributeList(j[i]);
386*8962SSonam.Gupta@Sun.COM 
387*8962SSonam.Gupta@Sun.COM 					papiAttributeListGetInteger(attrs,
388*8962SSonam.Gupta@Sun.COM 					    NULL, "job-state", &jstate);
389*8962SSonam.Gupta@Sun.COM 					papiAttributeListGetInteger(attrs,
390*8962SSonam.Gupta@Sun.COM 					    NULL, "job-id", &jobid);
3912264Sjacobs 
392*8962SSonam.Gupta@Sun.COM 					/*
393*8962SSonam.Gupta@Sun.COM 					 * If the job-state is not
394*8962SSonam.Gupta@Sun.COM 					 * "held", "cancelled" or
395*8962SSonam.Gupta@Sun.COM 					 * "completed" then only print.
396*8962SSonam.Gupta@Sun.COM 					 */
397*8962SSonam.Gupta@Sun.COM 					if ((jstate != 0x04) &&
398*8962SSonam.Gupta@Sun.COM 					    (jstate != 0x07) &&
399*8962SSonam.Gupta@Sun.COM 					    (jstate != 0x09)) {
400*8962SSonam.Gupta@Sun.COM 						if (flag == 0)
401*8962SSonam.Gupta@Sun.COM 							printf(gettext
402*8962SSonam.Gupta@Sun.COM 							    ("now printing"\
403*8962SSonam.Gupta@Sun.COM 							    " %s-%d. enabled"),
404*8962SSonam.Gupta@Sun.COM 							    name, jobid);
405*8962SSonam.Gupta@Sun.COM 						flag = 1;
406*8962SSonam.Gupta@Sun.COM 					}
407*8962SSonam.Gupta@Sun.COM 				}
408*8962SSonam.Gupta@Sun.COM 				papiJobListFree(j);
409*8962SSonam.Gupta@Sun.COM 			}
4102264Sjacobs 		}
4112264Sjacobs 		break;
4122264Sjacobs 	case 0x05:	/* stopped */
4132264Sjacobs 		printf(gettext("disabled"));
4142264Sjacobs 		break;
4152264Sjacobs 	default:
4162264Sjacobs 		printf(gettext("unknown state(0x%x)."), pstat);
4172264Sjacobs 		break;
4182264Sjacobs 	}
4192264Sjacobs 
4202264Sjacobs 	(void) time(&curr);
4212264Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
422*8962SSonam.Gupta@Sun.COM 	    "printer-up-time", &curr);
4232264Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
424*8962SSonam.Gupta@Sun.COM 	    "printer-state-time", &curr);
4252264Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
426*8962SSonam.Gupta@Sun.COM 	    "lpsched-disable-date", &curr);
4272264Sjacobs 	printf(gettext(" since %s. available.\n"), nctime(&curr));
4282264Sjacobs 
4292264Sjacobs 	if (pstat == 0x05) {
4302264Sjacobs 		char *reason = "unknown reason";
4312264Sjacobs 
4322264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
433*8962SSonam.Gupta@Sun.COM 		    "printer-state-reasons", &reason);
4342264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
435*8962SSonam.Gupta@Sun.COM 		    "lpsched-disable-reason", &reason);
4362264Sjacobs 		printf(gettext("\t%s\n"), reason);
4372264Sjacobs 	}
4382264Sjacobs 
4392264Sjacobs 	if (verbose == 1) {
4402264Sjacobs 		void *iter;
4412264Sjacobs 		char *str;
4422264Sjacobs 
4432264Sjacobs 		str = "";
4442264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
445*8962SSonam.Gupta@Sun.COM 		    "form-ready", &str);
4462264Sjacobs 		printf(gettext("\tForm mounted: %s\n"), str);
4472264Sjacobs 
4482264Sjacobs 		str = "";
4492264Sjacobs 		iter = NULL;
4502264Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
451*8962SSonam.Gupta@Sun.COM 		    "document-format-supported", &str);
4522264Sjacobs 		printf(gettext("\tContent types: %s"), str);
4532264Sjacobs 		while (papiAttributeListGetString(attrs, &iter, NULL, &str)
454*8962SSonam.Gupta@Sun.COM 		    == PAPI_OK)
4552264Sjacobs 			printf(", %s", str);
4562264Sjacobs 		printf("\n");
4572264Sjacobs 
4588534SSonam.Gupta@Sun.COM 		/* Display the printer description */
4598534SSonam.Gupta@Sun.COM 		print_description(attrs, name);
4602264Sjacobs 
4612264Sjacobs 		str = "";
4626676Swendyp 		iter = NULL;
4636676Swendyp 		(void) papiAttributeListGetString(attrs, &iter,
4646676Swendyp 		    "lpsched-printer-type", &str);
4656676Swendyp 		printf(gettext("\tPrinter types: %s"), str);
4666676Swendyp 		while (papiAttributeListGetString(attrs, &iter, NULL, &str)
4676676Swendyp 		    == PAPI_OK)
4686676Swendyp 			printf(", %s", str);
4696676Swendyp 		printf("\n");
4706676Swendyp 
4716676Swendyp 		str = "";
4722264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
473*8962SSonam.Gupta@Sun.COM 		    "lpsched-dial-info", &str);
4742264Sjacobs 		printf(gettext("\tConnection: %s\n"),
4757653SJonathan.Ca@Sun.COM 		    ((str[0] == '\0') ? gettext("direct") : str));
4762264Sjacobs 
4772264Sjacobs 		str = "";
4782264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
479*8962SSonam.Gupta@Sun.COM 		    "lpsched-interface-script", &str);
4802264Sjacobs 		printf(gettext("\tInterface: %s\n"), str);
4812264Sjacobs 
4822264Sjacobs 		str = NULL;
4832264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
484*8962SSonam.Gupta@Sun.COM 		    "ppd-file-uri", &str);
4852264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
486*8962SSonam.Gupta@Sun.COM 		    "lpsched-ppd-source-path", &str);
4872264Sjacobs 		if (str != NULL)
4882264Sjacobs 			printf(gettext("\tPPD: %s\n"), str);
4892264Sjacobs 
4902264Sjacobs 		str = NULL;
4912264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
492*8962SSonam.Gupta@Sun.COM 		    "lpsched-fault-alert-command", &str);
4932264Sjacobs 		if (str != NULL)
4942264Sjacobs 			printf(gettext("\tOn fault: %s\n"), str);
4952264Sjacobs 
4962264Sjacobs 		str = "";
4972264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
498*8962SSonam.Gupta@Sun.COM 		    "lpsched-fault-recovery", &str);
4992264Sjacobs 		printf(gettext("\tAfter fault: %s\n"),
500*8962SSonam.Gupta@Sun.COM 		    ((str[0] == '\0') ? gettext("continue") : str));
5012264Sjacobs 
5022264Sjacobs 		str = "(all)";
5032264Sjacobs 		iter = NULL;
5042264Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
505*8962SSonam.Gupta@Sun.COM 		    "requesting-user-name-allowed", &str);
5062264Sjacobs 		printf(gettext("\tUsers allowed:\n\t\t%s\n"),
507*8962SSonam.Gupta@Sun.COM 		    ((str[0] == '\0') ? gettext("(none)") : str));
5082264Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
5092264Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
510*8962SSonam.Gupta@Sun.COM 			    &str) == PAPI_OK)
5112264Sjacobs 				printf("\t\t%s\n", str);
5122264Sjacobs 
5132264Sjacobs 		str = NULL;
5142264Sjacobs 		iter = NULL;
5152264Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
516*8962SSonam.Gupta@Sun.COM 		    "requesting-user-name-denied", &str);
5172264Sjacobs 		if (str != NULL) {
5182264Sjacobs 			printf(gettext("\tUsers denied:\n\t\t%s\n"),
519*8962SSonam.Gupta@Sun.COM 			    ((str[0] == '\0') ? gettext("(none)") : str));
5202264Sjacobs 			if ((str != NULL) && (str[0] != '\0'))
5212264Sjacobs 				while (papiAttributeListGetString(attrs, &iter,
522*8962SSonam.Gupta@Sun.COM 				    NULL, &str) == PAPI_OK)
5232264Sjacobs 					printf("\t\t%s\n", str);
5242264Sjacobs 		}
5252264Sjacobs 
5268238SSonam.Gupta@Sun.COM 		str = "none";
5272264Sjacobs 		iter = NULL;
5282264Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
529*8962SSonam.Gupta@Sun.COM 		    "form-supported", &str);
5308238SSonam.Gupta@Sun.COM 		printf(gettext("\tForms allowed:\n\t\t(%s)\n"),
531*8962SSonam.Gupta@Sun.COM 		    ((str[0] == '\0') ? gettext("none") : str));
5322264Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
5332264Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
534*8962SSonam.Gupta@Sun.COM 			    &str) == PAPI_OK)
5358238SSonam.Gupta@Sun.COM 				printf("\t\t(%s)\n", str);
5362264Sjacobs 
5372264Sjacobs 		str = "";
5382264Sjacobs 		iter = NULL;
5392264Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
540*8962SSonam.Gupta@Sun.COM 		    "media-supported", &str);
5412264Sjacobs 		printf(gettext("\tMedia supported:\n\t\t%s\n"),
542*8962SSonam.Gupta@Sun.COM 		    ((str[0] == '\0') ? gettext("(none)") : str));
5432264Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
5442264Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
545*8962SSonam.Gupta@Sun.COM 			    &str) == PAPI_OK)
5462264Sjacobs 				printf("\t\t%s\n", str);
5472264Sjacobs 
5482264Sjacobs 		str = "";
5492264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
550*8962SSonam.Gupta@Sun.COM 		    "job-sheets-supported", &str);
5516676Swendyp 		if ((strcasecmp(str, "none")) == 0)
5526676Swendyp 			str = gettext("page never printed");
5536676Swendyp 		else if (strcasecmp(str, "optional") == 0)
5546676Swendyp 			str = gettext("not required");
5556676Swendyp 		else
5566676Swendyp 			str = gettext("required");
5576676Swendyp 
5586676Swendyp 		printf(gettext("\tBanner %s\n"), str);
5596676Swendyp 
5602264Sjacobs 
5612264Sjacobs 		str = "";
5622264Sjacobs 		iter = NULL;
5632264Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
564*8962SSonam.Gupta@Sun.COM 		    "lpsched-print-wheels", &str);
5652264Sjacobs 		printf(gettext("\tCharacter sets:\n\t\t%s\n"),
566*8962SSonam.Gupta@Sun.COM 		    ((str[0] == '\0') ? gettext("(none)") : str));
5672264Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
5682264Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
569*8962SSonam.Gupta@Sun.COM 			    &str) == PAPI_OK)
5702264Sjacobs 				printf("\t\t%s\n", str);
5712264Sjacobs 
5722264Sjacobs 		printf(gettext("\tDefault pitch:\n"));
5732264Sjacobs 		printf(gettext("\tDefault page size:\n"));
5742264Sjacobs 		printf(gettext("\tDefault port setting:\n"));
5752264Sjacobs 
5762264Sjacobs 		str = "";
5772264Sjacobs 		iter = NULL;
5782264Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
579*8962SSonam.Gupta@Sun.COM 		    "lpsched-options", &str);
5802264Sjacobs 		if (str != NULL) {
5812264Sjacobs 			printf(gettext("\tOptions: %s"), str);
5822264Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
583*8962SSonam.Gupta@Sun.COM 			    &str) == PAPI_OK)
5842264Sjacobs 				printf(", %s", str);
5852264Sjacobs 			printf("\n");
5862264Sjacobs 		}
5872264Sjacobs 
5888534SSonam.Gupta@Sun.COM 	} else if (description == 1)
5898534SSonam.Gupta@Sun.COM 		/* Display printer description */
5908534SSonam.Gupta@Sun.COM 		print_description(attrs, name);
5918534SSonam.Gupta@Sun.COM 	else if (verbose > 1)
5922264Sjacobs 		papiAttributeListPrint(stdout, attrs, "\t");
5932264Sjacobs 
5942264Sjacobs 	if (verbose > 0)
5952264Sjacobs 		printf("\n");
5962264Sjacobs 
5972264Sjacobs 	return (0);
5982264Sjacobs }
5992264Sjacobs 
6002264Sjacobs static int
6012264Sjacobs printer_query(char *name, int (*report)(papi_service_t, char *, papi_printer_t,
6022264Sjacobs 					int, int), papi_encryption_t encryption,
6032264Sjacobs 		int verbose, int description)
6042264Sjacobs {
6052264Sjacobs 	int result = 0;
6062264Sjacobs 	papi_status_t status;
6072264Sjacobs 	papi_service_t svc = NULL;
6082264Sjacobs 
6092264Sjacobs 	status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback,
610*8962SSonam.Gupta@Sun.COM 	    encryption, NULL);
6112264Sjacobs 	if (status != PAPI_OK) {
6124062Sjacobs 		if (status == PAPI_NOT_FOUND)
6134062Sjacobs 			fprintf(stderr, gettext("%s: unknown printer\n"),
614*8962SSonam.Gupta@Sun.COM 			    name ? name : "(NULL)");
6154062Sjacobs 		else
6164062Sjacobs 			fprintf(stderr, gettext(
617*8962SSonam.Gupta@Sun.COM 			    "Failed to contact service for %s: %s\n"),
618*8962SSonam.Gupta@Sun.COM 			    name ? name : "(NULL)",
619*8962SSonam.Gupta@Sun.COM 			    verbose_papi_message(svc, status));
6202264Sjacobs 		papiServiceDestroy(svc);
6212264Sjacobs 		return (-1);
6222264Sjacobs 	}
6232264Sjacobs 
6242264Sjacobs 	if (name == NULL) { /* all */
6252264Sjacobs 		char **interest = interest_list(svc);
6262264Sjacobs 
6272264Sjacobs 		if (interest != NULL) {
6282264Sjacobs 			int i;
6292264Sjacobs 
6302264Sjacobs 			for (i = 0; interest[i] != NULL; i++)
6312264Sjacobs 				result += printer_query(interest[i], report,
632*8962SSonam.Gupta@Sun.COM 				    encryption, verbose,
633*8962SSonam.Gupta@Sun.COM 				    description);
6342264Sjacobs 		}
6352264Sjacobs 	} else {
6362264Sjacobs 		papi_printer_t printer = NULL;
6372264Sjacobs 		char **keys = NULL;
6382264Sjacobs 
6392264Sjacobs 		/*
6402264Sjacobs 		 * Limit the query to only required data to reduce the need
6412264Sjacobs 		 * to go remote for information.
6422264Sjacobs 		 */
6432264Sjacobs 		if (report == report_device)
6442264Sjacobs 			keys = report_device_keys;
6452264Sjacobs 		else if (report == report_class)
6462264Sjacobs 			keys = report_class_keys;
6472264Sjacobs 		else if (report == report_accepting)
6482264Sjacobs 			keys = report_accepting_keys;
6492264Sjacobs 		else if ((report == report_printer) && (verbose == 0))
6502264Sjacobs 			keys = report_printer_keys;
6512264Sjacobs 
6522264Sjacobs 		status = papiPrinterQuery(svc, name, keys, NULL, &printer);
6532264Sjacobs 		if (status != PAPI_OK) {
6542264Sjacobs 			fprintf(stderr, gettext(
655*8962SSonam.Gupta@Sun.COM 			    "Failed to get printer info for %s: %s\n"),
656*8962SSonam.Gupta@Sun.COM 			    name, verbose_papi_message(svc, status));
6572264Sjacobs 			papiServiceDestroy(svc);
6582264Sjacobs 			return (-1);
6592264Sjacobs 		}
6602264Sjacobs 
6612264Sjacobs 		if (printer != NULL)
6622264Sjacobs 			result = report(svc, name, printer, verbose,
663*8962SSonam.Gupta@Sun.COM 			    description);
6642264Sjacobs 
6652264Sjacobs 		papiPrinterFree(printer);
6662264Sjacobs 	}
6672264Sjacobs 
6682264Sjacobs 	papiServiceDestroy(svc);
6692264Sjacobs 
6702264Sjacobs 	return (result);
6712264Sjacobs }
6722264Sjacobs 
6732264Sjacobs static int
6742264Sjacobs match_user(char *user, char **list)
6752264Sjacobs {
6762264Sjacobs 	int i;
6772264Sjacobs 
6782264Sjacobs 	for (i = 0; list[i] != NULL; i++) {
6792264Sjacobs 		if (strcmp(user, list[i]) == 0)
6802264Sjacobs 			return (0);
6812264Sjacobs 	}
6822264Sjacobs 
6832264Sjacobs 	return (-1);
6842264Sjacobs }
6852264Sjacobs 
6862264Sjacobs static char **users = NULL;
6872264Sjacobs 
6882264Sjacobs static int
6892264Sjacobs report_job(papi_job_t job, int show_rank, int verbose)
6902264Sjacobs {
6912264Sjacobs 	papi_attribute_t **attrs = papiJobGetAttributeList(job);
6922264Sjacobs 	time_t clock = 0;
6932264Sjacobs 	char date[24];
6942264Sjacobs 	char request[26];
6952264Sjacobs 	char *user = "unknown";
6968321SSonam.Gupta@Sun.COM 	char *host = NULL;
6972264Sjacobs 	int32_t size = 0;
6982264Sjacobs 	int32_t jstate = 0;
6998321SSonam.Gupta@Sun.COM 	char User[50];
7002264Sjacobs 
7012264Sjacobs 	char *destination = "unknown";
7022264Sjacobs 	int32_t id = -1;
7032264Sjacobs 
7042264Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
705*8962SSonam.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 
7138321SSonam.Gupta@Sun.COM 	if (host)
7148321SSonam.Gupta@Sun.COM 		snprintf(User, sizeof (User), "%s@%s", user, host);
7158321SSonam.Gupta@Sun.COM 	else
7168321SSonam.Gupta@Sun.COM 		snprintf(User, sizeof (User), "%s", user);
7178321SSonam.Gupta@Sun.COM 
7182264Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL, "job-k-octets", &size);
7192264Sjacobs 	size *= 1024;	/* for the approximate byte size */
7202264Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL, "job-octets", &size);
7212264Sjacobs 
7222264Sjacobs 	(void) time(&clock);
7232264Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL,
724*8962SSonam.Gupta@Sun.COM 	    "time-at-creation", (int32_t *)&clock);
7252264Sjacobs 	(void) strftime(date, sizeof (date), "%b %d %R", localtime(&clock));
7262264Sjacobs 
7272264Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
728*8962SSonam.Gupta@Sun.COM 	    "job-printer-uri", &destination);
7292264Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
730*8962SSonam.Gupta@Sun.COM 	    "printer-name", &destination);
7312264Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL,
732*8962SSonam.Gupta@Sun.COM 	    "job-id", &id);
7332264Sjacobs 	snprintf(request, sizeof (request), "%s-%d", destination, id);
7342264Sjacobs 
7352264Sjacobs 	if (show_rank != 0) {
7362264Sjacobs 		int32_t rank = -1;
7372264Sjacobs 
7382264Sjacobs 		(void) papiAttributeListGetInteger(attrs, NULL,
739*8962SSonam.Gupta@Sun.COM 		    "number-of-intervening-jobs", &rank);
7402264Sjacobs 		rank++;
7412264Sjacobs 
7422264Sjacobs 		printf("%3d %-21s %-14s %7ld %s",
7438321SSonam.Gupta@Sun.COM 		    rank, request, User, size, date);
7442264Sjacobs 	} else
7458321SSonam.Gupta@Sun.COM 		printf("%-23s %-14s %7ld   %s", request, User, size, date);
7462264Sjacobs 
7472264Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL,
748*8962SSonam.Gupta@Sun.COM 	    "job-state", &jstate);
7492264Sjacobs 	if (jstate == 0x04)
7502264Sjacobs 		printf(gettext(", being held"));
7512264Sjacobs 	else if (jstate == 0x07)
7522264Sjacobs 		printf(gettext(", cancelled"));
7532264Sjacobs 	else if (jstate == 0x09)
7542264Sjacobs 		printf(gettext(", complete"));
7552264Sjacobs 
7562264Sjacobs 	if (verbose == 1) {
7573125Sjacobs 		char *form = NULL;
7583125Sjacobs 
7592264Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
760*8962SSonam.Gupta@Sun.COM 		    "output-device-assigned", &destination);
7612264Sjacobs 		printf("\n\t assigned %s", destination);
7623127Sjacobs 
7633125Sjacobs 		(void) papiAttributeListGetString(attrs, NULL, "form", &form);
7643125Sjacobs 		if (form != NULL)
7653125Sjacobs 			printf(", form %s", form);
7662264Sjacobs 	} else if (verbose > 1) {
7672264Sjacobs 		printf("\n");
7682264Sjacobs 		papiAttributeListPrint(stdout, attrs, "\t");
7692264Sjacobs 	}
7702264Sjacobs 
7712264Sjacobs 	printf("\n");
7722264Sjacobs 
7732264Sjacobs 	return (0);
7742264Sjacobs }
7752264Sjacobs 
7762264Sjacobs static int
7772264Sjacobs job_query(char *request, int (*report)(papi_job_t, int, int),
7782264Sjacobs 		papi_encryption_t encryption, int show_rank, int verbose)
7792264Sjacobs {
7802264Sjacobs 	int result = 0;
7812264Sjacobs 	papi_status_t status;
7822264Sjacobs 	papi_service_t svc = NULL;
7838295SSonam.Gupta@Sun.COM 	char *printer = request;
7842264Sjacobs 	int32_t id = -1;
7858295SSonam.Gupta@Sun.COM 	int flag1 = 0;
7868295SSonam.Gupta@Sun.COM 	int flag = 1;
7878295SSonam.Gupta@Sun.COM 	int print_flag = 0;
7882264Sjacobs 
7898295SSonam.Gupta@Sun.COM 	do {
7908295SSonam.Gupta@Sun.COM 		status = papiServiceCreate(&svc, printer, NULL, NULL,
791*8962SSonam.Gupta@Sun.COM 		    cli_auth_callback, encryption, NULL);
7922264Sjacobs 
7938295SSonam.Gupta@Sun.COM 		if ((status == PAPI_OK) && (printer != NULL))
7948295SSonam.Gupta@Sun.COM 			print_flag = 1;
7952264Sjacobs 
7968295SSonam.Gupta@Sun.COM 		/* <name>-# printer name does not exist */
7978295SSonam.Gupta@Sun.COM 		if (status != PAPI_OK) {
7988295SSonam.Gupta@Sun.COM 			/*
7998295SSonam.Gupta@Sun.COM 			 * Check if <name>-# is a request-id
8008295SSonam.Gupta@Sun.COM 			 * Once this check is done flag1 is set
8018295SSonam.Gupta@Sun.COM 			 */
8028295SSonam.Gupta@Sun.COM 			if (flag1 == 1)
8038295SSonam.Gupta@Sun.COM 				break;
8048295SSonam.Gupta@Sun.COM 
8058295SSonam.Gupta@Sun.COM 			get_printer_id(printer, &printer, &id);
8062264Sjacobs 
8078295SSonam.Gupta@Sun.COM 			status = papiServiceCreate(&svc, printer, NULL, NULL,
808*8962SSonam.Gupta@Sun.COM 			    cli_auth_callback, encryption, NULL);
8092264Sjacobs 
8108295SSonam.Gupta@Sun.COM 			if (status != PAPI_OK) {
8118295SSonam.Gupta@Sun.COM 				fprintf(stderr, gettext(
8128295SSonam.Gupta@Sun.COM 				    "Failed to contact service for %s: %s\n"),
8138295SSonam.Gupta@Sun.COM 				    (printer ? printer : "all"),
8148295SSonam.Gupta@Sun.COM 				    verbose_papi_message(svc, status));
8158295SSonam.Gupta@Sun.COM 				return (-1);
8168295SSonam.Gupta@Sun.COM 			}
8172264Sjacobs 		}
8182264Sjacobs 
8198295SSonam.Gupta@Sun.COM 		if (printer == NULL) { /* all */
8208295SSonam.Gupta@Sun.COM 			char **interest = interest_list(svc);
8218295SSonam.Gupta@Sun.COM 
8228295SSonam.Gupta@Sun.COM 			if (interest != NULL) {
8238295SSonam.Gupta@Sun.COM 				int i;
8248295SSonam.Gupta@Sun.COM 
8258295SSonam.Gupta@Sun.COM 				for (i = 0; interest[i] != NULL; i++)
8268295SSonam.Gupta@Sun.COM 					result += job_query(interest[i], report,
827*8962SSonam.Gupta@Sun.COM 					    encryption, show_rank, verbose);
8288295SSonam.Gupta@Sun.COM 			}
8298295SSonam.Gupta@Sun.COM 		} else if (id == -1) { /* a printer */
8308295SSonam.Gupta@Sun.COM 			papi_job_t *jobs = NULL;
8318295SSonam.Gupta@Sun.COM 
8328295SSonam.Gupta@Sun.COM 			status = papiPrinterListJobs(svc, printer, NULL,
833*8962SSonam.Gupta@Sun.COM 			    0, 0, &jobs);
8348295SSonam.Gupta@Sun.COM 			if (status != PAPI_OK) {
8358295SSonam.Gupta@Sun.COM 				fprintf(stderr, gettext(
8368295SSonam.Gupta@Sun.COM 				    "Failed to get job list: %s\n"),
8378295SSonam.Gupta@Sun.COM 				    verbose_papi_message(svc, status));
8388295SSonam.Gupta@Sun.COM 				papiServiceDestroy(svc);
8398295SSonam.Gupta@Sun.COM 				return (-1);
8408295SSonam.Gupta@Sun.COM 			}
8418295SSonam.Gupta@Sun.COM 
8428295SSonam.Gupta@Sun.COM 			if (jobs != NULL) {
8438295SSonam.Gupta@Sun.COM 				int i;
8442264Sjacobs 
8458295SSonam.Gupta@Sun.COM 				for (i = 0; jobs[i] != NULL; i++)
8468295SSonam.Gupta@Sun.COM 					result += report(jobs[i],
847*8962SSonam.Gupta@Sun.COM 					    show_rank, verbose);
8488295SSonam.Gupta@Sun.COM 			}
8498295SSonam.Gupta@Sun.COM 
8508295SSonam.Gupta@Sun.COM 			papiJobListFree(jobs);
8518295SSonam.Gupta@Sun.COM 		} else {	/* a job */
8528295SSonam.Gupta@Sun.COM 			papi_job_t job = NULL;
8538295SSonam.Gupta@Sun.COM 
8548295SSonam.Gupta@Sun.COM 			/* Once a job has been found stop processing */
8558295SSonam.Gupta@Sun.COM 			flag = 0;
8568295SSonam.Gupta@Sun.COM 
8578295SSonam.Gupta@Sun.COM 			status = papiJobQuery(svc, printer, id, NULL, &job);
8588295SSonam.Gupta@Sun.COM 			if (status != PAPI_OK) {
8598295SSonam.Gupta@Sun.COM 				if (!print_flag)
8608295SSonam.Gupta@Sun.COM 					fprintf(stderr, gettext(
861*8962SSonam.Gupta@Sun.COM 					    "Failed to get job"\
862*8962SSonam.Gupta@Sun.COM 					    " info for %s: %s\n"),
863*8962SSonam.Gupta@Sun.COM 					    request,
864*8962SSonam.Gupta@Sun.COM 					    verbose_papi_message(svc, status));
8658295SSonam.Gupta@Sun.COM 				papiServiceDestroy(svc);
8668295SSonam.Gupta@Sun.COM 				return (-1);
8678295SSonam.Gupta@Sun.COM 			}
8688295SSonam.Gupta@Sun.COM 
8698295SSonam.Gupta@Sun.COM 			if (job != NULL)
8708295SSonam.Gupta@Sun.COM 				result = report(job, show_rank, verbose);
8718295SSonam.Gupta@Sun.COM 
8728295SSonam.Gupta@Sun.COM 			papiJobFree(job);
8732264Sjacobs 		}
8742264Sjacobs 
8758295SSonam.Gupta@Sun.COM 		if (flag) {
8768295SSonam.Gupta@Sun.COM 			id = -1;
8778295SSonam.Gupta@Sun.COM 			get_printer_id(printer, &printer, &id);
8788295SSonam.Gupta@Sun.COM 			if (id == -1)
8798295SSonam.Gupta@Sun.COM 				flag = 0;
8808295SSonam.Gupta@Sun.COM 			else
8818295SSonam.Gupta@Sun.COM 				flag1 = 1;
8822264Sjacobs 		}
8838295SSonam.Gupta@Sun.COM 	} while (flag);
8842264Sjacobs 
8852264Sjacobs 	papiServiceDestroy(svc);
8862264Sjacobs 
8872264Sjacobs 	return (result);
8882264Sjacobs }
8892264Sjacobs 
8902264Sjacobs static int
8912264Sjacobs report_form(char *name, papi_attribute_t **attrs, int verbose)
8922264Sjacobs {
8932264Sjacobs 	papi_status_t status;
8942264Sjacobs 	char *form = NULL;
8952264Sjacobs 	void *iter = NULL;
8962264Sjacobs 
8972264Sjacobs 	for (status = papiAttributeListGetString(attrs, &iter,
898*8962SSonam.Gupta@Sun.COM 	    "form-supported", &form);
899*8962SSonam.Gupta@Sun.COM 	    status == PAPI_OK;
900*8962SSonam.Gupta@Sun.COM 	    status = papiAttributeListGetString(attrs, &iter,
901*8962SSonam.Gupta@Sun.COM 	    NULL, &form)) {
9022264Sjacobs 		if ((name == NULL) || (strcmp(name, form) == 0)) {
9032264Sjacobs 			printf(gettext("form %s is available to you\n"), form);
9042264Sjacobs 			if (verbose != 0) {
9052264Sjacobs 				char *detail = NULL;
9062264Sjacobs 				status = papiAttributeListGetString(attrs, NULL,
907*8962SSonam.Gupta@Sun.COM 				    "form-supported-detail", &detail);
9082264Sjacobs 				if (status == PAPI_OK)
9092264Sjacobs 					printf("%s\n", detail);
9102264Sjacobs 			}
9112264Sjacobs 		}
9122264Sjacobs 	}
9132264Sjacobs 
9142264Sjacobs 	return (0);
9152264Sjacobs }
9162264Sjacobs 
9172264Sjacobs static int
9182264Sjacobs report_print_wheels(char *name, papi_attribute_t **attrs, int verbose)
9192264Sjacobs {
9202264Sjacobs 	papi_status_t status;
9212264Sjacobs 	char *pw = NULL;
9222264Sjacobs 	void *iter = NULL;
9232264Sjacobs 
9242264Sjacobs 	for (status = papiAttributeListGetString(attrs, &iter,
925*8962SSonam.Gupta@Sun.COM 	    "pw-supported", &pw);
926*8962SSonam.Gupta@Sun.COM 	    status == PAPI_OK;
927*8962SSonam.Gupta@Sun.COM 	    status = papiAttributeListGetString(attrs, &iter, NULL, &pw)) {
9282264Sjacobs 		if ((name == NULL) || (strcmp(name, pw) == 0)) {
9292264Sjacobs 			printf(gettext("charset %s is available\n"), pw);
9302264Sjacobs 			if (verbose != 0) {
9312264Sjacobs 				char *info = NULL;
9322264Sjacobs 				status = papiAttributeListGetString(attrs, NULL,
933*8962SSonam.Gupta@Sun.COM 				    "pw-supported-extra", &info);
9342264Sjacobs 				if (status == PAPI_OK)
9352264Sjacobs 					printf("%s\n", info);
9362264Sjacobs 			}
9372264Sjacobs 		}
9382264Sjacobs 	}
9392264Sjacobs 
9402264Sjacobs 	return (0);
9412264Sjacobs }
9422264Sjacobs 
9432264Sjacobs static int
9442264Sjacobs service_query(char *name, int (*report)(char *, papi_attribute_t **, int),
9452264Sjacobs 		papi_encryption_t encryption, int verbose)
9462264Sjacobs {
9472264Sjacobs 	int result = 0;
9482264Sjacobs 	papi_status_t status;
9492264Sjacobs 	papi_service_t svc = NULL;
9502264Sjacobs 	papi_attribute_t **attrs = NULL;
9512264Sjacobs 
9522264Sjacobs 	status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback,
953*8962SSonam.Gupta@Sun.COM 	    encryption, NULL);
9542264Sjacobs 	if (status != PAPI_OK) {
9552264Sjacobs 		papiServiceDestroy(svc);
9562264Sjacobs 		return (-1);
9572264Sjacobs 	}
9582264Sjacobs 
9592264Sjacobs 	attrs = papiServiceGetAttributeList(svc);
9602264Sjacobs 	if (attrs != NULL) {
9612264Sjacobs 		result = report(name, attrs, verbose);
9622264Sjacobs 
9632264Sjacobs 		if (verbose > 1) {
9642264Sjacobs 			printf("\n");
9652264Sjacobs 			papiAttributeListPrint(stdout, attrs, "\t");
9662264Sjacobs 			printf("\n");
9672264Sjacobs 		}
9682264Sjacobs 	}
9692264Sjacobs 
9702264Sjacobs 	papiServiceDestroy(svc);
9712264Sjacobs 
9722264Sjacobs 	return (result);
9732264Sjacobs }
9742264Sjacobs 
9752264Sjacobs int
9762264Sjacobs main(int ac, char *av[])
9772264Sjacobs {
9782264Sjacobs 	int exit_code = 0;
9792264Sjacobs 	papi_encryption_t encryption = PAPI_ENCRYPT_NEVER;
9802264Sjacobs 	int rank = 0;
9812264Sjacobs 	int verbose = 0;
9822264Sjacobs 	int description = 0;
9832264Sjacobs 	int c;
9842264Sjacobs 	char **argv;
9852264Sjacobs 
9862264Sjacobs 	(void) setlocale(LC_ALL, "");
9872264Sjacobs 	(void) textdomain("SUNW_OST_OSCMD");
9882264Sjacobs 
9892264Sjacobs 	argv = (char **)calloc((ac + 1), sizeof (char *));
9904286Swendyp 	for (c = 0; c < ac; c++) {
9914286Swendyp 		if ((av[c][0] == '-') && (av[c][1] == 'l') &&
992*8962SSonam.Gupta@Sun.COM 		    (isalpha(av[c][2]) != 0)) {
9934286Swendyp 			/* preserve old "-l[po...]" behavior */
9944286Swendyp 			argv[c] = &av[c][1];
9954286Swendyp 			argv[c][0] = '-';
9964286Swendyp 			verbose = 1;
9974286Swendyp 
9984286Swendyp 		} else
9994286Swendyp 			argv[c] = av[c];
10004286Swendyp 	}
10014286Swendyp 
10022264Sjacobs 	argv[c++] = "--";
10032264Sjacobs 	ac = c;
10042264Sjacobs 
10052264Sjacobs 	/* preprocess argument list looking for '-l' or '-R' so it can trail */
10062264Sjacobs 	while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF)
10072264Sjacobs 		switch (c) {
10082264Sjacobs 		case 'l':
10092264Sjacobs 			if ((optarg == NULL) || (optarg[0] == '-'))
10102264Sjacobs 				optarg = "1";
10112264Sjacobs 			verbose = atoi(optarg);
10122264Sjacobs 			break;
10132264Sjacobs 		case 'D':
10142264Sjacobs 			description = 1;
10152264Sjacobs 			break;
10162264Sjacobs 		case 'R':
10172264Sjacobs 			rank = 1;
10182264Sjacobs 			break;
10192264Sjacobs 		case 'E':
10202264Sjacobs 			encryption = PAPI_ENCRYPT_REQUIRED;
10212264Sjacobs 			break;
10222264Sjacobs 		default:
10232264Sjacobs 			break;
10242264Sjacobs 		}
10252264Sjacobs 	optind = 1;
10262264Sjacobs 
10272264Sjacobs 	/* process command line arguments */
10282264Sjacobs 	while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF) {
10292264Sjacobs 		switch (c) {	/* these may or may not have an option */
10302264Sjacobs 		case 'a':
10312264Sjacobs 		case 'c':
10322264Sjacobs 		case 'p':
10332264Sjacobs 		case 'o':
10342264Sjacobs 		case 'R':
10352264Sjacobs 		case 'u':
10362264Sjacobs 		case 'v':
10372264Sjacobs 		case 'l':
10382264Sjacobs 		case 'f':
10392264Sjacobs 		case 'S':
10402264Sjacobs 			if (optarg[0] == '-') {
10412264Sjacobs 				/* this check stop a possible infinite loop */
10422264Sjacobs 				if ((optind > 1) && (argv[optind-1][1] != c))
10432264Sjacobs 					optind--;
10442264Sjacobs 				optarg = NULL;
10452264Sjacobs 			} else if (strcmp(optarg, "all") == 0)
10462264Sjacobs 				optarg = NULL;
10472264Sjacobs 		}
10482264Sjacobs 
10492264Sjacobs 		switch (c) {
10502264Sjacobs 		case 'a':
10512264Sjacobs 			exit_code += printer_query(optarg, report_accepting,
1052*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
10532264Sjacobs 			break;
10542264Sjacobs 		case 'c':
10552264Sjacobs 			exit_code += printer_query(optarg, report_class,
1056*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
10572264Sjacobs 			break;
10582264Sjacobs 		case 'p':
10592264Sjacobs 			exit_code += printer_query(optarg, report_printer,
1060*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, description);
10612264Sjacobs 			break;
10622264Sjacobs 		case 'd':
10632264Sjacobs 			exit_code += lpstat_default_printer(encryption);
10642264Sjacobs 			break;
10652264Sjacobs 		case 'r':
10662264Sjacobs 			exit_code += lpstat_service_status(encryption);
10672264Sjacobs 			break;
10682264Sjacobs 		case 'u':
10692264Sjacobs 			if (optarg != NULL)
10702264Sjacobs 				users = strsplit(optarg, ", \n");
10712264Sjacobs 			exit_code += job_query(NULL, report_job,
1072*8962SSonam.Gupta@Sun.COM 			    encryption, rank, verbose);
10732264Sjacobs 			if (users != NULL) {
10742264Sjacobs 				free(users);
10752264Sjacobs 				users = NULL;
10762264Sjacobs 			}
10772264Sjacobs 			break;
10782264Sjacobs 		case 'v':
10792264Sjacobs 			exit_code += printer_query(optarg, report_device,
1080*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
10812264Sjacobs 			break;
10828604SGowtham.Thommandra@Sun.COM 		case 'R':	/* set "rank" flag in first pass */
10832264Sjacobs 		case 'o':
10842264Sjacobs 			exit_code += job_query(optarg, report_job,
1085*8962SSonam.Gupta@Sun.COM 			    encryption, rank, verbose);
10862264Sjacobs 			break;
10872264Sjacobs 		case 'f':
10882264Sjacobs 			exit_code += service_query(optarg, report_form,
1089*8962SSonam.Gupta@Sun.COM 			    encryption, verbose);
10902264Sjacobs 			break;
10912264Sjacobs 		case 'S':
10922264Sjacobs 			exit_code += service_query(optarg, report_print_wheels,
1093*8962SSonam.Gupta@Sun.COM 			    encryption, verbose);
10942264Sjacobs 			break;
10952264Sjacobs 		case 's':
10962264Sjacobs 			exit_code += lpstat_service_status(encryption);
10972264Sjacobs 			exit_code += lpstat_default_printer(encryption);
10982264Sjacobs 			exit_code += printer_query(NULL, report_class,
1099*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
11002264Sjacobs 			exit_code += printer_query(NULL, report_device,
1101*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
11022264Sjacobs 			exit_code += service_query(optarg, report_form,
1103*8962SSonam.Gupta@Sun.COM 			    encryption, verbose);
11042264Sjacobs 			exit_code += service_query(optarg, report_print_wheels,
1105*8962SSonam.Gupta@Sun.COM 			    encryption, verbose);
11062264Sjacobs 			break;
11072264Sjacobs 		case 't':
11082264Sjacobs 			exit_code += lpstat_service_status(encryption);
11092264Sjacobs 			exit_code += lpstat_default_printer(encryption);
11102264Sjacobs 			exit_code += printer_query(NULL, report_class,
1111*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
11122264Sjacobs 			exit_code += printer_query(NULL, report_device,
1113*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
11142264Sjacobs 			exit_code += printer_query(NULL, report_accepting,
1115*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
11162264Sjacobs 			exit_code += printer_query(NULL, report_printer,
1117*8962SSonam.Gupta@Sun.COM 			    encryption, verbose, 0);
11182264Sjacobs 			exit_code += service_query(optarg, report_form,
1119*8962SSonam.Gupta@Sun.COM 			    encryption, verbose);
11202264Sjacobs 			exit_code += service_query(optarg, report_print_wheels,
1121*8962SSonam.Gupta@Sun.COM 			    encryption, verbose);
11222264Sjacobs 			exit_code += job_query(NULL, report_job,
1123*8962SSonam.Gupta@Sun.COM 			    encryption, rank, verbose);
11242264Sjacobs 			break;
11252264Sjacobs 		case 'L':	/* local-only, ignored */
11262264Sjacobs 		case 'l':	/* increased verbose level in first pass */
11272264Sjacobs 		case 'D':	/* set "description" flag in first pass */
11282264Sjacobs 		case 'E':	/* set encryption in the first pass */
11292264Sjacobs 			break;
11302264Sjacobs 		default:
11312264Sjacobs 			usage(av[0]);
11322264Sjacobs 		}
11332264Sjacobs 	}
11342264Sjacobs 	ac--;
11352264Sjacobs 
11362264Sjacobs 	if (ac == 1) {	/* report on my jobs */
11372264Sjacobs 		struct passwd *pw = getpwuid(getuid());
11382264Sjacobs 
11392264Sjacobs 		if (pw != NULL)
11402264Sjacobs 			users = strsplit(pw->pw_name, "");
11412264Sjacobs 		exit_code += job_query(NULL, report_job, encryption,
1142*8962SSonam.Gupta@Sun.COM 		    rank, verbose);
11432264Sjacobs 		if (users != NULL) {
11442264Sjacobs 			free(users);
11452264Sjacobs 			users = NULL;
11462264Sjacobs 		}
11472264Sjacobs 	} else {
11482264Sjacobs 		for (c = optind; c < ac; c++)
11492264Sjacobs 			exit_code += job_query(argv[c], report_job, encryption,
1150*8962SSonam.Gupta@Sun.COM 			    rank, verbose);
11512264Sjacobs 	}
11522264Sjacobs 
11532264Sjacobs 
11542264Sjacobs 	if (exit_code != 0)
11552264Sjacobs 		exit_code = 1;
11562264Sjacobs 
11572264Sjacobs 	return (exit_code);
11582264Sjacobs }
1159