1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * "lpstat" command for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/cups-private.h>
16*5e7646d2SAndroid Build Coastguard Worker
17*5e7646d2SAndroid Build Coastguard Worker
18*5e7646d2SAndroid Build Coastguard Worker /*
19*5e7646d2SAndroid Build Coastguard Worker * Local functions...
20*5e7646d2SAndroid Build Coastguard Worker */
21*5e7646d2SAndroid Build Coastguard Worker
22*5e7646d2SAndroid Build Coastguard Worker static void check_dest(const char *command, const char *name,
23*5e7646d2SAndroid Build Coastguard Worker int *num_dests, cups_dest_t **dests);
24*5e7646d2SAndroid Build Coastguard Worker static int match_list(const char *list, const char *name);
25*5e7646d2SAndroid Build Coastguard Worker static int show_accepting(const char *printers, int num_dests,
26*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests);
27*5e7646d2SAndroid Build Coastguard Worker static int show_classes(const char *dests);
28*5e7646d2SAndroid Build Coastguard Worker static void show_default(cups_dest_t *dest);
29*5e7646d2SAndroid Build Coastguard Worker static int show_devices(const char *printers, int num_dests,
30*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests);
31*5e7646d2SAndroid Build Coastguard Worker static int show_jobs(const char *dests, const char *users, int long_status,
32*5e7646d2SAndroid Build Coastguard Worker int ranking, const char *which);
33*5e7646d2SAndroid Build Coastguard Worker static int show_printers(const char *printers, int num_dests,
34*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests, int long_status);
35*5e7646d2SAndroid Build Coastguard Worker static void show_scheduler(void);
36*5e7646d2SAndroid Build Coastguard Worker static void usage(void) _CUPS_NORETURN;
37*5e7646d2SAndroid Build Coastguard Worker
38*5e7646d2SAndroid Build Coastguard Worker
39*5e7646d2SAndroid Build Coastguard Worker /*
40*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Parse options and show status information.
41*5e7646d2SAndroid Build Coastguard Worker */
42*5e7646d2SAndroid Build Coastguard Worker
43*5e7646d2SAndroid Build Coastguard Worker int
main(int argc,char * argv[])44*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
45*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
46*5e7646d2SAndroid Build Coastguard Worker {
47*5e7646d2SAndroid Build Coastguard Worker int i, /* Looping var */
48*5e7646d2SAndroid Build Coastguard Worker status; /* Exit status */
49*5e7646d2SAndroid Build Coastguard Worker char *opt; /* Option pointer */
50*5e7646d2SAndroid Build Coastguard Worker int num_dests; /* Number of user destinations */
51*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests; /* User destinations */
52*5e7646d2SAndroid Build Coastguard Worker int long_status; /* Long status report? */
53*5e7646d2SAndroid Build Coastguard Worker int ranking; /* Show job ranking? */
54*5e7646d2SAndroid Build Coastguard Worker const char *which; /* Which jobs to show? */
55*5e7646d2SAndroid Build Coastguard Worker char op; /* Last operation on command-line */
56*5e7646d2SAndroid Build Coastguard Worker
57*5e7646d2SAndroid Build Coastguard Worker
58*5e7646d2SAndroid Build Coastguard Worker _cupsSetLocale(argv);
59*5e7646d2SAndroid Build Coastguard Worker
60*5e7646d2SAndroid Build Coastguard Worker /*
61*5e7646d2SAndroid Build Coastguard Worker * Parse command-line options...
62*5e7646d2SAndroid Build Coastguard Worker */
63*5e7646d2SAndroid Build Coastguard Worker
64*5e7646d2SAndroid Build Coastguard Worker num_dests = 0;
65*5e7646d2SAndroid Build Coastguard Worker dests = NULL;
66*5e7646d2SAndroid Build Coastguard Worker long_status = 0;
67*5e7646d2SAndroid Build Coastguard Worker ranking = 0;
68*5e7646d2SAndroid Build Coastguard Worker status = 0;
69*5e7646d2SAndroid Build Coastguard Worker which = "not-completed";
70*5e7646d2SAndroid Build Coastguard Worker op = 0;
71*5e7646d2SAndroid Build Coastguard Worker
72*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < argc; i ++)
73*5e7646d2SAndroid Build Coastguard Worker {
74*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[i], "--help"))
75*5e7646d2SAndroid Build Coastguard Worker usage();
76*5e7646d2SAndroid Build Coastguard Worker else if (argv[i][0] == '-')
77*5e7646d2SAndroid Build Coastguard Worker {
78*5e7646d2SAndroid Build Coastguard Worker for (opt = argv[i] + 1; *opt; opt ++)
79*5e7646d2SAndroid Build Coastguard Worker {
80*5e7646d2SAndroid Build Coastguard Worker switch (*opt)
81*5e7646d2SAndroid Build Coastguard Worker {
82*5e7646d2SAndroid Build Coastguard Worker case 'D' : /* Show description */
83*5e7646d2SAndroid Build Coastguard Worker long_status = 1;
84*5e7646d2SAndroid Build Coastguard Worker break;
85*5e7646d2SAndroid Build Coastguard Worker
86*5e7646d2SAndroid Build Coastguard Worker case 'E' : /* Encrypt */
87*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
88*5e7646d2SAndroid Build Coastguard Worker cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
89*5e7646d2SAndroid Build Coastguard Worker #else
90*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
91*5e7646d2SAndroid Build Coastguard Worker _("%s: Sorry, no encryption support."),
92*5e7646d2SAndroid Build Coastguard Worker argv[0]);
93*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
94*5e7646d2SAndroid Build Coastguard Worker break;
95*5e7646d2SAndroid Build Coastguard Worker
96*5e7646d2SAndroid Build Coastguard Worker case 'H' : /* Show server and port */
97*5e7646d2SAndroid Build Coastguard Worker if (cupsServer()[0] == '/')
98*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, cupsServer());
99*5e7646d2SAndroid Build Coastguard Worker else
100*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "%s:%d", cupsServer(), ippPort());
101*5e7646d2SAndroid Build Coastguard Worker op = 'H';
102*5e7646d2SAndroid Build Coastguard Worker break;
103*5e7646d2SAndroid Build Coastguard Worker
104*5e7646d2SAndroid Build Coastguard Worker case 'P' : /* Show paper types */
105*5e7646d2SAndroid Build Coastguard Worker op = 'P';
106*5e7646d2SAndroid Build Coastguard Worker break;
107*5e7646d2SAndroid Build Coastguard Worker
108*5e7646d2SAndroid Build Coastguard Worker case 'R' : /* Show ranking */
109*5e7646d2SAndroid Build Coastguard Worker ranking = 1;
110*5e7646d2SAndroid Build Coastguard Worker break;
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker case 'S' : /* Show charsets */
113*5e7646d2SAndroid Build Coastguard Worker op = 'S';
114*5e7646d2SAndroid Build Coastguard Worker if (!argv[i][2])
115*5e7646d2SAndroid Build Coastguard Worker i ++;
116*5e7646d2SAndroid Build Coastguard Worker break;
117*5e7646d2SAndroid Build Coastguard Worker
118*5e7646d2SAndroid Build Coastguard Worker case 'U' : /* Username */
119*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
120*5e7646d2SAndroid Build Coastguard Worker {
121*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(opt + 1);
122*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
123*5e7646d2SAndroid Build Coastguard Worker }
124*5e7646d2SAndroid Build Coastguard Worker else
125*5e7646d2SAndroid Build Coastguard Worker {
126*5e7646d2SAndroid Build Coastguard Worker i ++;
127*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
128*5e7646d2SAndroid Build Coastguard Worker {
129*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
130*5e7646d2SAndroid Build Coastguard Worker usage();
131*5e7646d2SAndroid Build Coastguard Worker }
132*5e7646d2SAndroid Build Coastguard Worker
133*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(argv[i]);
134*5e7646d2SAndroid Build Coastguard Worker }
135*5e7646d2SAndroid Build Coastguard Worker break;
136*5e7646d2SAndroid Build Coastguard Worker
137*5e7646d2SAndroid Build Coastguard Worker case 'W' : /* Show which jobs? */
138*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
139*5e7646d2SAndroid Build Coastguard Worker {
140*5e7646d2SAndroid Build Coastguard Worker which = opt + 1;
141*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
142*5e7646d2SAndroid Build Coastguard Worker }
143*5e7646d2SAndroid Build Coastguard Worker else
144*5e7646d2SAndroid Build Coastguard Worker {
145*5e7646d2SAndroid Build Coastguard Worker i ++;
146*5e7646d2SAndroid Build Coastguard Worker
147*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
148*5e7646d2SAndroid Build Coastguard Worker {
149*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."), argv[0]);
150*5e7646d2SAndroid Build Coastguard Worker usage();
151*5e7646d2SAndroid Build Coastguard Worker }
152*5e7646d2SAndroid Build Coastguard Worker
153*5e7646d2SAndroid Build Coastguard Worker which = argv[i];
154*5e7646d2SAndroid Build Coastguard Worker }
155*5e7646d2SAndroid Build Coastguard Worker
156*5e7646d2SAndroid Build Coastguard Worker if (strcmp(which, "completed") && strcmp(which, "not-completed") && strcmp(which, "all"))
157*5e7646d2SAndroid Build Coastguard Worker {
158*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."), argv[0]);
159*5e7646d2SAndroid Build Coastguard Worker usage();
160*5e7646d2SAndroid Build Coastguard Worker }
161*5e7646d2SAndroid Build Coastguard Worker break;
162*5e7646d2SAndroid Build Coastguard Worker
163*5e7646d2SAndroid Build Coastguard Worker case 'a' : /* Show acceptance status */
164*5e7646d2SAndroid Build Coastguard Worker op = 'a';
165*5e7646d2SAndroid Build Coastguard Worker
166*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
167*5e7646d2SAndroid Build Coastguard Worker {
168*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], opt + 1, &num_dests, &dests);
169*5e7646d2SAndroid Build Coastguard Worker
170*5e7646d2SAndroid Build Coastguard Worker status |= show_accepting(opt + 1, num_dests, dests);
171*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
172*5e7646d2SAndroid Build Coastguard Worker }
173*5e7646d2SAndroid Build Coastguard Worker else if ((i + 1) < argc && argv[i + 1][0] != '-')
174*5e7646d2SAndroid Build Coastguard Worker {
175*5e7646d2SAndroid Build Coastguard Worker i ++;
176*5e7646d2SAndroid Build Coastguard Worker
177*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], argv[i], &num_dests, &dests);
178*5e7646d2SAndroid Build Coastguard Worker
179*5e7646d2SAndroid Build Coastguard Worker status |= show_accepting(argv[i], num_dests, dests);
180*5e7646d2SAndroid Build Coastguard Worker }
181*5e7646d2SAndroid Build Coastguard Worker else
182*5e7646d2SAndroid Build Coastguard Worker {
183*5e7646d2SAndroid Build Coastguard Worker if (num_dests <= 1)
184*5e7646d2SAndroid Build Coastguard Worker {
185*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_dests, dests);
186*5e7646d2SAndroid Build Coastguard Worker num_dests = cupsGetDests(&dests);
187*5e7646d2SAndroid Build Coastguard Worker
188*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0 && (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST || cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
189*5e7646d2SAndroid Build Coastguard Worker {
190*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
191*5e7646d2SAndroid Build Coastguard Worker return (1);
192*5e7646d2SAndroid Build Coastguard Worker }
193*5e7646d2SAndroid Build Coastguard Worker }
194*5e7646d2SAndroid Build Coastguard Worker
195*5e7646d2SAndroid Build Coastguard Worker status |= show_accepting(NULL, num_dests, dests);
196*5e7646d2SAndroid Build Coastguard Worker }
197*5e7646d2SAndroid Build Coastguard Worker break;
198*5e7646d2SAndroid Build Coastguard Worker
199*5e7646d2SAndroid Build Coastguard Worker case 'c' : /* Show classes and members */
200*5e7646d2SAndroid Build Coastguard Worker op = 'c';
201*5e7646d2SAndroid Build Coastguard Worker
202*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
203*5e7646d2SAndroid Build Coastguard Worker {
204*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], opt + 1, &num_dests, &dests);
205*5e7646d2SAndroid Build Coastguard Worker
206*5e7646d2SAndroid Build Coastguard Worker status |= show_classes(opt + 1);
207*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
208*5e7646d2SAndroid Build Coastguard Worker }
209*5e7646d2SAndroid Build Coastguard Worker else if ((i + 1) < argc && argv[i + 1][0] != '-')
210*5e7646d2SAndroid Build Coastguard Worker {
211*5e7646d2SAndroid Build Coastguard Worker i ++;
212*5e7646d2SAndroid Build Coastguard Worker
213*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], argv[i], &num_dests, &dests);
214*5e7646d2SAndroid Build Coastguard Worker
215*5e7646d2SAndroid Build Coastguard Worker status |= show_classes(argv[i]);
216*5e7646d2SAndroid Build Coastguard Worker }
217*5e7646d2SAndroid Build Coastguard Worker else
218*5e7646d2SAndroid Build Coastguard Worker status |= show_classes(NULL);
219*5e7646d2SAndroid Build Coastguard Worker break;
220*5e7646d2SAndroid Build Coastguard Worker
221*5e7646d2SAndroid Build Coastguard Worker case 'd' : /* Show default destination */
222*5e7646d2SAndroid Build Coastguard Worker op = 'd';
223*5e7646d2SAndroid Build Coastguard Worker
224*5e7646d2SAndroid Build Coastguard Worker if (num_dests != 1 || !dests[0].is_default)
225*5e7646d2SAndroid Build Coastguard Worker {
226*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_dests, dests);
227*5e7646d2SAndroid Build Coastguard Worker
228*5e7646d2SAndroid Build Coastguard Worker dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
229*5e7646d2SAndroid Build Coastguard Worker num_dests = dests ? 1 : 0;
230*5e7646d2SAndroid Build Coastguard Worker
231*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0 &&
232*5e7646d2SAndroid Build Coastguard Worker (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
233*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
234*5e7646d2SAndroid Build Coastguard Worker {
235*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
236*5e7646d2SAndroid Build Coastguard Worker return (1);
237*5e7646d2SAndroid Build Coastguard Worker }
238*5e7646d2SAndroid Build Coastguard Worker }
239*5e7646d2SAndroid Build Coastguard Worker
240*5e7646d2SAndroid Build Coastguard Worker show_default(dests);
241*5e7646d2SAndroid Build Coastguard Worker break;
242*5e7646d2SAndroid Build Coastguard Worker
243*5e7646d2SAndroid Build Coastguard Worker case 'e' : /* List destinations */
244*5e7646d2SAndroid Build Coastguard Worker {
245*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *temp = NULL, *dest;
246*5e7646d2SAndroid Build Coastguard Worker int j, num_temp = cupsGetDests(&temp);
247*5e7646d2SAndroid Build Coastguard Worker
248*5e7646d2SAndroid Build Coastguard Worker op = 'e';
249*5e7646d2SAndroid Build Coastguard Worker
250*5e7646d2SAndroid Build Coastguard Worker for (j = num_temp, dest = temp; j > 0; j --, dest ++)
251*5e7646d2SAndroid Build Coastguard Worker {
252*5e7646d2SAndroid Build Coastguard Worker if (dest->instance)
253*5e7646d2SAndroid Build Coastguard Worker printf("%s/%s", dest->name, dest->instance);
254*5e7646d2SAndroid Build Coastguard Worker else
255*5e7646d2SAndroid Build Coastguard Worker fputs(dest->name, stdout);
256*5e7646d2SAndroid Build Coastguard Worker
257*5e7646d2SAndroid Build Coastguard Worker if (long_status)
258*5e7646d2SAndroid Build Coastguard Worker {
259*5e7646d2SAndroid Build Coastguard Worker const char *printer_uri_supported = cupsGetOption("printer-uri-supported", dest->num_options, dest->options);
260*5e7646d2SAndroid Build Coastguard Worker const char *printer_is_temporary = cupsGetOption("printer-is-temporary", dest->num_options, dest->options);
261*5e7646d2SAndroid Build Coastguard Worker const char *type = "network";
262*5e7646d2SAndroid Build Coastguard Worker
263*5e7646d2SAndroid Build Coastguard Worker if (printer_is_temporary && !strcmp(printer_is_temporary, "true"))
264*5e7646d2SAndroid Build Coastguard Worker type = "temporary";
265*5e7646d2SAndroid Build Coastguard Worker else if (printer_uri_supported)
266*5e7646d2SAndroid Build Coastguard Worker type = "permanent";
267*5e7646d2SAndroid Build Coastguard Worker
268*5e7646d2SAndroid Build Coastguard Worker printf(" %s %s %s\n", type, printer_uri_supported ? printer_uri_supported : "none", cupsGetOption("device-uri", dest->num_options, dest->options));
269*5e7646d2SAndroid Build Coastguard Worker }
270*5e7646d2SAndroid Build Coastguard Worker else
271*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
272*5e7646d2SAndroid Build Coastguard Worker }
273*5e7646d2SAndroid Build Coastguard Worker
274*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_temp, temp);
275*5e7646d2SAndroid Build Coastguard Worker }
276*5e7646d2SAndroid Build Coastguard Worker break;
277*5e7646d2SAndroid Build Coastguard Worker
278*5e7646d2SAndroid Build Coastguard Worker case 'f' : /* Show forms */
279*5e7646d2SAndroid Build Coastguard Worker op = 'f';
280*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
281*5e7646d2SAndroid Build Coastguard Worker {
282*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
283*5e7646d2SAndroid Build Coastguard Worker }
284*5e7646d2SAndroid Build Coastguard Worker else
285*5e7646d2SAndroid Build Coastguard Worker {
286*5e7646d2SAndroid Build Coastguard Worker i ++;
287*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
288*5e7646d2SAndroid Build Coastguard Worker return (1);
289*5e7646d2SAndroid Build Coastguard Worker }
290*5e7646d2SAndroid Build Coastguard Worker break;
291*5e7646d2SAndroid Build Coastguard Worker
292*5e7646d2SAndroid Build Coastguard Worker case 'h' : /* Connect to host */
293*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
294*5e7646d2SAndroid Build Coastguard Worker {
295*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(opt + 1);
296*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
297*5e7646d2SAndroid Build Coastguard Worker }
298*5e7646d2SAndroid Build Coastguard Worker else
299*5e7646d2SAndroid Build Coastguard Worker {
300*5e7646d2SAndroid Build Coastguard Worker i ++;
301*5e7646d2SAndroid Build Coastguard Worker
302*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
303*5e7646d2SAndroid Build Coastguard Worker {
304*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]);
305*5e7646d2SAndroid Build Coastguard Worker return (1);
306*5e7646d2SAndroid Build Coastguard Worker }
307*5e7646d2SAndroid Build Coastguard Worker
308*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(argv[i]);
309*5e7646d2SAndroid Build Coastguard Worker }
310*5e7646d2SAndroid Build Coastguard Worker break;
311*5e7646d2SAndroid Build Coastguard Worker
312*5e7646d2SAndroid Build Coastguard Worker case 'l' : /* Long status or long job status */
313*5e7646d2SAndroid Build Coastguard Worker long_status = 2;
314*5e7646d2SAndroid Build Coastguard Worker break;
315*5e7646d2SAndroid Build Coastguard Worker
316*5e7646d2SAndroid Build Coastguard Worker case 'o' : /* Show jobs by destination */
317*5e7646d2SAndroid Build Coastguard Worker op = 'o';
318*5e7646d2SAndroid Build Coastguard Worker
319*5e7646d2SAndroid Build Coastguard Worker if (opt[1])
320*5e7646d2SAndroid Build Coastguard Worker {
321*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], opt + 1, &num_dests, &dests);
322*5e7646d2SAndroid Build Coastguard Worker
323*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(opt + 1, NULL, long_status, ranking, which);
324*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
325*5e7646d2SAndroid Build Coastguard Worker }
326*5e7646d2SAndroid Build Coastguard Worker else if ((i + 1) < argc && argv[i + 1][0] != '-')
327*5e7646d2SAndroid Build Coastguard Worker {
328*5e7646d2SAndroid Build Coastguard Worker i ++;
329*5e7646d2SAndroid Build Coastguard Worker
330*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], argv[i], &num_dests, &dests);
331*5e7646d2SAndroid Build Coastguard Worker
332*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(argv[i], NULL, long_status, ranking, which);
333*5e7646d2SAndroid Build Coastguard Worker }
334*5e7646d2SAndroid Build Coastguard Worker else
335*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(NULL, NULL, long_status, ranking, which);
336*5e7646d2SAndroid Build Coastguard Worker break;
337*5e7646d2SAndroid Build Coastguard Worker
338*5e7646d2SAndroid Build Coastguard Worker case 'p' : /* Show printers */
339*5e7646d2SAndroid Build Coastguard Worker op = 'p';
340*5e7646d2SAndroid Build Coastguard Worker
341*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
342*5e7646d2SAndroid Build Coastguard Worker {
343*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], opt + 1, &num_dests, &dests);
344*5e7646d2SAndroid Build Coastguard Worker
345*5e7646d2SAndroid Build Coastguard Worker status |= show_printers(opt + 1, num_dests, dests,
346*5e7646d2SAndroid Build Coastguard Worker long_status);
347*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
348*5e7646d2SAndroid Build Coastguard Worker }
349*5e7646d2SAndroid Build Coastguard Worker else if ((i + 1) < argc && argv[i + 1][0] != '-')
350*5e7646d2SAndroid Build Coastguard Worker {
351*5e7646d2SAndroid Build Coastguard Worker i ++;
352*5e7646d2SAndroid Build Coastguard Worker
353*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], argv[i], &num_dests, &dests);
354*5e7646d2SAndroid Build Coastguard Worker
355*5e7646d2SAndroid Build Coastguard Worker status |= show_printers(argv[i], num_dests, dests, long_status);
356*5e7646d2SAndroid Build Coastguard Worker }
357*5e7646d2SAndroid Build Coastguard Worker else
358*5e7646d2SAndroid Build Coastguard Worker {
359*5e7646d2SAndroid Build Coastguard Worker if (num_dests <= 1)
360*5e7646d2SAndroid Build Coastguard Worker {
361*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_dests, dests);
362*5e7646d2SAndroid Build Coastguard Worker num_dests = cupsGetDests(&dests);
363*5e7646d2SAndroid Build Coastguard Worker
364*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0 &&
365*5e7646d2SAndroid Build Coastguard Worker (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
366*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
367*5e7646d2SAndroid Build Coastguard Worker {
368*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
369*5e7646d2SAndroid Build Coastguard Worker return (1);
370*5e7646d2SAndroid Build Coastguard Worker }
371*5e7646d2SAndroid Build Coastguard Worker }
372*5e7646d2SAndroid Build Coastguard Worker
373*5e7646d2SAndroid Build Coastguard Worker status |= show_printers(NULL, num_dests, dests, long_status);
374*5e7646d2SAndroid Build Coastguard Worker }
375*5e7646d2SAndroid Build Coastguard Worker break;
376*5e7646d2SAndroid Build Coastguard Worker
377*5e7646d2SAndroid Build Coastguard Worker case 'r' : /* Show scheduler status */
378*5e7646d2SAndroid Build Coastguard Worker op = 'r';
379*5e7646d2SAndroid Build Coastguard Worker
380*5e7646d2SAndroid Build Coastguard Worker show_scheduler();
381*5e7646d2SAndroid Build Coastguard Worker break;
382*5e7646d2SAndroid Build Coastguard Worker
383*5e7646d2SAndroid Build Coastguard Worker case 's' : /* Show summary */
384*5e7646d2SAndroid Build Coastguard Worker op = 's';
385*5e7646d2SAndroid Build Coastguard Worker
386*5e7646d2SAndroid Build Coastguard Worker if (num_dests <= 1)
387*5e7646d2SAndroid Build Coastguard Worker {
388*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_dests, dests);
389*5e7646d2SAndroid Build Coastguard Worker num_dests = cupsGetDests(&dests);
390*5e7646d2SAndroid Build Coastguard Worker
391*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0 &&
392*5e7646d2SAndroid Build Coastguard Worker (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
393*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
394*5e7646d2SAndroid Build Coastguard Worker {
395*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
396*5e7646d2SAndroid Build Coastguard Worker return (1);
397*5e7646d2SAndroid Build Coastguard Worker }
398*5e7646d2SAndroid Build Coastguard Worker }
399*5e7646d2SAndroid Build Coastguard Worker
400*5e7646d2SAndroid Build Coastguard Worker show_default(cupsGetDest(NULL, NULL, num_dests, dests));
401*5e7646d2SAndroid Build Coastguard Worker status |= show_classes(NULL);
402*5e7646d2SAndroid Build Coastguard Worker status |= show_devices(NULL, num_dests, dests);
403*5e7646d2SAndroid Build Coastguard Worker break;
404*5e7646d2SAndroid Build Coastguard Worker
405*5e7646d2SAndroid Build Coastguard Worker case 't' : /* Show all info */
406*5e7646d2SAndroid Build Coastguard Worker op = 't';
407*5e7646d2SAndroid Build Coastguard Worker
408*5e7646d2SAndroid Build Coastguard Worker if (num_dests <= 1)
409*5e7646d2SAndroid Build Coastguard Worker {
410*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_dests, dests);
411*5e7646d2SAndroid Build Coastguard Worker num_dests = cupsGetDests(&dests);
412*5e7646d2SAndroid Build Coastguard Worker
413*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0 &&
414*5e7646d2SAndroid Build Coastguard Worker (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
415*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
416*5e7646d2SAndroid Build Coastguard Worker {
417*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
418*5e7646d2SAndroid Build Coastguard Worker return (1);
419*5e7646d2SAndroid Build Coastguard Worker }
420*5e7646d2SAndroid Build Coastguard Worker }
421*5e7646d2SAndroid Build Coastguard Worker
422*5e7646d2SAndroid Build Coastguard Worker show_scheduler();
423*5e7646d2SAndroid Build Coastguard Worker show_default(cupsGetDest(NULL, NULL, num_dests, dests));
424*5e7646d2SAndroid Build Coastguard Worker status |= show_classes(NULL);
425*5e7646d2SAndroid Build Coastguard Worker status |= show_devices(NULL, num_dests, dests);
426*5e7646d2SAndroid Build Coastguard Worker status |= show_accepting(NULL, num_dests, dests);
427*5e7646d2SAndroid Build Coastguard Worker status |= show_printers(NULL, num_dests, dests, long_status);
428*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(NULL, NULL, long_status, ranking, which);
429*5e7646d2SAndroid Build Coastguard Worker break;
430*5e7646d2SAndroid Build Coastguard Worker
431*5e7646d2SAndroid Build Coastguard Worker case 'u' : /* Show jobs by user */
432*5e7646d2SAndroid Build Coastguard Worker op = 'u';
433*5e7646d2SAndroid Build Coastguard Worker
434*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
435*5e7646d2SAndroid Build Coastguard Worker {
436*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(NULL, opt + 1, long_status, ranking, which);
437*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
438*5e7646d2SAndroid Build Coastguard Worker }
439*5e7646d2SAndroid Build Coastguard Worker else if ((i + 1) < argc && argv[i + 1][0] != '-')
440*5e7646d2SAndroid Build Coastguard Worker {
441*5e7646d2SAndroid Build Coastguard Worker i ++;
442*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(NULL, argv[i], long_status, ranking, which);
443*5e7646d2SAndroid Build Coastguard Worker }
444*5e7646d2SAndroid Build Coastguard Worker else
445*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(NULL, NULL, long_status, ranking, which);
446*5e7646d2SAndroid Build Coastguard Worker break;
447*5e7646d2SAndroid Build Coastguard Worker
448*5e7646d2SAndroid Build Coastguard Worker case 'v' : /* Show printer devices */
449*5e7646d2SAndroid Build Coastguard Worker op = 'v';
450*5e7646d2SAndroid Build Coastguard Worker
451*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
452*5e7646d2SAndroid Build Coastguard Worker {
453*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], opt + 1, &num_dests, &dests);
454*5e7646d2SAndroid Build Coastguard Worker
455*5e7646d2SAndroid Build Coastguard Worker status |= show_devices(opt + 1, num_dests, dests);
456*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
457*5e7646d2SAndroid Build Coastguard Worker }
458*5e7646d2SAndroid Build Coastguard Worker else if ((i + 1) < argc && argv[i + 1][0] != '-')
459*5e7646d2SAndroid Build Coastguard Worker {
460*5e7646d2SAndroid Build Coastguard Worker i ++;
461*5e7646d2SAndroid Build Coastguard Worker
462*5e7646d2SAndroid Build Coastguard Worker check_dest(argv[0], argv[i], &num_dests, &dests);
463*5e7646d2SAndroid Build Coastguard Worker
464*5e7646d2SAndroid Build Coastguard Worker status |= show_devices(argv[i], num_dests, dests);
465*5e7646d2SAndroid Build Coastguard Worker }
466*5e7646d2SAndroid Build Coastguard Worker else
467*5e7646d2SAndroid Build Coastguard Worker {
468*5e7646d2SAndroid Build Coastguard Worker if (num_dests <= 1)
469*5e7646d2SAndroid Build Coastguard Worker {
470*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_dests, dests);
471*5e7646d2SAndroid Build Coastguard Worker num_dests = cupsGetDests(&dests);
472*5e7646d2SAndroid Build Coastguard Worker
473*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0 &&
474*5e7646d2SAndroid Build Coastguard Worker (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
475*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED))
476*5e7646d2SAndroid Build Coastguard Worker {
477*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
478*5e7646d2SAndroid Build Coastguard Worker return (1);
479*5e7646d2SAndroid Build Coastguard Worker }
480*5e7646d2SAndroid Build Coastguard Worker }
481*5e7646d2SAndroid Build Coastguard Worker
482*5e7646d2SAndroid Build Coastguard Worker status |= show_devices(NULL, num_dests, dests);
483*5e7646d2SAndroid Build Coastguard Worker }
484*5e7646d2SAndroid Build Coastguard Worker break;
485*5e7646d2SAndroid Build Coastguard Worker
486*5e7646d2SAndroid Build Coastguard Worker default :
487*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], argv[i][1]);
488*5e7646d2SAndroid Build Coastguard Worker usage();
489*5e7646d2SAndroid Build Coastguard Worker }
490*5e7646d2SAndroid Build Coastguard Worker }
491*5e7646d2SAndroid Build Coastguard Worker }
492*5e7646d2SAndroid Build Coastguard Worker else
493*5e7646d2SAndroid Build Coastguard Worker {
494*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(argv[i], NULL, long_status, ranking, which);
495*5e7646d2SAndroid Build Coastguard Worker op = 'o';
496*5e7646d2SAndroid Build Coastguard Worker }
497*5e7646d2SAndroid Build Coastguard Worker }
498*5e7646d2SAndroid Build Coastguard Worker
499*5e7646d2SAndroid Build Coastguard Worker if (!op)
500*5e7646d2SAndroid Build Coastguard Worker status |= show_jobs(NULL, cupsUser(), long_status, ranking, which);
501*5e7646d2SAndroid Build Coastguard Worker
502*5e7646d2SAndroid Build Coastguard Worker return (status);
503*5e7646d2SAndroid Build Coastguard Worker }
504*5e7646d2SAndroid Build Coastguard Worker
505*5e7646d2SAndroid Build Coastguard Worker
506*5e7646d2SAndroid Build Coastguard Worker /*
507*5e7646d2SAndroid Build Coastguard Worker * 'check_dest()' - Verify that the named destination(s) exists.
508*5e7646d2SAndroid Build Coastguard Worker */
509*5e7646d2SAndroid Build Coastguard Worker
510*5e7646d2SAndroid Build Coastguard Worker static void
check_dest(const char * command,const char * name,int * num_dests,cups_dest_t ** dests)511*5e7646d2SAndroid Build Coastguard Worker check_dest(const char *command, /* I - Command name */
512*5e7646d2SAndroid Build Coastguard Worker const char *name, /* I - List of printer/class names */
513*5e7646d2SAndroid Build Coastguard Worker int *num_dests, /* IO - Number of destinations */
514*5e7646d2SAndroid Build Coastguard Worker cups_dest_t **dests) /* IO - Destinations */
515*5e7646d2SAndroid Build Coastguard Worker {
516*5e7646d2SAndroid Build Coastguard Worker const char *dptr; /* Pointer into name */
517*5e7646d2SAndroid Build Coastguard Worker char *pptr, /* Pointer into printer */
518*5e7646d2SAndroid Build Coastguard Worker printer[1024]; /* Current printer/class name */
519*5e7646d2SAndroid Build Coastguard Worker
520*5e7646d2SAndroid Build Coastguard Worker
521*5e7646d2SAndroid Build Coastguard Worker /*
522*5e7646d2SAndroid Build Coastguard Worker * Load the destination list as necessary...
523*5e7646d2SAndroid Build Coastguard Worker */
524*5e7646d2SAndroid Build Coastguard Worker
525*5e7646d2SAndroid Build Coastguard Worker if (*num_dests <= 1)
526*5e7646d2SAndroid Build Coastguard Worker {
527*5e7646d2SAndroid Build Coastguard Worker if (*num_dests)
528*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(*num_dests, *dests);
529*5e7646d2SAndroid Build Coastguard Worker
530*5e7646d2SAndroid Build Coastguard Worker if (strchr(name, ','))
531*5e7646d2SAndroid Build Coastguard Worker *num_dests = cupsGetDests(dests);
532*5e7646d2SAndroid Build Coastguard Worker else
533*5e7646d2SAndroid Build Coastguard Worker {
534*5e7646d2SAndroid Build Coastguard Worker strlcpy(printer, name, sizeof(printer));
535*5e7646d2SAndroid Build Coastguard Worker if ((pptr = strchr(printer, '/')) != NULL)
536*5e7646d2SAndroid Build Coastguard Worker *pptr++ = '\0';
537*5e7646d2SAndroid Build Coastguard Worker
538*5e7646d2SAndroid Build Coastguard Worker if ((*dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, pptr)) == NULL)
539*5e7646d2SAndroid Build Coastguard Worker {
540*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
541*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
542*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
543*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
544*5e7646d2SAndroid Build Coastguard Worker command);
545*5e7646d2SAndroid Build Coastguard Worker else
546*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
547*5e7646d2SAndroid Build Coastguard Worker _("%s: Invalid destination name in list \"%s\"."),
548*5e7646d2SAndroid Build Coastguard Worker command, name);
549*5e7646d2SAndroid Build Coastguard Worker
550*5e7646d2SAndroid Build Coastguard Worker exit(1);
551*5e7646d2SAndroid Build Coastguard Worker }
552*5e7646d2SAndroid Build Coastguard Worker else
553*5e7646d2SAndroid Build Coastguard Worker {
554*5e7646d2SAndroid Build Coastguard Worker *num_dests = 1;
555*5e7646d2SAndroid Build Coastguard Worker return;
556*5e7646d2SAndroid Build Coastguard Worker }
557*5e7646d2SAndroid Build Coastguard Worker }
558*5e7646d2SAndroid Build Coastguard Worker }
559*5e7646d2SAndroid Build Coastguard Worker
560*5e7646d2SAndroid Build Coastguard Worker /*
561*5e7646d2SAndroid Build Coastguard Worker * Scan the name string for printer/class name(s)...
562*5e7646d2SAndroid Build Coastguard Worker */
563*5e7646d2SAndroid Build Coastguard Worker
564*5e7646d2SAndroid Build Coastguard Worker for (dptr = name; *dptr;)
565*5e7646d2SAndroid Build Coastguard Worker {
566*5e7646d2SAndroid Build Coastguard Worker /*
567*5e7646d2SAndroid Build Coastguard Worker * Skip leading whitespace and commas...
568*5e7646d2SAndroid Build Coastguard Worker */
569*5e7646d2SAndroid Build Coastguard Worker
570*5e7646d2SAndroid Build Coastguard Worker while (isspace(*dptr & 255) || *dptr == ',')
571*5e7646d2SAndroid Build Coastguard Worker dptr ++;
572*5e7646d2SAndroid Build Coastguard Worker
573*5e7646d2SAndroid Build Coastguard Worker if (!*dptr)
574*5e7646d2SAndroid Build Coastguard Worker break;
575*5e7646d2SAndroid Build Coastguard Worker
576*5e7646d2SAndroid Build Coastguard Worker /*
577*5e7646d2SAndroid Build Coastguard Worker * Extract a single destination name from the name string...
578*5e7646d2SAndroid Build Coastguard Worker */
579*5e7646d2SAndroid Build Coastguard Worker
580*5e7646d2SAndroid Build Coastguard Worker for (pptr = printer; !isspace(*dptr & 255) && *dptr != ',' && *dptr;)
581*5e7646d2SAndroid Build Coastguard Worker {
582*5e7646d2SAndroid Build Coastguard Worker if ((size_t)(pptr - printer) < (sizeof(printer) - 1))
583*5e7646d2SAndroid Build Coastguard Worker *pptr++ = *dptr++;
584*5e7646d2SAndroid Build Coastguard Worker else
585*5e7646d2SAndroid Build Coastguard Worker {
586*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
587*5e7646d2SAndroid Build Coastguard Worker _("%s: Invalid destination name in list \"%s\"."),
588*5e7646d2SAndroid Build Coastguard Worker command, name);
589*5e7646d2SAndroid Build Coastguard Worker exit(1);
590*5e7646d2SAndroid Build Coastguard Worker }
591*5e7646d2SAndroid Build Coastguard Worker }
592*5e7646d2SAndroid Build Coastguard Worker
593*5e7646d2SAndroid Build Coastguard Worker *pptr = '\0';
594*5e7646d2SAndroid Build Coastguard Worker
595*5e7646d2SAndroid Build Coastguard Worker /*
596*5e7646d2SAndroid Build Coastguard Worker * Check the destination...
597*5e7646d2SAndroid Build Coastguard Worker */
598*5e7646d2SAndroid Build Coastguard Worker
599*5e7646d2SAndroid Build Coastguard Worker if (!cupsGetDest(printer, NULL, *num_dests, *dests))
600*5e7646d2SAndroid Build Coastguard Worker {
601*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
602*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
603*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
604*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
605*5e7646d2SAndroid Build Coastguard Worker command);
606*5e7646d2SAndroid Build Coastguard Worker else
607*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
608*5e7646d2SAndroid Build Coastguard Worker _("%s: Unknown destination \"%s\"."), command, printer);
609*5e7646d2SAndroid Build Coastguard Worker
610*5e7646d2SAndroid Build Coastguard Worker exit(1);
611*5e7646d2SAndroid Build Coastguard Worker }
612*5e7646d2SAndroid Build Coastguard Worker }
613*5e7646d2SAndroid Build Coastguard Worker }
614*5e7646d2SAndroid Build Coastguard Worker
615*5e7646d2SAndroid Build Coastguard Worker
616*5e7646d2SAndroid Build Coastguard Worker /*
617*5e7646d2SAndroid Build Coastguard Worker * 'match_list()' - Match a name from a list of comma or space-separated names.
618*5e7646d2SAndroid Build Coastguard Worker */
619*5e7646d2SAndroid Build Coastguard Worker
620*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 on match, 0 on no match */
match_list(const char * list,const char * name)621*5e7646d2SAndroid Build Coastguard Worker match_list(const char *list, /* I - List of names */
622*5e7646d2SAndroid Build Coastguard Worker const char *name) /* I - Name to find */
623*5e7646d2SAndroid Build Coastguard Worker {
624*5e7646d2SAndroid Build Coastguard Worker const char *nameptr; /* Pointer into name */
625*5e7646d2SAndroid Build Coastguard Worker
626*5e7646d2SAndroid Build Coastguard Worker
627*5e7646d2SAndroid Build Coastguard Worker /*
628*5e7646d2SAndroid Build Coastguard Worker * An empty list always matches...
629*5e7646d2SAndroid Build Coastguard Worker */
630*5e7646d2SAndroid Build Coastguard Worker
631*5e7646d2SAndroid Build Coastguard Worker if (!list || !*list)
632*5e7646d2SAndroid Build Coastguard Worker return (1);
633*5e7646d2SAndroid Build Coastguard Worker
634*5e7646d2SAndroid Build Coastguard Worker if (!name)
635*5e7646d2SAndroid Build Coastguard Worker return (0);
636*5e7646d2SAndroid Build Coastguard Worker
637*5e7646d2SAndroid Build Coastguard Worker do
638*5e7646d2SAndroid Build Coastguard Worker {
639*5e7646d2SAndroid Build Coastguard Worker /*
640*5e7646d2SAndroid Build Coastguard Worker * Skip leading whitespace and commas...
641*5e7646d2SAndroid Build Coastguard Worker */
642*5e7646d2SAndroid Build Coastguard Worker
643*5e7646d2SAndroid Build Coastguard Worker while (isspace(*list & 255) || *list == ',')
644*5e7646d2SAndroid Build Coastguard Worker list ++;
645*5e7646d2SAndroid Build Coastguard Worker
646*5e7646d2SAndroid Build Coastguard Worker if (!*list)
647*5e7646d2SAndroid Build Coastguard Worker break;
648*5e7646d2SAndroid Build Coastguard Worker
649*5e7646d2SAndroid Build Coastguard Worker /*
650*5e7646d2SAndroid Build Coastguard Worker * Compare names...
651*5e7646d2SAndroid Build Coastguard Worker */
652*5e7646d2SAndroid Build Coastguard Worker
653*5e7646d2SAndroid Build Coastguard Worker for (nameptr = name;
654*5e7646d2SAndroid Build Coastguard Worker *nameptr && *list && tolower(*nameptr & 255) == tolower(*list & 255);
655*5e7646d2SAndroid Build Coastguard Worker nameptr ++, list ++);
656*5e7646d2SAndroid Build Coastguard Worker
657*5e7646d2SAndroid Build Coastguard Worker if (!*nameptr && (!*list || *list == ',' || isspace(*list & 255)))
658*5e7646d2SAndroid Build Coastguard Worker return (1);
659*5e7646d2SAndroid Build Coastguard Worker
660*5e7646d2SAndroid Build Coastguard Worker while (*list && !isspace(*list & 255) && *list != ',')
661*5e7646d2SAndroid Build Coastguard Worker list ++;
662*5e7646d2SAndroid Build Coastguard Worker }
663*5e7646d2SAndroid Build Coastguard Worker while (*list);
664*5e7646d2SAndroid Build Coastguard Worker
665*5e7646d2SAndroid Build Coastguard Worker return (0);
666*5e7646d2SAndroid Build Coastguard Worker }
667*5e7646d2SAndroid Build Coastguard Worker
668*5e7646d2SAndroid Build Coastguard Worker
669*5e7646d2SAndroid Build Coastguard Worker /*
670*5e7646d2SAndroid Build Coastguard Worker * 'show_accepting()' - Show acceptance status.
671*5e7646d2SAndroid Build Coastguard Worker */
672*5e7646d2SAndroid Build Coastguard Worker
673*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
show_accepting(const char * printers,int num_dests,cups_dest_t * dests)674*5e7646d2SAndroid Build Coastguard Worker show_accepting(const char *printers, /* I - Destinations */
675*5e7646d2SAndroid Build Coastguard Worker int num_dests, /* I - Number of user-defined dests */
676*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests) /* I - User-defined destinations */
677*5e7646d2SAndroid Build Coastguard Worker {
678*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
679*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
680*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP Response */
681*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* Current attribute */
682*5e7646d2SAndroid Build Coastguard Worker const char *printer, /* Printer name */
683*5e7646d2SAndroid Build Coastguard Worker *message; /* Printer device URI */
684*5e7646d2SAndroid Build Coastguard Worker int accepting; /* Accepting requests? */
685*5e7646d2SAndroid Build Coastguard Worker time_t ptime; /* Printer state time */
686*5e7646d2SAndroid Build Coastguard Worker char printer_state_time[255];/* Printer state time */
687*5e7646d2SAndroid Build Coastguard Worker static const char *pattrs[] = /* Attributes we need for printers... */
688*5e7646d2SAndroid Build Coastguard Worker {
689*5e7646d2SAndroid Build Coastguard Worker "printer-name",
690*5e7646d2SAndroid Build Coastguard Worker "printer-state-change-time",
691*5e7646d2SAndroid Build Coastguard Worker "printer-state-message",
692*5e7646d2SAndroid Build Coastguard Worker "printer-is-accepting-jobs"
693*5e7646d2SAndroid Build Coastguard Worker };
694*5e7646d2SAndroid Build Coastguard Worker
695*5e7646d2SAndroid Build Coastguard Worker
696*5e7646d2SAndroid Build Coastguard Worker if (printers != NULL && !strcmp(printers, "all"))
697*5e7646d2SAndroid Build Coastguard Worker printers = NULL;
698*5e7646d2SAndroid Build Coastguard Worker
699*5e7646d2SAndroid Build Coastguard Worker /*
700*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS_GET_PRINTERS request, which requires the following
701*5e7646d2SAndroid Build Coastguard Worker * attributes:
702*5e7646d2SAndroid Build Coastguard Worker *
703*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
704*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
705*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
706*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
707*5e7646d2SAndroid Build Coastguard Worker */
708*5e7646d2SAndroid Build Coastguard Worker
709*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(CUPS_GET_PRINTERS);
710*5e7646d2SAndroid Build Coastguard Worker
711*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
712*5e7646d2SAndroid Build Coastguard Worker "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
713*5e7646d2SAndroid Build Coastguard Worker NULL, pattrs);
714*5e7646d2SAndroid Build Coastguard Worker
715*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
716*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
717*5e7646d2SAndroid Build Coastguard Worker
718*5e7646d2SAndroid Build Coastguard Worker /*
719*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
720*5e7646d2SAndroid Build Coastguard Worker */
721*5e7646d2SAndroid Build Coastguard Worker
722*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
723*5e7646d2SAndroid Build Coastguard Worker
724*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
725*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
726*5e7646d2SAndroid Build Coastguard Worker {
727*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
728*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
729*5e7646d2SAndroid Build Coastguard Worker "lpstat");
730*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
731*5e7646d2SAndroid Build Coastguard Worker return (1);
732*5e7646d2SAndroid Build Coastguard Worker }
733*5e7646d2SAndroid Build Coastguard Worker else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
734*5e7646d2SAndroid Build Coastguard Worker {
735*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
736*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
737*5e7646d2SAndroid Build Coastguard Worker return (1);
738*5e7646d2SAndroid Build Coastguard Worker }
739*5e7646d2SAndroid Build Coastguard Worker
740*5e7646d2SAndroid Build Coastguard Worker if (response)
741*5e7646d2SAndroid Build Coastguard Worker {
742*5e7646d2SAndroid Build Coastguard Worker /*
743*5e7646d2SAndroid Build Coastguard Worker * Loop through the printers returned in the list and display
744*5e7646d2SAndroid Build Coastguard Worker * their devices...
745*5e7646d2SAndroid Build Coastguard Worker */
746*5e7646d2SAndroid Build Coastguard Worker
747*5e7646d2SAndroid Build Coastguard Worker for (attr = response->attrs; attr != NULL; attr = attr->next)
748*5e7646d2SAndroid Build Coastguard Worker {
749*5e7646d2SAndroid Build Coastguard Worker /*
750*5e7646d2SAndroid Build Coastguard Worker * Skip leading attributes until we hit a printer...
751*5e7646d2SAndroid Build Coastguard Worker */
752*5e7646d2SAndroid Build Coastguard Worker
753*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
754*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
755*5e7646d2SAndroid Build Coastguard Worker
756*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
757*5e7646d2SAndroid Build Coastguard Worker break;
758*5e7646d2SAndroid Build Coastguard Worker
759*5e7646d2SAndroid Build Coastguard Worker /*
760*5e7646d2SAndroid Build Coastguard Worker * Pull the needed attributes from this printer...
761*5e7646d2SAndroid Build Coastguard Worker */
762*5e7646d2SAndroid Build Coastguard Worker
763*5e7646d2SAndroid Build Coastguard Worker printer = NULL;
764*5e7646d2SAndroid Build Coastguard Worker message = NULL;
765*5e7646d2SAndroid Build Coastguard Worker accepting = 1;
766*5e7646d2SAndroid Build Coastguard Worker ptime = 0;
767*5e7646d2SAndroid Build Coastguard Worker
768*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
769*5e7646d2SAndroid Build Coastguard Worker {
770*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "printer-name") &&
771*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
772*5e7646d2SAndroid Build Coastguard Worker printer = attr->values[0].string.text;
773*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-state-change-time") &&
774*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_INTEGER)
775*5e7646d2SAndroid Build Coastguard Worker ptime = (time_t)attr->values[0].integer;
776*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-state-message") &&
777*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_TEXT)
778*5e7646d2SAndroid Build Coastguard Worker message = attr->values[0].string.text;
779*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-is-accepting-jobs") &&
780*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_BOOLEAN)
781*5e7646d2SAndroid Build Coastguard Worker accepting = attr->values[0].boolean;
782*5e7646d2SAndroid Build Coastguard Worker
783*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
784*5e7646d2SAndroid Build Coastguard Worker }
785*5e7646d2SAndroid Build Coastguard Worker
786*5e7646d2SAndroid Build Coastguard Worker /*
787*5e7646d2SAndroid Build Coastguard Worker * See if we have everything needed...
788*5e7646d2SAndroid Build Coastguard Worker */
789*5e7646d2SAndroid Build Coastguard Worker
790*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
791*5e7646d2SAndroid Build Coastguard Worker {
792*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
793*5e7646d2SAndroid Build Coastguard Worker break;
794*5e7646d2SAndroid Build Coastguard Worker else
795*5e7646d2SAndroid Build Coastguard Worker continue;
796*5e7646d2SAndroid Build Coastguard Worker }
797*5e7646d2SAndroid Build Coastguard Worker
798*5e7646d2SAndroid Build Coastguard Worker /*
799*5e7646d2SAndroid Build Coastguard Worker * Display the printer entry if needed...
800*5e7646d2SAndroid Build Coastguard Worker */
801*5e7646d2SAndroid Build Coastguard Worker
802*5e7646d2SAndroid Build Coastguard Worker if (match_list(printers, printer))
803*5e7646d2SAndroid Build Coastguard Worker {
804*5e7646d2SAndroid Build Coastguard Worker _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
805*5e7646d2SAndroid Build Coastguard Worker
806*5e7646d2SAndroid Build Coastguard Worker if (accepting)
807*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("%s accepting requests since %s"),
808*5e7646d2SAndroid Build Coastguard Worker printer, printer_state_time);
809*5e7646d2SAndroid Build Coastguard Worker else
810*5e7646d2SAndroid Build Coastguard Worker {
811*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("%s not accepting requests since %s -"),
812*5e7646d2SAndroid Build Coastguard Worker printer, printer_state_time);
813*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\t%s"),
814*5e7646d2SAndroid Build Coastguard Worker (message && *message) ?
815*5e7646d2SAndroid Build Coastguard Worker message : "reason unknown");
816*5e7646d2SAndroid Build Coastguard Worker }
817*5e7646d2SAndroid Build Coastguard Worker
818*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < num_dests; i ++)
819*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(dests[i].name, printer) && dests[i].instance)
820*5e7646d2SAndroid Build Coastguard Worker {
821*5e7646d2SAndroid Build Coastguard Worker if (accepting)
822*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("%s/%s accepting requests since %s"),
823*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance, printer_state_time);
824*5e7646d2SAndroid Build Coastguard Worker else
825*5e7646d2SAndroid Build Coastguard Worker {
826*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
827*5e7646d2SAndroid Build Coastguard Worker _("%s/%s not accepting requests since %s -"),
828*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance, printer_state_time);
829*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\t%s"),
830*5e7646d2SAndroid Build Coastguard Worker (message && *message) ?
831*5e7646d2SAndroid Build Coastguard Worker message : "reason unknown");
832*5e7646d2SAndroid Build Coastguard Worker }
833*5e7646d2SAndroid Build Coastguard Worker }
834*5e7646d2SAndroid Build Coastguard Worker }
835*5e7646d2SAndroid Build Coastguard Worker
836*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
837*5e7646d2SAndroid Build Coastguard Worker break;
838*5e7646d2SAndroid Build Coastguard Worker }
839*5e7646d2SAndroid Build Coastguard Worker
840*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
841*5e7646d2SAndroid Build Coastguard Worker }
842*5e7646d2SAndroid Build Coastguard Worker
843*5e7646d2SAndroid Build Coastguard Worker return (0);
844*5e7646d2SAndroid Build Coastguard Worker }
845*5e7646d2SAndroid Build Coastguard Worker
846*5e7646d2SAndroid Build Coastguard Worker
847*5e7646d2SAndroid Build Coastguard Worker /*
848*5e7646d2SAndroid Build Coastguard Worker * 'show_classes()' - Show printer classes.
849*5e7646d2SAndroid Build Coastguard Worker */
850*5e7646d2SAndroid Build Coastguard Worker
851*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
show_classes(const char * dests)852*5e7646d2SAndroid Build Coastguard Worker show_classes(const char *dests) /* I - Destinations */
853*5e7646d2SAndroid Build Coastguard Worker {
854*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
855*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
856*5e7646d2SAndroid Build Coastguard Worker *response, /* IPP Response */
857*5e7646d2SAndroid Build Coastguard Worker *response2; /* IPP response from remote server */
858*5e7646d2SAndroid Build Coastguard Worker http_t *http2; /* Remote server */
859*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* Current attribute */
860*5e7646d2SAndroid Build Coastguard Worker const char *printer, /* Printer class name */
861*5e7646d2SAndroid Build Coastguard Worker *printer_uri; /* Printer class URI */
862*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *members; /* Printer members */
863*5e7646d2SAndroid Build Coastguard Worker char method[HTTP_MAX_URI], /* Request method */
864*5e7646d2SAndroid Build Coastguard Worker username[HTTP_MAX_URI], /* Username:password */
865*5e7646d2SAndroid Build Coastguard Worker server[HTTP_MAX_URI], /* Server name */
866*5e7646d2SAndroid Build Coastguard Worker resource[HTTP_MAX_URI]; /* Resource name */
867*5e7646d2SAndroid Build Coastguard Worker int port; /* Port number */
868*5e7646d2SAndroid Build Coastguard Worker static const char *cattrs[] = /* Attributes we need for classes... */
869*5e7646d2SAndroid Build Coastguard Worker {
870*5e7646d2SAndroid Build Coastguard Worker "printer-name",
871*5e7646d2SAndroid Build Coastguard Worker "printer-uri-supported",
872*5e7646d2SAndroid Build Coastguard Worker "member-names"
873*5e7646d2SAndroid Build Coastguard Worker };
874*5e7646d2SAndroid Build Coastguard Worker
875*5e7646d2SAndroid Build Coastguard Worker
876*5e7646d2SAndroid Build Coastguard Worker if (dests != NULL && !strcmp(dests, "all"))
877*5e7646d2SAndroid Build Coastguard Worker dests = NULL;
878*5e7646d2SAndroid Build Coastguard Worker
879*5e7646d2SAndroid Build Coastguard Worker /*
880*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS_GET_CLASSES request, which requires the following
881*5e7646d2SAndroid Build Coastguard Worker * attributes:
882*5e7646d2SAndroid Build Coastguard Worker *
883*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
884*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
885*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
886*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
887*5e7646d2SAndroid Build Coastguard Worker */
888*5e7646d2SAndroid Build Coastguard Worker
889*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(CUPS_GET_CLASSES);
890*5e7646d2SAndroid Build Coastguard Worker
891*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
892*5e7646d2SAndroid Build Coastguard Worker "requested-attributes", sizeof(cattrs) / sizeof(cattrs[0]),
893*5e7646d2SAndroid Build Coastguard Worker NULL, cattrs);
894*5e7646d2SAndroid Build Coastguard Worker
895*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
896*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
897*5e7646d2SAndroid Build Coastguard Worker
898*5e7646d2SAndroid Build Coastguard Worker /*
899*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
900*5e7646d2SAndroid Build Coastguard Worker */
901*5e7646d2SAndroid Build Coastguard Worker
902*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
903*5e7646d2SAndroid Build Coastguard Worker
904*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
905*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
906*5e7646d2SAndroid Build Coastguard Worker {
907*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
908*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
909*5e7646d2SAndroid Build Coastguard Worker "lpstat");
910*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
911*5e7646d2SAndroid Build Coastguard Worker return (1);
912*5e7646d2SAndroid Build Coastguard Worker }
913*5e7646d2SAndroid Build Coastguard Worker else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
914*5e7646d2SAndroid Build Coastguard Worker {
915*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
916*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
917*5e7646d2SAndroid Build Coastguard Worker return (1);
918*5e7646d2SAndroid Build Coastguard Worker }
919*5e7646d2SAndroid Build Coastguard Worker
920*5e7646d2SAndroid Build Coastguard Worker if (response)
921*5e7646d2SAndroid Build Coastguard Worker {
922*5e7646d2SAndroid Build Coastguard Worker if (response->request.status.status_code > IPP_OK_CONFLICT)
923*5e7646d2SAndroid Build Coastguard Worker {
924*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
925*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
926*5e7646d2SAndroid Build Coastguard Worker return (1);
927*5e7646d2SAndroid Build Coastguard Worker }
928*5e7646d2SAndroid Build Coastguard Worker
929*5e7646d2SAndroid Build Coastguard Worker /*
930*5e7646d2SAndroid Build Coastguard Worker * Loop through the printers returned in the list and display
931*5e7646d2SAndroid Build Coastguard Worker * their devices...
932*5e7646d2SAndroid Build Coastguard Worker */
933*5e7646d2SAndroid Build Coastguard Worker
934*5e7646d2SAndroid Build Coastguard Worker for (attr = response->attrs; attr != NULL; attr = attr->next)
935*5e7646d2SAndroid Build Coastguard Worker {
936*5e7646d2SAndroid Build Coastguard Worker /*
937*5e7646d2SAndroid Build Coastguard Worker * Skip leading attributes until we hit a job...
938*5e7646d2SAndroid Build Coastguard Worker */
939*5e7646d2SAndroid Build Coastguard Worker
940*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
941*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
942*5e7646d2SAndroid Build Coastguard Worker
943*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
944*5e7646d2SAndroid Build Coastguard Worker break;
945*5e7646d2SAndroid Build Coastguard Worker
946*5e7646d2SAndroid Build Coastguard Worker /*
947*5e7646d2SAndroid Build Coastguard Worker * Pull the needed attributes from this job...
948*5e7646d2SAndroid Build Coastguard Worker */
949*5e7646d2SAndroid Build Coastguard Worker
950*5e7646d2SAndroid Build Coastguard Worker printer = NULL;
951*5e7646d2SAndroid Build Coastguard Worker printer_uri = NULL;
952*5e7646d2SAndroid Build Coastguard Worker members = NULL;
953*5e7646d2SAndroid Build Coastguard Worker
954*5e7646d2SAndroid Build Coastguard Worker do
955*5e7646d2SAndroid Build Coastguard Worker {
956*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "printer-name") &&
957*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
958*5e7646d2SAndroid Build Coastguard Worker printer = attr->values[0].string.text;
959*5e7646d2SAndroid Build Coastguard Worker
960*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "printer-uri-supported") &&
961*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_URI)
962*5e7646d2SAndroid Build Coastguard Worker printer_uri = attr->values[0].string.text;
963*5e7646d2SAndroid Build Coastguard Worker
964*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "member-names") &&
965*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
966*5e7646d2SAndroid Build Coastguard Worker members = attr;
967*5e7646d2SAndroid Build Coastguard Worker
968*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
969*5e7646d2SAndroid Build Coastguard Worker }
970*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER);
971*5e7646d2SAndroid Build Coastguard Worker
972*5e7646d2SAndroid Build Coastguard Worker /*
973*5e7646d2SAndroid Build Coastguard Worker * If this is a remote class, grab the class info from the
974*5e7646d2SAndroid Build Coastguard Worker * remote server...
975*5e7646d2SAndroid Build Coastguard Worker */
976*5e7646d2SAndroid Build Coastguard Worker
977*5e7646d2SAndroid Build Coastguard Worker response2 = NULL;
978*5e7646d2SAndroid Build Coastguard Worker if (members == NULL && printer_uri != NULL)
979*5e7646d2SAndroid Build Coastguard Worker {
980*5e7646d2SAndroid Build Coastguard Worker httpSeparateURI(HTTP_URI_CODING_ALL, printer_uri, method, sizeof(method),
981*5e7646d2SAndroid Build Coastguard Worker username, sizeof(username), server, sizeof(server),
982*5e7646d2SAndroid Build Coastguard Worker &port, resource, sizeof(resource));
983*5e7646d2SAndroid Build Coastguard Worker
984*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(server, cupsServer()))
985*5e7646d2SAndroid Build Coastguard Worker http2 = CUPS_HTTP_DEFAULT;
986*5e7646d2SAndroid Build Coastguard Worker else
987*5e7646d2SAndroid Build Coastguard Worker http2 = httpConnectEncrypt(server, port, cupsEncryption());
988*5e7646d2SAndroid Build Coastguard Worker
989*5e7646d2SAndroid Build Coastguard Worker /*
990*5e7646d2SAndroid Build Coastguard Worker * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the
991*5e7646d2SAndroid Build Coastguard Worker * following attributes:
992*5e7646d2SAndroid Build Coastguard Worker *
993*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
994*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
995*5e7646d2SAndroid Build Coastguard Worker * printer-uri
996*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
997*5e7646d2SAndroid Build Coastguard Worker */
998*5e7646d2SAndroid Build Coastguard Worker
999*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
1000*5e7646d2SAndroid Build Coastguard Worker
1001*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1002*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, printer_uri);
1003*5e7646d2SAndroid Build Coastguard Worker
1004*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
1005*5e7646d2SAndroid Build Coastguard Worker "requested-attributes",
1006*5e7646d2SAndroid Build Coastguard Worker sizeof(cattrs) / sizeof(cattrs[0]),
1007*5e7646d2SAndroid Build Coastguard Worker NULL, cattrs);
1008*5e7646d2SAndroid Build Coastguard Worker
1009*5e7646d2SAndroid Build Coastguard Worker if ((response2 = cupsDoRequest(http2, request, "/")) != NULL)
1010*5e7646d2SAndroid Build Coastguard Worker members = ippFindAttribute(response2, "member-names", IPP_TAG_NAME);
1011*5e7646d2SAndroid Build Coastguard Worker
1012*5e7646d2SAndroid Build Coastguard Worker if (http2)
1013*5e7646d2SAndroid Build Coastguard Worker httpClose(http2);
1014*5e7646d2SAndroid Build Coastguard Worker }
1015*5e7646d2SAndroid Build Coastguard Worker
1016*5e7646d2SAndroid Build Coastguard Worker /*
1017*5e7646d2SAndroid Build Coastguard Worker * See if we have everything needed...
1018*5e7646d2SAndroid Build Coastguard Worker */
1019*5e7646d2SAndroid Build Coastguard Worker
1020*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
1021*5e7646d2SAndroid Build Coastguard Worker {
1022*5e7646d2SAndroid Build Coastguard Worker if (response2)
1023*5e7646d2SAndroid Build Coastguard Worker ippDelete(response2);
1024*5e7646d2SAndroid Build Coastguard Worker
1025*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1026*5e7646d2SAndroid Build Coastguard Worker break;
1027*5e7646d2SAndroid Build Coastguard Worker else
1028*5e7646d2SAndroid Build Coastguard Worker continue;
1029*5e7646d2SAndroid Build Coastguard Worker }
1030*5e7646d2SAndroid Build Coastguard Worker
1031*5e7646d2SAndroid Build Coastguard Worker /*
1032*5e7646d2SAndroid Build Coastguard Worker * Display the printer entry if needed...
1033*5e7646d2SAndroid Build Coastguard Worker */
1034*5e7646d2SAndroid Build Coastguard Worker
1035*5e7646d2SAndroid Build Coastguard Worker if (match_list(dests, printer))
1036*5e7646d2SAndroid Build Coastguard Worker {
1037*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("members of class %s:"), printer);
1038*5e7646d2SAndroid Build Coastguard Worker
1039*5e7646d2SAndroid Build Coastguard Worker if (members)
1040*5e7646d2SAndroid Build Coastguard Worker {
1041*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < members->num_values; i ++)
1042*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "\t%s", members->values[i].string.text);
1043*5e7646d2SAndroid Build Coastguard Worker }
1044*5e7646d2SAndroid Build Coastguard Worker else
1045*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, "\tunknown");
1046*5e7646d2SAndroid Build Coastguard Worker }
1047*5e7646d2SAndroid Build Coastguard Worker
1048*5e7646d2SAndroid Build Coastguard Worker if (response2)
1049*5e7646d2SAndroid Build Coastguard Worker ippDelete(response2);
1050*5e7646d2SAndroid Build Coastguard Worker
1051*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1052*5e7646d2SAndroid Build Coastguard Worker break;
1053*5e7646d2SAndroid Build Coastguard Worker }
1054*5e7646d2SAndroid Build Coastguard Worker
1055*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1056*5e7646d2SAndroid Build Coastguard Worker }
1057*5e7646d2SAndroid Build Coastguard Worker
1058*5e7646d2SAndroid Build Coastguard Worker return (0);
1059*5e7646d2SAndroid Build Coastguard Worker }
1060*5e7646d2SAndroid Build Coastguard Worker
1061*5e7646d2SAndroid Build Coastguard Worker
1062*5e7646d2SAndroid Build Coastguard Worker /*
1063*5e7646d2SAndroid Build Coastguard Worker * 'show_default()' - Show default destination.
1064*5e7646d2SAndroid Build Coastguard Worker */
1065*5e7646d2SAndroid Build Coastguard Worker
1066*5e7646d2SAndroid Build Coastguard Worker static void
show_default(cups_dest_t * dest)1067*5e7646d2SAndroid Build Coastguard Worker show_default(cups_dest_t *dest) /* I - Default destination */
1068*5e7646d2SAndroid Build Coastguard Worker {
1069*5e7646d2SAndroid Build Coastguard Worker const char *printer, /* Printer name */
1070*5e7646d2SAndroid Build Coastguard Worker *val; /* Environment variable name */
1071*5e7646d2SAndroid Build Coastguard Worker
1072*5e7646d2SAndroid Build Coastguard Worker
1073*5e7646d2SAndroid Build Coastguard Worker if (dest)
1074*5e7646d2SAndroid Build Coastguard Worker {
1075*5e7646d2SAndroid Build Coastguard Worker if (dest->instance)
1076*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("system default destination: %s/%s"),
1077*5e7646d2SAndroid Build Coastguard Worker dest->name, dest->instance);
1078*5e7646d2SAndroid Build Coastguard Worker else
1079*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("system default destination: %s"),
1080*5e7646d2SAndroid Build Coastguard Worker dest->name);
1081*5e7646d2SAndroid Build Coastguard Worker }
1082*5e7646d2SAndroid Build Coastguard Worker else
1083*5e7646d2SAndroid Build Coastguard Worker {
1084*5e7646d2SAndroid Build Coastguard Worker val = NULL;
1085*5e7646d2SAndroid Build Coastguard Worker
1086*5e7646d2SAndroid Build Coastguard Worker if ((printer = getenv("LPDEST")) == NULL)
1087*5e7646d2SAndroid Build Coastguard Worker {
1088*5e7646d2SAndroid Build Coastguard Worker if ((printer = getenv("PRINTER")) != NULL)
1089*5e7646d2SAndroid Build Coastguard Worker {
1090*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(printer, "lp"))
1091*5e7646d2SAndroid Build Coastguard Worker printer = NULL;
1092*5e7646d2SAndroid Build Coastguard Worker else
1093*5e7646d2SAndroid Build Coastguard Worker val = "PRINTER";
1094*5e7646d2SAndroid Build Coastguard Worker }
1095*5e7646d2SAndroid Build Coastguard Worker }
1096*5e7646d2SAndroid Build Coastguard Worker else
1097*5e7646d2SAndroid Build Coastguard Worker val = "LPDEST";
1098*5e7646d2SAndroid Build Coastguard Worker
1099*5e7646d2SAndroid Build Coastguard Worker if (printer)
1100*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
1101*5e7646d2SAndroid Build Coastguard Worker _("lpstat: error - %s environment variable names "
1102*5e7646d2SAndroid Build Coastguard Worker "non-existent destination \"%s\"."),
1103*5e7646d2SAndroid Build Coastguard Worker val, printer);
1104*5e7646d2SAndroid Build Coastguard Worker else
1105*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("no system default destination"));
1106*5e7646d2SAndroid Build Coastguard Worker }
1107*5e7646d2SAndroid Build Coastguard Worker }
1108*5e7646d2SAndroid Build Coastguard Worker
1109*5e7646d2SAndroid Build Coastguard Worker
1110*5e7646d2SAndroid Build Coastguard Worker /*
1111*5e7646d2SAndroid Build Coastguard Worker * 'show_devices()' - Show printer devices.
1112*5e7646d2SAndroid Build Coastguard Worker */
1113*5e7646d2SAndroid Build Coastguard Worker
1114*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
show_devices(const char * printers,int num_dests,cups_dest_t * dests)1115*5e7646d2SAndroid Build Coastguard Worker show_devices(const char *printers, /* I - Destinations */
1116*5e7646d2SAndroid Build Coastguard Worker int num_dests, /* I - Number of user-defined dests */
1117*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests) /* I - User-defined destinations */
1118*5e7646d2SAndroid Build Coastguard Worker {
1119*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
1120*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
1121*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP Response */
1122*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* Current attribute */
1123*5e7646d2SAndroid Build Coastguard Worker const char *printer, /* Printer name */
1124*5e7646d2SAndroid Build Coastguard Worker *uri, /* Printer URI */
1125*5e7646d2SAndroid Build Coastguard Worker *device; /* Printer device URI */
1126*5e7646d2SAndroid Build Coastguard Worker static const char *pattrs[] = /* Attributes we need for printers... */
1127*5e7646d2SAndroid Build Coastguard Worker {
1128*5e7646d2SAndroid Build Coastguard Worker "printer-name",
1129*5e7646d2SAndroid Build Coastguard Worker "printer-uri-supported",
1130*5e7646d2SAndroid Build Coastguard Worker "device-uri"
1131*5e7646d2SAndroid Build Coastguard Worker };
1132*5e7646d2SAndroid Build Coastguard Worker
1133*5e7646d2SAndroid Build Coastguard Worker
1134*5e7646d2SAndroid Build Coastguard Worker if (printers != NULL && !strcmp(printers, "all"))
1135*5e7646d2SAndroid Build Coastguard Worker printers = NULL;
1136*5e7646d2SAndroid Build Coastguard Worker
1137*5e7646d2SAndroid Build Coastguard Worker /*
1138*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS_GET_PRINTERS request, which requires the following
1139*5e7646d2SAndroid Build Coastguard Worker * attributes:
1140*5e7646d2SAndroid Build Coastguard Worker *
1141*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1142*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1143*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
1144*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1145*5e7646d2SAndroid Build Coastguard Worker */
1146*5e7646d2SAndroid Build Coastguard Worker
1147*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(CUPS_GET_PRINTERS);
1148*5e7646d2SAndroid Build Coastguard Worker
1149*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
1150*5e7646d2SAndroid Build Coastguard Worker "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
1151*5e7646d2SAndroid Build Coastguard Worker NULL, pattrs);
1152*5e7646d2SAndroid Build Coastguard Worker
1153*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1154*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
1155*5e7646d2SAndroid Build Coastguard Worker
1156*5e7646d2SAndroid Build Coastguard Worker /*
1157*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
1158*5e7646d2SAndroid Build Coastguard Worker */
1159*5e7646d2SAndroid Build Coastguard Worker
1160*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
1161*5e7646d2SAndroid Build Coastguard Worker
1162*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
1163*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
1164*5e7646d2SAndroid Build Coastguard Worker {
1165*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1166*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
1167*5e7646d2SAndroid Build Coastguard Worker "lpstat");
1168*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1169*5e7646d2SAndroid Build Coastguard Worker return (1);
1170*5e7646d2SAndroid Build Coastguard Worker }
1171*5e7646d2SAndroid Build Coastguard Worker else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1172*5e7646d2SAndroid Build Coastguard Worker {
1173*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
1174*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1175*5e7646d2SAndroid Build Coastguard Worker return (1);
1176*5e7646d2SAndroid Build Coastguard Worker }
1177*5e7646d2SAndroid Build Coastguard Worker
1178*5e7646d2SAndroid Build Coastguard Worker if (response)
1179*5e7646d2SAndroid Build Coastguard Worker {
1180*5e7646d2SAndroid Build Coastguard Worker /*
1181*5e7646d2SAndroid Build Coastguard Worker * Loop through the printers returned in the list and display
1182*5e7646d2SAndroid Build Coastguard Worker * their devices...
1183*5e7646d2SAndroid Build Coastguard Worker */
1184*5e7646d2SAndroid Build Coastguard Worker
1185*5e7646d2SAndroid Build Coastguard Worker for (attr = response->attrs; attr != NULL; attr = attr->next)
1186*5e7646d2SAndroid Build Coastguard Worker {
1187*5e7646d2SAndroid Build Coastguard Worker /*
1188*5e7646d2SAndroid Build Coastguard Worker * Skip leading attributes until we hit a job...
1189*5e7646d2SAndroid Build Coastguard Worker */
1190*5e7646d2SAndroid Build Coastguard Worker
1191*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
1192*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
1193*5e7646d2SAndroid Build Coastguard Worker
1194*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1195*5e7646d2SAndroid Build Coastguard Worker break;
1196*5e7646d2SAndroid Build Coastguard Worker
1197*5e7646d2SAndroid Build Coastguard Worker /*
1198*5e7646d2SAndroid Build Coastguard Worker * Pull the needed attributes from this job...
1199*5e7646d2SAndroid Build Coastguard Worker */
1200*5e7646d2SAndroid Build Coastguard Worker
1201*5e7646d2SAndroid Build Coastguard Worker printer = NULL;
1202*5e7646d2SAndroid Build Coastguard Worker device = NULL;
1203*5e7646d2SAndroid Build Coastguard Worker uri = NULL;
1204*5e7646d2SAndroid Build Coastguard Worker
1205*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
1206*5e7646d2SAndroid Build Coastguard Worker {
1207*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "printer-name") &&
1208*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
1209*5e7646d2SAndroid Build Coastguard Worker printer = attr->values[0].string.text;
1210*5e7646d2SAndroid Build Coastguard Worker
1211*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "printer-uri-supported") &&
1212*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_URI)
1213*5e7646d2SAndroid Build Coastguard Worker uri = attr->values[0].string.text;
1214*5e7646d2SAndroid Build Coastguard Worker
1215*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "device-uri") &&
1216*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_URI)
1217*5e7646d2SAndroid Build Coastguard Worker device = attr->values[0].string.text;
1218*5e7646d2SAndroid Build Coastguard Worker
1219*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
1220*5e7646d2SAndroid Build Coastguard Worker }
1221*5e7646d2SAndroid Build Coastguard Worker
1222*5e7646d2SAndroid Build Coastguard Worker /*
1223*5e7646d2SAndroid Build Coastguard Worker * See if we have everything needed...
1224*5e7646d2SAndroid Build Coastguard Worker */
1225*5e7646d2SAndroid Build Coastguard Worker
1226*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
1227*5e7646d2SAndroid Build Coastguard Worker {
1228*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1229*5e7646d2SAndroid Build Coastguard Worker break;
1230*5e7646d2SAndroid Build Coastguard Worker else
1231*5e7646d2SAndroid Build Coastguard Worker continue;
1232*5e7646d2SAndroid Build Coastguard Worker }
1233*5e7646d2SAndroid Build Coastguard Worker
1234*5e7646d2SAndroid Build Coastguard Worker /*
1235*5e7646d2SAndroid Build Coastguard Worker * Display the printer entry if needed...
1236*5e7646d2SAndroid Build Coastguard Worker */
1237*5e7646d2SAndroid Build Coastguard Worker
1238*5e7646d2SAndroid Build Coastguard Worker if (match_list(printers, printer))
1239*5e7646d2SAndroid Build Coastguard Worker {
1240*5e7646d2SAndroid Build Coastguard Worker if (device == NULL)
1241*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("device for %s: %s"),
1242*5e7646d2SAndroid Build Coastguard Worker printer, uri);
1243*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(device, "file:", 5))
1244*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("device for %s: %s"),
1245*5e7646d2SAndroid Build Coastguard Worker printer, device + 5);
1246*5e7646d2SAndroid Build Coastguard Worker else
1247*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("device for %s: %s"),
1248*5e7646d2SAndroid Build Coastguard Worker printer, device);
1249*5e7646d2SAndroid Build Coastguard Worker
1250*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < num_dests; i ++)
1251*5e7646d2SAndroid Build Coastguard Worker {
1252*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance)
1253*5e7646d2SAndroid Build Coastguard Worker {
1254*5e7646d2SAndroid Build Coastguard Worker if (device == NULL)
1255*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("device for %s/%s: %s"),
1256*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance, uri);
1257*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(device, "file:", 5))
1258*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("device for %s/%s: %s"),
1259*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance, device + 5);
1260*5e7646d2SAndroid Build Coastguard Worker else
1261*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("device for %s/%s: %s"),
1262*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance, device);
1263*5e7646d2SAndroid Build Coastguard Worker }
1264*5e7646d2SAndroid Build Coastguard Worker }
1265*5e7646d2SAndroid Build Coastguard Worker }
1266*5e7646d2SAndroid Build Coastguard Worker
1267*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1268*5e7646d2SAndroid Build Coastguard Worker break;
1269*5e7646d2SAndroid Build Coastguard Worker }
1270*5e7646d2SAndroid Build Coastguard Worker
1271*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1272*5e7646d2SAndroid Build Coastguard Worker }
1273*5e7646d2SAndroid Build Coastguard Worker
1274*5e7646d2SAndroid Build Coastguard Worker return (0);
1275*5e7646d2SAndroid Build Coastguard Worker }
1276*5e7646d2SAndroid Build Coastguard Worker
1277*5e7646d2SAndroid Build Coastguard Worker
1278*5e7646d2SAndroid Build Coastguard Worker /*
1279*5e7646d2SAndroid Build Coastguard Worker * 'show_jobs()' - Show active print jobs.
1280*5e7646d2SAndroid Build Coastguard Worker */
1281*5e7646d2SAndroid Build Coastguard Worker
1282*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
show_jobs(const char * dests,const char * users,int long_status,int ranking,const char * which)1283*5e7646d2SAndroid Build Coastguard Worker show_jobs(const char *dests, /* I - Destinations */
1284*5e7646d2SAndroid Build Coastguard Worker const char *users, /* I - Users */
1285*5e7646d2SAndroid Build Coastguard Worker int long_status, /* I - Show long status? */
1286*5e7646d2SAndroid Build Coastguard Worker int ranking, /* I - Show job ranking? */
1287*5e7646d2SAndroid Build Coastguard Worker const char *which) /* I - Show which jobs? */
1288*5e7646d2SAndroid Build Coastguard Worker {
1289*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
1290*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
1291*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP Response */
1292*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr, /* Current attribute */
1293*5e7646d2SAndroid Build Coastguard Worker *reasons; /* Job state reasons attribute */
1294*5e7646d2SAndroid Build Coastguard Worker const char *dest, /* Pointer into job-printer-uri */
1295*5e7646d2SAndroid Build Coastguard Worker *username, /* Pointer to job-originating-user-name */
1296*5e7646d2SAndroid Build Coastguard Worker *message, /* Pointer to job-printer-state-message */
1297*5e7646d2SAndroid Build Coastguard Worker *time_at; /* time-at-xxx attribute name to use */
1298*5e7646d2SAndroid Build Coastguard Worker int rank, /* Rank in queue */
1299*5e7646d2SAndroid Build Coastguard Worker jobid, /* job-id */
1300*5e7646d2SAndroid Build Coastguard Worker size; /* job-k-octets */
1301*5e7646d2SAndroid Build Coastguard Worker time_t jobtime; /* time-at-creation */
1302*5e7646d2SAndroid Build Coastguard Worker char temp[255], /* Temporary buffer */
1303*5e7646d2SAndroid Build Coastguard Worker date[255]; /* Date buffer */
1304*5e7646d2SAndroid Build Coastguard Worker static const char *jattrs[] = /* Attributes we need for jobs... */
1305*5e7646d2SAndroid Build Coastguard Worker {
1306*5e7646d2SAndroid Build Coastguard Worker "job-id",
1307*5e7646d2SAndroid Build Coastguard Worker "job-k-octets",
1308*5e7646d2SAndroid Build Coastguard Worker "job-name",
1309*5e7646d2SAndroid Build Coastguard Worker "job-originating-user-name",
1310*5e7646d2SAndroid Build Coastguard Worker "job-printer-state-message",
1311*5e7646d2SAndroid Build Coastguard Worker "job-printer-uri",
1312*5e7646d2SAndroid Build Coastguard Worker "job-state-reasons",
1313*5e7646d2SAndroid Build Coastguard Worker "time-at-creation",
1314*5e7646d2SAndroid Build Coastguard Worker "time-at-completed"
1315*5e7646d2SAndroid Build Coastguard Worker };
1316*5e7646d2SAndroid Build Coastguard Worker
1317*5e7646d2SAndroid Build Coastguard Worker
1318*5e7646d2SAndroid Build Coastguard Worker if (dests != NULL && !strcmp(dests, "all"))
1319*5e7646d2SAndroid Build Coastguard Worker dests = NULL;
1320*5e7646d2SAndroid Build Coastguard Worker
1321*5e7646d2SAndroid Build Coastguard Worker /*
1322*5e7646d2SAndroid Build Coastguard Worker * Build a IPP_GET_JOBS request, which requires the following
1323*5e7646d2SAndroid Build Coastguard Worker * attributes:
1324*5e7646d2SAndroid Build Coastguard Worker *
1325*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1326*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1327*5e7646d2SAndroid Build Coastguard Worker * printer-uri
1328*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
1329*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1330*5e7646d2SAndroid Build Coastguard Worker * which-jobs
1331*5e7646d2SAndroid Build Coastguard Worker */
1332*5e7646d2SAndroid Build Coastguard Worker
1333*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_GET_JOBS);
1334*5e7646d2SAndroid Build Coastguard Worker
1335*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
1336*5e7646d2SAndroid Build Coastguard Worker NULL, "ipp://localhost/");
1337*5e7646d2SAndroid Build Coastguard Worker
1338*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
1339*5e7646d2SAndroid Build Coastguard Worker "requested-attributes", sizeof(jattrs) / sizeof(jattrs[0]),
1340*5e7646d2SAndroid Build Coastguard Worker NULL, jattrs);
1341*5e7646d2SAndroid Build Coastguard Worker
1342*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1343*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
1344*5e7646d2SAndroid Build Coastguard Worker
1345*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
1346*5e7646d2SAndroid Build Coastguard Worker NULL, which);
1347*5e7646d2SAndroid Build Coastguard Worker
1348*5e7646d2SAndroid Build Coastguard Worker /*
1349*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
1350*5e7646d2SAndroid Build Coastguard Worker */
1351*5e7646d2SAndroid Build Coastguard Worker
1352*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
1353*5e7646d2SAndroid Build Coastguard Worker
1354*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
1355*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
1356*5e7646d2SAndroid Build Coastguard Worker {
1357*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1358*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
1359*5e7646d2SAndroid Build Coastguard Worker "lpstat");
1360*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1361*5e7646d2SAndroid Build Coastguard Worker return (1);
1362*5e7646d2SAndroid Build Coastguard Worker }
1363*5e7646d2SAndroid Build Coastguard Worker else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1364*5e7646d2SAndroid Build Coastguard Worker {
1365*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
1366*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1367*5e7646d2SAndroid Build Coastguard Worker return (1);
1368*5e7646d2SAndroid Build Coastguard Worker }
1369*5e7646d2SAndroid Build Coastguard Worker
1370*5e7646d2SAndroid Build Coastguard Worker if (response)
1371*5e7646d2SAndroid Build Coastguard Worker {
1372*5e7646d2SAndroid Build Coastguard Worker /*
1373*5e7646d2SAndroid Build Coastguard Worker * Loop through the job list and display them...
1374*5e7646d2SAndroid Build Coastguard Worker */
1375*5e7646d2SAndroid Build Coastguard Worker
1376*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(which, "aborted") ||
1377*5e7646d2SAndroid Build Coastguard Worker !strcmp(which, "canceled") ||
1378*5e7646d2SAndroid Build Coastguard Worker !strcmp(which, "completed"))
1379*5e7646d2SAndroid Build Coastguard Worker time_at = "time-at-completed";
1380*5e7646d2SAndroid Build Coastguard Worker else
1381*5e7646d2SAndroid Build Coastguard Worker time_at = "time-at-creation";
1382*5e7646d2SAndroid Build Coastguard Worker
1383*5e7646d2SAndroid Build Coastguard Worker rank = -1;
1384*5e7646d2SAndroid Build Coastguard Worker
1385*5e7646d2SAndroid Build Coastguard Worker for (attr = response->attrs; attr != NULL; attr = attr->next)
1386*5e7646d2SAndroid Build Coastguard Worker {
1387*5e7646d2SAndroid Build Coastguard Worker /*
1388*5e7646d2SAndroid Build Coastguard Worker * Skip leading attributes until we hit a job...
1389*5e7646d2SAndroid Build Coastguard Worker */
1390*5e7646d2SAndroid Build Coastguard Worker
1391*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
1392*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
1393*5e7646d2SAndroid Build Coastguard Worker
1394*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1395*5e7646d2SAndroid Build Coastguard Worker break;
1396*5e7646d2SAndroid Build Coastguard Worker
1397*5e7646d2SAndroid Build Coastguard Worker /*
1398*5e7646d2SAndroid Build Coastguard Worker * Pull the needed attributes from this job...
1399*5e7646d2SAndroid Build Coastguard Worker */
1400*5e7646d2SAndroid Build Coastguard Worker
1401*5e7646d2SAndroid Build Coastguard Worker jobid = 0;
1402*5e7646d2SAndroid Build Coastguard Worker size = 0;
1403*5e7646d2SAndroid Build Coastguard Worker username = NULL;
1404*5e7646d2SAndroid Build Coastguard Worker dest = NULL;
1405*5e7646d2SAndroid Build Coastguard Worker jobtime = 0;
1406*5e7646d2SAndroid Build Coastguard Worker message = NULL;
1407*5e7646d2SAndroid Build Coastguard Worker reasons = NULL;
1408*5e7646d2SAndroid Build Coastguard Worker
1409*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
1410*5e7646d2SAndroid Build Coastguard Worker {
1411*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "job-id") &&
1412*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_INTEGER)
1413*5e7646d2SAndroid Build Coastguard Worker jobid = attr->values[0].integer;
1414*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "job-k-octets") &&
1415*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_INTEGER)
1416*5e7646d2SAndroid Build Coastguard Worker size = attr->values[0].integer;
1417*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, time_at) && attr->value_tag == IPP_TAG_INTEGER)
1418*5e7646d2SAndroid Build Coastguard Worker jobtime = attr->values[0].integer;
1419*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "job-printer-state-message") &&
1420*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_TEXT)
1421*5e7646d2SAndroid Build Coastguard Worker message = attr->values[0].string.text;
1422*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "job-printer-uri") &&
1423*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_URI)
1424*5e7646d2SAndroid Build Coastguard Worker {
1425*5e7646d2SAndroid Build Coastguard Worker if ((dest = strrchr(attr->values[0].string.text, '/')) != NULL)
1426*5e7646d2SAndroid Build Coastguard Worker dest ++;
1427*5e7646d2SAndroid Build Coastguard Worker }
1428*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "job-originating-user-name") &&
1429*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
1430*5e7646d2SAndroid Build Coastguard Worker username = attr->values[0].string.text;
1431*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "job-state-reasons") &&
1432*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_KEYWORD)
1433*5e7646d2SAndroid Build Coastguard Worker reasons = attr;
1434*5e7646d2SAndroid Build Coastguard Worker
1435*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
1436*5e7646d2SAndroid Build Coastguard Worker }
1437*5e7646d2SAndroid Build Coastguard Worker
1438*5e7646d2SAndroid Build Coastguard Worker /*
1439*5e7646d2SAndroid Build Coastguard Worker * See if we have everything needed...
1440*5e7646d2SAndroid Build Coastguard Worker */
1441*5e7646d2SAndroid Build Coastguard Worker
1442*5e7646d2SAndroid Build Coastguard Worker if (dest == NULL || jobid == 0)
1443*5e7646d2SAndroid Build Coastguard Worker {
1444*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1445*5e7646d2SAndroid Build Coastguard Worker break;
1446*5e7646d2SAndroid Build Coastguard Worker else
1447*5e7646d2SAndroid Build Coastguard Worker continue;
1448*5e7646d2SAndroid Build Coastguard Worker }
1449*5e7646d2SAndroid Build Coastguard Worker
1450*5e7646d2SAndroid Build Coastguard Worker /*
1451*5e7646d2SAndroid Build Coastguard Worker * Display the job...
1452*5e7646d2SAndroid Build Coastguard Worker */
1453*5e7646d2SAndroid Build Coastguard Worker
1454*5e7646d2SAndroid Build Coastguard Worker rank ++;
1455*5e7646d2SAndroid Build Coastguard Worker
1456*5e7646d2SAndroid Build Coastguard Worker if (match_list(dests, dest) && match_list(users, username))
1457*5e7646d2SAndroid Build Coastguard Worker {
1458*5e7646d2SAndroid Build Coastguard Worker snprintf(temp, sizeof(temp), "%s-%d", dest, jobid);
1459*5e7646d2SAndroid Build Coastguard Worker
1460*5e7646d2SAndroid Build Coastguard Worker _cupsStrDate(date, sizeof(date), jobtime);
1461*5e7646d2SAndroid Build Coastguard Worker
1462*5e7646d2SAndroid Build Coastguard Worker if (ranking)
1463*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s",
1464*5e7646d2SAndroid Build Coastguard Worker rank, temp, username ? username : "unknown",
1465*5e7646d2SAndroid Build Coastguard Worker 1024.0 * size, date);
1466*5e7646d2SAndroid Build Coastguard Worker else
1467*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "%-23s %-13s %8.0f %s",
1468*5e7646d2SAndroid Build Coastguard Worker temp, username ? username : "unknown",
1469*5e7646d2SAndroid Build Coastguard Worker 1024.0 * size, date);
1470*5e7646d2SAndroid Build Coastguard Worker if (long_status)
1471*5e7646d2SAndroid Build Coastguard Worker {
1472*5e7646d2SAndroid Build Coastguard Worker if (message)
1473*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
1474*5e7646d2SAndroid Build Coastguard Worker
1475*5e7646d2SAndroid Build Coastguard Worker if (reasons)
1476*5e7646d2SAndroid Build Coastguard Worker {
1477*5e7646d2SAndroid Build Coastguard Worker char alerts[1024], /* Alerts string */
1478*5e7646d2SAndroid Build Coastguard Worker *aptr; /* Pointer into alerts string */
1479*5e7646d2SAndroid Build Coastguard Worker
1480*5e7646d2SAndroid Build Coastguard Worker for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
1481*5e7646d2SAndroid Build Coastguard Worker {
1482*5e7646d2SAndroid Build Coastguard Worker if (i)
1483*5e7646d2SAndroid Build Coastguard Worker snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
1484*5e7646d2SAndroid Build Coastguard Worker else
1485*5e7646d2SAndroid Build Coastguard Worker strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
1486*5e7646d2SAndroid Build Coastguard Worker
1487*5e7646d2SAndroid Build Coastguard Worker aptr += strlen(aptr);
1488*5e7646d2SAndroid Build Coastguard Worker }
1489*5e7646d2SAndroid Build Coastguard Worker
1490*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
1491*5e7646d2SAndroid Build Coastguard Worker }
1492*5e7646d2SAndroid Build Coastguard Worker
1493*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tqueued for %s"), dest);
1494*5e7646d2SAndroid Build Coastguard Worker }
1495*5e7646d2SAndroid Build Coastguard Worker }
1496*5e7646d2SAndroid Build Coastguard Worker
1497*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1498*5e7646d2SAndroid Build Coastguard Worker break;
1499*5e7646d2SAndroid Build Coastguard Worker }
1500*5e7646d2SAndroid Build Coastguard Worker
1501*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1502*5e7646d2SAndroid Build Coastguard Worker }
1503*5e7646d2SAndroid Build Coastguard Worker
1504*5e7646d2SAndroid Build Coastguard Worker return (0);
1505*5e7646d2SAndroid Build Coastguard Worker }
1506*5e7646d2SAndroid Build Coastguard Worker
1507*5e7646d2SAndroid Build Coastguard Worker
1508*5e7646d2SAndroid Build Coastguard Worker /*
1509*5e7646d2SAndroid Build Coastguard Worker * 'show_printers()' - Show printers.
1510*5e7646d2SAndroid Build Coastguard Worker */
1511*5e7646d2SAndroid Build Coastguard Worker
1512*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
show_printers(const char * printers,int num_dests,cups_dest_t * dests,int long_status)1513*5e7646d2SAndroid Build Coastguard Worker show_printers(const char *printers, /* I - Destinations */
1514*5e7646d2SAndroid Build Coastguard Worker int num_dests, /* I - Number of user-defined dests */
1515*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests, /* I - User-defined destinations */
1516*5e7646d2SAndroid Build Coastguard Worker int long_status) /* I - Show long status? */
1517*5e7646d2SAndroid Build Coastguard Worker {
1518*5e7646d2SAndroid Build Coastguard Worker int i, j; /* Looping vars */
1519*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
1520*5e7646d2SAndroid Build Coastguard Worker *response, /* IPP Response */
1521*5e7646d2SAndroid Build Coastguard Worker *jobs; /* IPP Get Jobs response */
1522*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr, /* Current attribute */
1523*5e7646d2SAndroid Build Coastguard Worker *jobattr, /* Job ID attribute */
1524*5e7646d2SAndroid Build Coastguard Worker *reasons; /* Job state reasons attribute */
1525*5e7646d2SAndroid Build Coastguard Worker const char *printer, /* Printer name */
1526*5e7646d2SAndroid Build Coastguard Worker *message, /* Printer state message */
1527*5e7646d2SAndroid Build Coastguard Worker *description, /* Description of printer */
1528*5e7646d2SAndroid Build Coastguard Worker *location, /* Location of printer */
1529*5e7646d2SAndroid Build Coastguard Worker *make_model, /* Make and model of printer */
1530*5e7646d2SAndroid Build Coastguard Worker *uri; /* URI of printer */
1531*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *allowed, /* requesting-user-name-allowed */
1532*5e7646d2SAndroid Build Coastguard Worker *denied; /* requestint-user-name-denied */
1533*5e7646d2SAndroid Build Coastguard Worker ipp_pstate_t pstate; /* Printer state */
1534*5e7646d2SAndroid Build Coastguard Worker cups_ptype_t ptype; /* Printer type */
1535*5e7646d2SAndroid Build Coastguard Worker time_t ptime; /* Printer state time */
1536*5e7646d2SAndroid Build Coastguard Worker int jobid; /* Job ID of current job */
1537*5e7646d2SAndroid Build Coastguard Worker char printer_uri[HTTP_MAX_URI],
1538*5e7646d2SAndroid Build Coastguard Worker /* Printer URI */
1539*5e7646d2SAndroid Build Coastguard Worker printer_state_time[255];/* Printer state time */
1540*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg = _cupsGlobals(); /* Global data */
1541*5e7646d2SAndroid Build Coastguard Worker static const char *pattrs[] = /* Attributes we need for printers... */
1542*5e7646d2SAndroid Build Coastguard Worker {
1543*5e7646d2SAndroid Build Coastguard Worker "printer-name",
1544*5e7646d2SAndroid Build Coastguard Worker "printer-state",
1545*5e7646d2SAndroid Build Coastguard Worker "printer-state-message",
1546*5e7646d2SAndroid Build Coastguard Worker "printer-state-reasons",
1547*5e7646d2SAndroid Build Coastguard Worker "printer-state-change-time",
1548*5e7646d2SAndroid Build Coastguard Worker "printer-type",
1549*5e7646d2SAndroid Build Coastguard Worker "printer-info",
1550*5e7646d2SAndroid Build Coastguard Worker "printer-location",
1551*5e7646d2SAndroid Build Coastguard Worker "printer-make-and-model",
1552*5e7646d2SAndroid Build Coastguard Worker "printer-uri-supported",
1553*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name-allowed",
1554*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name-denied"
1555*5e7646d2SAndroid Build Coastguard Worker };
1556*5e7646d2SAndroid Build Coastguard Worker static const char *jattrs[] = /* Attributes we need for jobs... */
1557*5e7646d2SAndroid Build Coastguard Worker {
1558*5e7646d2SAndroid Build Coastguard Worker "job-id",
1559*5e7646d2SAndroid Build Coastguard Worker "job-state"
1560*5e7646d2SAndroid Build Coastguard Worker };
1561*5e7646d2SAndroid Build Coastguard Worker
1562*5e7646d2SAndroid Build Coastguard Worker
1563*5e7646d2SAndroid Build Coastguard Worker if (printers != NULL && !strcmp(printers, "all"))
1564*5e7646d2SAndroid Build Coastguard Worker printers = NULL;
1565*5e7646d2SAndroid Build Coastguard Worker
1566*5e7646d2SAndroid Build Coastguard Worker /*
1567*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS_GET_PRINTERS request, which requires the following
1568*5e7646d2SAndroid Build Coastguard Worker * attributes:
1569*5e7646d2SAndroid Build Coastguard Worker *
1570*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1571*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1572*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
1573*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1574*5e7646d2SAndroid Build Coastguard Worker */
1575*5e7646d2SAndroid Build Coastguard Worker
1576*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(CUPS_GET_PRINTERS);
1577*5e7646d2SAndroid Build Coastguard Worker
1578*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
1579*5e7646d2SAndroid Build Coastguard Worker "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
1580*5e7646d2SAndroid Build Coastguard Worker NULL, pattrs);
1581*5e7646d2SAndroid Build Coastguard Worker
1582*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
1583*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
1584*5e7646d2SAndroid Build Coastguard Worker
1585*5e7646d2SAndroid Build Coastguard Worker /*
1586*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
1587*5e7646d2SAndroid Build Coastguard Worker */
1588*5e7646d2SAndroid Build Coastguard Worker
1589*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/");
1590*5e7646d2SAndroid Build Coastguard Worker
1591*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
1592*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
1593*5e7646d2SAndroid Build Coastguard Worker {
1594*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
1595*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
1596*5e7646d2SAndroid Build Coastguard Worker "lpstat");
1597*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1598*5e7646d2SAndroid Build Coastguard Worker return (1);
1599*5e7646d2SAndroid Build Coastguard Worker }
1600*5e7646d2SAndroid Build Coastguard Worker else if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1601*5e7646d2SAndroid Build Coastguard Worker {
1602*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString());
1603*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1604*5e7646d2SAndroid Build Coastguard Worker return (1);
1605*5e7646d2SAndroid Build Coastguard Worker }
1606*5e7646d2SAndroid Build Coastguard Worker
1607*5e7646d2SAndroid Build Coastguard Worker if (response)
1608*5e7646d2SAndroid Build Coastguard Worker {
1609*5e7646d2SAndroid Build Coastguard Worker /*
1610*5e7646d2SAndroid Build Coastguard Worker * Loop through the printers returned in the list and display
1611*5e7646d2SAndroid Build Coastguard Worker * their status...
1612*5e7646d2SAndroid Build Coastguard Worker */
1613*5e7646d2SAndroid Build Coastguard Worker
1614*5e7646d2SAndroid Build Coastguard Worker for (attr = response->attrs; attr != NULL; attr = attr->next)
1615*5e7646d2SAndroid Build Coastguard Worker {
1616*5e7646d2SAndroid Build Coastguard Worker /*
1617*5e7646d2SAndroid Build Coastguard Worker * Skip leading attributes until we hit a job...
1618*5e7646d2SAndroid Build Coastguard Worker */
1619*5e7646d2SAndroid Build Coastguard Worker
1620*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
1621*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
1622*5e7646d2SAndroid Build Coastguard Worker
1623*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1624*5e7646d2SAndroid Build Coastguard Worker break;
1625*5e7646d2SAndroid Build Coastguard Worker
1626*5e7646d2SAndroid Build Coastguard Worker /*
1627*5e7646d2SAndroid Build Coastguard Worker * Pull the needed attributes from this job...
1628*5e7646d2SAndroid Build Coastguard Worker */
1629*5e7646d2SAndroid Build Coastguard Worker
1630*5e7646d2SAndroid Build Coastguard Worker printer = NULL;
1631*5e7646d2SAndroid Build Coastguard Worker ptime = 0;
1632*5e7646d2SAndroid Build Coastguard Worker ptype = CUPS_PRINTER_LOCAL;
1633*5e7646d2SAndroid Build Coastguard Worker pstate = IPP_PRINTER_IDLE;
1634*5e7646d2SAndroid Build Coastguard Worker message = NULL;
1635*5e7646d2SAndroid Build Coastguard Worker description = NULL;
1636*5e7646d2SAndroid Build Coastguard Worker location = NULL;
1637*5e7646d2SAndroid Build Coastguard Worker make_model = NULL;
1638*5e7646d2SAndroid Build Coastguard Worker reasons = NULL;
1639*5e7646d2SAndroid Build Coastguard Worker uri = NULL;
1640*5e7646d2SAndroid Build Coastguard Worker jobid = 0;
1641*5e7646d2SAndroid Build Coastguard Worker allowed = NULL;
1642*5e7646d2SAndroid Build Coastguard Worker denied = NULL;
1643*5e7646d2SAndroid Build Coastguard Worker
1644*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
1645*5e7646d2SAndroid Build Coastguard Worker {
1646*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "printer-name") &&
1647*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
1648*5e7646d2SAndroid Build Coastguard Worker printer = attr->values[0].string.text;
1649*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-state") &&
1650*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_ENUM)
1651*5e7646d2SAndroid Build Coastguard Worker pstate = (ipp_pstate_t)attr->values[0].integer;
1652*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-type") &&
1653*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_ENUM)
1654*5e7646d2SAndroid Build Coastguard Worker ptype = (cups_ptype_t)attr->values[0].integer;
1655*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-state-message") &&
1656*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_TEXT)
1657*5e7646d2SAndroid Build Coastguard Worker message = attr->values[0].string.text;
1658*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-state-change-time") &&
1659*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_INTEGER)
1660*5e7646d2SAndroid Build Coastguard Worker ptime = (time_t)attr->values[0].integer;
1661*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-info") &&
1662*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_TEXT)
1663*5e7646d2SAndroid Build Coastguard Worker description = attr->values[0].string.text;
1664*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-location") &&
1665*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_TEXT)
1666*5e7646d2SAndroid Build Coastguard Worker location = attr->values[0].string.text;
1667*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-make-and-model") &&
1668*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_TEXT)
1669*5e7646d2SAndroid Build Coastguard Worker make_model = attr->values[0].string.text;
1670*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-uri-supported") &&
1671*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_URI)
1672*5e7646d2SAndroid Build Coastguard Worker uri = attr->values[0].string.text;
1673*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "printer-state-reasons") &&
1674*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_KEYWORD)
1675*5e7646d2SAndroid Build Coastguard Worker reasons = attr;
1676*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "requesting-user-name-allowed") &&
1677*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
1678*5e7646d2SAndroid Build Coastguard Worker allowed = attr;
1679*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(attr->name, "requesting-user-name-denied") &&
1680*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
1681*5e7646d2SAndroid Build Coastguard Worker denied = attr;
1682*5e7646d2SAndroid Build Coastguard Worker
1683*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
1684*5e7646d2SAndroid Build Coastguard Worker }
1685*5e7646d2SAndroid Build Coastguard Worker
1686*5e7646d2SAndroid Build Coastguard Worker /*
1687*5e7646d2SAndroid Build Coastguard Worker * See if we have everything needed...
1688*5e7646d2SAndroid Build Coastguard Worker */
1689*5e7646d2SAndroid Build Coastguard Worker
1690*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
1691*5e7646d2SAndroid Build Coastguard Worker {
1692*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
1693*5e7646d2SAndroid Build Coastguard Worker break;
1694*5e7646d2SAndroid Build Coastguard Worker else
1695*5e7646d2SAndroid Build Coastguard Worker continue;
1696*5e7646d2SAndroid Build Coastguard Worker }
1697*5e7646d2SAndroid Build Coastguard Worker
1698*5e7646d2SAndroid Build Coastguard Worker /*
1699*5e7646d2SAndroid Build Coastguard Worker * Display the printer entry if needed...
1700*5e7646d2SAndroid Build Coastguard Worker */
1701*5e7646d2SAndroid Build Coastguard Worker
1702*5e7646d2SAndroid Build Coastguard Worker if (match_list(printers, printer))
1703*5e7646d2SAndroid Build Coastguard Worker {
1704*5e7646d2SAndroid Build Coastguard Worker /*
1705*5e7646d2SAndroid Build Coastguard Worker * If the printer state is "IPP_PRINTER_PROCESSING", then grab the
1706*5e7646d2SAndroid Build Coastguard Worker * current job for the printer.
1707*5e7646d2SAndroid Build Coastguard Worker */
1708*5e7646d2SAndroid Build Coastguard Worker
1709*5e7646d2SAndroid Build Coastguard Worker if (pstate == IPP_PRINTER_PROCESSING)
1710*5e7646d2SAndroid Build Coastguard Worker {
1711*5e7646d2SAndroid Build Coastguard Worker /*
1712*5e7646d2SAndroid Build Coastguard Worker * Build an IPP_GET_JOBS request, which requires the following
1713*5e7646d2SAndroid Build Coastguard Worker * attributes:
1714*5e7646d2SAndroid Build Coastguard Worker *
1715*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1716*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1717*5e7646d2SAndroid Build Coastguard Worker * printer-uri
1718*5e7646d2SAndroid Build Coastguard Worker * limit
1719*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
1720*5e7646d2SAndroid Build Coastguard Worker */
1721*5e7646d2SAndroid Build Coastguard Worker
1722*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_GET_JOBS);
1723*5e7646d2SAndroid Build Coastguard Worker
1724*5e7646d2SAndroid Build Coastguard Worker request->request.op.operation_id = IPP_GET_JOBS;
1725*5e7646d2SAndroid Build Coastguard Worker request->request.op.request_id = 1;
1726*5e7646d2SAndroid Build Coastguard Worker
1727*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
1728*5e7646d2SAndroid Build Coastguard Worker "requested-attributes",
1729*5e7646d2SAndroid Build Coastguard Worker sizeof(jattrs) / sizeof(jattrs[0]), NULL, jattrs);
1730*5e7646d2SAndroid Build Coastguard Worker
1731*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
1732*5e7646d2SAndroid Build Coastguard Worker "ipp", NULL, "localhost", 0, "/printers/%s", printer);
1733*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1734*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, printer_uri);
1735*5e7646d2SAndroid Build Coastguard Worker
1736*5e7646d2SAndroid Build Coastguard Worker if ((jobs = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL)
1737*5e7646d2SAndroid Build Coastguard Worker {
1738*5e7646d2SAndroid Build Coastguard Worker /*
1739*5e7646d2SAndroid Build Coastguard Worker * Get the current active job on this queue...
1740*5e7646d2SAndroid Build Coastguard Worker */
1741*5e7646d2SAndroid Build Coastguard Worker
1742*5e7646d2SAndroid Build Coastguard Worker ipp_jstate_t jobstate = IPP_JOB_PENDING;
1743*5e7646d2SAndroid Build Coastguard Worker jobid = 0;
1744*5e7646d2SAndroid Build Coastguard Worker
1745*5e7646d2SAndroid Build Coastguard Worker for (jobattr = jobs->attrs; jobattr; jobattr = jobattr->next)
1746*5e7646d2SAndroid Build Coastguard Worker {
1747*5e7646d2SAndroid Build Coastguard Worker if (!jobattr->name)
1748*5e7646d2SAndroid Build Coastguard Worker {
1749*5e7646d2SAndroid Build Coastguard Worker if (jobstate == IPP_JOB_PROCESSING)
1750*5e7646d2SAndroid Build Coastguard Worker break;
1751*5e7646d2SAndroid Build Coastguard Worker else
1752*5e7646d2SAndroid Build Coastguard Worker continue;
1753*5e7646d2SAndroid Build Coastguard Worker }
1754*5e7646d2SAndroid Build Coastguard Worker
1755*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(jobattr->name, "job-id") &&
1756*5e7646d2SAndroid Build Coastguard Worker jobattr->value_tag == IPP_TAG_INTEGER)
1757*5e7646d2SAndroid Build Coastguard Worker jobid = jobattr->values[0].integer;
1758*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(jobattr->name, "job-state") &&
1759*5e7646d2SAndroid Build Coastguard Worker jobattr->value_tag == IPP_TAG_ENUM)
1760*5e7646d2SAndroid Build Coastguard Worker jobstate = (ipp_jstate_t)jobattr->values[0].integer;
1761*5e7646d2SAndroid Build Coastguard Worker }
1762*5e7646d2SAndroid Build Coastguard Worker
1763*5e7646d2SAndroid Build Coastguard Worker if (jobstate != IPP_JOB_PROCESSING)
1764*5e7646d2SAndroid Build Coastguard Worker jobid = 0;
1765*5e7646d2SAndroid Build Coastguard Worker
1766*5e7646d2SAndroid Build Coastguard Worker ippDelete(jobs);
1767*5e7646d2SAndroid Build Coastguard Worker }
1768*5e7646d2SAndroid Build Coastguard Worker }
1769*5e7646d2SAndroid Build Coastguard Worker
1770*5e7646d2SAndroid Build Coastguard Worker /*
1771*5e7646d2SAndroid Build Coastguard Worker * Display it...
1772*5e7646d2SAndroid Build Coastguard Worker */
1773*5e7646d2SAndroid Build Coastguard Worker
1774*5e7646d2SAndroid Build Coastguard Worker _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
1775*5e7646d2SAndroid Build Coastguard Worker
1776*5e7646d2SAndroid Build Coastguard Worker switch (pstate)
1777*5e7646d2SAndroid Build Coastguard Worker {
1778*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_IDLE :
1779*5e7646d2SAndroid Build Coastguard Worker if (ippContainsString(reasons, "hold-new-jobs"))
1780*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("printer %s is holding new jobs. enabled since %s"), printer, printer_state_time);
1781*5e7646d2SAndroid Build Coastguard Worker else
1782*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("printer %s is idle. enabled since %s"), printer, printer_state_time);
1783*5e7646d2SAndroid Build Coastguard Worker break;
1784*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_PROCESSING :
1785*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("printer %s now printing %s-%d. enabled since %s"), printer, printer, jobid, printer_state_time);
1786*5e7646d2SAndroid Build Coastguard Worker break;
1787*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_STOPPED :
1788*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("printer %s disabled since %s -"), printer, printer_state_time);
1789*5e7646d2SAndroid Build Coastguard Worker break;
1790*5e7646d2SAndroid Build Coastguard Worker }
1791*5e7646d2SAndroid Build Coastguard Worker
1792*5e7646d2SAndroid Build Coastguard Worker if ((message && *message) || pstate == IPP_PRINTER_STOPPED)
1793*5e7646d2SAndroid Build Coastguard Worker {
1794*5e7646d2SAndroid Build Coastguard Worker if (message && *message)
1795*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "\t%s", message);
1796*5e7646d2SAndroid Build Coastguard Worker else
1797*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\treason unknown"));
1798*5e7646d2SAndroid Build Coastguard Worker }
1799*5e7646d2SAndroid Build Coastguard Worker
1800*5e7646d2SAndroid Build Coastguard Worker if (long_status > 1)
1801*5e7646d2SAndroid Build Coastguard Worker {
1802*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tForm mounted:"));
1803*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tContent types: any"));
1804*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tPrinter types: unknown"));
1805*5e7646d2SAndroid Build Coastguard Worker }
1806*5e7646d2SAndroid Build Coastguard Worker
1807*5e7646d2SAndroid Build Coastguard Worker if (long_status)
1808*5e7646d2SAndroid Build Coastguard Worker {
1809*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tDescription: %s"),
1810*5e7646d2SAndroid Build Coastguard Worker description ? description : "");
1811*5e7646d2SAndroid Build Coastguard Worker
1812*5e7646d2SAndroid Build Coastguard Worker if (reasons)
1813*5e7646d2SAndroid Build Coastguard Worker {
1814*5e7646d2SAndroid Build Coastguard Worker char alerts[1024], /* Alerts string */
1815*5e7646d2SAndroid Build Coastguard Worker *aptr; /* Pointer into alerts string */
1816*5e7646d2SAndroid Build Coastguard Worker
1817*5e7646d2SAndroid Build Coastguard Worker for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
1818*5e7646d2SAndroid Build Coastguard Worker {
1819*5e7646d2SAndroid Build Coastguard Worker if (i)
1820*5e7646d2SAndroid Build Coastguard Worker snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
1821*5e7646d2SAndroid Build Coastguard Worker else
1822*5e7646d2SAndroid Build Coastguard Worker strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
1823*5e7646d2SAndroid Build Coastguard Worker
1824*5e7646d2SAndroid Build Coastguard Worker aptr += strlen(aptr);
1825*5e7646d2SAndroid Build Coastguard Worker }
1826*5e7646d2SAndroid Build Coastguard Worker
1827*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
1828*5e7646d2SAndroid Build Coastguard Worker }
1829*5e7646d2SAndroid Build Coastguard Worker }
1830*5e7646d2SAndroid Build Coastguard Worker if (long_status > 1)
1831*5e7646d2SAndroid Build Coastguard Worker {
1832*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tLocation: %s"),
1833*5e7646d2SAndroid Build Coastguard Worker location ? location : "");
1834*5e7646d2SAndroid Build Coastguard Worker
1835*5e7646d2SAndroid Build Coastguard Worker if (ptype & CUPS_PRINTER_REMOTE)
1836*5e7646d2SAndroid Build Coastguard Worker {
1837*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tConnection: remote"));
1838*5e7646d2SAndroid Build Coastguard Worker
1839*5e7646d2SAndroid Build Coastguard Worker if (make_model && !strstr(make_model, "System V Printer") &&
1840*5e7646d2SAndroid Build Coastguard Worker !strstr(make_model, "Raw Printer") && uri)
1841*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tInterface: %s.ppd"),
1842*5e7646d2SAndroid Build Coastguard Worker uri);
1843*5e7646d2SAndroid Build Coastguard Worker }
1844*5e7646d2SAndroid Build Coastguard Worker else
1845*5e7646d2SAndroid Build Coastguard Worker {
1846*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tConnection: direct"));
1847*5e7646d2SAndroid Build Coastguard Worker
1848*5e7646d2SAndroid Build Coastguard Worker if (make_model && !strstr(make_model, "Raw Printer"))
1849*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
1850*5e7646d2SAndroid Build Coastguard Worker _("\tInterface: %s/ppd/%s.ppd"),
1851*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverroot, printer);
1852*5e7646d2SAndroid Build Coastguard Worker }
1853*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tOn fault: no alert"));
1854*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tAfter fault: continue"));
1855*5e7646d2SAndroid Build Coastguard Worker /* TODO update to use printer-error-policy */
1856*5e7646d2SAndroid Build Coastguard Worker if (allowed)
1857*5e7646d2SAndroid Build Coastguard Worker {
1858*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tUsers allowed:"));
1859*5e7646d2SAndroid Build Coastguard Worker for (j = 0; j < allowed->num_values; j ++)
1860*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "\t\t%s",
1861*5e7646d2SAndroid Build Coastguard Worker allowed->values[j].string.text);
1862*5e7646d2SAndroid Build Coastguard Worker }
1863*5e7646d2SAndroid Build Coastguard Worker else if (denied)
1864*5e7646d2SAndroid Build Coastguard Worker {
1865*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tUsers denied:"));
1866*5e7646d2SAndroid Build Coastguard Worker for (j = 0; j < denied->num_values; j ++)
1867*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "\t\t%s",
1868*5e7646d2SAndroid Build Coastguard Worker denied->values[j].string.text);
1869*5e7646d2SAndroid Build Coastguard Worker }
1870*5e7646d2SAndroid Build Coastguard Worker else
1871*5e7646d2SAndroid Build Coastguard Worker {
1872*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tUsers allowed:"));
1873*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\t\t(all)"));
1874*5e7646d2SAndroid Build Coastguard Worker }
1875*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tForms allowed:"));
1876*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\t\t(none)"));
1877*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tBanner required"));
1878*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tCharset sets:"));
1879*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\t\t(none)"));
1880*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tDefault pitch:"));
1881*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tDefault page size:"));
1882*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tDefault port settings:"));
1883*5e7646d2SAndroid Build Coastguard Worker }
1884*5e7646d2SAndroid Build Coastguard Worker
1885*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < num_dests; i ++)
1886*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance)
1887*5e7646d2SAndroid Build Coastguard Worker {
1888*5e7646d2SAndroid Build Coastguard Worker switch (pstate)
1889*5e7646d2SAndroid Build Coastguard Worker {
1890*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_IDLE :
1891*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
1892*5e7646d2SAndroid Build Coastguard Worker _("printer %s/%s is idle. "
1893*5e7646d2SAndroid Build Coastguard Worker "enabled since %s"),
1894*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance,
1895*5e7646d2SAndroid Build Coastguard Worker printer_state_time);
1896*5e7646d2SAndroid Build Coastguard Worker break;
1897*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_PROCESSING :
1898*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
1899*5e7646d2SAndroid Build Coastguard Worker _("printer %s/%s now printing %s-%d. "
1900*5e7646d2SAndroid Build Coastguard Worker "enabled since %s"),
1901*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance, printer, jobid,
1902*5e7646d2SAndroid Build Coastguard Worker printer_state_time);
1903*5e7646d2SAndroid Build Coastguard Worker break;
1904*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_STOPPED :
1905*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
1906*5e7646d2SAndroid Build Coastguard Worker _("printer %s/%s disabled since %s -"),
1907*5e7646d2SAndroid Build Coastguard Worker printer, dests[i].instance,
1908*5e7646d2SAndroid Build Coastguard Worker printer_state_time);
1909*5e7646d2SAndroid Build Coastguard Worker break;
1910*5e7646d2SAndroid Build Coastguard Worker }
1911*5e7646d2SAndroid Build Coastguard Worker
1912*5e7646d2SAndroid Build Coastguard Worker if ((message && *message) || pstate == IPP_PRINTER_STOPPED)
1913*5e7646d2SAndroid Build Coastguard Worker {
1914*5e7646d2SAndroid Build Coastguard Worker if (message && *message)
1915*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "\t%s", message);
1916*5e7646d2SAndroid Build Coastguard Worker else
1917*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\treason unknown"));
1918*5e7646d2SAndroid Build Coastguard Worker }
1919*5e7646d2SAndroid Build Coastguard Worker
1920*5e7646d2SAndroid Build Coastguard Worker if (long_status > 1)
1921*5e7646d2SAndroid Build Coastguard Worker {
1922*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tForm mounted:"));
1923*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tContent types: any"));
1924*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tPrinter types: unknown"));
1925*5e7646d2SAndroid Build Coastguard Worker }
1926*5e7646d2SAndroid Build Coastguard Worker
1927*5e7646d2SAndroid Build Coastguard Worker if (long_status)
1928*5e7646d2SAndroid Build Coastguard Worker {
1929*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tDescription: %s"),
1930*5e7646d2SAndroid Build Coastguard Worker description ? description : "");
1931*5e7646d2SAndroid Build Coastguard Worker
1932*5e7646d2SAndroid Build Coastguard Worker if (reasons)
1933*5e7646d2SAndroid Build Coastguard Worker {
1934*5e7646d2SAndroid Build Coastguard Worker char alerts[1024], /* Alerts string */
1935*5e7646d2SAndroid Build Coastguard Worker *aptr; /* Pointer into alerts string */
1936*5e7646d2SAndroid Build Coastguard Worker
1937*5e7646d2SAndroid Build Coastguard Worker for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
1938*5e7646d2SAndroid Build Coastguard Worker {
1939*5e7646d2SAndroid Build Coastguard Worker if (i)
1940*5e7646d2SAndroid Build Coastguard Worker snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
1941*5e7646d2SAndroid Build Coastguard Worker else
1942*5e7646d2SAndroid Build Coastguard Worker strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
1943*5e7646d2SAndroid Build Coastguard Worker
1944*5e7646d2SAndroid Build Coastguard Worker aptr += strlen(aptr);
1945*5e7646d2SAndroid Build Coastguard Worker }
1946*5e7646d2SAndroid Build Coastguard Worker
1947*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
1948*5e7646d2SAndroid Build Coastguard Worker }
1949*5e7646d2SAndroid Build Coastguard Worker }
1950*5e7646d2SAndroid Build Coastguard Worker if (long_status > 1)
1951*5e7646d2SAndroid Build Coastguard Worker {
1952*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tLocation: %s"),
1953*5e7646d2SAndroid Build Coastguard Worker location ? location : "");
1954*5e7646d2SAndroid Build Coastguard Worker
1955*5e7646d2SAndroid Build Coastguard Worker if (ptype & CUPS_PRINTER_REMOTE)
1956*5e7646d2SAndroid Build Coastguard Worker {
1957*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tConnection: remote"));
1958*5e7646d2SAndroid Build Coastguard Worker
1959*5e7646d2SAndroid Build Coastguard Worker if (make_model && !strstr(make_model, "System V Printer") &&
1960*5e7646d2SAndroid Build Coastguard Worker !strstr(make_model, "Raw Printer") && uri)
1961*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("\tInterface: %s.ppd"), uri);
1962*5e7646d2SAndroid Build Coastguard Worker }
1963*5e7646d2SAndroid Build Coastguard Worker else
1964*5e7646d2SAndroid Build Coastguard Worker {
1965*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tConnection: direct"));
1966*5e7646d2SAndroid Build Coastguard Worker
1967*5e7646d2SAndroid Build Coastguard Worker if (make_model && !strstr(make_model, "Raw Printer"))
1968*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
1969*5e7646d2SAndroid Build Coastguard Worker _("\tInterface: %s/ppd/%s.ppd"),
1970*5e7646d2SAndroid Build Coastguard Worker cg->cups_serverroot, printer);
1971*5e7646d2SAndroid Build Coastguard Worker }
1972*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tOn fault: no alert"));
1973*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tAfter fault: continue"));
1974*5e7646d2SAndroid Build Coastguard Worker /* TODO update to use printer-error-policy */
1975*5e7646d2SAndroid Build Coastguard Worker if (allowed)
1976*5e7646d2SAndroid Build Coastguard Worker {
1977*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tUsers allowed:"));
1978*5e7646d2SAndroid Build Coastguard Worker for (j = 0; j < allowed->num_values; j ++)
1979*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "\t\t%s",
1980*5e7646d2SAndroid Build Coastguard Worker allowed->values[j].string.text);
1981*5e7646d2SAndroid Build Coastguard Worker }
1982*5e7646d2SAndroid Build Coastguard Worker else if (denied)
1983*5e7646d2SAndroid Build Coastguard Worker {
1984*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tUsers denied:"));
1985*5e7646d2SAndroid Build Coastguard Worker for (j = 0; j < denied->num_values; j ++)
1986*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, "\t\t%s",
1987*5e7646d2SAndroid Build Coastguard Worker denied->values[j].string.text);
1988*5e7646d2SAndroid Build Coastguard Worker }
1989*5e7646d2SAndroid Build Coastguard Worker else
1990*5e7646d2SAndroid Build Coastguard Worker {
1991*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tUsers allowed:"));
1992*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\t\t(all)"));
1993*5e7646d2SAndroid Build Coastguard Worker }
1994*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tForms allowed:"));
1995*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\t\t(none)"));
1996*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tBanner required"));
1997*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tCharset sets:"));
1998*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\t\t(none)"));
1999*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tDefault pitch:"));
2000*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tDefault page size:"));
2001*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("\tDefault port settings:"));
2002*5e7646d2SAndroid Build Coastguard Worker }
2003*5e7646d2SAndroid Build Coastguard Worker }
2004*5e7646d2SAndroid Build Coastguard Worker }
2005*5e7646d2SAndroid Build Coastguard Worker
2006*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
2007*5e7646d2SAndroid Build Coastguard Worker break;
2008*5e7646d2SAndroid Build Coastguard Worker }
2009*5e7646d2SAndroid Build Coastguard Worker
2010*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
2011*5e7646d2SAndroid Build Coastguard Worker }
2012*5e7646d2SAndroid Build Coastguard Worker
2013*5e7646d2SAndroid Build Coastguard Worker return (0);
2014*5e7646d2SAndroid Build Coastguard Worker }
2015*5e7646d2SAndroid Build Coastguard Worker
2016*5e7646d2SAndroid Build Coastguard Worker
2017*5e7646d2SAndroid Build Coastguard Worker /*
2018*5e7646d2SAndroid Build Coastguard Worker * 'show_scheduler()' - Show scheduler status.
2019*5e7646d2SAndroid Build Coastguard Worker */
2020*5e7646d2SAndroid Build Coastguard Worker
2021*5e7646d2SAndroid Build Coastguard Worker static void
show_scheduler(void)2022*5e7646d2SAndroid Build Coastguard Worker show_scheduler(void)
2023*5e7646d2SAndroid Build Coastguard Worker {
2024*5e7646d2SAndroid Build Coastguard Worker http_t *http; /* Connection to server */
2025*5e7646d2SAndroid Build Coastguard Worker
2026*5e7646d2SAndroid Build Coastguard Worker
2027*5e7646d2SAndroid Build Coastguard Worker if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
2028*5e7646d2SAndroid Build Coastguard Worker cupsEncryption())) != NULL)
2029*5e7646d2SAndroid Build Coastguard Worker {
2030*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("scheduler is running"));
2031*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
2032*5e7646d2SAndroid Build Coastguard Worker }
2033*5e7646d2SAndroid Build Coastguard Worker else
2034*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("scheduler is not running"));
2035*5e7646d2SAndroid Build Coastguard Worker }
2036*5e7646d2SAndroid Build Coastguard Worker
2037*5e7646d2SAndroid Build Coastguard Worker
2038*5e7646d2SAndroid Build Coastguard Worker /*
2039*5e7646d2SAndroid Build Coastguard Worker * 'usage()' - Show program usage and exit.
2040*5e7646d2SAndroid Build Coastguard Worker */
2041*5e7646d2SAndroid Build Coastguard Worker
2042*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)2043*5e7646d2SAndroid Build Coastguard Worker usage(void)
2044*5e7646d2SAndroid Build Coastguard Worker {
2045*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Usage: lpstat [options]"));
2046*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Options:"));
2047*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
2048*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
2049*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-l Show verbose (long) output"));
2050*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication"));
2051*5e7646d2SAndroid Build Coastguard Worker
2052*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-H Show the default server and port"));
2053*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-W completed Show completed jobs"));
2054*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-W not-completed Show pending jobs"));
2055*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-a [destination(s)] Show the accepting state of destinations"));
2056*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-c [class(es)] Show classes and their member printers"));
2057*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-d Show the default destination"));
2058*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-e Show available destinations on the network"));
2059*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o [destination(s)] Show jobs"));
2060*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-p [printer(s)] Show the processing state of destinations"));
2061*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-r Show whether the CUPS server is running"));
2062*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-R Show the ranking of jobs"));
2063*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-s Show a status summary"));
2064*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-t Show all status information"));
2065*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-u [user(s)] Show jobs queued by the current or specified users"));
2066*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-v [printer(s)] Show the devices for each destination"));
2067*5e7646d2SAndroid Build Coastguard Worker
2068*5e7646d2SAndroid Build Coastguard Worker exit(1);
2069*5e7646d2SAndroid Build Coastguard Worker }
2070