xref: /illumos-gate/usr/src/cmd/print/lpget/lpget.c (revision 7c478bd9)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1998 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <sys/types.h>
32 #include <stdarg.h>
33 #include <unistd.h>
34 #include <string.h>
35 #include <syslog.h>
36 #include <locale.h>
37 #ifndef SUNOS_4
38 #include <libintl.h>
39 #endif
40 
41 #include <print/ns.h>
42 #include <print/misc.h>
43 #include <print/list.h>
44 
45 extern char *optarg;
46 extern int optind, opterr, optopt;
47 extern char *getenv(const char *);
48 
49 
50 static void
51 Usage(char *name)
52 {
53 	(void) fprintf(stderr,
54 		gettext("Usage: %s [-k key] [list|(printer) ...]\n"),
55 		name);
56 	exit(1);
57 }
58 
59 static int
60 display_kvp(char *key, char *value)
61 {
62 	int rc = -1;
63 
64 	if (value != NULL) {
65 		rc = 0;
66 		(void) printf("\n\t%s=%s", key, value);
67 	} else
68 		(void) printf(gettext("\n\t%s - undefined"), key);
69 
70 	return (rc);
71 }
72 
73 
74 static int
75 display_value(ns_printer_t *printer, char *name, char **keys)
76 {
77 	int rc = -1;
78 
79 	if (printer != NULL) {
80 		rc = 0;
81 		(void) printf("%s:", name);
82 		if (keys != NULL) {
83 			while (*keys != NULL) {
84 				char *string = ns_get_value_string(*keys,
85 							printer);
86 				rc += display_kvp(*keys, string);
87 				keys++;
88 			}
89 		} else {
90 			ns_kvp_t **list = printer->attributes;
91 
92 			for (list = printer->attributes;
93 			    (list != NULL && *list != NULL); list++) {
94 				char *string;
95 				if (((*list)->key[0] == '\t') ||
96 				    ((*list)->key[0] == ' '))
97 					continue;
98 
99 				string = ns_get_value_string((*list)->key,
100 							    printer);
101 				rc += display_kvp((*list)->key, string);
102 			}
103 		}
104 		(void) printf("\n");
105 	} else
106 		(void) printf(gettext("%s: Not Found\n"), name);
107 
108 	return (rc);
109 }
110 
111 
112 /*
113  *  main() calls the appropriate routine to parse the command line arguments
114  *	and then calls the local remove routine, followed by the remote remove
115  *	routine to remove jobs.
116  */
117 int
118 main(int ac, char *av[])
119 {
120 	char *program;
121 	int c;
122 	char **keys = NULL;
123 	char *ns = NULL;
124 	int exit_code = 0;
125 
126 	(void) setlocale(LC_ALL, "");
127 
128 #if	!defined(TEXT_DOMAIN)
129 #define	TEXT_DOMAIN "SYS_TEST"
130 #endif
131 	(void) textdomain(TEXT_DOMAIN);
132 
133 	if ((program = strrchr(av[0], '/')) == NULL)
134 		program = av[0];
135 	else
136 		program++;
137 
138 	openlog(program, LOG_PID, LOG_LPR);
139 	while ((c = getopt(ac, av, "k:t:n:")) != EOF)
140 		switch (c) {
141 		case 'k':
142 		case 't':
143 			keys = (char **)list_append((void **)keys,
144 						    (void *)optarg);
145 			break;
146 		case 'n':
147 			ns = optarg;
148 			break;
149 		default:
150 			Usage(program);
151 		}
152 
153 	if (optind >= ac)
154 		Usage(program);
155 
156 	ns = normalize_ns_name(ns);
157 
158 	while (optind < ac) {
159 		char *name = av[optind++];
160 
161 		if (strcmp(name, "list") == 0) {
162 			ns_printer_t **printers = ns_printer_get_list(ns);
163 
164 			while (printers != NULL && *printers != NULL) {
165 				exit_code += display_value(*printers,
166 						(*printers)->name, keys);
167 				printers++;
168 			}
169 		} else
170 			exit_code = display_value(ns_printer_get_name(name, ns),
171 						name, keys);
172 
173 
174 	}
175 	return (exit_code);
176 }
177