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