xref: /aosp_15_r20/external/libcups/systemv/lpinfo.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * "lpinfo" 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 #include <cups/adminutil.h>
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker 
19*5e7646d2SAndroid Build Coastguard Worker /*
20*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
21*5e7646d2SAndroid Build Coastguard Worker  */
22*5e7646d2SAndroid Build Coastguard Worker 
23*5e7646d2SAndroid Build Coastguard Worker static void	device_cb(const char *device_class, const char *device_id,
24*5e7646d2SAndroid Build Coastguard Worker 		          const char *device_info,
25*5e7646d2SAndroid Build Coastguard Worker 			  const char *device_make_and_model,
26*5e7646d2SAndroid Build Coastguard Worker 			  const char *device_uri, const char *device_location,
27*5e7646d2SAndroid Build Coastguard Worker 			  void *user_data);
28*5e7646d2SAndroid Build Coastguard Worker static int	show_devices(int long_status, int timeout,
29*5e7646d2SAndroid Build Coastguard Worker 			     const char *include_schemes,
30*5e7646d2SAndroid Build Coastguard Worker 			     const char *exclude_schemes);
31*5e7646d2SAndroid Build Coastguard Worker static int	show_models(int long_status,
32*5e7646d2SAndroid Build Coastguard Worker 			    const char *device_id, const char *language,
33*5e7646d2SAndroid Build Coastguard Worker 			    const char *make_model, const char *product,
34*5e7646d2SAndroid Build Coastguard Worker 			    const char *include_schemes,
35*5e7646d2SAndroid Build Coastguard Worker 			    const char *exclude_schemes);
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   int		long_status;		/* Long listing? */
49*5e7646d2SAndroid Build Coastguard Worker   const char	*opt,			/* Option pointer */
50*5e7646d2SAndroid Build Coastguard Worker 		*device_id,		/* 1284 device ID */
51*5e7646d2SAndroid Build Coastguard Worker 		*language,		/* Language */
52*5e7646d2SAndroid Build Coastguard Worker 		*make_model,		/* Make and model */
53*5e7646d2SAndroid Build Coastguard Worker 		*product,		/* Product */
54*5e7646d2SAndroid Build Coastguard Worker 		*include_schemes,	/* Schemes to include */
55*5e7646d2SAndroid Build Coastguard Worker 		*exclude_schemes;	/* Schemes to exclude */
56*5e7646d2SAndroid Build Coastguard Worker   int		timeout;		/* Device timeout */
57*5e7646d2SAndroid Build Coastguard Worker 
58*5e7646d2SAndroid Build Coastguard Worker 
59*5e7646d2SAndroid Build Coastguard Worker   _cupsSetLocale(argv);
60*5e7646d2SAndroid Build Coastguard Worker 
61*5e7646d2SAndroid Build Coastguard Worker   long_status     = 0;
62*5e7646d2SAndroid Build Coastguard Worker   device_id       = NULL;
63*5e7646d2SAndroid Build Coastguard Worker   language        = NULL;
64*5e7646d2SAndroid Build Coastguard Worker   make_model      = NULL;
65*5e7646d2SAndroid Build Coastguard Worker   product         = NULL;
66*5e7646d2SAndroid Build Coastguard Worker   include_schemes = CUPS_INCLUDE_ALL;
67*5e7646d2SAndroid Build Coastguard Worker   exclude_schemes = CUPS_EXCLUDE_NONE;
68*5e7646d2SAndroid Build Coastguard Worker   timeout         = CUPS_TIMEOUT_DEFAULT;
69*5e7646d2SAndroid Build Coastguard Worker 
70*5e7646d2SAndroid Build Coastguard Worker   for (i = 1; i < argc; i ++)
71*5e7646d2SAndroid Build Coastguard Worker   {
72*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(argv[i], "--device-id"))
73*5e7646d2SAndroid Build Coastguard Worker     {
74*5e7646d2SAndroid Build Coastguard Worker       i ++;
75*5e7646d2SAndroid Build Coastguard Worker 
76*5e7646d2SAndroid Build Coastguard Worker       if (i < argc)
77*5e7646d2SAndroid Build Coastguard Worker 	device_id = argv[i];
78*5e7646d2SAndroid Build Coastguard Worker       else
79*5e7646d2SAndroid Build Coastguard Worker       {
80*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stderr, _("lpinfo: Expected 1284 device ID string after \"--device-id\"."));
81*5e7646d2SAndroid Build Coastguard Worker 	usage();
82*5e7646d2SAndroid Build Coastguard Worker       }
83*5e7646d2SAndroid Build Coastguard Worker     }
84*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[i], "--device-id=", 12) && argv[i][12])
85*5e7646d2SAndroid Build Coastguard Worker     {
86*5e7646d2SAndroid Build Coastguard Worker       device_id = argv[i] + 12;
87*5e7646d2SAndroid Build Coastguard Worker     }
88*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "--exclude-schemes"))
89*5e7646d2SAndroid Build Coastguard Worker     {
90*5e7646d2SAndroid Build Coastguard Worker       i ++;
91*5e7646d2SAndroid Build Coastguard Worker 
92*5e7646d2SAndroid Build Coastguard Worker       if (i < argc)
93*5e7646d2SAndroid Build Coastguard Worker 	exclude_schemes = argv[i];
94*5e7646d2SAndroid Build Coastguard Worker       else
95*5e7646d2SAndroid Build Coastguard Worker       {
96*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stderr, _("lpinfo: Expected scheme list after \"--exclude-schemes\"."));
97*5e7646d2SAndroid Build Coastguard Worker 	usage();
98*5e7646d2SAndroid Build Coastguard Worker       }
99*5e7646d2SAndroid Build Coastguard Worker     }
100*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[i], "--exclude-schemes=", 18) && argv[i][18])
101*5e7646d2SAndroid Build Coastguard Worker     {
102*5e7646d2SAndroid Build Coastguard Worker       exclude_schemes = argv[i] + 18;
103*5e7646d2SAndroid Build Coastguard Worker     }
104*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "--help"))
105*5e7646d2SAndroid Build Coastguard Worker       usage();
106*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "--include-schemes"))
107*5e7646d2SAndroid Build Coastguard Worker     {
108*5e7646d2SAndroid Build Coastguard Worker       i ++;
109*5e7646d2SAndroid Build Coastguard Worker 
110*5e7646d2SAndroid Build Coastguard Worker       if (i < argc)
111*5e7646d2SAndroid Build Coastguard Worker 	include_schemes = argv[i];
112*5e7646d2SAndroid Build Coastguard Worker       else
113*5e7646d2SAndroid Build Coastguard Worker       {
114*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stderr, _("lpinfo: Expected scheme list after \"--include-schemes\"."));
115*5e7646d2SAndroid Build Coastguard Worker 	usage();
116*5e7646d2SAndroid Build Coastguard Worker       }
117*5e7646d2SAndroid Build Coastguard Worker     }
118*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[i], "--include-schemes=", 18) && argv[i][18])
119*5e7646d2SAndroid Build Coastguard Worker     {
120*5e7646d2SAndroid Build Coastguard Worker       include_schemes = argv[i] + 18;
121*5e7646d2SAndroid Build Coastguard Worker     }
122*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "--language"))
123*5e7646d2SAndroid Build Coastguard Worker     {
124*5e7646d2SAndroid Build Coastguard Worker       i ++;
125*5e7646d2SAndroid Build Coastguard Worker       if (i < argc)
126*5e7646d2SAndroid Build Coastguard Worker 	language = argv[i];
127*5e7646d2SAndroid Build Coastguard Worker       else
128*5e7646d2SAndroid Build Coastguard Worker       {
129*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stderr, _("lpinfo: Expected language after \"--language\"."));
130*5e7646d2SAndroid Build Coastguard Worker 	usage();
131*5e7646d2SAndroid Build Coastguard Worker       }
132*5e7646d2SAndroid Build Coastguard Worker     }
133*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[i], "--language=", 11) && argv[i][11])
134*5e7646d2SAndroid Build Coastguard Worker     {
135*5e7646d2SAndroid Build Coastguard Worker       language = argv[i] + 11;
136*5e7646d2SAndroid Build Coastguard Worker     }
137*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "--make-and-model"))
138*5e7646d2SAndroid Build Coastguard Worker     {
139*5e7646d2SAndroid Build Coastguard Worker       i ++;
140*5e7646d2SAndroid Build Coastguard Worker       if (i < argc)
141*5e7646d2SAndroid Build Coastguard Worker 	make_model= argv[i];
142*5e7646d2SAndroid Build Coastguard Worker       else
143*5e7646d2SAndroid Build Coastguard Worker       {
144*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stderr, _("lpinfo: Expected make and model after \"--make-and-model\"."));
145*5e7646d2SAndroid Build Coastguard Worker 	usage();
146*5e7646d2SAndroid Build Coastguard Worker       }
147*5e7646d2SAndroid Build Coastguard Worker     }
148*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[i], "--make-and-model=", 17) && argv[i][17])
149*5e7646d2SAndroid Build Coastguard Worker     {
150*5e7646d2SAndroid Build Coastguard Worker       make_model = argv[i] + 17;
151*5e7646d2SAndroid Build Coastguard Worker     }
152*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "--product"))
153*5e7646d2SAndroid Build Coastguard Worker     {
154*5e7646d2SAndroid Build Coastguard Worker       i ++;
155*5e7646d2SAndroid Build Coastguard Worker       if (i < argc)
156*5e7646d2SAndroid Build Coastguard Worker 	product = argv[i];
157*5e7646d2SAndroid Build Coastguard Worker       else
158*5e7646d2SAndroid Build Coastguard Worker       {
159*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stderr, _("lpinfo: Expected product string after \"--product\"."));
160*5e7646d2SAndroid Build Coastguard Worker 	usage();
161*5e7646d2SAndroid Build Coastguard Worker       }
162*5e7646d2SAndroid Build Coastguard Worker     }
163*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[i], "--product=", 10) && argv[i][10])
164*5e7646d2SAndroid Build Coastguard Worker     {
165*5e7646d2SAndroid Build Coastguard Worker       product = argv[i] + 10;
166*5e7646d2SAndroid Build Coastguard Worker     }
167*5e7646d2SAndroid Build Coastguard Worker     else if (!strcmp(argv[i], "--timeout"))
168*5e7646d2SAndroid Build Coastguard Worker     {
169*5e7646d2SAndroid Build Coastguard Worker       i ++;
170*5e7646d2SAndroid Build Coastguard Worker       if (i < argc)
171*5e7646d2SAndroid Build Coastguard Worker 	timeout = atoi(argv[i]);
172*5e7646d2SAndroid Build Coastguard Worker       else
173*5e7646d2SAndroid Build Coastguard Worker       {
174*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stderr, _("lpinfo: Expected timeout after \"--timeout\"."));
175*5e7646d2SAndroid Build Coastguard Worker 	usage();
176*5e7646d2SAndroid Build Coastguard Worker       }
177*5e7646d2SAndroid Build Coastguard Worker     }
178*5e7646d2SAndroid Build Coastguard Worker     else if (!strncmp(argv[i], "--timeout=", 10) && argv[i][10])
179*5e7646d2SAndroid Build Coastguard Worker     {
180*5e7646d2SAndroid Build Coastguard Worker       timeout = atoi(argv[i] + 10);
181*5e7646d2SAndroid Build Coastguard Worker     }
182*5e7646d2SAndroid Build Coastguard Worker     else if (argv[i][0] == '-')
183*5e7646d2SAndroid Build Coastguard Worker     {
184*5e7646d2SAndroid Build Coastguard Worker       for (opt = argv[i] + 1; *opt; opt ++)
185*5e7646d2SAndroid Build Coastguard Worker       {
186*5e7646d2SAndroid Build Coastguard Worker 	switch (*opt)
187*5e7646d2SAndroid Build Coastguard Worker 	{
188*5e7646d2SAndroid Build Coastguard Worker 	  case 'E' : /* Encrypt */
189*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
190*5e7646d2SAndroid Build Coastguard Worker 	      cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
191*5e7646d2SAndroid Build Coastguard Worker #else
192*5e7646d2SAndroid Build Coastguard Worker 	      _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
193*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
194*5e7646d2SAndroid Build Coastguard Worker 	      break;
195*5e7646d2SAndroid Build Coastguard Worker 
196*5e7646d2SAndroid Build Coastguard Worker 	  case 'h' : /* Connect to host */
197*5e7646d2SAndroid Build Coastguard Worker 	      if (opt[1] != '\0')
198*5e7646d2SAndroid Build Coastguard Worker 	      {
199*5e7646d2SAndroid Build Coastguard Worker 		cupsSetServer(opt + 1);
200*5e7646d2SAndroid Build Coastguard Worker 		opt += strlen(opt) - 1;
201*5e7646d2SAndroid Build Coastguard Worker 	      }
202*5e7646d2SAndroid Build Coastguard Worker 	      else
203*5e7646d2SAndroid Build Coastguard Worker 	      {
204*5e7646d2SAndroid Build Coastguard Worker 		i ++;
205*5e7646d2SAndroid Build Coastguard Worker 
206*5e7646d2SAndroid Build Coastguard Worker 		if (i >= argc)
207*5e7646d2SAndroid Build Coastguard Worker 		{
208*5e7646d2SAndroid Build Coastguard Worker 		  _cupsLangPuts(stderr, _("Error: need hostname after \"-h\" option."));
209*5e7646d2SAndroid Build Coastguard Worker 		  usage();
210*5e7646d2SAndroid Build Coastguard Worker 		}
211*5e7646d2SAndroid Build Coastguard Worker 
212*5e7646d2SAndroid Build Coastguard Worker 		cupsSetServer(argv[i]);
213*5e7646d2SAndroid Build Coastguard Worker 	      }
214*5e7646d2SAndroid Build Coastguard Worker 	      break;
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker 	  case 'l' : /* Show long listing */
217*5e7646d2SAndroid Build Coastguard Worker 	      long_status = 1;
218*5e7646d2SAndroid Build Coastguard Worker 	      break;
219*5e7646d2SAndroid Build Coastguard Worker 
220*5e7646d2SAndroid Build Coastguard Worker 	  case 'm' : /* Show models */
221*5e7646d2SAndroid Build Coastguard Worker 	      if (show_models(long_status, device_id, language, make_model, product, include_schemes, exclude_schemes))
222*5e7646d2SAndroid Build Coastguard Worker 		return (1);
223*5e7646d2SAndroid Build Coastguard Worker 	      break;
224*5e7646d2SAndroid Build Coastguard Worker 
225*5e7646d2SAndroid Build Coastguard Worker 	  case 'v' : /* Show available devices */
226*5e7646d2SAndroid Build Coastguard Worker 	      if (show_devices(long_status, timeout, include_schemes, exclude_schemes))
227*5e7646d2SAndroid Build Coastguard Worker 		return (1);
228*5e7646d2SAndroid Build Coastguard Worker 	      break;
229*5e7646d2SAndroid Build Coastguard Worker 
230*5e7646d2SAndroid Build Coastguard Worker 	  default :
231*5e7646d2SAndroid Build Coastguard Worker 	      _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), argv[0], *opt);
232*5e7646d2SAndroid Build Coastguard Worker 	      usage();
233*5e7646d2SAndroid Build Coastguard Worker 	}
234*5e7646d2SAndroid Build Coastguard Worker       }
235*5e7646d2SAndroid Build Coastguard Worker     }
236*5e7646d2SAndroid Build Coastguard Worker     else
237*5e7646d2SAndroid Build Coastguard Worker     {
238*5e7646d2SAndroid Build Coastguard Worker       _cupsLangPrintf(stderr, _("%s: Unknown argument \"%s\"."), argv[0], argv[i]);
239*5e7646d2SAndroid Build Coastguard Worker       usage();
240*5e7646d2SAndroid Build Coastguard Worker     }
241*5e7646d2SAndroid Build Coastguard Worker   }
242*5e7646d2SAndroid Build Coastguard Worker 
243*5e7646d2SAndroid Build Coastguard Worker   return (0);
244*5e7646d2SAndroid Build Coastguard Worker }
245*5e7646d2SAndroid Build Coastguard Worker 
246*5e7646d2SAndroid Build Coastguard Worker 
247*5e7646d2SAndroid Build Coastguard Worker /*
248*5e7646d2SAndroid Build Coastguard Worker  * 'device_cb()' - Device callback.
249*5e7646d2SAndroid Build Coastguard Worker  */
250*5e7646d2SAndroid Build Coastguard Worker 
251*5e7646d2SAndroid Build Coastguard Worker static void
device_cb(const char * device_class,const char * device_id,const char * device_info,const char * device_make_and_model,const char * device_uri,const char * device_location,void * user_data)252*5e7646d2SAndroid Build Coastguard Worker device_cb(
253*5e7646d2SAndroid Build Coastguard Worker     const char *device_class,		/* I - device-class string */
254*5e7646d2SAndroid Build Coastguard Worker     const char *device_id,		/* I - device-id string */
255*5e7646d2SAndroid Build Coastguard Worker     const char *device_info,		/* I - device-info string */
256*5e7646d2SAndroid Build Coastguard Worker     const char *device_make_and_model,	/* I - device-make-and-model string */
257*5e7646d2SAndroid Build Coastguard Worker     const char *device_uri,		/* I - device-uri string */
258*5e7646d2SAndroid Build Coastguard Worker     const char *device_location,	/* I - device-location string */
259*5e7646d2SAndroid Build Coastguard Worker     void       *user_data)		/* I - User data */
260*5e7646d2SAndroid Build Coastguard Worker {
261*5e7646d2SAndroid Build Coastguard Worker   int	*long_status;			/* Show verbose info? */
262*5e7646d2SAndroid Build Coastguard Worker 
263*5e7646d2SAndroid Build Coastguard Worker 
264*5e7646d2SAndroid Build Coastguard Worker  /*
265*5e7646d2SAndroid Build Coastguard Worker   * Display the device...
266*5e7646d2SAndroid Build Coastguard Worker   */
267*5e7646d2SAndroid Build Coastguard Worker 
268*5e7646d2SAndroid Build Coastguard Worker   long_status = (int *)user_data;
269*5e7646d2SAndroid Build Coastguard Worker 
270*5e7646d2SAndroid Build Coastguard Worker   if (*long_status)
271*5e7646d2SAndroid Build Coastguard Worker   {
272*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stdout,
273*5e7646d2SAndroid Build Coastguard Worker 		    _("Device: uri = %s\n"
274*5e7646d2SAndroid Build Coastguard Worker 		      "        class = %s\n"
275*5e7646d2SAndroid Build Coastguard Worker 		      "        info = %s\n"
276*5e7646d2SAndroid Build Coastguard Worker 		      "        make-and-model = %s\n"
277*5e7646d2SAndroid Build Coastguard Worker 		      "        device-id = %s\n"
278*5e7646d2SAndroid Build Coastguard Worker 		      "        location = %s"),
279*5e7646d2SAndroid Build Coastguard Worker 		    device_uri, device_class, device_info,
280*5e7646d2SAndroid Build Coastguard Worker 		    device_make_and_model, device_id, device_location);
281*5e7646d2SAndroid Build Coastguard Worker   }
282*5e7646d2SAndroid Build Coastguard Worker   else
283*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stdout, "%s %s", device_class, device_uri);
284*5e7646d2SAndroid Build Coastguard Worker }
285*5e7646d2SAndroid Build Coastguard Worker 
286*5e7646d2SAndroid Build Coastguard Worker 
287*5e7646d2SAndroid Build Coastguard Worker /*
288*5e7646d2SAndroid Build Coastguard Worker  * 'show_devices()' - Show available devices.
289*5e7646d2SAndroid Build Coastguard Worker  */
290*5e7646d2SAndroid Build Coastguard Worker 
291*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 0 on success, 1 on failure */
show_devices(int long_status,int timeout,const char * include_schemes,const char * exclude_schemes)292*5e7646d2SAndroid Build Coastguard Worker show_devices(
293*5e7646d2SAndroid Build Coastguard Worker     int        long_status,		/* I - Long status report? */
294*5e7646d2SAndroid Build Coastguard Worker     int        timeout,			/* I - Timeout */
295*5e7646d2SAndroid Build Coastguard Worker     const char *include_schemes,	/* I - List of schemes to include */
296*5e7646d2SAndroid Build Coastguard Worker     const char *exclude_schemes)	/* I - List of schemes to exclude */
297*5e7646d2SAndroid Build Coastguard Worker {
298*5e7646d2SAndroid Build Coastguard Worker   if (cupsGetDevices(CUPS_HTTP_DEFAULT, timeout, include_schemes,
299*5e7646d2SAndroid Build Coastguard Worker                      exclude_schemes, device_cb, &long_status) != IPP_OK)
300*5e7646d2SAndroid Build Coastguard Worker   {
301*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stderr, "lpinfo: %s", cupsLastErrorString());
302*5e7646d2SAndroid Build Coastguard Worker     return (1);
303*5e7646d2SAndroid Build Coastguard Worker   }
304*5e7646d2SAndroid Build Coastguard Worker 
305*5e7646d2SAndroid Build Coastguard Worker   return (0);
306*5e7646d2SAndroid Build Coastguard Worker }
307*5e7646d2SAndroid Build Coastguard Worker 
308*5e7646d2SAndroid Build Coastguard Worker 
309*5e7646d2SAndroid Build Coastguard Worker /*
310*5e7646d2SAndroid Build Coastguard Worker  * 'show_models()' - Show available PPDs.
311*5e7646d2SAndroid Build Coastguard Worker  */
312*5e7646d2SAndroid Build Coastguard Worker 
313*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 0 on success, 1 on failure */
show_models(int long_status,const char * device_id,const char * language,const char * make_model,const char * product,const char * include_schemes,const char * exclude_schemes)314*5e7646d2SAndroid Build Coastguard Worker show_models(
315*5e7646d2SAndroid Build Coastguard Worker     int        long_status,		/* I - Long status report? */
316*5e7646d2SAndroid Build Coastguard Worker     const char *device_id,		/* I - 1284 device ID */
317*5e7646d2SAndroid Build Coastguard Worker     const char *language,		/* I - Language */
318*5e7646d2SAndroid Build Coastguard Worker     const char *make_model,		/* I - Make and model */
319*5e7646d2SAndroid Build Coastguard Worker     const char *product,		/* I - Product */
320*5e7646d2SAndroid Build Coastguard Worker     const char *include_schemes,	/* I - List of schemes to include */
321*5e7646d2SAndroid Build Coastguard Worker     const char *exclude_schemes)	/* I - List of schemes to exclude */
322*5e7646d2SAndroid Build Coastguard Worker {
323*5e7646d2SAndroid Build Coastguard Worker   ipp_t		*request,		/* IPP Request */
324*5e7646d2SAndroid Build Coastguard Worker 		*response;		/* IPP Response */
325*5e7646d2SAndroid Build Coastguard Worker   ipp_attribute_t *attr;		/* Current attribute */
326*5e7646d2SAndroid Build Coastguard Worker   const char	*ppd_device_id,		/* Pointer to ppd-device-id */
327*5e7646d2SAndroid Build Coastguard Worker 		*ppd_language,		/* Pointer to ppd-natural-language */
328*5e7646d2SAndroid Build Coastguard Worker 		*ppd_make_model,	/* Pointer to ppd-make-and-model */
329*5e7646d2SAndroid Build Coastguard Worker 		*ppd_name;		/* Pointer to ppd-name */
330*5e7646d2SAndroid Build Coastguard Worker   cups_option_t	option;			/* in/exclude-schemes option */
331*5e7646d2SAndroid Build Coastguard Worker 
332*5e7646d2SAndroid Build Coastguard Worker 
333*5e7646d2SAndroid Build Coastguard Worker  /*
334*5e7646d2SAndroid Build Coastguard Worker   * Build a CUPS_GET_PPDS request...
335*5e7646d2SAndroid Build Coastguard Worker   */
336*5e7646d2SAndroid Build Coastguard Worker 
337*5e7646d2SAndroid Build Coastguard Worker   request = ippNewRequest(CUPS_GET_PPDS);
338*5e7646d2SAndroid Build Coastguard Worker 
339*5e7646d2SAndroid Build Coastguard Worker   if (device_id)
340*5e7646d2SAndroid Build Coastguard Worker     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-device-id",
341*5e7646d2SAndroid Build Coastguard Worker                  NULL, device_id);
342*5e7646d2SAndroid Build Coastguard Worker   if (language)
343*5e7646d2SAndroid Build Coastguard Worker     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "ppd-language",
344*5e7646d2SAndroid Build Coastguard Worker                  NULL, language);
345*5e7646d2SAndroid Build Coastguard Worker   if (make_model)
346*5e7646d2SAndroid Build Coastguard Worker     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-make-and-model",
347*5e7646d2SAndroid Build Coastguard Worker                  NULL, make_model);
348*5e7646d2SAndroid Build Coastguard Worker   if (product)
349*5e7646d2SAndroid Build Coastguard Worker     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-product",
350*5e7646d2SAndroid Build Coastguard Worker                  NULL, product);
351*5e7646d2SAndroid Build Coastguard Worker 
352*5e7646d2SAndroid Build Coastguard Worker   if (include_schemes)
353*5e7646d2SAndroid Build Coastguard Worker   {
354*5e7646d2SAndroid Build Coastguard Worker     option.name  = "include-schemes";
355*5e7646d2SAndroid Build Coastguard Worker     option.value = (char *)include_schemes;
356*5e7646d2SAndroid Build Coastguard Worker 
357*5e7646d2SAndroid Build Coastguard Worker     cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION);
358*5e7646d2SAndroid Build Coastguard Worker   }
359*5e7646d2SAndroid Build Coastguard Worker 
360*5e7646d2SAndroid Build Coastguard Worker   if (exclude_schemes)
361*5e7646d2SAndroid Build Coastguard Worker   {
362*5e7646d2SAndroid Build Coastguard Worker     option.name  = "exclude-schemes";
363*5e7646d2SAndroid Build Coastguard Worker     option.value = (char *)exclude_schemes;
364*5e7646d2SAndroid Build Coastguard Worker 
365*5e7646d2SAndroid Build Coastguard Worker     cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION);
366*5e7646d2SAndroid Build Coastguard Worker   }
367*5e7646d2SAndroid Build Coastguard Worker 
368*5e7646d2SAndroid Build Coastguard Worker  /*
369*5e7646d2SAndroid Build Coastguard Worker   * Do the request and get back a response...
370*5e7646d2SAndroid Build Coastguard Worker   */
371*5e7646d2SAndroid Build Coastguard Worker 
372*5e7646d2SAndroid Build Coastguard Worker   if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL)
373*5e7646d2SAndroid Build Coastguard Worker   {
374*5e7646d2SAndroid Build Coastguard Worker    /*
375*5e7646d2SAndroid Build Coastguard Worker     * Loop through the device list and display them...
376*5e7646d2SAndroid Build Coastguard Worker     */
377*5e7646d2SAndroid Build Coastguard Worker 
378*5e7646d2SAndroid Build Coastguard Worker     if (response->request.status.status_code > IPP_OK_CONFLICT)
379*5e7646d2SAndroid Build Coastguard Worker     {
380*5e7646d2SAndroid Build Coastguard Worker       _cupsLangPrintf(stderr, "lpinfo: %s", cupsLastErrorString());
381*5e7646d2SAndroid Build Coastguard Worker       ippDelete(response);
382*5e7646d2SAndroid Build Coastguard Worker       return (1);
383*5e7646d2SAndroid Build Coastguard Worker     }
384*5e7646d2SAndroid Build Coastguard Worker 
385*5e7646d2SAndroid Build Coastguard Worker     for (attr = response->attrs; attr != NULL; attr = attr->next)
386*5e7646d2SAndroid Build Coastguard Worker     {
387*5e7646d2SAndroid Build Coastguard Worker      /*
388*5e7646d2SAndroid Build Coastguard Worker       * Skip leading attributes until we hit a PPD...
389*5e7646d2SAndroid Build Coastguard Worker       */
390*5e7646d2SAndroid Build Coastguard Worker 
391*5e7646d2SAndroid Build Coastguard Worker       while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
392*5e7646d2SAndroid Build Coastguard Worker         attr = attr->next;
393*5e7646d2SAndroid Build Coastguard Worker 
394*5e7646d2SAndroid Build Coastguard Worker       if (attr == NULL)
395*5e7646d2SAndroid Build Coastguard Worker         break;
396*5e7646d2SAndroid Build Coastguard Worker 
397*5e7646d2SAndroid Build Coastguard Worker      /*
398*5e7646d2SAndroid Build Coastguard Worker       * Pull the needed attributes from this PPD...
399*5e7646d2SAndroid Build Coastguard Worker       */
400*5e7646d2SAndroid Build Coastguard Worker 
401*5e7646d2SAndroid Build Coastguard Worker       ppd_device_id  = "NONE";
402*5e7646d2SAndroid Build Coastguard Worker       ppd_language   = NULL;
403*5e7646d2SAndroid Build Coastguard Worker       ppd_make_model = NULL;
404*5e7646d2SAndroid Build Coastguard Worker       ppd_name       = NULL;
405*5e7646d2SAndroid Build Coastguard Worker 
406*5e7646d2SAndroid Build Coastguard Worker       while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
407*5e7646d2SAndroid Build Coastguard Worker       {
408*5e7646d2SAndroid Build Coastguard Worker         if (!strcmp(attr->name, "ppd-device-id") &&
409*5e7646d2SAndroid Build Coastguard Worker 	    attr->value_tag == IPP_TAG_TEXT)
410*5e7646d2SAndroid Build Coastguard Worker 	  ppd_device_id = attr->values[0].string.text;
411*5e7646d2SAndroid Build Coastguard Worker         else if (!strcmp(attr->name, "ppd-natural-language") &&
412*5e7646d2SAndroid Build Coastguard Worker 	         attr->value_tag == IPP_TAG_LANGUAGE)
413*5e7646d2SAndroid Build Coastguard Worker 	  ppd_language = attr->values[0].string.text;
414*5e7646d2SAndroid Build Coastguard Worker         else if (!strcmp(attr->name, "ppd-make-and-model") &&
415*5e7646d2SAndroid Build Coastguard Worker 	         attr->value_tag == IPP_TAG_TEXT)
416*5e7646d2SAndroid Build Coastguard Worker 	  ppd_make_model = attr->values[0].string.text;
417*5e7646d2SAndroid Build Coastguard Worker         else if (!strcmp(attr->name, "ppd-name") &&
418*5e7646d2SAndroid Build Coastguard Worker 	         attr->value_tag == IPP_TAG_NAME)
419*5e7646d2SAndroid Build Coastguard Worker 	  ppd_name = attr->values[0].string.text;
420*5e7646d2SAndroid Build Coastguard Worker 
421*5e7646d2SAndroid Build Coastguard Worker         attr = attr->next;
422*5e7646d2SAndroid Build Coastguard Worker       }
423*5e7646d2SAndroid Build Coastguard Worker 
424*5e7646d2SAndroid Build Coastguard Worker      /*
425*5e7646d2SAndroid Build Coastguard Worker       * See if we have everything needed...
426*5e7646d2SAndroid Build Coastguard Worker       */
427*5e7646d2SAndroid Build Coastguard Worker 
428*5e7646d2SAndroid Build Coastguard Worker       if (ppd_language == NULL || ppd_make_model == NULL || ppd_name == NULL)
429*5e7646d2SAndroid Build Coastguard Worker       {
430*5e7646d2SAndroid Build Coastguard Worker         if (attr == NULL)
431*5e7646d2SAndroid Build Coastguard Worker 	  break;
432*5e7646d2SAndroid Build Coastguard Worker 	else
433*5e7646d2SAndroid Build Coastguard Worker           continue;
434*5e7646d2SAndroid Build Coastguard Worker       }
435*5e7646d2SAndroid Build Coastguard Worker 
436*5e7646d2SAndroid Build Coastguard Worker      /*
437*5e7646d2SAndroid Build Coastguard Worker       * Display the device...
438*5e7646d2SAndroid Build Coastguard Worker       */
439*5e7646d2SAndroid Build Coastguard Worker 
440*5e7646d2SAndroid Build Coastguard Worker       if (long_status)
441*5e7646d2SAndroid Build Coastguard Worker       {
442*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPrintf(stdout,
443*5e7646d2SAndroid Build Coastguard Worker 	                _("Model:  name = %s\n"
444*5e7646d2SAndroid Build Coastguard Worker 			  "        natural_language = %s\n"
445*5e7646d2SAndroid Build Coastguard Worker 			  "        make-and-model = %s\n"
446*5e7646d2SAndroid Build Coastguard Worker 			  "        device-id = %s"),
447*5e7646d2SAndroid Build Coastguard Worker 			ppd_name, ppd_language, ppd_make_model, ppd_device_id);
448*5e7646d2SAndroid Build Coastguard Worker       }
449*5e7646d2SAndroid Build Coastguard Worker       else
450*5e7646d2SAndroid Build Coastguard Worker         _cupsLangPrintf(stdout, "%s %s", ppd_name, ppd_make_model);
451*5e7646d2SAndroid Build Coastguard Worker 
452*5e7646d2SAndroid Build Coastguard Worker       if (attr == NULL)
453*5e7646d2SAndroid Build Coastguard Worker         break;
454*5e7646d2SAndroid Build Coastguard Worker     }
455*5e7646d2SAndroid Build Coastguard Worker 
456*5e7646d2SAndroid Build Coastguard Worker     ippDelete(response);
457*5e7646d2SAndroid Build Coastguard Worker 
458*5e7646d2SAndroid Build Coastguard Worker    /*
459*5e7646d2SAndroid Build Coastguard Worker     * Show the "everywhere" model, which is handled by the lpadmin command...
460*5e7646d2SAndroid Build Coastguard Worker     */
461*5e7646d2SAndroid Build Coastguard Worker 
462*5e7646d2SAndroid Build Coastguard Worker     if ((!include_schemes || strstr(include_schemes, "everywhere")) && (!exclude_schemes || !strstr(exclude_schemes, "everywhere")))
463*5e7646d2SAndroid Build Coastguard Worker     {
464*5e7646d2SAndroid Build Coastguard Worker       if (long_status)
465*5e7646d2SAndroid Build Coastguard Worker       {
466*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPrintf(stdout,
467*5e7646d2SAndroid Build Coastguard Worker 	                _("Model:  name = %s\n"
468*5e7646d2SAndroid Build Coastguard Worker 			  "        natural_language = %s\n"
469*5e7646d2SAndroid Build Coastguard Worker 			  "        make-and-model = %s\n"
470*5e7646d2SAndroid Build Coastguard Worker 			  "        device-id = %s"),
471*5e7646d2SAndroid Build Coastguard Worker 			"everywhere", cupsLangDefault()->language, "IPP Everywhere™", "CMD:PwgRaster");
472*5e7646d2SAndroid Build Coastguard Worker       }
473*5e7646d2SAndroid Build Coastguard Worker       else
474*5e7646d2SAndroid Build Coastguard Worker         _cupsLangPuts(stdout, "everywhere IPP Everywhere");
475*5e7646d2SAndroid Build Coastguard Worker     }
476*5e7646d2SAndroid Build Coastguard Worker   }
477*5e7646d2SAndroid Build Coastguard Worker   else
478*5e7646d2SAndroid Build Coastguard Worker   {
479*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stderr, "lpinfo: %s", cupsLastErrorString());
480*5e7646d2SAndroid Build Coastguard Worker 
481*5e7646d2SAndroid Build Coastguard Worker     return (1);
482*5e7646d2SAndroid Build Coastguard Worker   }
483*5e7646d2SAndroid Build Coastguard Worker 
484*5e7646d2SAndroid Build Coastguard Worker   return (0);
485*5e7646d2SAndroid Build Coastguard Worker }
486*5e7646d2SAndroid Build Coastguard Worker 
487*5e7646d2SAndroid Build Coastguard Worker 
488*5e7646d2SAndroid Build Coastguard Worker /*
489*5e7646d2SAndroid Build Coastguard Worker  * 'usage()' - Show program usage and exit.
490*5e7646d2SAndroid Build Coastguard Worker  */
491*5e7646d2SAndroid Build Coastguard Worker 
492*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)493*5e7646d2SAndroid Build Coastguard Worker usage(void)
494*5e7646d2SAndroid Build Coastguard Worker {
495*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Usage: lpinfo [options] -m\n"
496*5e7646d2SAndroid Build Coastguard Worker                           "       lpinfo [options] -v"));
497*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Options:"));
498*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-E                      Encrypt the connection to the server"));
499*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-h server[:port]        Connect to the named server and port"));
500*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-l                      Show verbose (long) output"));
501*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-m                      Show models"));
502*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-U username             Specify the username to use for authentication"));
503*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-v                      Show devices"));
504*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("--device-id device-id   Show models matching the given IEEE 1284 device ID"));
505*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("--exclude-schemes scheme-list\n"
506*5e7646d2SAndroid Build Coastguard Worker                           "                        Exclude the specified URI schemes"));
507*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("--include-schemes scheme-list\n"
508*5e7646d2SAndroid Build Coastguard Worker                           "                        Include only the specified URI schemes"));
509*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("--language locale       Show models matching the given locale"));
510*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("--make-and-model name   Show models matching the given make and model name"));
511*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("--product name          Show models matching the given PostScript product"));
512*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("--timeout seconds       Specify the maximum number of seconds to discover devices"));
513*5e7646d2SAndroid Build Coastguard Worker 
514*5e7646d2SAndroid Build Coastguard Worker   exit(1);
515*5e7646d2SAndroid Build Coastguard Worker }
516