1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * "lpq" 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 http_t *connect_server(const char *, http_t *);
23*5e7646d2SAndroid Build Coastguard Worker static int show_jobs(const char *, http_t *, const char *,
24*5e7646d2SAndroid Build Coastguard Worker const char *, const int, const int);
25*5e7646d2SAndroid Build Coastguard Worker static void show_printer(const char *, http_t *, const char *);
26*5e7646d2SAndroid Build Coastguard Worker static void usage(void) _CUPS_NORETURN;
27*5e7646d2SAndroid Build Coastguard Worker
28*5e7646d2SAndroid Build Coastguard Worker
29*5e7646d2SAndroid Build Coastguard Worker /*
30*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Parse options and commands.
31*5e7646d2SAndroid Build Coastguard Worker */
32*5e7646d2SAndroid Build Coastguard Worker
33*5e7646d2SAndroid Build Coastguard Worker int
main(int argc,char * argv[])34*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
35*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
36*5e7646d2SAndroid Build Coastguard Worker {
37*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
38*5e7646d2SAndroid Build Coastguard Worker http_t *http; /* Connection to server */
39*5e7646d2SAndroid Build Coastguard Worker const char *opt, /* Option pointer */
40*5e7646d2SAndroid Build Coastguard Worker *dest, /* Desired printer */
41*5e7646d2SAndroid Build Coastguard Worker *user, /* Desired user */
42*5e7646d2SAndroid Build Coastguard Worker *val; /* Environment variable name */
43*5e7646d2SAndroid Build Coastguard Worker char *instance; /* Printer instance */
44*5e7646d2SAndroid Build Coastguard Worker int id, /* Desired job ID */
45*5e7646d2SAndroid Build Coastguard Worker all, /* All printers */
46*5e7646d2SAndroid Build Coastguard Worker interval, /* Reporting interval */
47*5e7646d2SAndroid Build Coastguard Worker longstatus; /* Show file details */
48*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *named_dest; /* Named destination */
49*5e7646d2SAndroid Build Coastguard Worker
50*5e7646d2SAndroid Build Coastguard Worker
51*5e7646d2SAndroid Build Coastguard Worker _cupsSetLocale(argv);
52*5e7646d2SAndroid Build Coastguard Worker
53*5e7646d2SAndroid Build Coastguard Worker /*
54*5e7646d2SAndroid Build Coastguard Worker * Check for command-line options...
55*5e7646d2SAndroid Build Coastguard Worker */
56*5e7646d2SAndroid Build Coastguard Worker
57*5e7646d2SAndroid Build Coastguard Worker http = NULL;
58*5e7646d2SAndroid Build Coastguard Worker dest = NULL;
59*5e7646d2SAndroid Build Coastguard Worker user = NULL;
60*5e7646d2SAndroid Build Coastguard Worker id = 0;
61*5e7646d2SAndroid Build Coastguard Worker interval = 0;
62*5e7646d2SAndroid Build Coastguard Worker longstatus = 0;
63*5e7646d2SAndroid Build Coastguard Worker all = 0;
64*5e7646d2SAndroid Build Coastguard Worker
65*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < argc; i ++)
66*5e7646d2SAndroid Build Coastguard Worker {
67*5e7646d2SAndroid Build Coastguard Worker if (argv[i][0] == '+')
68*5e7646d2SAndroid Build Coastguard Worker {
69*5e7646d2SAndroid Build Coastguard Worker interval = atoi(argv[i] + 1);
70*5e7646d2SAndroid Build Coastguard Worker }
71*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "--help"))
72*5e7646d2SAndroid Build Coastguard Worker usage();
73*5e7646d2SAndroid Build Coastguard Worker else if (argv[i][0] == '-')
74*5e7646d2SAndroid Build Coastguard Worker {
75*5e7646d2SAndroid Build Coastguard Worker for (opt = argv[i] + 1; *opt; opt ++)
76*5e7646d2SAndroid Build Coastguard Worker {
77*5e7646d2SAndroid Build Coastguard Worker switch (*opt)
78*5e7646d2SAndroid Build Coastguard Worker {
79*5e7646d2SAndroid Build Coastguard Worker case 'E' : /* Encrypt */
80*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
81*5e7646d2SAndroid Build Coastguard Worker cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
82*5e7646d2SAndroid Build Coastguard Worker
83*5e7646d2SAndroid Build Coastguard Worker if (http)
84*5e7646d2SAndroid Build Coastguard Worker httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
85*5e7646d2SAndroid Build Coastguard Worker #else
86*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
87*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
88*5e7646d2SAndroid Build Coastguard Worker break;
89*5e7646d2SAndroid Build Coastguard Worker
90*5e7646d2SAndroid Build Coastguard Worker case 'U' : /* Username */
91*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
92*5e7646d2SAndroid Build Coastguard Worker {
93*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(opt + 1);
94*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
95*5e7646d2SAndroid Build Coastguard Worker }
96*5e7646d2SAndroid Build Coastguard Worker else
97*5e7646d2SAndroid Build Coastguard Worker {
98*5e7646d2SAndroid Build Coastguard Worker i ++;
99*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
100*5e7646d2SAndroid Build Coastguard Worker {
101*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
102*5e7646d2SAndroid Build Coastguard Worker return (1);
103*5e7646d2SAndroid Build Coastguard Worker }
104*5e7646d2SAndroid Build Coastguard Worker
105*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(argv[i]);
106*5e7646d2SAndroid Build Coastguard Worker }
107*5e7646d2SAndroid Build Coastguard Worker break;
108*5e7646d2SAndroid Build Coastguard Worker
109*5e7646d2SAndroid Build Coastguard Worker case 'P' : /* Printer */
110*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
111*5e7646d2SAndroid Build Coastguard Worker {
112*5e7646d2SAndroid Build Coastguard Worker dest = opt + 1;
113*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
114*5e7646d2SAndroid Build Coastguard Worker }
115*5e7646d2SAndroid Build Coastguard Worker else
116*5e7646d2SAndroid Build Coastguard Worker {
117*5e7646d2SAndroid Build Coastguard Worker i ++;
118*5e7646d2SAndroid Build Coastguard Worker
119*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
120*5e7646d2SAndroid Build Coastguard Worker {
121*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
122*5e7646d2SAndroid Build Coastguard Worker
123*5e7646d2SAndroid Build Coastguard Worker usage();
124*5e7646d2SAndroid Build Coastguard Worker }
125*5e7646d2SAndroid Build Coastguard Worker
126*5e7646d2SAndroid Build Coastguard Worker dest = argv[i];
127*5e7646d2SAndroid Build Coastguard Worker }
128*5e7646d2SAndroid Build Coastguard Worker
129*5e7646d2SAndroid Build Coastguard Worker if ((instance = strchr(dest, '/')) != NULL)
130*5e7646d2SAndroid Build Coastguard Worker *instance++ = '\0';
131*5e7646d2SAndroid Build Coastguard Worker
132*5e7646d2SAndroid Build Coastguard Worker http = connect_server(argv[0], http);
133*5e7646d2SAndroid Build Coastguard Worker
134*5e7646d2SAndroid Build Coastguard Worker if ((named_dest = cupsGetNamedDest(http, dest, instance)) == NULL)
135*5e7646d2SAndroid Build Coastguard Worker {
136*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
137*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
138*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
139*5e7646d2SAndroid Build Coastguard Worker else if (instance)
140*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s/%s\"."), argv[0], dest, instance);
141*5e7646d2SAndroid Build Coastguard Worker else
142*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Unknown destination \"%s\"."), argv[0], dest);
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker return (1);
145*5e7646d2SAndroid Build Coastguard Worker }
146*5e7646d2SAndroid Build Coastguard Worker
147*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(1, named_dest);
148*5e7646d2SAndroid Build Coastguard Worker break;
149*5e7646d2SAndroid Build Coastguard Worker
150*5e7646d2SAndroid Build Coastguard Worker case 'a' : /* All printers */
151*5e7646d2SAndroid Build Coastguard Worker all = 1;
152*5e7646d2SAndroid Build Coastguard Worker break;
153*5e7646d2SAndroid Build Coastguard Worker
154*5e7646d2SAndroid Build Coastguard Worker case 'h' : /* Connect to host */
155*5e7646d2SAndroid Build Coastguard Worker if (http)
156*5e7646d2SAndroid Build Coastguard Worker {
157*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
158*5e7646d2SAndroid Build Coastguard Worker http = NULL;
159*5e7646d2SAndroid Build Coastguard Worker }
160*5e7646d2SAndroid Build Coastguard Worker
161*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
162*5e7646d2SAndroid Build Coastguard Worker {
163*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(opt + 1);
164*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
165*5e7646d2SAndroid Build Coastguard Worker }
166*5e7646d2SAndroid Build Coastguard Worker else
167*5e7646d2SAndroid Build Coastguard Worker {
168*5e7646d2SAndroid Build Coastguard Worker i ++;
169*5e7646d2SAndroid Build Coastguard Worker
170*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
171*5e7646d2SAndroid Build Coastguard Worker {
172*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]);
173*5e7646d2SAndroid Build Coastguard Worker return (1);
174*5e7646d2SAndroid Build Coastguard Worker }
175*5e7646d2SAndroid Build Coastguard Worker else
176*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(argv[i]);
177*5e7646d2SAndroid Build Coastguard Worker }
178*5e7646d2SAndroid Build Coastguard Worker break;
179*5e7646d2SAndroid Build Coastguard Worker
180*5e7646d2SAndroid Build Coastguard Worker case 'l' : /* Long status */
181*5e7646d2SAndroid Build Coastguard Worker longstatus = 1;
182*5e7646d2SAndroid Build Coastguard Worker break;
183*5e7646d2SAndroid Build Coastguard Worker
184*5e7646d2SAndroid Build Coastguard Worker default :
185*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
186*5e7646d2SAndroid Build Coastguard Worker
187*5e7646d2SAndroid Build Coastguard Worker usage();
188*5e7646d2SAndroid Build Coastguard Worker }
189*5e7646d2SAndroid Build Coastguard Worker }
190*5e7646d2SAndroid Build Coastguard Worker }
191*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(argv[i][0] & 255))
192*5e7646d2SAndroid Build Coastguard Worker {
193*5e7646d2SAndroid Build Coastguard Worker id = atoi(argv[i]);
194*5e7646d2SAndroid Build Coastguard Worker }
195*5e7646d2SAndroid Build Coastguard Worker else
196*5e7646d2SAndroid Build Coastguard Worker {
197*5e7646d2SAndroid Build Coastguard Worker user = argv[i];
198*5e7646d2SAndroid Build Coastguard Worker }
199*5e7646d2SAndroid Build Coastguard Worker }
200*5e7646d2SAndroid Build Coastguard Worker
201*5e7646d2SAndroid Build Coastguard Worker http = connect_server(argv[0], http);
202*5e7646d2SAndroid Build Coastguard Worker
203*5e7646d2SAndroid Build Coastguard Worker if (dest == NULL && !all)
204*5e7646d2SAndroid Build Coastguard Worker {
205*5e7646d2SAndroid Build Coastguard Worker if ((named_dest = cupsGetNamedDest(http, NULL, NULL)) == NULL)
206*5e7646d2SAndroid Build Coastguard Worker {
207*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
208*5e7646d2SAndroid Build Coastguard Worker cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
209*5e7646d2SAndroid Build Coastguard Worker {
210*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
211*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - add '/version=1.1' to server name."),
212*5e7646d2SAndroid Build Coastguard Worker argv[0]);
213*5e7646d2SAndroid Build Coastguard Worker return (1);
214*5e7646d2SAndroid Build Coastguard Worker }
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker val = NULL;
217*5e7646d2SAndroid Build Coastguard Worker
218*5e7646d2SAndroid Build Coastguard Worker if ((dest = getenv("LPDEST")) == NULL)
219*5e7646d2SAndroid Build Coastguard Worker {
220*5e7646d2SAndroid Build Coastguard Worker if ((dest = getenv("PRINTER")) != NULL)
221*5e7646d2SAndroid Build Coastguard Worker {
222*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(dest, "lp"))
223*5e7646d2SAndroid Build Coastguard Worker dest = NULL;
224*5e7646d2SAndroid Build Coastguard Worker else
225*5e7646d2SAndroid Build Coastguard Worker val = "PRINTER";
226*5e7646d2SAndroid Build Coastguard Worker }
227*5e7646d2SAndroid Build Coastguard Worker }
228*5e7646d2SAndroid Build Coastguard Worker else
229*5e7646d2SAndroid Build Coastguard Worker val = "LPDEST";
230*5e7646d2SAndroid Build Coastguard Worker
231*5e7646d2SAndroid Build Coastguard Worker if (dest && val)
232*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
233*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - %s environment variable names "
234*5e7646d2SAndroid Build Coastguard Worker "non-existent destination \"%s\"."), argv[0], val,
235*5e7646d2SAndroid Build Coastguard Worker dest);
236*5e7646d2SAndroid Build Coastguard Worker else
237*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
238*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - no default destination available."),
239*5e7646d2SAndroid Build Coastguard Worker argv[0]);
240*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
241*5e7646d2SAndroid Build Coastguard Worker return (1);
242*5e7646d2SAndroid Build Coastguard Worker }
243*5e7646d2SAndroid Build Coastguard Worker
244*5e7646d2SAndroid Build Coastguard Worker dest = named_dest->name;
245*5e7646d2SAndroid Build Coastguard Worker }
246*5e7646d2SAndroid Build Coastguard Worker
247*5e7646d2SAndroid Build Coastguard Worker /*
248*5e7646d2SAndroid Build Coastguard Worker * Show the status in a loop...
249*5e7646d2SAndroid Build Coastguard Worker */
250*5e7646d2SAndroid Build Coastguard Worker
251*5e7646d2SAndroid Build Coastguard Worker for (;;)
252*5e7646d2SAndroid Build Coastguard Worker {
253*5e7646d2SAndroid Build Coastguard Worker if (dest)
254*5e7646d2SAndroid Build Coastguard Worker show_printer(argv[0], http, dest);
255*5e7646d2SAndroid Build Coastguard Worker
256*5e7646d2SAndroid Build Coastguard Worker i = show_jobs(argv[0], http, dest, user, id, longstatus);
257*5e7646d2SAndroid Build Coastguard Worker
258*5e7646d2SAndroid Build Coastguard Worker if (i && interval)
259*5e7646d2SAndroid Build Coastguard Worker {
260*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
261*5e7646d2SAndroid Build Coastguard Worker sleep((unsigned)interval);
262*5e7646d2SAndroid Build Coastguard Worker }
263*5e7646d2SAndroid Build Coastguard Worker else
264*5e7646d2SAndroid Build Coastguard Worker break;
265*5e7646d2SAndroid Build Coastguard Worker }
266*5e7646d2SAndroid Build Coastguard Worker
267*5e7646d2SAndroid Build Coastguard Worker /*
268*5e7646d2SAndroid Build Coastguard Worker * Close the connection to the server and return...
269*5e7646d2SAndroid Build Coastguard Worker */
270*5e7646d2SAndroid Build Coastguard Worker
271*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
272*5e7646d2SAndroid Build Coastguard Worker
273*5e7646d2SAndroid Build Coastguard Worker return (0);
274*5e7646d2SAndroid Build Coastguard Worker }
275*5e7646d2SAndroid Build Coastguard Worker
276*5e7646d2SAndroid Build Coastguard Worker
277*5e7646d2SAndroid Build Coastguard Worker /*
278*5e7646d2SAndroid Build Coastguard Worker * 'connect_server()' - Connect to the server as necessary...
279*5e7646d2SAndroid Build Coastguard Worker */
280*5e7646d2SAndroid Build Coastguard Worker
281*5e7646d2SAndroid Build Coastguard Worker static http_t * /* O - New HTTP connection */
connect_server(const char * command,http_t * http)282*5e7646d2SAndroid Build Coastguard Worker connect_server(const char *command, /* I - Command name */
283*5e7646d2SAndroid Build Coastguard Worker http_t *http) /* I - Current HTTP connection */
284*5e7646d2SAndroid Build Coastguard Worker {
285*5e7646d2SAndroid Build Coastguard Worker if (!http)
286*5e7646d2SAndroid Build Coastguard Worker {
287*5e7646d2SAndroid Build Coastguard Worker http = httpConnectEncrypt(cupsServer(), ippPort(),
288*5e7646d2SAndroid Build Coastguard Worker cupsEncryption());
289*5e7646d2SAndroid Build Coastguard Worker
290*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
291*5e7646d2SAndroid Build Coastguard Worker {
292*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), command);
293*5e7646d2SAndroid Build Coastguard Worker exit(1);
294*5e7646d2SAndroid Build Coastguard Worker }
295*5e7646d2SAndroid Build Coastguard Worker }
296*5e7646d2SAndroid Build Coastguard Worker
297*5e7646d2SAndroid Build Coastguard Worker return (http);
298*5e7646d2SAndroid Build Coastguard Worker }
299*5e7646d2SAndroid Build Coastguard Worker
300*5e7646d2SAndroid Build Coastguard Worker
301*5e7646d2SAndroid Build Coastguard Worker /*
302*5e7646d2SAndroid Build Coastguard Worker * 'show_jobs()' - Show jobs.
303*5e7646d2SAndroid Build Coastguard Worker */
304*5e7646d2SAndroid Build Coastguard Worker
305*5e7646d2SAndroid Build Coastguard Worker static int /* O - Number of jobs in queue */
show_jobs(const char * command,http_t * http,const char * dest,const char * user,const int id,const int longstatus)306*5e7646d2SAndroid Build Coastguard Worker show_jobs(const char *command, /* I - Command name */
307*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - HTTP connection to server */
308*5e7646d2SAndroid Build Coastguard Worker const char *dest, /* I - Destination */
309*5e7646d2SAndroid Build Coastguard Worker const char *user, /* I - User */
310*5e7646d2SAndroid Build Coastguard Worker const int id, /* I - Job ID */
311*5e7646d2SAndroid Build Coastguard Worker const int longstatus) /* I - 1 if long report desired */
312*5e7646d2SAndroid Build Coastguard Worker {
313*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
314*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP Response */
315*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* Current attribute */
316*5e7646d2SAndroid Build Coastguard Worker const char *jobdest, /* Pointer into job-printer-uri */
317*5e7646d2SAndroid Build Coastguard Worker *jobuser, /* Pointer to job-originating-user-name */
318*5e7646d2SAndroid Build Coastguard Worker *jobname; /* Pointer to job-name */
319*5e7646d2SAndroid Build Coastguard Worker ipp_jstate_t jobstate; /* job-state */
320*5e7646d2SAndroid Build Coastguard Worker int jobid, /* job-id */
321*5e7646d2SAndroid Build Coastguard Worker jobsize, /* job-k-octets */
322*5e7646d2SAndroid Build Coastguard Worker jobcount, /* Number of jobs */
323*5e7646d2SAndroid Build Coastguard Worker jobcopies, /* Number of copies */
324*5e7646d2SAndroid Build Coastguard Worker rank; /* Rank of job */
325*5e7646d2SAndroid Build Coastguard Worker char resource[1024]; /* Resource string */
326*5e7646d2SAndroid Build Coastguard Worker char rankstr[255]; /* Rank string */
327*5e7646d2SAndroid Build Coastguard Worker char namestr[1024]; /* Job name string */
328*5e7646d2SAndroid Build Coastguard Worker static const char * const jobattrs[] =/* Job attributes we want to see */
329*5e7646d2SAndroid Build Coastguard Worker {
330*5e7646d2SAndroid Build Coastguard Worker "copies",
331*5e7646d2SAndroid Build Coastguard Worker "job-id",
332*5e7646d2SAndroid Build Coastguard Worker "job-k-octets",
333*5e7646d2SAndroid Build Coastguard Worker "job-name",
334*5e7646d2SAndroid Build Coastguard Worker "job-originating-user-name",
335*5e7646d2SAndroid Build Coastguard Worker "job-printer-uri",
336*5e7646d2SAndroid Build Coastguard Worker "job-priority",
337*5e7646d2SAndroid Build Coastguard Worker "job-state"
338*5e7646d2SAndroid Build Coastguard Worker };
339*5e7646d2SAndroid Build Coastguard Worker static const char * const ranks[10] = /* Ranking strings */
340*5e7646d2SAndroid Build Coastguard Worker {
341*5e7646d2SAndroid Build Coastguard Worker "th",
342*5e7646d2SAndroid Build Coastguard Worker "st",
343*5e7646d2SAndroid Build Coastguard Worker "nd",
344*5e7646d2SAndroid Build Coastguard Worker "rd",
345*5e7646d2SAndroid Build Coastguard Worker "th",
346*5e7646d2SAndroid Build Coastguard Worker "th",
347*5e7646d2SAndroid Build Coastguard Worker "th",
348*5e7646d2SAndroid Build Coastguard Worker "th",
349*5e7646d2SAndroid Build Coastguard Worker "th",
350*5e7646d2SAndroid Build Coastguard Worker "th"
351*5e7646d2SAndroid Build Coastguard Worker };
352*5e7646d2SAndroid Build Coastguard Worker
353*5e7646d2SAndroid Build Coastguard Worker
354*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
355*5e7646d2SAndroid Build Coastguard Worker return (0);
356*5e7646d2SAndroid Build Coastguard Worker
357*5e7646d2SAndroid Build Coastguard Worker /*
358*5e7646d2SAndroid Build Coastguard Worker * Build an IPP_GET_JOBS or IPP_GET_JOB_ATTRIBUTES request, which requires
359*5e7646d2SAndroid Build Coastguard Worker * the following attributes:
360*5e7646d2SAndroid Build Coastguard Worker *
361*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
362*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
363*5e7646d2SAndroid Build Coastguard Worker * job-uri or printer-uri
364*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
365*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
366*5e7646d2SAndroid Build Coastguard Worker */
367*5e7646d2SAndroid Build Coastguard Worker
368*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS);
369*5e7646d2SAndroid Build Coastguard Worker
370*5e7646d2SAndroid Build Coastguard Worker if (id)
371*5e7646d2SAndroid Build Coastguard Worker {
372*5e7646d2SAndroid Build Coastguard Worker snprintf(resource, sizeof(resource), "ipp://localhost/jobs/%d", id);
373*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
374*5e7646d2SAndroid Build Coastguard Worker NULL, resource);
375*5e7646d2SAndroid Build Coastguard Worker }
376*5e7646d2SAndroid Build Coastguard Worker else if (dest)
377*5e7646d2SAndroid Build Coastguard Worker {
378*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, resource, sizeof(resource), "ipp",
379*5e7646d2SAndroid Build Coastguard Worker NULL, "localhost", 0, "/printers/%s", dest);
380*5e7646d2SAndroid Build Coastguard Worker
381*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
382*5e7646d2SAndroid Build Coastguard Worker NULL, resource);
383*5e7646d2SAndroid Build Coastguard Worker }
384*5e7646d2SAndroid Build Coastguard Worker else
385*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
386*5e7646d2SAndroid Build Coastguard Worker NULL, "ipp://localhost/");
387*5e7646d2SAndroid Build Coastguard Worker
388*5e7646d2SAndroid Build Coastguard Worker if (user)
389*5e7646d2SAndroid Build Coastguard Worker {
390*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
391*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, user);
392*5e7646d2SAndroid Build Coastguard Worker ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
393*5e7646d2SAndroid Build Coastguard Worker }
394*5e7646d2SAndroid Build Coastguard Worker else
395*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
396*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, cupsUser());
397*5e7646d2SAndroid Build Coastguard Worker
398*5e7646d2SAndroid Build Coastguard Worker ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
399*5e7646d2SAndroid Build Coastguard Worker "requested-attributes",
400*5e7646d2SAndroid Build Coastguard Worker (int)(sizeof(jobattrs) / sizeof(jobattrs[0])), NULL, jobattrs);
401*5e7646d2SAndroid Build Coastguard Worker
402*5e7646d2SAndroid Build Coastguard Worker /*
403*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
404*5e7646d2SAndroid Build Coastguard Worker */
405*5e7646d2SAndroid Build Coastguard Worker
406*5e7646d2SAndroid Build Coastguard Worker jobcount = 0;
407*5e7646d2SAndroid Build Coastguard Worker
408*5e7646d2SAndroid Build Coastguard Worker if ((response = cupsDoRequest(http, request, "/")) != NULL)
409*5e7646d2SAndroid Build Coastguard Worker {
410*5e7646d2SAndroid Build Coastguard Worker if (response->request.status.status_code > IPP_OK_CONFLICT)
411*5e7646d2SAndroid Build Coastguard Worker {
412*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
413*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
414*5e7646d2SAndroid Build Coastguard Worker return (0);
415*5e7646d2SAndroid Build Coastguard Worker }
416*5e7646d2SAndroid Build Coastguard Worker
417*5e7646d2SAndroid Build Coastguard Worker rank = 1;
418*5e7646d2SAndroid Build Coastguard Worker
419*5e7646d2SAndroid Build Coastguard Worker /*
420*5e7646d2SAndroid Build Coastguard Worker * Loop through the job list and display them...
421*5e7646d2SAndroid Build Coastguard Worker */
422*5e7646d2SAndroid Build Coastguard Worker
423*5e7646d2SAndroid Build Coastguard Worker for (attr = response->attrs; attr != NULL; attr = attr->next)
424*5e7646d2SAndroid Build Coastguard Worker {
425*5e7646d2SAndroid Build Coastguard Worker /*
426*5e7646d2SAndroid Build Coastguard Worker * Skip leading attributes until we hit a job...
427*5e7646d2SAndroid Build Coastguard Worker */
428*5e7646d2SAndroid Build Coastguard Worker
429*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag != IPP_TAG_JOB)
430*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
431*5e7646d2SAndroid Build Coastguard Worker
432*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
433*5e7646d2SAndroid Build Coastguard Worker break;
434*5e7646d2SAndroid Build Coastguard Worker
435*5e7646d2SAndroid Build Coastguard Worker /*
436*5e7646d2SAndroid Build Coastguard Worker * Pull the needed attributes from this job...
437*5e7646d2SAndroid Build Coastguard Worker */
438*5e7646d2SAndroid Build Coastguard Worker
439*5e7646d2SAndroid Build Coastguard Worker jobid = 0;
440*5e7646d2SAndroid Build Coastguard Worker jobsize = 0;
441*5e7646d2SAndroid Build Coastguard Worker jobstate = IPP_JOB_PENDING;
442*5e7646d2SAndroid Build Coastguard Worker jobname = "unknown";
443*5e7646d2SAndroid Build Coastguard Worker jobuser = "unknown";
444*5e7646d2SAndroid Build Coastguard Worker jobdest = NULL;
445*5e7646d2SAndroid Build Coastguard Worker jobcopies = 1;
446*5e7646d2SAndroid Build Coastguard Worker
447*5e7646d2SAndroid Build Coastguard Worker while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
448*5e7646d2SAndroid Build Coastguard Worker {
449*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "job-id") &&
450*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_INTEGER)
451*5e7646d2SAndroid Build Coastguard Worker jobid = attr->values[0].integer;
452*5e7646d2SAndroid Build Coastguard Worker
453*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "job-k-octets") &&
454*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_INTEGER)
455*5e7646d2SAndroid Build Coastguard Worker jobsize = attr->values[0].integer;
456*5e7646d2SAndroid Build Coastguard Worker
457*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "job-state") &&
458*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_ENUM)
459*5e7646d2SAndroid Build Coastguard Worker jobstate = (ipp_jstate_t)attr->values[0].integer;
460*5e7646d2SAndroid Build Coastguard Worker
461*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "job-printer-uri") &&
462*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_URI)
463*5e7646d2SAndroid Build Coastguard Worker if ((jobdest = strrchr(attr->values[0].string.text, '/')) != NULL)
464*5e7646d2SAndroid Build Coastguard Worker jobdest ++;
465*5e7646d2SAndroid Build Coastguard Worker
466*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "job-originating-user-name") &&
467*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
468*5e7646d2SAndroid Build Coastguard Worker jobuser = attr->values[0].string.text;
469*5e7646d2SAndroid Build Coastguard Worker
470*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "job-name") &&
471*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_NAME)
472*5e7646d2SAndroid Build Coastguard Worker jobname = attr->values[0].string.text;
473*5e7646d2SAndroid Build Coastguard Worker
474*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(attr->name, "copies") &&
475*5e7646d2SAndroid Build Coastguard Worker attr->value_tag == IPP_TAG_INTEGER)
476*5e7646d2SAndroid Build Coastguard Worker jobcopies = attr->values[0].integer;
477*5e7646d2SAndroid Build Coastguard Worker
478*5e7646d2SAndroid Build Coastguard Worker attr = attr->next;
479*5e7646d2SAndroid Build Coastguard Worker }
480*5e7646d2SAndroid Build Coastguard Worker
481*5e7646d2SAndroid Build Coastguard Worker /*
482*5e7646d2SAndroid Build Coastguard Worker * See if we have everything needed...
483*5e7646d2SAndroid Build Coastguard Worker */
484*5e7646d2SAndroid Build Coastguard Worker
485*5e7646d2SAndroid Build Coastguard Worker if (jobdest == NULL || jobid == 0)
486*5e7646d2SAndroid Build Coastguard Worker {
487*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
488*5e7646d2SAndroid Build Coastguard Worker break;
489*5e7646d2SAndroid Build Coastguard Worker else
490*5e7646d2SAndroid Build Coastguard Worker continue;
491*5e7646d2SAndroid Build Coastguard Worker }
492*5e7646d2SAndroid Build Coastguard Worker
493*5e7646d2SAndroid Build Coastguard Worker if (!longstatus && jobcount == 0)
494*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout,
495*5e7646d2SAndroid Build Coastguard Worker _("Rank Owner Job File(s)"
496*5e7646d2SAndroid Build Coastguard Worker " Total Size"));
497*5e7646d2SAndroid Build Coastguard Worker
498*5e7646d2SAndroid Build Coastguard Worker jobcount ++;
499*5e7646d2SAndroid Build Coastguard Worker
500*5e7646d2SAndroid Build Coastguard Worker /*
501*5e7646d2SAndroid Build Coastguard Worker * Display the job...
502*5e7646d2SAndroid Build Coastguard Worker */
503*5e7646d2SAndroid Build Coastguard Worker
504*5e7646d2SAndroid Build Coastguard Worker if (jobstate == IPP_JOB_PROCESSING)
505*5e7646d2SAndroid Build Coastguard Worker strlcpy(rankstr, "active", sizeof(rankstr));
506*5e7646d2SAndroid Build Coastguard Worker else
507*5e7646d2SAndroid Build Coastguard Worker {
508*5e7646d2SAndroid Build Coastguard Worker /*
509*5e7646d2SAndroid Build Coastguard Worker * Make the rank show the "correct" suffix for each number
510*5e7646d2SAndroid Build Coastguard Worker * (11-13 are the only special cases, for English anyways...)
511*5e7646d2SAndroid Build Coastguard Worker */
512*5e7646d2SAndroid Build Coastguard Worker
513*5e7646d2SAndroid Build Coastguard Worker if ((rank % 100) >= 11 && (rank % 100) <= 13)
514*5e7646d2SAndroid Build Coastguard Worker snprintf(rankstr, sizeof(rankstr), "%dth", rank);
515*5e7646d2SAndroid Build Coastguard Worker else
516*5e7646d2SAndroid Build Coastguard Worker snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]);
517*5e7646d2SAndroid Build Coastguard Worker
518*5e7646d2SAndroid Build Coastguard Worker rank ++;
519*5e7646d2SAndroid Build Coastguard Worker }
520*5e7646d2SAndroid Build Coastguard Worker
521*5e7646d2SAndroid Build Coastguard Worker if (longstatus)
522*5e7646d2SAndroid Build Coastguard Worker {
523*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, "\n");
524*5e7646d2SAndroid Build Coastguard Worker
525*5e7646d2SAndroid Build Coastguard Worker if (jobcopies > 1)
526*5e7646d2SAndroid Build Coastguard Worker snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies,
527*5e7646d2SAndroid Build Coastguard Worker jobname);
528*5e7646d2SAndroid Build Coastguard Worker else
529*5e7646d2SAndroid Build Coastguard Worker strlcpy(namestr, jobname, sizeof(namestr));
530*5e7646d2SAndroid Build Coastguard Worker
531*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("%s: %-33.33s [job %d localhost]"),
532*5e7646d2SAndroid Build Coastguard Worker jobuser, rankstr, jobid);
533*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _(" %-39.39s %.0f bytes"),
534*5e7646d2SAndroid Build Coastguard Worker namestr, 1024.0 * jobsize);
535*5e7646d2SAndroid Build Coastguard Worker }
536*5e7646d2SAndroid Build Coastguard Worker else
537*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout,
538*5e7646d2SAndroid Build Coastguard Worker _("%-7s %-7.7s %-7d %-31.31s %.0f bytes"),
539*5e7646d2SAndroid Build Coastguard Worker rankstr, jobuser, jobid, jobname, 1024.0 * jobsize);
540*5e7646d2SAndroid Build Coastguard Worker
541*5e7646d2SAndroid Build Coastguard Worker if (attr == NULL)
542*5e7646d2SAndroid Build Coastguard Worker break;
543*5e7646d2SAndroid Build Coastguard Worker }
544*5e7646d2SAndroid Build Coastguard Worker
545*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
546*5e7646d2SAndroid Build Coastguard Worker }
547*5e7646d2SAndroid Build Coastguard Worker else
548*5e7646d2SAndroid Build Coastguard Worker {
549*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
550*5e7646d2SAndroid Build Coastguard Worker return (0);
551*5e7646d2SAndroid Build Coastguard Worker }
552*5e7646d2SAndroid Build Coastguard Worker
553*5e7646d2SAndroid Build Coastguard Worker if (jobcount == 0)
554*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("no entries"));
555*5e7646d2SAndroid Build Coastguard Worker
556*5e7646d2SAndroid Build Coastguard Worker return (jobcount);
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 * 'show_printer()' - Show printer status.
562*5e7646d2SAndroid Build Coastguard Worker */
563*5e7646d2SAndroid Build Coastguard Worker
564*5e7646d2SAndroid Build Coastguard Worker static void
show_printer(const char * command,http_t * http,const char * dest)565*5e7646d2SAndroid Build Coastguard Worker show_printer(const char *command, /* I - Command name */
566*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - HTTP connection to server */
567*5e7646d2SAndroid Build Coastguard Worker const char *dest) /* I - Destination */
568*5e7646d2SAndroid Build Coastguard Worker {
569*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
570*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP Response */
571*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* Current attribute */
572*5e7646d2SAndroid Build Coastguard Worker ipp_pstate_t state; /* Printer state */
573*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI]; /* Printer URI */
574*5e7646d2SAndroid Build Coastguard Worker
575*5e7646d2SAndroid Build Coastguard Worker
576*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
577*5e7646d2SAndroid Build Coastguard Worker return;
578*5e7646d2SAndroid Build Coastguard Worker
579*5e7646d2SAndroid Build Coastguard Worker /*
580*5e7646d2SAndroid Build Coastguard Worker * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
581*5e7646d2SAndroid Build Coastguard Worker * attributes:
582*5e7646d2SAndroid Build Coastguard Worker *
583*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
584*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
585*5e7646d2SAndroid Build Coastguard Worker * printer-uri
586*5e7646d2SAndroid Build Coastguard Worker */
587*5e7646d2SAndroid Build Coastguard Worker
588*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
589*5e7646d2SAndroid Build Coastguard Worker
590*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
591*5e7646d2SAndroid Build Coastguard Worker "localhost", 0, "/printers/%s", dest);
592*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
593*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
594*5e7646d2SAndroid Build Coastguard Worker
595*5e7646d2SAndroid Build Coastguard Worker /*
596*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
597*5e7646d2SAndroid Build Coastguard Worker */
598*5e7646d2SAndroid Build Coastguard Worker
599*5e7646d2SAndroid Build Coastguard Worker if ((response = cupsDoRequest(http, request, "/")) != NULL)
600*5e7646d2SAndroid Build Coastguard Worker {
601*5e7646d2SAndroid Build Coastguard Worker if (response->request.status.status_code > IPP_OK_CONFLICT)
602*5e7646d2SAndroid Build Coastguard Worker {
603*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
604*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
605*5e7646d2SAndroid Build Coastguard Worker return;
606*5e7646d2SAndroid Build Coastguard Worker }
607*5e7646d2SAndroid Build Coastguard Worker
608*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
609*5e7646d2SAndroid Build Coastguard Worker state = (ipp_pstate_t)attr->values[0].integer;
610*5e7646d2SAndroid Build Coastguard Worker else
611*5e7646d2SAndroid Build Coastguard Worker state = IPP_PRINTER_STOPPED;
612*5e7646d2SAndroid Build Coastguard Worker
613*5e7646d2SAndroid Build Coastguard Worker switch (state)
614*5e7646d2SAndroid Build Coastguard Worker {
615*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_IDLE :
616*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("%s is ready"), dest);
617*5e7646d2SAndroid Build Coastguard Worker break;
618*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_PROCESSING :
619*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("%s is ready and printing"),
620*5e7646d2SAndroid Build Coastguard Worker dest);
621*5e7646d2SAndroid Build Coastguard Worker break;
622*5e7646d2SAndroid Build Coastguard Worker case IPP_PRINTER_STOPPED :
623*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stdout, _("%s is not ready"), dest);
624*5e7646d2SAndroid Build Coastguard Worker break;
625*5e7646d2SAndroid Build Coastguard Worker }
626*5e7646d2SAndroid Build Coastguard Worker
627*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
628*5e7646d2SAndroid Build Coastguard Worker }
629*5e7646d2SAndroid Build Coastguard Worker else
630*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
631*5e7646d2SAndroid Build Coastguard Worker }
632*5e7646d2SAndroid Build Coastguard Worker
633*5e7646d2SAndroid Build Coastguard Worker
634*5e7646d2SAndroid Build Coastguard Worker /*
635*5e7646d2SAndroid Build Coastguard Worker * 'usage()' - Show program usage.
636*5e7646d2SAndroid Build Coastguard Worker */
637*5e7646d2SAndroid Build Coastguard Worker
638*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)639*5e7646d2SAndroid Build Coastguard Worker usage(void)
640*5e7646d2SAndroid Build Coastguard Worker {
641*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("Usage: lpq [options] [+interval]"));
642*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Options:"));
643*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-a Show jobs on all destinations"));
644*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
645*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
646*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-l Show verbose (long) output"));
647*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-P destination Show status for the specified destination"));
648*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication"));
649*5e7646d2SAndroid Build Coastguard Worker
650*5e7646d2SAndroid Build Coastguard Worker exit(1);
651*5e7646d2SAndroid Build Coastguard Worker }
652