xref: /titanic_50/usr/src/cmd/print/bsd-sysv-commands/lpstat.c (revision 38c3e53d685374085f084b673862c1f7ae96dece)
1355b4669Sjacobs /*
2355b4669Sjacobs  * CDDL HEADER START
3355b4669Sjacobs  *
4355b4669Sjacobs  * The contents of this file are subject to the terms of the
5355b4669Sjacobs  * Common Development and Distribution License (the "License").
6355b4669Sjacobs  * You may not use this file except in compliance with the License.
7355b4669Sjacobs  *
8355b4669Sjacobs  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9355b4669Sjacobs  * or http://www.opensolaris.org/os/licensing.
10355b4669Sjacobs  * See the License for the specific language governing permissions
11355b4669Sjacobs  * and limitations under the License.
12355b4669Sjacobs  *
13355b4669Sjacobs  * When distributing Covered Code, include this CDDL HEADER in each
14355b4669Sjacobs  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15355b4669Sjacobs  * If applicable, add the following below this CDDL HEADER, with the
16355b4669Sjacobs  * fields enclosed by brackets "[]" replaced with your own identifying
17355b4669Sjacobs  * information: Portions Copyright [yyyy] [name of copyright owner]
18355b4669Sjacobs  *
19355b4669Sjacobs  * CDDL HEADER END
20355b4669Sjacobs  */
21355b4669Sjacobs 
22355b4669Sjacobs /*
23f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24355b4669Sjacobs  * Use is subject to license terms.
25355b4669Sjacobs  *
26355b4669Sjacobs  */
27355b4669Sjacobs 
28355b4669Sjacobs /* $Id: lpstat.c 173 2006-05-25 04:52:06Z njacobs $ */
29355b4669Sjacobs 
30355b4669Sjacobs 
31355b4669Sjacobs #include <stdio.h>
32355b4669Sjacobs #include <stdlib.h>
33355b4669Sjacobs #include <unistd.h>
34355b4669Sjacobs #include <string.h>
35355b4669Sjacobs #include <locale.h>
36355b4669Sjacobs #include <libintl.h>
3791216fe4Swendyp #include <ctype.h>
38355b4669Sjacobs #include <pwd.h>
39355b4669Sjacobs #include <papi.h>
40355b4669Sjacobs #include <uri.h>
41355b4669Sjacobs #include "common.h"
42375b28ffSGowtham Thommandra #include "lp.h"
43355b4669Sjacobs 
44355b4669Sjacobs static void
45355b4669Sjacobs usage(char *program)
46355b4669Sjacobs {
47355b4669Sjacobs 	char *name;
48355b4669Sjacobs 
49355b4669Sjacobs 	if ((name = strrchr(program, '/')) == NULL)
50355b4669Sjacobs 		name = program;
51355b4669Sjacobs 	else
52355b4669Sjacobs 		name++;
53355b4669Sjacobs 
54355b4669Sjacobs 	fprintf(stdout, gettext("Usage: %s [-d] [-r] [-s] [-t] [-a [list]] "
55355b4669Sjacobs 	    "[-c [list]] [-o [list] [-l]] [-R [list] [-l]] "
56355b4669Sjacobs 	    "[-p [list] [-D] [-l]] [-v [list]] [-S [list] [-l]] "
57355b4669Sjacobs 	    "[-f [list] [-l]] [-u list]\n"),
58355b4669Sjacobs 	    name);
59355b4669Sjacobs 	exit(1);
60355b4669Sjacobs }
61355b4669Sjacobs 
62355b4669Sjacobs static char *
63355b4669Sjacobs nctime(time_t *t)
64355b4669Sjacobs {
65355b4669Sjacobs 	static char buf[64];
66355b4669Sjacobs 	struct tm *tm = localtime(t);
67355b4669Sjacobs 
68355b4669Sjacobs 	(void) strftime(buf, sizeof (buf), "%c", tm);
69355b4669Sjacobs 
70355b4669Sjacobs 	return (buf);
71355b4669Sjacobs }
72355b4669Sjacobs 
73355b4669Sjacobs static char *
74355b4669Sjacobs printer_name(papi_printer_t printer)
75355b4669Sjacobs {
76355b4669Sjacobs 	papi_attribute_t **attributes = papiPrinterGetAttributeList(printer);
77355b4669Sjacobs 	char *result = NULL;
78355b4669Sjacobs 
79355b4669Sjacobs 	if (attributes != NULL)
80355b4669Sjacobs 		papiAttributeListGetString(attributes, NULL,
81355b4669Sjacobs 		    "printer-name", &result);
82355b4669Sjacobs 
83355b4669Sjacobs 	return (result);
84355b4669Sjacobs }
85355b4669Sjacobs 
86355b4669Sjacobs static int
87355b4669Sjacobs lpstat_default_printer(papi_encryption_t encryption)
88355b4669Sjacobs {
89355b4669Sjacobs 	papi_status_t status;
90355b4669Sjacobs 	papi_service_t svc = NULL;
91355b4669Sjacobs 	papi_printer_t p = NULL;
92355b4669Sjacobs 	char *name = NULL;
93355b4669Sjacobs 
94355b4669Sjacobs 	status = papiServiceCreate(&svc, NULL, NULL, NULL, cli_auth_callback,
95355b4669Sjacobs 	    encryption, NULL);
96355b4669Sjacobs 	if (status == PAPI_OK) {
97355b4669Sjacobs 		char *req[] = { "printer-name", NULL };
98355b4669Sjacobs 
99355b4669Sjacobs 		status = papiPrinterQuery(svc, DEFAULT_DEST, req, NULL, &p);
100355b4669Sjacobs 		if (p != NULL)
101355b4669Sjacobs 			name = printer_name(p);
102355b4669Sjacobs 	}
103355b4669Sjacobs 	if (name != NULL)
104355b4669Sjacobs 		printf(gettext("system default printer: %s\n"), name);
105355b4669Sjacobs 	else
106355b4669Sjacobs 		printf(gettext("no system default destination\n"));
107355b4669Sjacobs 	papiPrinterFree(p);
108355b4669Sjacobs 	papiServiceDestroy(svc);
109355b4669Sjacobs 
110355b4669Sjacobs 	return (0);
111355b4669Sjacobs }
112355b4669Sjacobs 
113355b4669Sjacobs static int
114355b4669Sjacobs lpstat_service_status(papi_encryption_t encryption)
115355b4669Sjacobs {
116355b4669Sjacobs 	papi_status_t status;
117355b4669Sjacobs 	papi_service_t svc = NULL;
118355b4669Sjacobs 	char *name = NULL;
119355b4669Sjacobs 
120355b4669Sjacobs 	if (((name = getenv("PAPI_SERVICE_URI")) == NULL) &&
121355b4669Sjacobs 	    ((name = getenv("IPP_SERVER")) == NULL) &&
122355b4669Sjacobs 	    ((name = getenv("CUPS_SERVER")) == NULL))
123355b4669Sjacobs 		name = DEFAULT_SERVICE_URI;
124355b4669Sjacobs 
125355b4669Sjacobs 	status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback,
126355b4669Sjacobs 	    encryption, NULL);
127355b4669Sjacobs 	if (status != PAPI_OK) {
128355b4669Sjacobs 		printf(gettext("scheduler is not running\n"));
129355b4669Sjacobs 	} else
130355b4669Sjacobs 		printf(gettext("scheduler is running\n"));
131355b4669Sjacobs 	papiServiceDestroy(svc);
132355b4669Sjacobs 
133f154fbfeSGowtham Thommandra 	return (0);
134355b4669Sjacobs }
135355b4669Sjacobs 
136355b4669Sjacobs static char *
137355b4669Sjacobs get_device_uri(papi_service_t svc, char *name)
138355b4669Sjacobs {
139355b4669Sjacobs 	papi_status_t status;
140355b4669Sjacobs 	papi_printer_t p = NULL;
141355b4669Sjacobs 	char *keys[] = { "device-uri", NULL };
142355b4669Sjacobs 	char *result = NULL;
143355b4669Sjacobs 
144355b4669Sjacobs 	status = papiPrinterQuery(svc, name, keys, NULL, &p);
145355b4669Sjacobs 	if ((status == PAPI_OK) && (p != NULL)) {
146355b4669Sjacobs 		papi_attribute_t **attrs = papiPrinterGetAttributeList(p);
147355b4669Sjacobs 
148355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
149355b4669Sjacobs 		    "device-uri", &result);
150355b4669Sjacobs 		if (result != NULL)
151355b4669Sjacobs 			result = strdup(result);
152355b4669Sjacobs 
153355b4669Sjacobs 		papiPrinterFree(p);
154355b4669Sjacobs 	}
155355b4669Sjacobs 
156355b4669Sjacobs 	return (result);
157355b4669Sjacobs }
158355b4669Sjacobs 
159f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India static void
160f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India print_description(papi_attribute_t **list, char *printer_name)
161f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India {
162f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	char *str = "";
163f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 
164f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	(void) papiAttributeListGetString(list, NULL,
165f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	    "printer-info", &str);
166f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 
167f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	/*
168f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	 * If no printer-info is read then
169f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	 * by default the printer-info is <printer-name>@<server>
170f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	 */
171f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	if (str[0] == '\0') {
172f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		char *uri = NULL;
173f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		uri_t *u = NULL;
174f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 
175f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		(void) papiAttributeListGetString(list, NULL,
176f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		    "printer-uri-supported", &uri);
177f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 
178f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) {
179f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 			char *nodename = localhostname();
180f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 
181f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 			if ((u->host == NULL) ||
182f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 			    (strcasecmp(u->host, "localhost") == 0) ||
183f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 			    (strcasecmp(u->host, nodename) == 0))
184f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 				printf(gettext("\tDescription:\n"));
185f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 			else
186f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 				printf(gettext("\tDescription: %s@%s\n"),
187f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 				    printer_name, u->host);
188f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 
189f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 			uri_free(u);
190f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		} else
191f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 			printf(gettext("\tDescription:\n"));
192f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	} else
193f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		printf(gettext("\tDescription: %s\n"), str);
194f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India }
195f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 
196355b4669Sjacobs static char *report_device_keys[] = { "printer-name", "printer-uri-supported",
197355b4669Sjacobs 					NULL };
198355b4669Sjacobs /* ARGSUSED2 */
199355b4669Sjacobs static int
200355b4669Sjacobs report_device(papi_service_t svc, char *name, papi_printer_t printer,
201355b4669Sjacobs 		int verbose, int description)
202355b4669Sjacobs {
203355b4669Sjacobs 	papi_status_t status;
204355b4669Sjacobs 	papi_attribute_t **attrs = papiPrinterGetAttributeList(printer);
205355b4669Sjacobs 	char *uri = NULL;
206355b4669Sjacobs 	char *device = NULL;
207355b4669Sjacobs 	uri_t *u = NULL;
208355b4669Sjacobs 
209355b4669Sjacobs 	if (name == NULL) {
210355b4669Sjacobs 		status = papiAttributeListGetString(attrs, NULL,
211355b4669Sjacobs 		    "printer-name", &name);
212355b4669Sjacobs 		if (status != PAPI_OK)
213355b4669Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
214355b4669Sjacobs 			    "printer-uri-supported", &name);
215355b4669Sjacobs 	}
216355b4669Sjacobs 
217355b4669Sjacobs 	if (name == NULL)
218355b4669Sjacobs 		return (-1);
219355b4669Sjacobs 
220355b4669Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
221355b4669Sjacobs 	    "printer-uri-supported", &uri);
222355b4669Sjacobs 
223355b4669Sjacobs 	if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) {
224355b4669Sjacobs 		char *nodename = localhostname();
225355b4669Sjacobs 
226355b4669Sjacobs 		if ((u->host == NULL) ||
227355b4669Sjacobs 		    (strcasecmp(u->host, "localhost") == 0) ||
228355b4669Sjacobs 		    (strcasecmp(u->host, nodename) == 0))
229355b4669Sjacobs 			device = get_device_uri(svc, name);
230355b4669Sjacobs 
231355b4669Sjacobs 		if (device != NULL) {
232355b4669Sjacobs 			printf(gettext("device for %s: %s\n"), name, device);
233355b4669Sjacobs 			return (0);
234355b4669Sjacobs 		} else if (uri != NULL) {
235355b4669Sjacobs 			printf(gettext("system for %s: %s (as %s)\n"), name,
236e059026eSKeerthi Kondaka 			    u->host?u->host:"localhost", uri);
237355b4669Sjacobs 			return (0);
238355b4669Sjacobs 		}
239355b4669Sjacobs 
240355b4669Sjacobs 		uri_free(u);
241355b4669Sjacobs 	}
242355b4669Sjacobs 
243355b4669Sjacobs 	return (0);
244355b4669Sjacobs }
245355b4669Sjacobs 
246355b4669Sjacobs static char *report_accepting_keys[] = { "printer-name",
247355b4669Sjacobs 			"printer-uri-supported", "printer-is-accepting-jobs",
248355b4669Sjacobs 			"printer-up-time", "printer-state-time",
249355b4669Sjacobs 			"lpsched-reject-date", "lpsched-reject-reason", NULL };
250355b4669Sjacobs /* ARGSUSED2 */
251355b4669Sjacobs static int
252355b4669Sjacobs report_accepting(papi_service_t svc, char *name, papi_printer_t printer,
253355b4669Sjacobs 		int verbose, int description)
254355b4669Sjacobs {
255355b4669Sjacobs 	papi_status_t status;
256355b4669Sjacobs 	papi_attribute_t **attrs = papiPrinterGetAttributeList(printer);
257355b4669Sjacobs 	time_t curr;
258355b4669Sjacobs 	char boolean = PAPI_FALSE;
259355b4669Sjacobs 
260355b4669Sjacobs 	if (name == NULL) {
261355b4669Sjacobs 		status = papiAttributeListGetString(attrs, NULL,
262355b4669Sjacobs 		    "printer-name", &name);
263355b4669Sjacobs 		if (status != PAPI_OK)
264355b4669Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
265355b4669Sjacobs 			    "printer-uri-supported", &name);
266355b4669Sjacobs 	}
267355b4669Sjacobs 	if (name == NULL)
268355b4669Sjacobs 		return (-1);
269355b4669Sjacobs 
270355b4669Sjacobs 	(void) papiAttributeListGetBoolean(attrs, NULL,
271355b4669Sjacobs 	    "printer-is-accepting-jobs", &boolean);
272355b4669Sjacobs 	(void) time(&curr);
273355b4669Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
274355b4669Sjacobs 	    "printer-up-time", &curr);
275355b4669Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
276355b4669Sjacobs 	    "printer-state-time", &curr);
277355b4669Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
278355b4669Sjacobs 	    "lpsched-reject-date", &curr);
279355b4669Sjacobs 
280355b4669Sjacobs 	if (boolean == PAPI_TRUE) {
281355b4669Sjacobs 		printf(gettext("%s accepting requests since %s\n"),
282355b4669Sjacobs 		    name, nctime(&curr));
283355b4669Sjacobs 	} else {
284355b4669Sjacobs 		char *reason = "unknown reason";
285355b4669Sjacobs 
286355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
287355b4669Sjacobs 		    "lpsched-reject-reason", &reason);
288355b4669Sjacobs 
289355b4669Sjacobs 		printf(gettext("%s not accepting requests since %s\n\t%s\n"),
290355b4669Sjacobs 		    name, nctime(&curr), reason);
291355b4669Sjacobs 	}
292355b4669Sjacobs 
293355b4669Sjacobs 	return (0);
294355b4669Sjacobs }
295355b4669Sjacobs 
296355b4669Sjacobs static char *report_class_keys[] = { "printer-name", "printer-uri-supported",
297355b4669Sjacobs 					"member-names", NULL };
298355b4669Sjacobs /* ARGSUSED2 */
299355b4669Sjacobs static int
300355b4669Sjacobs report_class(papi_service_t svc, char *name, papi_printer_t printer,
301355b4669Sjacobs 		int verbose, int description)
302355b4669Sjacobs {
303355b4669Sjacobs 	papi_status_t status;
304355b4669Sjacobs 	papi_attribute_t **attrs = papiPrinterGetAttributeList(printer);
305355b4669Sjacobs 	char *member = NULL;
306355b4669Sjacobs 	void *iter = NULL;
307355b4669Sjacobs 
308355b4669Sjacobs 	status = papiAttributeListGetString(attrs, &iter,
309355b4669Sjacobs 	    "member-names", &member);
310355b4669Sjacobs 	if (status == PAPI_NOT_FOUND)	/* it's not a class */
311355b4669Sjacobs 		return (0);
312355b4669Sjacobs 
313355b4669Sjacobs 	if (name == NULL) {
314355b4669Sjacobs 		status = papiAttributeListGetString(attrs, NULL,
315355b4669Sjacobs 		    "printer-name", &name);
316355b4669Sjacobs 		if (status != PAPI_OK)
317355b4669Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
318355b4669Sjacobs 			    "printer-uri-supported", &name);
319355b4669Sjacobs 	}
320355b4669Sjacobs 	if (name == NULL)
321355b4669Sjacobs 		return (-1);
322355b4669Sjacobs 
323355b4669Sjacobs 	printf(gettext("members of class %s:\n\t%s\n"), name, member);
324355b4669Sjacobs 	while (papiAttributeListGetString(attrs, &iter, NULL, &member)
325355b4669Sjacobs 	    == PAPI_OK)
326355b4669Sjacobs 		printf("\t%s\n", member);
327355b4669Sjacobs 
328355b4669Sjacobs 	return (0);
329355b4669Sjacobs }
330355b4669Sjacobs 
331e9a20b61SKeerthi Kondaka static int
332e9a20b61SKeerthi Kondaka get_remote_hostname(papi_attribute_t **attrs, char **host)
333e9a20b61SKeerthi Kondaka {
334e9a20b61SKeerthi Kondaka 	char *uri = NULL;
335e9a20b61SKeerthi Kondaka 	uri_t *u;
336e9a20b61SKeerthi Kondaka 	char *nodename;
337e9a20b61SKeerthi Kondaka 
338e9a20b61SKeerthi Kondaka 	*host = NULL;
339e9a20b61SKeerthi Kondaka 	(void) papiAttributeListGetString(attrs, NULL,
340e9a20b61SKeerthi Kondaka 	    "job-originating-host-name", host);
341e9a20b61SKeerthi Kondaka 	(void) papiAttributeListGetString(attrs, NULL,
342e9a20b61SKeerthi Kondaka 	    "printer-uri-supported", &uri);
343e9a20b61SKeerthi Kondaka 	if (*host == NULL) {
344e9a20b61SKeerthi Kondaka 		if (uri != NULL) {
345e9a20b61SKeerthi Kondaka 			if (uri_from_string(uri, &u) == 0) {
346e9a20b61SKeerthi Kondaka 				if (u->host == NULL) {
347e9a20b61SKeerthi Kondaka 					uri_free(u);
348e9a20b61SKeerthi Kondaka 					return (0);
349e9a20b61SKeerthi Kondaka 				}
350e9a20b61SKeerthi Kondaka 				*host = strdup(u->host);
351e9a20b61SKeerthi Kondaka 				uri_free(u);
352e9a20b61SKeerthi Kondaka 			} else {
353e9a20b61SKeerthi Kondaka 				return (0);
354e9a20b61SKeerthi Kondaka 			}
355e9a20b61SKeerthi Kondaka 		} else {
356e9a20b61SKeerthi Kondaka 			return (0);
357e9a20b61SKeerthi Kondaka 		}
358e9a20b61SKeerthi Kondaka 	}
359e9a20b61SKeerthi Kondaka 	nodename = localhostname();
360e9a20b61SKeerthi Kondaka 	if ((strcasecmp(*host, "localhost") == 0) ||
361e9a20b61SKeerthi Kondaka 	    (strcasecmp(*host, nodename) == 0)) {
362e9a20b61SKeerthi Kondaka 		return (0);
363e9a20b61SKeerthi Kondaka 	}
364e9a20b61SKeerthi Kondaka 	return (1);
365e9a20b61SKeerthi Kondaka }
366e9a20b61SKeerthi Kondaka 
367355b4669Sjacobs static char *report_printer_keys[] = { "printer-name",
368355b4669Sjacobs 			"printer-uri-supported", "printer-state",
369355b4669Sjacobs 			"printer-up-time", "printer-state-time",
370355b4669Sjacobs 			"lpsched-disable-date", "printer-state-reasons",
371355b4669Sjacobs 			"lpsched-disable-reason", NULL };
372355b4669Sjacobs /* ARGSUSED2 */
373355b4669Sjacobs static int
374355b4669Sjacobs report_printer(papi_service_t svc, char *name, papi_printer_t printer,
375355b4669Sjacobs 		int verbose, int description)
376355b4669Sjacobs {
377355b4669Sjacobs 	papi_status_t status;
378355b4669Sjacobs 	papi_attribute_t **attrs = papiPrinterGetAttributeList(printer);
379355b4669Sjacobs 	time_t curr;
380355b4669Sjacobs 	int32_t pstat = 0;
381355b4669Sjacobs 	char *member = NULL;
38254d5ddccSsonam gupta - Sun Microsystems - Bangalore India 	papi_job_t *j = NULL;
383355b4669Sjacobs 
384355b4669Sjacobs 	status = papiAttributeListGetString(attrs, NULL,
385355b4669Sjacobs 	    "member-names", &member);
386355b4669Sjacobs 	if (status == PAPI_OK)	/* it's a class */
387355b4669Sjacobs 		return (0);
388355b4669Sjacobs 
389355b4669Sjacobs 	if (name == NULL) {
390355b4669Sjacobs 		status = papiAttributeListGetString(attrs, NULL,
391355b4669Sjacobs 		    "printer-name", &name);
392355b4669Sjacobs 		if (status != PAPI_OK)
393355b4669Sjacobs 			status = papiAttributeListGetString(attrs, NULL,
394355b4669Sjacobs 			    "printer-uri-supported", &name);
395355b4669Sjacobs 	}
396355b4669Sjacobs 	if (name == NULL)
397355b4669Sjacobs 		return (-1);
398355b4669Sjacobs 
399355b4669Sjacobs 	printf(gettext("printer %s "), name);
400355b4669Sjacobs 
401355b4669Sjacobs 	status = papiAttributeListGetInteger(attrs, NULL,
402355b4669Sjacobs 	    "printer-state", &pstat);
403355b4669Sjacobs 
404355b4669Sjacobs 	switch (pstat) {
405355b4669Sjacobs 	case 0x03:	/* idle */
406*38c3e53dSsonam gupta - Sun Microsystems - Bangalore India 		printf(gettext("is idle. enabled"));
407355b4669Sjacobs 		break;
40854d5ddccSsonam gupta - Sun Microsystems - Bangalore India 	case 0x04: /* processing */
40954d5ddccSsonam gupta - Sun Microsystems - Bangalore India 		status = papiPrinterListJobs(svc, name, NULL,
41054d5ddccSsonam gupta - Sun Microsystems - Bangalore India 		    0, 0, &j);
41154d5ddccSsonam gupta - Sun Microsystems - Bangalore India 
41254d5ddccSsonam gupta - Sun Microsystems - Bangalore India 		if (status == PAPI_OK) {
41354d5ddccSsonam gupta - Sun Microsystems - Bangalore India 			if (j != NULL) {
41454d5ddccSsonam gupta - Sun Microsystems - Bangalore India 				int i = 0;
415355b4669Sjacobs 				int32_t jobid = 0;
41654d5ddccSsonam gupta - Sun Microsystems - Bangalore India 				int32_t jstate = 0;
417355b4669Sjacobs 
41854d5ddccSsonam gupta - Sun Microsystems - Bangalore India 				for (i = 0; j[i] != NULL; ++i) {
419356a8421Ssonam gupta - Sun Microsystems - Bangalore India 					papi_attribute_t **attr =
420356a8421Ssonam gupta - Sun Microsystems - Bangalore India 					    papiJobGetAttributeList(j[i]);
42154d5ddccSsonam gupta - Sun Microsystems - Bangalore India 
422356a8421Ssonam gupta - Sun Microsystems - Bangalore India 					papiAttributeListGetInteger(attr,
42354d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					    NULL, "job-state", &jstate);
424356a8421Ssonam gupta - Sun Microsystems - Bangalore India 					papiAttributeListGetInteger(attr,
42554d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					    NULL, "job-id", &jobid);
4264c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					/*
4274c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * For lpd protocol "job-id-requested"
4284c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * should be read.
4294c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 */
4304c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					papiAttributeListGetInteger(attr,
4314c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					    NULL, "job-id-requested", &jobid);
43254d5ddccSsonam gupta - Sun Microsystems - Bangalore India 
43354d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					/*
4344c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * When lpd protocol is used job-state
4354c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * cannot be retrieved, therefore
4364c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * job-state will be 0.
4374c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * When ipp protocol is used, the
4384c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * active/printing job-state will be
4394c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * RS_PRINTING (0x0008) post s10u5.
4404c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * For pre-s10u5 job-state will be
4414c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * RS_ACTIVE (0x05). So print only when
4424c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * the job-state is RS_PRINTING (0x0008)
4434c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					 * or RS_ACTIVE (0x05) or 0
44454d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					 */
4454c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					if ((jstate == 0x0008) ||
4464c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					    (jstate == 0x05) ||
4474c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 					    (jstate == 0)) {
44854d5ddccSsonam gupta - Sun Microsystems - Bangalore India 						printf(gettext
44954d5ddccSsonam gupta - Sun Microsystems - Bangalore India 						    ("now printing"\
45054d5ddccSsonam gupta - Sun Microsystems - Bangalore India 						    " %s-%d. enabled"),
45154d5ddccSsonam gupta - Sun Microsystems - Bangalore India 						    name, jobid);
4524c64d8ccSsonam gupta - Sun Microsystems - Bangalore India 						break;
45354d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					}
45454d5ddccSsonam gupta - Sun Microsystems - Bangalore India 				}
455355b4669Sjacobs 				papiJobListFree(j);
45654d5ddccSsonam gupta - Sun Microsystems - Bangalore India 			}
457355b4669Sjacobs 		}
458355b4669Sjacobs 		break;
459355b4669Sjacobs 	case 0x05:	/* stopped */
460355b4669Sjacobs 		printf(gettext("disabled"));
461355b4669Sjacobs 		break;
462355b4669Sjacobs 	default:
463355b4669Sjacobs 		printf(gettext("unknown state(0x%x)."), pstat);
464355b4669Sjacobs 		break;
465355b4669Sjacobs 	}
466355b4669Sjacobs 
467355b4669Sjacobs 	(void) time(&curr);
468355b4669Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
469355b4669Sjacobs 	    "printer-up-time", &curr);
470355b4669Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
471355b4669Sjacobs 	    "printer-state-time", &curr);
472355b4669Sjacobs 	(void) papiAttributeListGetDatetime(attrs, NULL,
473355b4669Sjacobs 	    "lpsched-disable-date", &curr);
474355b4669Sjacobs 	printf(gettext(" since %s. available.\n"), nctime(&curr));
475355b4669Sjacobs 
476355b4669Sjacobs 	if (pstat == 0x05) {
477355b4669Sjacobs 		char *reason = "unknown reason";
478355b4669Sjacobs 
479355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
480355b4669Sjacobs 		    "printer-state-reasons", &reason);
481355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
482355b4669Sjacobs 		    "lpsched-disable-reason", &reason);
483355b4669Sjacobs 		printf(gettext("\t%s\n"), reason);
484355b4669Sjacobs 	}
485355b4669Sjacobs 
486355b4669Sjacobs 	if (verbose == 1) {
487355b4669Sjacobs 		void *iter;
488355b4669Sjacobs 		char *str;
489e9a20b61SKeerthi Kondaka 		char *host = NULL;
490355b4669Sjacobs 
491e9a20b61SKeerthi Kondaka 		if ((get_remote_hostname(attrs, &host)) != 0) {
492e9a20b61SKeerthi Kondaka 			(void) printf(
493e9a20b61SKeerthi Kondaka 			    gettext("\tRemote Name: %s\n\tRemote Server: "
494e9a20b61SKeerthi Kondaka 			    "%s\n"), name, host);
495e9a20b61SKeerthi Kondaka 			free(host);
496e9a20b61SKeerthi Kondaka 			return (0);
497e9a20b61SKeerthi Kondaka 		}
498355b4669Sjacobs 		str = "";
499355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
500355b4669Sjacobs 		    "form-ready", &str);
501355b4669Sjacobs 		printf(gettext("\tForm mounted: %s\n"), str);
502355b4669Sjacobs 
503355b4669Sjacobs 		str = "";
504355b4669Sjacobs 		iter = NULL;
505355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
506355b4669Sjacobs 		    "document-format-supported", &str);
507355b4669Sjacobs 		printf(gettext("\tContent types: %s"), str);
508355b4669Sjacobs 		while (papiAttributeListGetString(attrs, &iter, NULL, &str)
509355b4669Sjacobs 		    == PAPI_OK)
510355b4669Sjacobs 			printf(", %s", str);
511355b4669Sjacobs 		printf("\n");
512355b4669Sjacobs 
513f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		/* Display the printer description */
514f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		print_description(attrs, name);
515355b4669Sjacobs 
516355b4669Sjacobs 		str = "";
517853389e3Swendyp 		iter = NULL;
518853389e3Swendyp 		(void) papiAttributeListGetString(attrs, &iter,
519853389e3Swendyp 		    "lpsched-printer-type", &str);
520853389e3Swendyp 		printf(gettext("\tPrinter types: %s"), str);
521853389e3Swendyp 		while (papiAttributeListGetString(attrs, &iter, NULL, &str)
522853389e3Swendyp 		    == PAPI_OK)
523853389e3Swendyp 			printf(", %s", str);
524853389e3Swendyp 		printf("\n");
525853389e3Swendyp 
526853389e3Swendyp 		str = "";
527355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
528355b4669Sjacobs 		    "lpsched-dial-info", &str);
529355b4669Sjacobs 		printf(gettext("\tConnection: %s\n"),
5305eb9a62cSJonathan Cowper-Andrewes 		    ((str[0] == '\0') ? gettext("direct") : str));
531355b4669Sjacobs 
532355b4669Sjacobs 		str = "";
533355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
534355b4669Sjacobs 		    "lpsched-interface-script", &str);
535355b4669Sjacobs 		printf(gettext("\tInterface: %s\n"), str);
536355b4669Sjacobs 
537355b4669Sjacobs 		str = NULL;
538355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
539355b4669Sjacobs 		    "ppd-file-uri", &str);
540355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
541355b4669Sjacobs 		    "lpsched-ppd-source-path", &str);
542355b4669Sjacobs 		if (str != NULL)
543355b4669Sjacobs 			printf(gettext("\tPPD: %s\n"), str);
544355b4669Sjacobs 
545355b4669Sjacobs 		str = NULL;
546355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
547355b4669Sjacobs 		    "lpsched-fault-alert-command", &str);
548355b4669Sjacobs 		if (str != NULL)
549355b4669Sjacobs 			printf(gettext("\tOn fault: %s\n"), str);
550355b4669Sjacobs 
551355b4669Sjacobs 		str = "";
552355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
553355b4669Sjacobs 		    "lpsched-fault-recovery", &str);
554355b4669Sjacobs 		printf(gettext("\tAfter fault: %s\n"),
555355b4669Sjacobs 		    ((str[0] == '\0') ? gettext("continue") : str));
556355b4669Sjacobs 
557355b4669Sjacobs 		str = "(all)";
558355b4669Sjacobs 		iter = NULL;
559355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
560355b4669Sjacobs 		    "requesting-user-name-allowed", &str);
561355b4669Sjacobs 		printf(gettext("\tUsers allowed:\n\t\t%s\n"),
562355b4669Sjacobs 		    ((str[0] == '\0') ? gettext("(none)") : str));
563355b4669Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
564355b4669Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
565355b4669Sjacobs 			    &str) == PAPI_OK)
566355b4669Sjacobs 				printf("\t\t%s\n", str);
567355b4669Sjacobs 
568355b4669Sjacobs 		str = NULL;
569355b4669Sjacobs 		iter = NULL;
570355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
571355b4669Sjacobs 		    "requesting-user-name-denied", &str);
572355b4669Sjacobs 		if (str != NULL) {
573355b4669Sjacobs 			printf(gettext("\tUsers denied:\n\t\t%s\n"),
574355b4669Sjacobs 			    ((str[0] == '\0') ? gettext("(none)") : str));
575355b4669Sjacobs 			if ((str != NULL) && (str[0] != '\0'))
576355b4669Sjacobs 				while (papiAttributeListGetString(attrs, &iter,
577355b4669Sjacobs 				    NULL, &str) == PAPI_OK)
578355b4669Sjacobs 					printf("\t\t%s\n", str);
579355b4669Sjacobs 		}
580355b4669Sjacobs 
581f06271beSsonam gupta - Sun Microsystems - Bangalore India 		str = "none";
582355b4669Sjacobs 		iter = NULL;
583355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
584355b4669Sjacobs 		    "form-supported", &str);
585f06271beSsonam gupta - Sun Microsystems - Bangalore India 		printf(gettext("\tForms allowed:\n\t\t(%s)\n"),
586f06271beSsonam gupta - Sun Microsystems - Bangalore India 		    ((str[0] == '\0') ? gettext("none") : str));
587355b4669Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
588355b4669Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
589355b4669Sjacobs 			    &str) == PAPI_OK)
590f06271beSsonam gupta - Sun Microsystems - Bangalore India 				printf("\t\t(%s)\n", str);
591355b4669Sjacobs 
592355b4669Sjacobs 		str = "";
593355b4669Sjacobs 		iter = NULL;
594355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
595355b4669Sjacobs 		    "media-supported", &str);
596355b4669Sjacobs 		printf(gettext("\tMedia supported:\n\t\t%s\n"),
597355b4669Sjacobs 		    ((str[0] == '\0') ? gettext("(none)") : str));
598355b4669Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
599355b4669Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
600355b4669Sjacobs 			    &str) == PAPI_OK)
601355b4669Sjacobs 				printf("\t\t%s\n", str);
602355b4669Sjacobs 
603355b4669Sjacobs 		str = "";
604355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
605355b4669Sjacobs 		    "job-sheets-supported", &str);
606853389e3Swendyp 		if ((strcasecmp(str, "none")) == 0)
607853389e3Swendyp 			str = gettext("page never printed");
608853389e3Swendyp 		else if (strcasecmp(str, "optional") == 0)
609853389e3Swendyp 			str = gettext("not required");
610853389e3Swendyp 		else
611853389e3Swendyp 			str = gettext("required");
612853389e3Swendyp 
613853389e3Swendyp 		printf(gettext("\tBanner %s\n"), str);
614853389e3Swendyp 
615355b4669Sjacobs 
616355b4669Sjacobs 		str = "";
617355b4669Sjacobs 		iter = NULL;
618355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
619355b4669Sjacobs 		    "lpsched-print-wheels", &str);
620355b4669Sjacobs 		printf(gettext("\tCharacter sets:\n\t\t%s\n"),
621355b4669Sjacobs 		    ((str[0] == '\0') ? gettext("(none)") : str));
622355b4669Sjacobs 		if ((str != NULL) && (str[0] != '\0'))
623355b4669Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
624355b4669Sjacobs 			    &str) == PAPI_OK)
625355b4669Sjacobs 				printf("\t\t%s\n", str);
626355b4669Sjacobs 
627355b4669Sjacobs 		printf(gettext("\tDefault pitch:\n"));
628355b4669Sjacobs 		printf(gettext("\tDefault page size:\n"));
629355b4669Sjacobs 		printf(gettext("\tDefault port setting:\n"));
630355b4669Sjacobs 
631355b4669Sjacobs 		str = "";
632355b4669Sjacobs 		iter = NULL;
633355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, &iter,
634355b4669Sjacobs 		    "lpsched-options", &str);
635355b4669Sjacobs 		if (str != NULL) {
636355b4669Sjacobs 			printf(gettext("\tOptions: %s"), str);
637355b4669Sjacobs 			while (papiAttributeListGetString(attrs, &iter, NULL,
638355b4669Sjacobs 			    &str) == PAPI_OK)
639355b4669Sjacobs 				printf(", %s", str);
640355b4669Sjacobs 			printf("\n");
641355b4669Sjacobs 		}
642355b4669Sjacobs 
643f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	} else if (description == 1)
644f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		/* Display printer description */
645f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 		print_description(attrs, name);
646f7c8cd01Ssonam gupta - Sun Microsystems - Bangalore India 	else if (verbose > 1)
647355b4669Sjacobs 		papiAttributeListPrint(stdout, attrs, "\t");
648355b4669Sjacobs 
649355b4669Sjacobs 	if (verbose > 0)
650355b4669Sjacobs 		printf("\n");
651355b4669Sjacobs 
652355b4669Sjacobs 	return (0);
653355b4669Sjacobs }
654355b4669Sjacobs 
655355b4669Sjacobs static int
656355b4669Sjacobs printer_query(char *name, int (*report)(papi_service_t, char *, papi_printer_t,
657355b4669Sjacobs 					int, int), papi_encryption_t encryption,
658355b4669Sjacobs 		int verbose, int description)
659355b4669Sjacobs {
660375b28ffSGowtham Thommandra 	int result = 0, i = 0;
661355b4669Sjacobs 	papi_status_t status;
662355b4669Sjacobs 	papi_service_t svc = NULL;
663375b28ffSGowtham Thommandra 	char **list = getlist(name, LP_WS, LP_SEP);
664355b4669Sjacobs 
665375b28ffSGowtham Thommandra 	if (list == NULL) {
666375b28ffSGowtham Thommandra 		list = (char **)malloc(sizeof (char *));
667375b28ffSGowtham Thommandra 		list[0] = name;
668375b28ffSGowtham Thommandra 	}
669375b28ffSGowtham Thommandra 
670375b28ffSGowtham Thommandra 	/*
671375b28ffSGowtham Thommandra 	 * The for loop executes once for every printer
672375b28ffSGowtham Thommandra 	 * entry in list. If list is NULL that implies
673375b28ffSGowtham Thommandra 	 * name is also NULL, the loop runs only one time.
674375b28ffSGowtham Thommandra 	 */
675375b28ffSGowtham Thommandra 
676375b28ffSGowtham Thommandra 	for (i = 0; name == NULL || list[i] != NULL; i++) {
677375b28ffSGowtham Thommandra 		name = list[i];
678375b28ffSGowtham Thommandra 
679375b28ffSGowtham Thommandra 		status = papiServiceCreate(&svc, name, NULL, NULL,
680375b28ffSGowtham Thommandra 		    cli_auth_callback, encryption, NULL);
681355b4669Sjacobs 		if (status != PAPI_OK) {
682022ba35cSjacobs 			if (status == PAPI_NOT_FOUND)
683375b28ffSGowtham Thommandra 				fprintf(stderr,
684375b28ffSGowtham Thommandra 				    gettext("%s: unknown printer\n"),
685022ba35cSjacobs 				    name ? name : "(NULL)");
686022ba35cSjacobs 			else
687355b4669Sjacobs 				fprintf(stderr, gettext(
688355b4669Sjacobs 				    "Failed to contact service for %s: %s\n"),
689355b4669Sjacobs 				    name ? name : "(NULL)",
690355b4669Sjacobs 				    verbose_papi_message(svc, status));
691355b4669Sjacobs 			papiServiceDestroy(svc);
692375b28ffSGowtham Thommandra 			result--;
693375b28ffSGowtham Thommandra 			continue;
694355b4669Sjacobs 		}
695355b4669Sjacobs 
696355b4669Sjacobs 		if (name == NULL) { /* all */
697355b4669Sjacobs 			char **interest = interest_list(svc);
698355b4669Sjacobs 
699355b4669Sjacobs 			if (interest != NULL) {
700355b4669Sjacobs 				int i;
701355b4669Sjacobs 
702355b4669Sjacobs 				for (i = 0; interest[i] != NULL; i++)
703375b28ffSGowtham Thommandra 					result += printer_query(interest[i],
704375b28ffSGowtham Thommandra 					    report, encryption, verbose,
705355b4669Sjacobs 					    description);
706355b4669Sjacobs 			}
707355b4669Sjacobs 		} else {
708355b4669Sjacobs 			papi_printer_t printer = NULL;
709355b4669Sjacobs 			char **keys = NULL;
710355b4669Sjacobs 
711355b4669Sjacobs 			/*
712375b28ffSGowtham Thommandra 			 * Limit the query to only required data
713375b28ffSGowtham Thommandra 			 * to reduce the need to go remote for
714375b28ffSGowtham Thommandra 			 * information.
715355b4669Sjacobs 			 */
716355b4669Sjacobs 			if (report == report_device)
717355b4669Sjacobs 				keys = report_device_keys;
718355b4669Sjacobs 			else if (report == report_class)
719355b4669Sjacobs 				keys = report_class_keys;
720355b4669Sjacobs 			else if (report == report_accepting)
721355b4669Sjacobs 				keys = report_accepting_keys;
722355b4669Sjacobs 			else if ((report == report_printer) && (verbose == 0))
723355b4669Sjacobs 				keys = report_printer_keys;
724355b4669Sjacobs 
725375b28ffSGowtham Thommandra 			status = papiPrinterQuery(svc, name, keys,
726375b28ffSGowtham Thommandra 			    NULL, &printer);
727355b4669Sjacobs 			if (status != PAPI_OK) {
728355b4669Sjacobs 				fprintf(stderr, gettext(
729355b4669Sjacobs 				    "Failed to get printer info for %s: %s\n"),
730355b4669Sjacobs 				    name, verbose_papi_message(svc, status));
731355b4669Sjacobs 				papiServiceDestroy(svc);
732375b28ffSGowtham Thommandra 				result--;
733375b28ffSGowtham Thommandra 				continue;
734355b4669Sjacobs 			}
735355b4669Sjacobs 
736355b4669Sjacobs 			if (printer != NULL)
737375b28ffSGowtham Thommandra 				result += report(svc, name, printer, verbose,
738355b4669Sjacobs 				    description);
739355b4669Sjacobs 
740355b4669Sjacobs 			papiPrinterFree(printer);
741355b4669Sjacobs 		}
742355b4669Sjacobs 
743355b4669Sjacobs 		papiServiceDestroy(svc);
744355b4669Sjacobs 
745375b28ffSGowtham Thommandra 		if (name == NULL)
746375b28ffSGowtham Thommandra 			break;
747375b28ffSGowtham Thommandra 	}
748375b28ffSGowtham Thommandra 
749375b28ffSGowtham Thommandra 	freelist(list);
750375b28ffSGowtham Thommandra 
751355b4669Sjacobs 	return (result);
752355b4669Sjacobs }
753355b4669Sjacobs 
754355b4669Sjacobs static int
755355b4669Sjacobs match_user(char *user, char **list)
756355b4669Sjacobs {
757355b4669Sjacobs 	int i;
758355b4669Sjacobs 
759355b4669Sjacobs 	for (i = 0; list[i] != NULL; i++) {
760355b4669Sjacobs 		if (strcmp(user, list[i]) == 0)
761355b4669Sjacobs 			return (0);
762355b4669Sjacobs 	}
763355b4669Sjacobs 
764355b4669Sjacobs 	return (-1);
765355b4669Sjacobs }
766355b4669Sjacobs 
767355b4669Sjacobs static char **users = NULL;
768355b4669Sjacobs 
769355b4669Sjacobs static int
77035a603adSsonam gupta - Sun Microsystems - Bangalore India report_job(char *printer, papi_job_t job, int show_rank, int verbose)
771355b4669Sjacobs {
772355b4669Sjacobs 	papi_attribute_t **attrs = papiJobGetAttributeList(job);
773355b4669Sjacobs 	time_t clock = 0;
774355b4669Sjacobs 	char date[24];
775355b4669Sjacobs 	char request[26];
776355b4669Sjacobs 	char *user = "unknown";
777b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 	char *host = NULL;
778355b4669Sjacobs 	int32_t size = 0;
779355b4669Sjacobs 	int32_t jstate = 0;
780b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 	char User[50];
781355b4669Sjacobs 
782355b4669Sjacobs 	char *destination = "unknown";
783355b4669Sjacobs 	int32_t id = -1;
7843d09a4feSsonam gupta - Sun Microsystems - Bangalore India 	static int check = 0;
7853d09a4feSsonam gupta - Sun Microsystems - Bangalore India 	static char *uri = NULL;
7863333c089Ssonam gupta - Sun Microsystems - Bangalore India 	static char *puri = NULL;	/* printer-uri */
7873333c089Ssonam gupta - Sun Microsystems - Bangalore India 	static char *pname = NULL;	/* printer-name */
788355b4669Sjacobs 
789355b4669Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
790355b4669Sjacobs 	    "job-originating-user-name", &user);
791355b4669Sjacobs 
792355b4669Sjacobs 	if ((users != NULL) && (match_user(user, users) < 0))
793355b4669Sjacobs 		return (0);
794355b4669Sjacobs 
795b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 	(void) papiAttributeListGetString(attrs, NULL,
796b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 	    "job-originating-host-name", &host);
797b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 
7983d09a4feSsonam gupta - Sun Microsystems - Bangalore India 	/*
7993333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * When lpstat is called for multiple printers
8003333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * internally the function 'report_job' gets
8013333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * called multiple times with different printer-names.
8023333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * The following block of code handles the case when lpstat is
8033333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * executed for multiple printers. In other words when 'report_job'
8043333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * is called multiple times for different printers for
8053333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * one lpstat command
8063333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 * For e.g: lpstat printer1 printer2 printer3
8073333c089Ssonam gupta - Sun Microsystems - Bangalore India 	 */
8083333c089Ssonam gupta - Sun Microsystems - Bangalore India 	if (pname == NULL) {
8093333c089Ssonam gupta - Sun Microsystems - Bangalore India 		/*
8103333c089Ssonam gupta - Sun Microsystems - Bangalore India 		 * When lpstat is queried for the first time
8113333c089Ssonam gupta - Sun Microsystems - Bangalore India 		 * pname is NULL so this part of the code gets executed.
8123d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		 * Read the attribute "job-printer-uri"
8133333c089Ssonam gupta - Sun Microsystems - Bangalore India 		 * first time
8143d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		 */
8153d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		(void) papiAttributeListGetString(attrs, NULL,
8163d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		    "job-printer-uri", &uri);
8173333c089Ssonam gupta - Sun Microsystems - Bangalore India 
8183333c089Ssonam gupta - Sun Microsystems - Bangalore India 		if (printer != NULL) {
8193333c089Ssonam gupta - Sun Microsystems - Bangalore India 			/*
8203333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * Set pname to the printer that is being
8213333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * queried so that this can be used later
8223333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * if 'report_job' is called multiple times for
8233333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * different printers for one lpstat command
8243333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 */
8253333c089Ssonam gupta - Sun Microsystems - Bangalore India 			pname = printer;
8263333c089Ssonam gupta - Sun Microsystems - Bangalore India 		}
8273333c089Ssonam gupta - Sun Microsystems - Bangalore India 
8283333c089Ssonam gupta - Sun Microsystems - Bangalore India 		if (uri != NULL) {
8293333c089Ssonam gupta - Sun Microsystems - Bangalore India 			/*
8303333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * Set puri so that "job-printer-uri" corresponding
8313333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * to a particular printer can be used later when
8323333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * lpstat is queried for the same printer as
8333333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 * "job-printer-uri" for a printer is read just once.
8343333c089Ssonam gupta - Sun Microsystems - Bangalore India 			 */
8353333c089Ssonam gupta - Sun Microsystems - Bangalore India 			puri = strdup(uri);
8363333c089Ssonam gupta - Sun Microsystems - Bangalore India 		}
8373333c089Ssonam gupta - Sun Microsystems - Bangalore India 	} else {
8383333c089Ssonam gupta - Sun Microsystems - Bangalore India 		/*
8393333c089Ssonam gupta - Sun Microsystems - Bangalore India 		 * This part of the code will get executed when
8403333c089Ssonam gupta - Sun Microsystems - Bangalore India 		 * 'report_job' is called more than once for the same
8413333c089Ssonam gupta - Sun Microsystems - Bangalore India 		 * lpstat command
8423333c089Ssonam gupta - Sun Microsystems - Bangalore India 		 */
8433333c089Ssonam gupta - Sun Microsystems - Bangalore India 		if (printer != NULL) {
8443333c089Ssonam gupta - Sun Microsystems - Bangalore India 			if (strcasecmp(pname, printer) != 0) {
8453333c089Ssonam gupta - Sun Microsystems - Bangalore India 				/*
8463333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * Read the job-printer-uri as
8473333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * it will be different for
8483333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * different printers
8493333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 */
8503333c089Ssonam gupta - Sun Microsystems - Bangalore India 				uri = NULL;
8513333c089Ssonam gupta - Sun Microsystems - Bangalore India 				(void) papiAttributeListGetString(attrs,
8523333c089Ssonam gupta - Sun Microsystems - Bangalore India 				    NULL, "job-printer-uri", &uri);
8533333c089Ssonam gupta - Sun Microsystems - Bangalore India 				pname = printer;
8543333c089Ssonam gupta - Sun Microsystems - Bangalore India 				if (uri != NULL)
8553333c089Ssonam gupta - Sun Microsystems - Bangalore India 					puri = strdup(uri);
8563333c089Ssonam gupta - Sun Microsystems - Bangalore India 				else
8573333c089Ssonam gupta - Sun Microsystems - Bangalore India 					puri = NULL;
8583333c089Ssonam gupta - Sun Microsystems - Bangalore India 			} else {
8593333c089Ssonam gupta - Sun Microsystems - Bangalore India 				/*
8603333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * Same printer queried twice
8613333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * uri should be the same as
8623333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * already read in the previous call
8633333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * to 'report_job'.
8643333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * For the same printer 'job-printer-uri'
8653333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * is read just once because only in the
8663333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 * first call it contains the host information
8673333c089Ssonam gupta - Sun Microsystems - Bangalore India 				 */
8683333c089Ssonam gupta - Sun Microsystems - Bangalore India 				uri = puri;
8693333c089Ssonam gupta - Sun Microsystems - Bangalore India 			}
8703333c089Ssonam gupta - Sun Microsystems - Bangalore India 		}
8713d09a4feSsonam gupta - Sun Microsystems - Bangalore India 	}
8723d09a4feSsonam gupta - Sun Microsystems - Bangalore India 
8733d09a4feSsonam gupta - Sun Microsystems - Bangalore India 	if (host) {
8743d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		/* Check if it is local printer or remote printer */
8753d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		uri_t *u = NULL;
8763d09a4feSsonam gupta - Sun Microsystems - Bangalore India 
8773d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) {
8783d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			char *nodename = localhostname();
8793d09a4feSsonam gupta - Sun Microsystems - Bangalore India 
8803d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			if ((u->host == NULL) ||
8813d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			    (strcasecmp(u->host, "localhost") == 0) ||
8823d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			    (strcasecmp(u->host, nodename) == 0)) {
8833d09a4feSsonam gupta - Sun Microsystems - Bangalore India 
8843d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				if (strcasecmp(host, nodename) == 0) {
8853d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					/*
8863d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					 * Request submitted locally
8873d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					 * for the local queue.
8883d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					 * Hostname will not be displayed
8893d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					 */
8903d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					snprintf(User, sizeof (User), "%s",
8913d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					    user);
8923d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				}
8933d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				else
8943d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					snprintf(User, sizeof (User), "%s@%s",
8953d09a4feSsonam gupta - Sun Microsystems - Bangalore India 					    user, host);
8963d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			} else if (uri != NULL) {
8973d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				/*
8983d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				 * It's a remote printer.
8993d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				 * In case of remote printers hostname is
9003d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				 * always displayed.
9013d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				 */
9023d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				snprintf(User, sizeof (User), "%s@%s",
9033d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				    user, host);
9043d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			}
9053d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			uri_free(u);
9063d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		} else {
9073d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			/*
9083d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			 * If attribute "job-printer-uri"
9093d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			 * cannot be read
9103d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			 * by default append the hostname
9113d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			 */
912b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 			snprintf(User, sizeof (User), "%s@%s", user, host);
9133d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		}
9143d09a4feSsonam gupta - Sun Microsystems - Bangalore India 	} else {
9153d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		/*
9163d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		 * When print server is s10u4 and ipp service is used
9173d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		 * "job-originating-hostname" attribute is not set
9183d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		 * So get the host information from the uri
9193d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		 */
9203d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		uri_t *u = NULL;
9213d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		if ((uri != NULL) && (uri_from_string(uri, &u) == 0)) {
9223d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			if ((u != NULL) && (u->host != NULL))
9233d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				snprintf(User, sizeof (User), "%s@%s",
9243d09a4feSsonam gupta - Sun Microsystems - Bangalore India 				    user, u->host);
925b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 			else
926b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 				snprintf(User, sizeof (User), "%s", user);
927b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 
9283d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			uri_free(u);
9293d09a4feSsonam gupta - Sun Microsystems - Bangalore India 		} else
9303d09a4feSsonam gupta - Sun Microsystems - Bangalore India 			snprintf(User, sizeof (User), "%s", user);
9313d09a4feSsonam gupta - Sun Microsystems - Bangalore India 	}
932355b4669Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL, "job-k-octets", &size);
933355b4669Sjacobs 	size *= 1024;	/* for the approximate byte size */
934355b4669Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL, "job-octets", &size);
935355b4669Sjacobs 
936355b4669Sjacobs 	(void) time(&clock);
937355b4669Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL,
938355b4669Sjacobs 	    "time-at-creation", (int32_t *)&clock);
939355b4669Sjacobs 	(void) strftime(date, sizeof (date), "%b %d %R", localtime(&clock));
940355b4669Sjacobs 
941355b4669Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
942355b4669Sjacobs 	    "job-printer-uri", &destination);
943355b4669Sjacobs 	(void) papiAttributeListGetString(attrs, NULL,
944355b4669Sjacobs 	    "printer-name", &destination);
945355b4669Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL,
946355b4669Sjacobs 	    "job-id", &id);
94740e7ce05Ssonam gupta - Sun Microsystems - Bangalore India 	(void) papiAttributeListGetInteger(attrs, NULL,
94840e7ce05Ssonam gupta - Sun Microsystems - Bangalore India 	    "job-id-requested", &id);
94935a603adSsonam gupta - Sun Microsystems - Bangalore India 
950f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 
95135a603adSsonam gupta - Sun Microsystems - Bangalore India 	snprintf(request, sizeof (request), "%s-%d", printer, id);
952355b4669Sjacobs 
953355b4669Sjacobs 	if (show_rank != 0) {
954355b4669Sjacobs 		int32_t rank = -1;
955355b4669Sjacobs 
956355b4669Sjacobs 		(void) papiAttributeListGetInteger(attrs, NULL,
957355b4669Sjacobs 		    "number-of-intervening-jobs", &rank);
958355b4669Sjacobs 		rank++;
959355b4669Sjacobs 
960355b4669Sjacobs 		printf("%3d %-21s %-14s %7ld %s",
961b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 		    rank, request, User, size, date);
962355b4669Sjacobs 	} else
963b9c04f6bSsonam gupta - Sun Microsystems - Bangalore India 		printf("%-23s %-14s %7ld   %s", request, User, size, date);
964355b4669Sjacobs 
965355b4669Sjacobs 	(void) papiAttributeListGetInteger(attrs, NULL,
966355b4669Sjacobs 	    "job-state", &jstate);
967f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 
968c389c7f8SGowtham Thommandra 	if (jstate == 0x0001)
969c389c7f8SGowtham Thommandra 		printf(gettext(" being held"));
970c389c7f8SGowtham Thommandra 	else if (jstate == 0x0800)
971c389c7f8SGowtham Thommandra 		printf(gettext(" notifying user"));
972c389c7f8SGowtham Thommandra 	else if (jstate == 0x0040)
973c389c7f8SGowtham Thommandra 		printf(gettext(" cancelled"));
974c389c7f8SGowtham Thommandra 	else if (jstate == 0x0010)
975c389c7f8SGowtham Thommandra 		printf(gettext(" finished printing"));
976c389c7f8SGowtham Thommandra 	else if (jstate == 0x0008)
977c389c7f8SGowtham Thommandra 		printf(gettext(" on %s"), destination);
978c389c7f8SGowtham Thommandra 	else if (jstate == 0x2000)
979c389c7f8SGowtham Thommandra 		printf(gettext(" held by admin"));
980c389c7f8SGowtham Thommandra 	else if (jstate == 0x0002)
981c389c7f8SGowtham Thommandra 		printf(gettext(" being filtered"));
982c389c7f8SGowtham Thommandra 	else if (jstate == 0x0004)
983c389c7f8SGowtham Thommandra 		printf(gettext(" filtered"));
984c389c7f8SGowtham Thommandra 	else if (jstate == 0x0020)
985c389c7f8SGowtham Thommandra 		printf(gettext(" held for change"));
986355b4669Sjacobs 
987355b4669Sjacobs 	if (verbose == 1) {
9880a44ef6dSjacobs 		char *form = NULL;
9890a44ef6dSjacobs 
990355b4669Sjacobs 		(void) papiAttributeListGetString(attrs, NULL,
991355b4669Sjacobs 		    "output-device-assigned", &destination);
992355b4669Sjacobs 		printf("\n\t assigned %s", destination);
9930a44ef6dSjacobs 
9940a44ef6dSjacobs 		(void) papiAttributeListGetString(attrs, NULL, "form", &form);
9950a44ef6dSjacobs 		if (form != NULL)
9960a44ef6dSjacobs 			printf(", form %s", form);
997355b4669Sjacobs 	} else if (verbose > 1) {
998355b4669Sjacobs 		printf("\n");
999355b4669Sjacobs 		papiAttributeListPrint(stdout, attrs, "\t");
1000355b4669Sjacobs 	}
1001355b4669Sjacobs 
1002355b4669Sjacobs 	printf("\n");
1003355b4669Sjacobs 
1004355b4669Sjacobs 	return (0);
1005355b4669Sjacobs }
1006355b4669Sjacobs 
1007355b4669Sjacobs static int
100835a603adSsonam gupta - Sun Microsystems - Bangalore India job_query(char *request, int (*report)(char *, papi_job_t, int, int),
1009355b4669Sjacobs 		papi_encryption_t encryption, int show_rank, int verbose)
1010355b4669Sjacobs {
1011355b4669Sjacobs 	int result = 0;
1012355b4669Sjacobs 	papi_status_t status;
1013355b4669Sjacobs 	papi_service_t svc = NULL;
10144749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 	char *printer = request;
1015355b4669Sjacobs 	int32_t id = -1;
10164749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 	int flag1 = 0;
10174749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 	int flag = 1;
10184749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 	int print_flag = 0;
1019355b4669Sjacobs 
10204749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 	do {
10214749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		status = papiServiceCreate(&svc, printer, NULL, NULL,
10224749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		    cli_auth_callback, encryption, NULL);
1023355b4669Sjacobs 
10244749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		if ((status == PAPI_OK) && (printer != NULL))
10254749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			print_flag = 1;
10264749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 
10274749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		/* <name>-# printer name does not exist */
10284749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		if (status != PAPI_OK) {
10294749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			/*
10304749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			 * Check if <name>-# is a request-id
10314749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			 * Once this check is done flag1 is set
10324749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			 */
10334749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			if (flag1 == 1)
10344749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 				break;
10354749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 
10364749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			get_printer_id(printer, &printer, &id);
10374749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 
10384749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			status = papiServiceCreate(&svc, printer, NULL, NULL,
10394749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			    cli_auth_callback, encryption, NULL);
10404749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 
1041355b4669Sjacobs 			if (status != PAPI_OK) {
1042355b4669Sjacobs 				fprintf(stderr, gettext(
1043355b4669Sjacobs 				    "Failed to contact service for %s: %s\n"),
1044355b4669Sjacobs 				    (printer ? printer : "all"),
1045355b4669Sjacobs 				    verbose_papi_message(svc, status));
1046355b4669Sjacobs 				return (-1);
1047355b4669Sjacobs 			}
10484749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		}
1049355b4669Sjacobs 
1050355b4669Sjacobs 		if (printer == NULL) { /* all */
1051355b4669Sjacobs 			char **interest = interest_list(svc);
1052355b4669Sjacobs 
1053355b4669Sjacobs 			if (interest != NULL) {
1054355b4669Sjacobs 				int i;
1055355b4669Sjacobs 
1056355b4669Sjacobs 				for (i = 0; interest[i] != NULL; i++)
1057355b4669Sjacobs 					result += job_query(interest[i], report,
1058355b4669Sjacobs 					    encryption, show_rank, verbose);
1059355b4669Sjacobs 			}
1060355b4669Sjacobs 		} else if (id == -1) { /* a printer */
1061355b4669Sjacobs 			papi_job_t *jobs = NULL;
1062355b4669Sjacobs 
10634749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			status = papiPrinterListJobs(svc, printer, NULL,
10644749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			    0, 0, &jobs);
1065355b4669Sjacobs 			if (status != PAPI_OK) {
1066355b4669Sjacobs 				fprintf(stderr, gettext(
1067355b4669Sjacobs 				    "Failed to get job list: %s\n"),
1068355b4669Sjacobs 				    verbose_papi_message(svc, status));
1069355b4669Sjacobs 				papiServiceDestroy(svc);
1070355b4669Sjacobs 				return (-1);
1071355b4669Sjacobs 			}
1072355b4669Sjacobs 
1073355b4669Sjacobs 			if (jobs != NULL) {
1074355b4669Sjacobs 				int i;
1075355b4669Sjacobs 
1076355b4669Sjacobs 				for (i = 0; jobs[i] != NULL; i++)
107735a603adSsonam gupta - Sun Microsystems - Bangalore India 					result += report(printer,
107835a603adSsonam gupta - Sun Microsystems - Bangalore India 					    jobs[i], show_rank,
107935a603adSsonam gupta - Sun Microsystems - Bangalore India 					    verbose);
1080355b4669Sjacobs 			}
1081355b4669Sjacobs 
1082355b4669Sjacobs 			papiJobListFree(jobs);
1083355b4669Sjacobs 		} else {	/* a job */
1084355b4669Sjacobs 			papi_job_t job = NULL;
1085f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			int rid = id;
1086355b4669Sjacobs 
10874749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			/* Once a job has been found stop processing */
10884749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			flag = 0;
10894749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 
1090f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			/*
1091f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			 * Job-id could be the job-id requested
1092f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			 * Check if it is job-id or job-id-requested
1093f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			 */
1094f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			id = job_to_be_queried(svc, printer, id);
1095f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 
1096f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			if (id > 0)
1097375b28ffSGowtham Thommandra 				status = papiJobQuery(svc, printer, id,
1098375b28ffSGowtham Thommandra 				    NULL, &job);
1099f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 			else
1100375b28ffSGowtham Thommandra 				status = papiJobQuery(svc, printer, rid,
1101375b28ffSGowtham Thommandra 				    NULL, &job);
1102f0b87b90Ssonam gupta - Sun Microsystems - Bangalore India 
1103355b4669Sjacobs 			if (status != PAPI_OK) {
11044749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 				if (!print_flag)
1105355b4669Sjacobs 					fprintf(stderr, gettext(
110654d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					    "Failed to get job"\
110754d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					    " info for %s: %s\n"),
110854d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					    request,
110954d5ddccSsonam gupta - Sun Microsystems - Bangalore India 					    verbose_papi_message(svc, status));
1110355b4669Sjacobs 				papiServiceDestroy(svc);
1111355b4669Sjacobs 				return (-1);
1112355b4669Sjacobs 			}
1113355b4669Sjacobs 
1114355b4669Sjacobs 			if (job != NULL)
111535a603adSsonam gupta - Sun Microsystems - Bangalore India 				result = report(printer, job,
111635a603adSsonam gupta - Sun Microsystems - Bangalore India 				    show_rank, verbose);
1117355b4669Sjacobs 
1118355b4669Sjacobs 			papiJobFree(job);
1119355b4669Sjacobs 		}
1120355b4669Sjacobs 
11214749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		if (flag) {
11224749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			id = -1;
11234749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			get_printer_id(printer, &printer, &id);
11244749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			if (id == -1)
11254749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 				flag = 0;
11264749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 			else
11274749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 				flag1 = 1;
11284749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 		}
11294749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 	} while (flag);
11304749ecc3Ssonam gupta - Sun Microsystems - Bangalore India 
1131355b4669Sjacobs 	papiServiceDestroy(svc);
1132355b4669Sjacobs 
1133355b4669Sjacobs 	return (result);
1134355b4669Sjacobs }
1135355b4669Sjacobs 
1136355b4669Sjacobs static int
1137355b4669Sjacobs report_form(char *name, papi_attribute_t **attrs, int verbose)
1138355b4669Sjacobs {
1139355b4669Sjacobs 	papi_status_t status;
1140355b4669Sjacobs 	char *form = NULL;
1141355b4669Sjacobs 	void *iter = NULL;
1142355b4669Sjacobs 
1143355b4669Sjacobs 	for (status = papiAttributeListGetString(attrs, &iter,
1144355b4669Sjacobs 	    "form-supported", &form);
1145355b4669Sjacobs 	    status == PAPI_OK;
1146355b4669Sjacobs 	    status = papiAttributeListGetString(attrs, &iter,
1147355b4669Sjacobs 	    NULL, &form)) {
1148355b4669Sjacobs 		if ((name == NULL) || (strcmp(name, form) == 0)) {
1149355b4669Sjacobs 			printf(gettext("form %s is available to you\n"), form);
1150355b4669Sjacobs 			if (verbose != 0) {
1151355b4669Sjacobs 				char *detail = NULL;
1152355b4669Sjacobs 				status = papiAttributeListGetString(attrs, NULL,
115354d5ddccSsonam gupta - Sun Microsystems - Bangalore India 				    "form-supported-detail", &detail);
1154355b4669Sjacobs 				if (status == PAPI_OK)
1155355b4669Sjacobs 					printf("%s\n", detail);
1156355b4669Sjacobs 			}
1157355b4669Sjacobs 		}
1158355b4669Sjacobs 	}
1159355b4669Sjacobs 
1160355b4669Sjacobs 	return (0);
1161355b4669Sjacobs }
1162355b4669Sjacobs 
1163355b4669Sjacobs static int
1164355b4669Sjacobs report_print_wheels(char *name, papi_attribute_t **attrs, int verbose)
1165355b4669Sjacobs {
1166355b4669Sjacobs 	papi_status_t status;
1167355b4669Sjacobs 	char *pw = NULL;
1168355b4669Sjacobs 	void *iter = NULL;
1169355b4669Sjacobs 
1170355b4669Sjacobs 	for (status = papiAttributeListGetString(attrs, &iter,
1171355b4669Sjacobs 	    "pw-supported", &pw);
1172355b4669Sjacobs 	    status == PAPI_OK;
1173355b4669Sjacobs 	    status = papiAttributeListGetString(attrs, &iter, NULL, &pw)) {
1174355b4669Sjacobs 		if ((name == NULL) || (strcmp(name, pw) == 0)) {
1175355b4669Sjacobs 			printf(gettext("charset %s is available\n"), pw);
1176355b4669Sjacobs 			if (verbose != 0) {
1177355b4669Sjacobs 				char *info = NULL;
1178355b4669Sjacobs 				status = papiAttributeListGetString(attrs, NULL,
1179355b4669Sjacobs 				    "pw-supported-extra", &info);
1180355b4669Sjacobs 				if (status == PAPI_OK)
1181355b4669Sjacobs 					printf("%s\n", info);
1182355b4669Sjacobs 			}
1183355b4669Sjacobs 		}
1184355b4669Sjacobs 	}
1185355b4669Sjacobs 
1186355b4669Sjacobs 	return (0);
1187355b4669Sjacobs }
1188355b4669Sjacobs 
1189355b4669Sjacobs static int
1190355b4669Sjacobs service_query(char *name, int (*report)(char *, papi_attribute_t **, int),
1191355b4669Sjacobs 		papi_encryption_t encryption, int verbose)
1192355b4669Sjacobs {
1193355b4669Sjacobs 	int result = 0;
1194355b4669Sjacobs 	papi_status_t status;
1195355b4669Sjacobs 	papi_service_t svc = NULL;
1196355b4669Sjacobs 	papi_attribute_t **attrs = NULL;
1197355b4669Sjacobs 
1198355b4669Sjacobs 	status = papiServiceCreate(&svc, name, NULL, NULL, cli_auth_callback,
1199355b4669Sjacobs 	    encryption, NULL);
1200355b4669Sjacobs 	if (status != PAPI_OK) {
1201355b4669Sjacobs 		papiServiceDestroy(svc);
1202355b4669Sjacobs 		return (-1);
1203355b4669Sjacobs 	}
1204355b4669Sjacobs 
1205355b4669Sjacobs 	attrs = papiServiceGetAttributeList(svc);
1206355b4669Sjacobs 	if (attrs != NULL) {
1207355b4669Sjacobs 		result = report(name, attrs, verbose);
1208355b4669Sjacobs 
1209355b4669Sjacobs 		if (verbose > 1) {
1210355b4669Sjacobs 			printf("\n");
1211355b4669Sjacobs 			papiAttributeListPrint(stdout, attrs, "\t");
1212355b4669Sjacobs 			printf("\n");
1213355b4669Sjacobs 		}
1214355b4669Sjacobs 	}
1215355b4669Sjacobs 
1216355b4669Sjacobs 	papiServiceDestroy(svc);
1217355b4669Sjacobs 
1218355b4669Sjacobs 	return (result);
1219355b4669Sjacobs }
1220355b4669Sjacobs 
1221355b4669Sjacobs int
1222355b4669Sjacobs main(int ac, char *av[])
1223355b4669Sjacobs {
1224355b4669Sjacobs 	int exit_code = 0;
1225355b4669Sjacobs 	papi_encryption_t encryption = PAPI_ENCRYPT_NEVER;
1226355b4669Sjacobs 	int rank = 0;
1227355b4669Sjacobs 	int verbose = 0;
1228355b4669Sjacobs 	int description = 0;
1229355b4669Sjacobs 	int c;
1230355b4669Sjacobs 	char **argv;
1231355b4669Sjacobs 
1232355b4669Sjacobs 	(void) setlocale(LC_ALL, "");
1233355b4669Sjacobs 	(void) textdomain("SUNW_OST_OSCMD");
1234355b4669Sjacobs 
1235355b4669Sjacobs 	argv = (char **)calloc((ac + 1), sizeof (char *));
123691216fe4Swendyp 	for (c = 0; c < ac; c++) {
123791216fe4Swendyp 		if ((av[c][0] == '-') && (av[c][1] == 'l') &&
123891216fe4Swendyp 		    (isalpha(av[c][2]) != 0)) {
123991216fe4Swendyp 			/* preserve old "-l[po...]" behavior */
124091216fe4Swendyp 			argv[c] = &av[c][1];
124191216fe4Swendyp 			argv[c][0] = '-';
124291216fe4Swendyp 			verbose = 1;
124391216fe4Swendyp 
124491216fe4Swendyp 		} else
1245355b4669Sjacobs 			argv[c] = av[c];
124691216fe4Swendyp 	}
124791216fe4Swendyp 
1248355b4669Sjacobs 	argv[c++] = "--";
1249355b4669Sjacobs 	ac = c;
1250355b4669Sjacobs 
1251355b4669Sjacobs 	/* preprocess argument list looking for '-l' or '-R' so it can trail */
12525abc75a2SKeerthi Kondaka 	while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF) {
12535abc75a2SKeerthi Kondaka 		switch (c) {    /* these may or may not have an option */
12545abc75a2SKeerthi Kondaka 		case 'a':
12555abc75a2SKeerthi Kondaka 		case 'c':
12565abc75a2SKeerthi Kondaka 		case 'p':
12575abc75a2SKeerthi Kondaka 		case 'o':
12585abc75a2SKeerthi Kondaka 		case 'R':
12595abc75a2SKeerthi Kondaka 		case 'u':
12605abc75a2SKeerthi Kondaka 		case 'v':
12615abc75a2SKeerthi Kondaka 		case 'l':
12625abc75a2SKeerthi Kondaka 		case 'f':
12635abc75a2SKeerthi Kondaka 		case 'S':
12645abc75a2SKeerthi Kondaka 			if (optarg[0] == '-') {
12655abc75a2SKeerthi Kondaka 				/* this check stop a possible infinite loop */
12665abc75a2SKeerthi Kondaka 				if ((optind > 1) && (argv[optind-1][1] != c))
12675abc75a2SKeerthi Kondaka 					optind--;
12685abc75a2SKeerthi Kondaka 				optarg = NULL;
12695abc75a2SKeerthi Kondaka 			} else if (strcmp(optarg, "all") == 0)
12705abc75a2SKeerthi Kondaka 				optarg = NULL;
12715abc75a2SKeerthi Kondaka 		}
12725abc75a2SKeerthi Kondaka 
1273355b4669Sjacobs 		switch (c) {
1274355b4669Sjacobs 		case 'l':
1275355b4669Sjacobs 			if ((optarg == NULL) || (optarg[0] == '-'))
1276355b4669Sjacobs 				optarg = "1";
1277355b4669Sjacobs 			verbose = atoi(optarg);
1278355b4669Sjacobs 			break;
1279355b4669Sjacobs 		case 'D':
1280355b4669Sjacobs 			description = 1;
1281355b4669Sjacobs 			break;
1282355b4669Sjacobs 		case 'R':
1283355b4669Sjacobs 			rank = 1;
1284355b4669Sjacobs 			break;
1285355b4669Sjacobs 		case 'E':
1286355b4669Sjacobs 			encryption = PAPI_ENCRYPT_REQUIRED;
1287355b4669Sjacobs 			break;
1288355b4669Sjacobs 		default:
1289355b4669Sjacobs 			break;
1290355b4669Sjacobs 		}
12915abc75a2SKeerthi Kondaka 	}
1292355b4669Sjacobs 	optind = 1;
1293355b4669Sjacobs 
1294355b4669Sjacobs 	/* process command line arguments */
1295355b4669Sjacobs 	while ((c = getopt(ac, argv, "LEDf:S:stc:p:a:drs:v:l:o:R:u:")) != EOF) {
1296355b4669Sjacobs 		switch (c) {	/* these may or may not have an option */
1297355b4669Sjacobs 		case 'a':
1298355b4669Sjacobs 		case 'c':
1299355b4669Sjacobs 		case 'p':
1300355b4669Sjacobs 		case 'o':
1301355b4669Sjacobs 		case 'R':
1302355b4669Sjacobs 		case 'u':
1303355b4669Sjacobs 		case 'v':
1304355b4669Sjacobs 		case 'l':
1305355b4669Sjacobs 		case 'f':
1306355b4669Sjacobs 		case 'S':
1307355b4669Sjacobs 			if (optarg[0] == '-') {
1308355b4669Sjacobs 				/* this check stop a possible infinite loop */
1309355b4669Sjacobs 				if ((optind > 1) && (argv[optind-1][1] != c))
1310355b4669Sjacobs 					optind--;
1311355b4669Sjacobs 				optarg = NULL;
1312355b4669Sjacobs 			} else if (strcmp(optarg, "all") == 0)
1313355b4669Sjacobs 				optarg = NULL;
1314355b4669Sjacobs 		}
1315355b4669Sjacobs 
1316355b4669Sjacobs 		switch (c) {
1317355b4669Sjacobs 		case 'a':
1318355b4669Sjacobs 			exit_code += printer_query(optarg, report_accepting,
1319355b4669Sjacobs 			    encryption, verbose, 0);
1320355b4669Sjacobs 			break;
1321355b4669Sjacobs 		case 'c':
1322355b4669Sjacobs 			exit_code += printer_query(optarg, report_class,
1323355b4669Sjacobs 			    encryption, verbose, 0);
1324355b4669Sjacobs 			break;
1325355b4669Sjacobs 		case 'p':
1326355b4669Sjacobs 			exit_code += printer_query(optarg, report_printer,
132754d5ddccSsonam gupta - Sun Microsystems - Bangalore India 			    encryption, verbose, description);
1328355b4669Sjacobs 			break;
1329355b4669Sjacobs 		case 'd':
1330355b4669Sjacobs 			exit_code += lpstat_default_printer(encryption);
1331355b4669Sjacobs 			break;
1332355b4669Sjacobs 		case 'r':
1333355b4669Sjacobs 			exit_code += lpstat_service_status(encryption);
1334355b4669Sjacobs 			break;
1335355b4669Sjacobs 		case 'u':
1336355b4669Sjacobs 			if (optarg != NULL)
1337355b4669Sjacobs 				users = strsplit(optarg, ", \n");
1338355b4669Sjacobs 			exit_code += job_query(NULL, report_job,
1339355b4669Sjacobs 			    encryption, rank, verbose);
1340355b4669Sjacobs 			if (users != NULL) {
1341355b4669Sjacobs 				free(users);
1342355b4669Sjacobs 				users = NULL;
1343355b4669Sjacobs 			}
1344355b4669Sjacobs 			break;
1345355b4669Sjacobs 		case 'v':
1346355b4669Sjacobs 			exit_code += printer_query(optarg, report_device,
1347355b4669Sjacobs 			    encryption, verbose, 0);
1348355b4669Sjacobs 			break;
1349c2765d20SGowtham Thommandra 		case 'R':	/* set "rank" flag in first pass */
1350355b4669Sjacobs 		case 'o':
1351355b4669Sjacobs 			exit_code += job_query(optarg, report_job,
1352355b4669Sjacobs 			    encryption, rank, verbose);
1353355b4669Sjacobs 			break;
1354355b4669Sjacobs 		case 'f':
1355355b4669Sjacobs 			exit_code += service_query(optarg, report_form,
1356355b4669Sjacobs 			    encryption, verbose);
1357355b4669Sjacobs 			break;
1358355b4669Sjacobs 		case 'S':
1359355b4669Sjacobs 			exit_code += service_query(optarg, report_print_wheels,
1360355b4669Sjacobs 			    encryption, verbose);
1361355b4669Sjacobs 			break;
1362355b4669Sjacobs 		case 's':
1363355b4669Sjacobs 			exit_code += lpstat_service_status(encryption);
1364355b4669Sjacobs 			exit_code += lpstat_default_printer(encryption);
1365355b4669Sjacobs 			exit_code += printer_query(NULL, report_class,
1366355b4669Sjacobs 			    encryption, verbose, 0);
1367355b4669Sjacobs 			exit_code += printer_query(NULL, report_device,
1368355b4669Sjacobs 			    encryption, verbose, 0);
1369355b4669Sjacobs 			exit_code += service_query(optarg, report_form,
1370355b4669Sjacobs 			    encryption, verbose);
1371355b4669Sjacobs 			exit_code += service_query(optarg, report_print_wheels,
1372355b4669Sjacobs 			    encryption, verbose);
1373355b4669Sjacobs 			break;
1374355b4669Sjacobs 		case 't':
1375355b4669Sjacobs 			exit_code += lpstat_service_status(encryption);
1376355b4669Sjacobs 			exit_code += lpstat_default_printer(encryption);
1377355b4669Sjacobs 			exit_code += printer_query(NULL, report_class,
1378355b4669Sjacobs 			    encryption, verbose, 0);
1379355b4669Sjacobs 			exit_code += printer_query(NULL, report_device,
1380355b4669Sjacobs 			    encryption, verbose, 0);
1381355b4669Sjacobs 			exit_code += printer_query(NULL, report_accepting,
1382355b4669Sjacobs 			    encryption, verbose, 0);
1383355b4669Sjacobs 			exit_code += printer_query(NULL, report_printer,
1384355b4669Sjacobs 			    encryption, verbose, 0);
1385355b4669Sjacobs 			exit_code += service_query(optarg, report_form,
1386355b4669Sjacobs 			    encryption, verbose);
1387355b4669Sjacobs 			exit_code += service_query(optarg, report_print_wheels,
1388355b4669Sjacobs 			    encryption, verbose);
1389355b4669Sjacobs 			exit_code += job_query(NULL, report_job,
1390355b4669Sjacobs 			    encryption, rank, verbose);
1391355b4669Sjacobs 			break;
1392355b4669Sjacobs 		case 'L':	/* local-only, ignored */
1393355b4669Sjacobs 		case 'l':	/* increased verbose level in first pass */
1394355b4669Sjacobs 		case 'D':	/* set "description" flag in first pass */
1395355b4669Sjacobs 		case 'E':	/* set encryption in the first pass */
1396355b4669Sjacobs 			break;
1397355b4669Sjacobs 		default:
1398355b4669Sjacobs 			usage(av[0]);
1399355b4669Sjacobs 		}
1400355b4669Sjacobs 	}
1401355b4669Sjacobs 	ac--;
1402355b4669Sjacobs 
1403355b4669Sjacobs 	if (ac == 1) {	/* report on my jobs */
1404355b4669Sjacobs 		struct passwd *pw = getpwuid(getuid());
1405355b4669Sjacobs 
1406355b4669Sjacobs 		if (pw != NULL)
1407355b4669Sjacobs 			users = strsplit(pw->pw_name, "");
1408355b4669Sjacobs 		exit_code += job_query(NULL, report_job, encryption,
1409355b4669Sjacobs 		    rank, verbose);
1410355b4669Sjacobs 		if (users != NULL) {
1411355b4669Sjacobs 			free(users);
1412355b4669Sjacobs 			users = NULL;
1413355b4669Sjacobs 		}
1414355b4669Sjacobs 	} else {
1415355b4669Sjacobs 		for (c = optind; c < ac; c++)
1416355b4669Sjacobs 			exit_code += job_query(argv[c], report_job, encryption,
1417355b4669Sjacobs 			    rank, verbose);
1418355b4669Sjacobs 	}
1419355b4669Sjacobs 
1420355b4669Sjacobs 
1421355b4669Sjacobs 	if (exit_code != 0)
1422355b4669Sjacobs 		exit_code = 1;
1423355b4669Sjacobs 
1424355b4669Sjacobs 	return (exit_code);
1425355b4669Sjacobs }
1426