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