xref: /aosp_15_r20/external/libcups/berkeley/lpq.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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