1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * CUPS API test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007 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 information.
8*5e7646d2SAndroid Build Coastguard Worker */
9*5e7646d2SAndroid Build Coastguard Worker
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker */
13*5e7646d2SAndroid Build Coastguard Worker
14*5e7646d2SAndroid Build Coastguard Worker #undef _CUPS_NO_DEPRECATED
15*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
16*5e7646d2SAndroid Build Coastguard Worker #include "ppd.h"
17*5e7646d2SAndroid Build Coastguard Worker #include <stdlib.h>
18*5e7646d2SAndroid Build Coastguard Worker
19*5e7646d2SAndroid Build Coastguard Worker
20*5e7646d2SAndroid Build Coastguard Worker /*
21*5e7646d2SAndroid Build Coastguard Worker * Local functions...
22*5e7646d2SAndroid Build Coastguard Worker */
23*5e7646d2SAndroid Build Coastguard Worker
24*5e7646d2SAndroid Build Coastguard Worker static int dests_equal(cups_dest_t *a, cups_dest_t *b);
25*5e7646d2SAndroid Build Coastguard Worker static int enum_cb(void *user_data, unsigned flags, cups_dest_t *dest);
26*5e7646d2SAndroid Build Coastguard Worker static void show_diffs(cups_dest_t *a, cups_dest_t *b);
27*5e7646d2SAndroid Build Coastguard Worker
28*5e7646d2SAndroid Build Coastguard Worker
29*5e7646d2SAndroid Build Coastguard Worker /*
30*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Main entry.
31*5e7646d2SAndroid Build Coastguard Worker */
32*5e7646d2SAndroid Build Coastguard Worker
33*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])34*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
35*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
36*5e7646d2SAndroid Build Coastguard Worker {
37*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* First HTTP connection */
38*5e7646d2SAndroid Build Coastguard Worker *http2; /* Second HTTP connection */
39*5e7646d2SAndroid Build Coastguard Worker int status = 0, /* Exit status */
40*5e7646d2SAndroid Build Coastguard Worker i, /* Looping var */
41*5e7646d2SAndroid Build Coastguard Worker num_dests; /* Number of destinations */
42*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests, /* Destinations */
43*5e7646d2SAndroid Build Coastguard Worker *dest, /* Current destination */
44*5e7646d2SAndroid Build Coastguard Worker *named_dest; /* Current named destination */
45*5e7646d2SAndroid Build Coastguard Worker const char *dest_name, /* Destination name */
46*5e7646d2SAndroid Build Coastguard Worker *dval, /* Destination value */
47*5e7646d2SAndroid Build Coastguard Worker *ppdfile; /* PPD file */
48*5e7646d2SAndroid Build Coastguard Worker ppd_file_t *ppd; /* PPD file data */
49*5e7646d2SAndroid Build Coastguard Worker int num_jobs; /* Number of jobs for queue */
50*5e7646d2SAndroid Build Coastguard Worker cups_job_t *jobs; /* Jobs for queue */
51*5e7646d2SAndroid Build Coastguard Worker
52*5e7646d2SAndroid Build Coastguard Worker
53*5e7646d2SAndroid Build Coastguard Worker if (argc > 1)
54*5e7646d2SAndroid Build Coastguard Worker {
55*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[1], "enum"))
56*5e7646d2SAndroid Build Coastguard Worker {
57*5e7646d2SAndroid Build Coastguard Worker cups_ptype_t mask = CUPS_PRINTER_LOCAL,
58*5e7646d2SAndroid Build Coastguard Worker /* Printer type mask */
59*5e7646d2SAndroid Build Coastguard Worker type = CUPS_PRINTER_LOCAL;
60*5e7646d2SAndroid Build Coastguard Worker /* Printer type */
61*5e7646d2SAndroid Build Coastguard Worker int msec = 0; /* Timeout in milliseconds */
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker
64*5e7646d2SAndroid Build Coastguard Worker for (i = 2; i < argc; i ++)
65*5e7646d2SAndroid Build Coastguard Worker if (isdigit(argv[i][0] & 255) || argv[i][0] == '.')
66*5e7646d2SAndroid Build Coastguard Worker msec = (int)(atof(argv[i]) * 1000);
67*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "bw"))
68*5e7646d2SAndroid Build Coastguard Worker {
69*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_BW;
70*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_BW;
71*5e7646d2SAndroid Build Coastguard Worker }
72*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "color"))
73*5e7646d2SAndroid Build Coastguard Worker {
74*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_COLOR;
75*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_COLOR;
76*5e7646d2SAndroid Build Coastguard Worker }
77*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "mono"))
78*5e7646d2SAndroid Build Coastguard Worker {
79*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_COLOR;
80*5e7646d2SAndroid Build Coastguard Worker }
81*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "duplex"))
82*5e7646d2SAndroid Build Coastguard Worker {
83*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_DUPLEX;
84*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_DUPLEX;
85*5e7646d2SAndroid Build Coastguard Worker }
86*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "simplex"))
87*5e7646d2SAndroid Build Coastguard Worker {
88*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_DUPLEX;
89*5e7646d2SAndroid Build Coastguard Worker }
90*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "staple"))
91*5e7646d2SAndroid Build Coastguard Worker {
92*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_STAPLE;
93*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_STAPLE;
94*5e7646d2SAndroid Build Coastguard Worker }
95*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "copies"))
96*5e7646d2SAndroid Build Coastguard Worker {
97*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_COPIES;
98*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_COPIES;
99*5e7646d2SAndroid Build Coastguard Worker }
100*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "collate"))
101*5e7646d2SAndroid Build Coastguard Worker {
102*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_COLLATE;
103*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_COLLATE;
104*5e7646d2SAndroid Build Coastguard Worker }
105*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "punch"))
106*5e7646d2SAndroid Build Coastguard Worker {
107*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_PUNCH;
108*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_PUNCH;
109*5e7646d2SAndroid Build Coastguard Worker }
110*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "cover"))
111*5e7646d2SAndroid Build Coastguard Worker {
112*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_COVER;
113*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_COVER;
114*5e7646d2SAndroid Build Coastguard Worker }
115*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "bind"))
116*5e7646d2SAndroid Build Coastguard Worker {
117*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_BIND;
118*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_BIND;
119*5e7646d2SAndroid Build Coastguard Worker }
120*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "sort"))
121*5e7646d2SAndroid Build Coastguard Worker {
122*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_SORT;
123*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_SORT;
124*5e7646d2SAndroid Build Coastguard Worker }
125*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "mfp"))
126*5e7646d2SAndroid Build Coastguard Worker {
127*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_MFP;
128*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_MFP;
129*5e7646d2SAndroid Build Coastguard Worker }
130*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "printer"))
131*5e7646d2SAndroid Build Coastguard Worker {
132*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_MFP;
133*5e7646d2SAndroid Build Coastguard Worker }
134*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "large"))
135*5e7646d2SAndroid Build Coastguard Worker {
136*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_LARGE;
137*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_LARGE;
138*5e7646d2SAndroid Build Coastguard Worker }
139*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "medium"))
140*5e7646d2SAndroid Build Coastguard Worker {
141*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_MEDIUM;
142*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_MEDIUM;
143*5e7646d2SAndroid Build Coastguard Worker }
144*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(argv[i], "small"))
145*5e7646d2SAndroid Build Coastguard Worker {
146*5e7646d2SAndroid Build Coastguard Worker mask |= CUPS_PRINTER_SMALL;
147*5e7646d2SAndroid Build Coastguard Worker type |= CUPS_PRINTER_SMALL;
148*5e7646d2SAndroid Build Coastguard Worker }
149*5e7646d2SAndroid Build Coastguard Worker else
150*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "Unknown argument \"%s\" ignored...\n", argv[i]);
151*5e7646d2SAndroid Build Coastguard Worker
152*5e7646d2SAndroid Build Coastguard Worker cupsEnumDests(CUPS_DEST_FLAGS_NONE, msec, NULL, type, mask, enum_cb, NULL);
153*5e7646d2SAndroid Build Coastguard Worker }
154*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[1], "password"))
155*5e7646d2SAndroid Build Coastguard Worker {
156*5e7646d2SAndroid Build Coastguard Worker const char *pass = cupsGetPassword("Password:");
157*5e7646d2SAndroid Build Coastguard Worker /* Password string */
158*5e7646d2SAndroid Build Coastguard Worker
159*5e7646d2SAndroid Build Coastguard Worker if (pass)
160*5e7646d2SAndroid Build Coastguard Worker printf("Password entered: %s\n", pass);
161*5e7646d2SAndroid Build Coastguard Worker else
162*5e7646d2SAndroid Build Coastguard Worker puts("No password entered.");
163*5e7646d2SAndroid Build Coastguard Worker }
164*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[1], "ppd") && argc == 3)
165*5e7646d2SAndroid Build Coastguard Worker {
166*5e7646d2SAndroid Build Coastguard Worker /*
167*5e7646d2SAndroid Build Coastguard Worker * ./testcups ppd printer
168*5e7646d2SAndroid Build Coastguard Worker */
169*5e7646d2SAndroid Build Coastguard Worker
170*5e7646d2SAndroid Build Coastguard Worker http_status_t http_status; /* Status */
171*5e7646d2SAndroid Build Coastguard Worker char buffer[1024]; /* PPD filename */
172*5e7646d2SAndroid Build Coastguard Worker time_t modtime = 0; /* Last modified */
173*5e7646d2SAndroid Build Coastguard Worker
174*5e7646d2SAndroid Build Coastguard Worker if ((http_status = cupsGetPPD3(CUPS_HTTP_DEFAULT, argv[2], &modtime,
175*5e7646d2SAndroid Build Coastguard Worker buffer, sizeof(buffer))) != HTTP_STATUS_OK)
176*5e7646d2SAndroid Build Coastguard Worker printf("Unable to get PPD: %d (%s)\n", (int)http_status,
177*5e7646d2SAndroid Build Coastguard Worker cupsLastErrorString());
178*5e7646d2SAndroid Build Coastguard Worker else
179*5e7646d2SAndroid Build Coastguard Worker puts(buffer);
180*5e7646d2SAndroid Build Coastguard Worker }
181*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[1], "print") && argc == 5)
182*5e7646d2SAndroid Build Coastguard Worker {
183*5e7646d2SAndroid Build Coastguard Worker /*
184*5e7646d2SAndroid Build Coastguard Worker * ./testcups print printer file interval
185*5e7646d2SAndroid Build Coastguard Worker */
186*5e7646d2SAndroid Build Coastguard Worker
187*5e7646d2SAndroid Build Coastguard Worker int interval, /* Interval between writes */
188*5e7646d2SAndroid Build Coastguard Worker job_id; /* Job ID */
189*5e7646d2SAndroid Build Coastguard Worker cups_file_t *fp; /* Print file */
190*5e7646d2SAndroid Build Coastguard Worker char buffer[16384]; /* Read/write buffer */
191*5e7646d2SAndroid Build Coastguard Worker ssize_t bytes; /* Bytes read/written */
192*5e7646d2SAndroid Build Coastguard Worker
193*5e7646d2SAndroid Build Coastguard Worker if ((fp = cupsFileOpen(argv[3], "r")) == NULL)
194*5e7646d2SAndroid Build Coastguard Worker {
195*5e7646d2SAndroid Build Coastguard Worker printf("Unable to open \"%s\": %s\n", argv[2], strerror(errno));
196*5e7646d2SAndroid Build Coastguard Worker return (1);
197*5e7646d2SAndroid Build Coastguard Worker }
198*5e7646d2SAndroid Build Coastguard Worker
199*5e7646d2SAndroid Build Coastguard Worker if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, argv[2], "testcups", 0,
200*5e7646d2SAndroid Build Coastguard Worker NULL)) <= 0)
201*5e7646d2SAndroid Build Coastguard Worker {
202*5e7646d2SAndroid Build Coastguard Worker printf("Unable to create print job on %s: %s\n", argv[1],
203*5e7646d2SAndroid Build Coastguard Worker cupsLastErrorString());
204*5e7646d2SAndroid Build Coastguard Worker return (1);
205*5e7646d2SAndroid Build Coastguard Worker }
206*5e7646d2SAndroid Build Coastguard Worker
207*5e7646d2SAndroid Build Coastguard Worker interval = atoi(argv[4]);
208*5e7646d2SAndroid Build Coastguard Worker
209*5e7646d2SAndroid Build Coastguard Worker if (cupsStartDocument(CUPS_HTTP_DEFAULT, argv[1], job_id, argv[2],
210*5e7646d2SAndroid Build Coastguard Worker CUPS_FORMAT_AUTO, 1) != HTTP_STATUS_CONTINUE)
211*5e7646d2SAndroid Build Coastguard Worker {
212*5e7646d2SAndroid Build Coastguard Worker puts("Unable to start document!");
213*5e7646d2SAndroid Build Coastguard Worker return (1);
214*5e7646d2SAndroid Build Coastguard Worker }
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
217*5e7646d2SAndroid Build Coastguard Worker {
218*5e7646d2SAndroid Build Coastguard Worker printf("Writing %d bytes...\n", (int)bytes);
219*5e7646d2SAndroid Build Coastguard Worker
220*5e7646d2SAndroid Build Coastguard Worker if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes) != HTTP_STATUS_CONTINUE)
221*5e7646d2SAndroid Build Coastguard Worker {
222*5e7646d2SAndroid Build Coastguard Worker puts("Unable to write bytes!");
223*5e7646d2SAndroid Build Coastguard Worker return (1);
224*5e7646d2SAndroid Build Coastguard Worker }
225*5e7646d2SAndroid Build Coastguard Worker
226*5e7646d2SAndroid Build Coastguard Worker if (interval > 0)
227*5e7646d2SAndroid Build Coastguard Worker sleep((unsigned)interval);
228*5e7646d2SAndroid Build Coastguard Worker }
229*5e7646d2SAndroid Build Coastguard Worker
230*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
231*5e7646d2SAndroid Build Coastguard Worker
232*5e7646d2SAndroid Build Coastguard Worker if (cupsFinishDocument(CUPS_HTTP_DEFAULT,
233*5e7646d2SAndroid Build Coastguard Worker argv[1]) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
234*5e7646d2SAndroid Build Coastguard Worker {
235*5e7646d2SAndroid Build Coastguard Worker puts("Unable to finish document!");
236*5e7646d2SAndroid Build Coastguard Worker return (1);
237*5e7646d2SAndroid Build Coastguard Worker }
238*5e7646d2SAndroid Build Coastguard Worker }
239*5e7646d2SAndroid Build Coastguard Worker else
240*5e7646d2SAndroid Build Coastguard Worker {
241*5e7646d2SAndroid Build Coastguard Worker puts("Usage:");
242*5e7646d2SAndroid Build Coastguard Worker puts("");
243*5e7646d2SAndroid Build Coastguard Worker puts("Run basic unit tests:");
244*5e7646d2SAndroid Build Coastguard Worker puts("");
245*5e7646d2SAndroid Build Coastguard Worker puts(" ./testcups");
246*5e7646d2SAndroid Build Coastguard Worker puts("");
247*5e7646d2SAndroid Build Coastguard Worker puts("Enumerate printers (for N seconds, -1 for indefinitely):");
248*5e7646d2SAndroid Build Coastguard Worker puts("");
249*5e7646d2SAndroid Build Coastguard Worker puts(" ./testcups enum [seconds]");
250*5e7646d2SAndroid Build Coastguard Worker puts("");
251*5e7646d2SAndroid Build Coastguard Worker puts("Ask for a password:");
252*5e7646d2SAndroid Build Coastguard Worker puts("");
253*5e7646d2SAndroid Build Coastguard Worker puts(" ./testcups password");
254*5e7646d2SAndroid Build Coastguard Worker puts("");
255*5e7646d2SAndroid Build Coastguard Worker puts("Get the PPD file:");
256*5e7646d2SAndroid Build Coastguard Worker puts("");
257*5e7646d2SAndroid Build Coastguard Worker puts(" ./testcups ppd printer");
258*5e7646d2SAndroid Build Coastguard Worker puts("");
259*5e7646d2SAndroid Build Coastguard Worker puts("Print a file (interval controls delay between buffers in seconds):");
260*5e7646d2SAndroid Build Coastguard Worker puts("");
261*5e7646d2SAndroid Build Coastguard Worker puts(" ./testcups print printer file interval");
262*5e7646d2SAndroid Build Coastguard Worker return (1);
263*5e7646d2SAndroid Build Coastguard Worker }
264*5e7646d2SAndroid Build Coastguard Worker
265*5e7646d2SAndroid Build Coastguard Worker return (0);
266*5e7646d2SAndroid Build Coastguard Worker }
267*5e7646d2SAndroid Build Coastguard Worker
268*5e7646d2SAndroid Build Coastguard Worker /*
269*5e7646d2SAndroid Build Coastguard Worker * _cupsConnect() connection reuse...
270*5e7646d2SAndroid Build Coastguard Worker */
271*5e7646d2SAndroid Build Coastguard Worker
272*5e7646d2SAndroid Build Coastguard Worker fputs("_cupsConnect: ", stdout);
273*5e7646d2SAndroid Build Coastguard Worker http = _cupsConnect();
274*5e7646d2SAndroid Build Coastguard Worker http2 = _cupsConnect();
275*5e7646d2SAndroid Build Coastguard Worker
276*5e7646d2SAndroid Build Coastguard Worker if (http == http2)
277*5e7646d2SAndroid Build Coastguard Worker {
278*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
279*5e7646d2SAndroid Build Coastguard Worker }
280*5e7646d2SAndroid Build Coastguard Worker else
281*5e7646d2SAndroid Build Coastguard Worker {
282*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (different connections)");
283*5e7646d2SAndroid Build Coastguard Worker return (1);
284*5e7646d2SAndroid Build Coastguard Worker }
285*5e7646d2SAndroid Build Coastguard Worker
286*5e7646d2SAndroid Build Coastguard Worker /*
287*5e7646d2SAndroid Build Coastguard Worker * cupsGetDests()
288*5e7646d2SAndroid Build Coastguard Worker */
289*5e7646d2SAndroid Build Coastguard Worker
290*5e7646d2SAndroid Build Coastguard Worker fputs("cupsGetDests: ", stdout);
291*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
292*5e7646d2SAndroid Build Coastguard Worker
293*5e7646d2SAndroid Build Coastguard Worker num_dests = cupsGetDests(&dests);
294*5e7646d2SAndroid Build Coastguard Worker
295*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0)
296*5e7646d2SAndroid Build Coastguard Worker {
297*5e7646d2SAndroid Build Coastguard Worker puts("FAIL");
298*5e7646d2SAndroid Build Coastguard Worker return (1);
299*5e7646d2SAndroid Build Coastguard Worker }
300*5e7646d2SAndroid Build Coastguard Worker else
301*5e7646d2SAndroid Build Coastguard Worker {
302*5e7646d2SAndroid Build Coastguard Worker printf("PASS (%d dests)\n", num_dests);
303*5e7646d2SAndroid Build Coastguard Worker
304*5e7646d2SAndroid Build Coastguard Worker for (i = num_dests, dest = dests; i > 0; i --, dest ++)
305*5e7646d2SAndroid Build Coastguard Worker {
306*5e7646d2SAndroid Build Coastguard Worker printf(" %s", dest->name);
307*5e7646d2SAndroid Build Coastguard Worker
308*5e7646d2SAndroid Build Coastguard Worker if (dest->instance)
309*5e7646d2SAndroid Build Coastguard Worker printf(" /%s", dest->instance);
310*5e7646d2SAndroid Build Coastguard Worker
311*5e7646d2SAndroid Build Coastguard Worker if (dest->is_default)
312*5e7646d2SAndroid Build Coastguard Worker puts(" ***DEFAULT***");
313*5e7646d2SAndroid Build Coastguard Worker else
314*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
315*5e7646d2SAndroid Build Coastguard Worker }
316*5e7646d2SAndroid Build Coastguard Worker }
317*5e7646d2SAndroid Build Coastguard Worker
318*5e7646d2SAndroid Build Coastguard Worker /*
319*5e7646d2SAndroid Build Coastguard Worker * cupsGetDest(NULL)
320*5e7646d2SAndroid Build Coastguard Worker */
321*5e7646d2SAndroid Build Coastguard Worker
322*5e7646d2SAndroid Build Coastguard Worker fputs("cupsGetDest(NULL): ", stdout);
323*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
324*5e7646d2SAndroid Build Coastguard Worker
325*5e7646d2SAndroid Build Coastguard Worker if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL)
326*5e7646d2SAndroid Build Coastguard Worker {
327*5e7646d2SAndroid Build Coastguard Worker for (i = num_dests, dest = dests; i > 0; i --, dest ++)
328*5e7646d2SAndroid Build Coastguard Worker if (dest->is_default)
329*5e7646d2SAndroid Build Coastguard Worker break;
330*5e7646d2SAndroid Build Coastguard Worker
331*5e7646d2SAndroid Build Coastguard Worker if (i)
332*5e7646d2SAndroid Build Coastguard Worker {
333*5e7646d2SAndroid Build Coastguard Worker status = 1;
334*5e7646d2SAndroid Build Coastguard Worker puts("FAIL");
335*5e7646d2SAndroid Build Coastguard Worker }
336*5e7646d2SAndroid Build Coastguard Worker else
337*5e7646d2SAndroid Build Coastguard Worker puts("PASS (no default)");
338*5e7646d2SAndroid Build Coastguard Worker
339*5e7646d2SAndroid Build Coastguard Worker dest = NULL;
340*5e7646d2SAndroid Build Coastguard Worker }
341*5e7646d2SAndroid Build Coastguard Worker else
342*5e7646d2SAndroid Build Coastguard Worker printf("PASS (%s)\n", dest->name);
343*5e7646d2SAndroid Build Coastguard Worker
344*5e7646d2SAndroid Build Coastguard Worker /*
345*5e7646d2SAndroid Build Coastguard Worker * cupsGetNamedDest(NULL, NULL, NULL)
346*5e7646d2SAndroid Build Coastguard Worker */
347*5e7646d2SAndroid Build Coastguard Worker
348*5e7646d2SAndroid Build Coastguard Worker fputs("cupsGetNamedDest(NULL, NULL, NULL): ", stdout);
349*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
350*5e7646d2SAndroid Build Coastguard Worker
351*5e7646d2SAndroid Build Coastguard Worker if ((named_dest = cupsGetNamedDest(NULL, NULL, NULL)) == NULL ||
352*5e7646d2SAndroid Build Coastguard Worker !dests_equal(dest, named_dest))
353*5e7646d2SAndroid Build Coastguard Worker {
354*5e7646d2SAndroid Build Coastguard Worker if (!dest)
355*5e7646d2SAndroid Build Coastguard Worker puts("PASS (no default)");
356*5e7646d2SAndroid Build Coastguard Worker else if (named_dest)
357*5e7646d2SAndroid Build Coastguard Worker {
358*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (different values)");
359*5e7646d2SAndroid Build Coastguard Worker show_diffs(dest, named_dest);
360*5e7646d2SAndroid Build Coastguard Worker status = 1;
361*5e7646d2SAndroid Build Coastguard Worker }
362*5e7646d2SAndroid Build Coastguard Worker else
363*5e7646d2SAndroid Build Coastguard Worker {
364*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (no default)");
365*5e7646d2SAndroid Build Coastguard Worker status = 1;
366*5e7646d2SAndroid Build Coastguard Worker }
367*5e7646d2SAndroid Build Coastguard Worker }
368*5e7646d2SAndroid Build Coastguard Worker else
369*5e7646d2SAndroid Build Coastguard Worker printf("PASS (%s)\n", named_dest->name);
370*5e7646d2SAndroid Build Coastguard Worker
371*5e7646d2SAndroid Build Coastguard Worker if (named_dest)
372*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(1, named_dest);
373*5e7646d2SAndroid Build Coastguard Worker
374*5e7646d2SAndroid Build Coastguard Worker /*
375*5e7646d2SAndroid Build Coastguard Worker * cupsGetDest(printer)
376*5e7646d2SAndroid Build Coastguard Worker */
377*5e7646d2SAndroid Build Coastguard Worker
378*5e7646d2SAndroid Build Coastguard Worker for (i = 0, dest_name = NULL; i < num_dests; i ++)
379*5e7646d2SAndroid Build Coastguard Worker {
380*5e7646d2SAndroid Build Coastguard Worker if ((dval = cupsGetOption("printer-is-temporary", dests[i].num_options, dest[i].options)) != NULL && !strcmp(dval, "false"))
381*5e7646d2SAndroid Build Coastguard Worker {
382*5e7646d2SAndroid Build Coastguard Worker dest_name = dests[i].name;
383*5e7646d2SAndroid Build Coastguard Worker break;
384*5e7646d2SAndroid Build Coastguard Worker }
385*5e7646d2SAndroid Build Coastguard Worker }
386*5e7646d2SAndroid Build Coastguard Worker
387*5e7646d2SAndroid Build Coastguard Worker printf("cupsGetDest(\"%s\"): ", dest_name ? dest_name : "(null)");
388*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
389*5e7646d2SAndroid Build Coastguard Worker
390*5e7646d2SAndroid Build Coastguard Worker if ((dest = cupsGetDest(dest_name, NULL, num_dests, dests)) == NULL)
391*5e7646d2SAndroid Build Coastguard Worker {
392*5e7646d2SAndroid Build Coastguard Worker puts("FAIL");
393*5e7646d2SAndroid Build Coastguard Worker return (1);
394*5e7646d2SAndroid Build Coastguard Worker }
395*5e7646d2SAndroid Build Coastguard Worker else
396*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
397*5e7646d2SAndroid Build Coastguard Worker
398*5e7646d2SAndroid Build Coastguard Worker /*
399*5e7646d2SAndroid Build Coastguard Worker * cupsGetNamedDest(NULL, printer, instance)
400*5e7646d2SAndroid Build Coastguard Worker */
401*5e7646d2SAndroid Build Coastguard Worker
402*5e7646d2SAndroid Build Coastguard Worker printf("cupsGetNamedDest(NULL, \"%s\", \"%s\"): ", dest->name,
403*5e7646d2SAndroid Build Coastguard Worker dest->instance ? dest->instance : "(null)");
404*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
405*5e7646d2SAndroid Build Coastguard Worker
406*5e7646d2SAndroid Build Coastguard Worker if ((named_dest = cupsGetNamedDest(NULL, dest->name, dest->instance)) == NULL ||
407*5e7646d2SAndroid Build Coastguard Worker !dests_equal(dest, named_dest))
408*5e7646d2SAndroid Build Coastguard Worker {
409*5e7646d2SAndroid Build Coastguard Worker if (named_dest)
410*5e7646d2SAndroid Build Coastguard Worker {
411*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (different values)");
412*5e7646d2SAndroid Build Coastguard Worker show_diffs(dest, named_dest);
413*5e7646d2SAndroid Build Coastguard Worker }
414*5e7646d2SAndroid Build Coastguard Worker else
415*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (no destination)");
416*5e7646d2SAndroid Build Coastguard Worker
417*5e7646d2SAndroid Build Coastguard Worker
418*5e7646d2SAndroid Build Coastguard Worker status = 1;
419*5e7646d2SAndroid Build Coastguard Worker }
420*5e7646d2SAndroid Build Coastguard Worker else
421*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
422*5e7646d2SAndroid Build Coastguard Worker
423*5e7646d2SAndroid Build Coastguard Worker if (named_dest)
424*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(1, named_dest);
425*5e7646d2SAndroid Build Coastguard Worker
426*5e7646d2SAndroid Build Coastguard Worker /*
427*5e7646d2SAndroid Build Coastguard Worker * cupsPrintFile()
428*5e7646d2SAndroid Build Coastguard Worker */
429*5e7646d2SAndroid Build Coastguard Worker
430*5e7646d2SAndroid Build Coastguard Worker fputs("cupsPrintFile: ", stdout);
431*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
432*5e7646d2SAndroid Build Coastguard Worker
433*5e7646d2SAndroid Build Coastguard Worker if (cupsPrintFile(dest->name, "../test/testfile.pdf", "Test Page",
434*5e7646d2SAndroid Build Coastguard Worker dest->num_options, dest->options) <= 0)
435*5e7646d2SAndroid Build Coastguard Worker {
436*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (%s)\n", cupsLastErrorString());
437*5e7646d2SAndroid Build Coastguard Worker return (1);
438*5e7646d2SAndroid Build Coastguard Worker }
439*5e7646d2SAndroid Build Coastguard Worker else
440*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
441*5e7646d2SAndroid Build Coastguard Worker
442*5e7646d2SAndroid Build Coastguard Worker /*
443*5e7646d2SAndroid Build Coastguard Worker * cupsGetPPD(printer)
444*5e7646d2SAndroid Build Coastguard Worker */
445*5e7646d2SAndroid Build Coastguard Worker
446*5e7646d2SAndroid Build Coastguard Worker fputs("cupsGetPPD: ", stdout);
447*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
448*5e7646d2SAndroid Build Coastguard Worker
449*5e7646d2SAndroid Build Coastguard Worker if ((ppdfile = cupsGetPPD(dest->name)) == NULL)
450*5e7646d2SAndroid Build Coastguard Worker {
451*5e7646d2SAndroid Build Coastguard Worker puts("FAIL");
452*5e7646d2SAndroid Build Coastguard Worker }
453*5e7646d2SAndroid Build Coastguard Worker else
454*5e7646d2SAndroid Build Coastguard Worker {
455*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
456*5e7646d2SAndroid Build Coastguard Worker
457*5e7646d2SAndroid Build Coastguard Worker /*
458*5e7646d2SAndroid Build Coastguard Worker * ppdOpenFile()
459*5e7646d2SAndroid Build Coastguard Worker */
460*5e7646d2SAndroid Build Coastguard Worker
461*5e7646d2SAndroid Build Coastguard Worker fputs("ppdOpenFile: ", stdout);
462*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
463*5e7646d2SAndroid Build Coastguard Worker
464*5e7646d2SAndroid Build Coastguard Worker if ((ppd = ppdOpenFile(ppdfile)) == NULL)
465*5e7646d2SAndroid Build Coastguard Worker {
466*5e7646d2SAndroid Build Coastguard Worker puts("FAIL");
467*5e7646d2SAndroid Build Coastguard Worker return (1);
468*5e7646d2SAndroid Build Coastguard Worker }
469*5e7646d2SAndroid Build Coastguard Worker else
470*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
471*5e7646d2SAndroid Build Coastguard Worker
472*5e7646d2SAndroid Build Coastguard Worker ppdClose(ppd);
473*5e7646d2SAndroid Build Coastguard Worker unlink(ppdfile);
474*5e7646d2SAndroid Build Coastguard Worker }
475*5e7646d2SAndroid Build Coastguard Worker
476*5e7646d2SAndroid Build Coastguard Worker /*
477*5e7646d2SAndroid Build Coastguard Worker * cupsGetJobs()
478*5e7646d2SAndroid Build Coastguard Worker */
479*5e7646d2SAndroid Build Coastguard Worker
480*5e7646d2SAndroid Build Coastguard Worker fputs("cupsGetJobs: ", stdout);
481*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
482*5e7646d2SAndroid Build Coastguard Worker
483*5e7646d2SAndroid Build Coastguard Worker num_jobs = cupsGetJobs(&jobs, NULL, 0, -1);
484*5e7646d2SAndroid Build Coastguard Worker
485*5e7646d2SAndroid Build Coastguard Worker if (num_jobs == 0)
486*5e7646d2SAndroid Build Coastguard Worker {
487*5e7646d2SAndroid Build Coastguard Worker puts("FAIL");
488*5e7646d2SAndroid Build Coastguard Worker return (1);
489*5e7646d2SAndroid Build Coastguard Worker }
490*5e7646d2SAndroid Build Coastguard Worker else
491*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
492*5e7646d2SAndroid Build Coastguard Worker
493*5e7646d2SAndroid Build Coastguard Worker cupsFreeJobs(num_jobs, jobs);
494*5e7646d2SAndroid Build Coastguard Worker cupsFreeDests(num_dests, dests);
495*5e7646d2SAndroid Build Coastguard Worker
496*5e7646d2SAndroid Build Coastguard Worker return (status);
497*5e7646d2SAndroid Build Coastguard Worker }
498*5e7646d2SAndroid Build Coastguard Worker
499*5e7646d2SAndroid Build Coastguard Worker
500*5e7646d2SAndroid Build Coastguard Worker /*
501*5e7646d2SAndroid Build Coastguard Worker * 'dests_equal()' - Determine whether two destinations are equal.
502*5e7646d2SAndroid Build Coastguard Worker */
503*5e7646d2SAndroid Build Coastguard Worker
504*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 if equal, 0 if not equal */
dests_equal(cups_dest_t * a,cups_dest_t * b)505*5e7646d2SAndroid Build Coastguard Worker dests_equal(cups_dest_t *a, /* I - First destination */
506*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *b) /* I - Second destination */
507*5e7646d2SAndroid Build Coastguard Worker {
508*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
509*5e7646d2SAndroid Build Coastguard Worker cups_option_t *aoption; /* Current option */
510*5e7646d2SAndroid Build Coastguard Worker const char *bval; /* Option value */
511*5e7646d2SAndroid Build Coastguard Worker
512*5e7646d2SAndroid Build Coastguard Worker
513*5e7646d2SAndroid Build Coastguard Worker if (a == b)
514*5e7646d2SAndroid Build Coastguard Worker return (1);
515*5e7646d2SAndroid Build Coastguard Worker
516*5e7646d2SAndroid Build Coastguard Worker if (!a || !b)
517*5e7646d2SAndroid Build Coastguard Worker return (0);
518*5e7646d2SAndroid Build Coastguard Worker
519*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(a->name, b->name) ||
520*5e7646d2SAndroid Build Coastguard Worker (a->instance && !b->instance) ||
521*5e7646d2SAndroid Build Coastguard Worker (!a->instance && b->instance) ||
522*5e7646d2SAndroid Build Coastguard Worker (a->instance && _cups_strcasecmp(a->instance, b->instance)) ||
523*5e7646d2SAndroid Build Coastguard Worker a->num_options != b->num_options)
524*5e7646d2SAndroid Build Coastguard Worker return (0);
525*5e7646d2SAndroid Build Coastguard Worker
526*5e7646d2SAndroid Build Coastguard Worker for (i = a->num_options, aoption = a->options; i > 0; i --, aoption ++)
527*5e7646d2SAndroid Build Coastguard Worker if ((bval = cupsGetOption(aoption->name, b->num_options,
528*5e7646d2SAndroid Build Coastguard Worker b->options)) == NULL ||
529*5e7646d2SAndroid Build Coastguard Worker strcmp(aoption->value, bval))
530*5e7646d2SAndroid Build Coastguard Worker return (0);
531*5e7646d2SAndroid Build Coastguard Worker
532*5e7646d2SAndroid Build Coastguard Worker return (1);
533*5e7646d2SAndroid Build Coastguard Worker }
534*5e7646d2SAndroid Build Coastguard Worker
535*5e7646d2SAndroid Build Coastguard Worker
536*5e7646d2SAndroid Build Coastguard Worker /*
537*5e7646d2SAndroid Build Coastguard Worker * 'enum_cb()' - Report additions and removals.
538*5e7646d2SAndroid Build Coastguard Worker */
539*5e7646d2SAndroid Build Coastguard Worker
540*5e7646d2SAndroid Build Coastguard Worker static int /* O - 1 to continue, 0 to stop */
enum_cb(void * user_data,unsigned flags,cups_dest_t * dest)541*5e7646d2SAndroid Build Coastguard Worker enum_cb(void *user_data, /* I - User data (unused) */
542*5e7646d2SAndroid Build Coastguard Worker unsigned flags, /* I - Destination flags */
543*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dest) /* I - Destination */
544*5e7646d2SAndroid Build Coastguard Worker {
545*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
546*5e7646d2SAndroid Build Coastguard Worker cups_option_t *option; /* Current option */
547*5e7646d2SAndroid Build Coastguard Worker
548*5e7646d2SAndroid Build Coastguard Worker
549*5e7646d2SAndroid Build Coastguard Worker (void)user_data;
550*5e7646d2SAndroid Build Coastguard Worker
551*5e7646d2SAndroid Build Coastguard Worker if (flags & CUPS_DEST_FLAGS_REMOVED)
552*5e7646d2SAndroid Build Coastguard Worker printf("Removed '%s':\n", dest->name);
553*5e7646d2SAndroid Build Coastguard Worker else
554*5e7646d2SAndroid Build Coastguard Worker printf("Added '%s':\n", dest->name);
555*5e7646d2SAndroid Build Coastguard Worker
556*5e7646d2SAndroid Build Coastguard Worker for (i = dest->num_options, option = dest->options; i > 0; i --, option ++)
557*5e7646d2SAndroid Build Coastguard Worker printf(" %s=\"%s\"\n", option->name, option->value);
558*5e7646d2SAndroid Build Coastguard Worker
559*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
560*5e7646d2SAndroid Build Coastguard Worker
561*5e7646d2SAndroid Build Coastguard Worker return (1);
562*5e7646d2SAndroid Build Coastguard Worker }
563*5e7646d2SAndroid Build Coastguard Worker
564*5e7646d2SAndroid Build Coastguard Worker
565*5e7646d2SAndroid Build Coastguard Worker /*
566*5e7646d2SAndroid Build Coastguard Worker * 'show_diffs()' - Show differences between two destinations.
567*5e7646d2SAndroid Build Coastguard Worker */
568*5e7646d2SAndroid Build Coastguard Worker
569*5e7646d2SAndroid Build Coastguard Worker static void
show_diffs(cups_dest_t * a,cups_dest_t * b)570*5e7646d2SAndroid Build Coastguard Worker show_diffs(cups_dest_t *a, /* I - First destination */
571*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *b) /* I - Second destination */
572*5e7646d2SAndroid Build Coastguard Worker {
573*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
574*5e7646d2SAndroid Build Coastguard Worker cups_option_t *aoption; /* Current option */
575*5e7646d2SAndroid Build Coastguard Worker cups_option_t *boption; /* Current option */
576*5e7646d2SAndroid Build Coastguard Worker const char *bval; /* Option value */
577*5e7646d2SAndroid Build Coastguard Worker
578*5e7646d2SAndroid Build Coastguard Worker
579*5e7646d2SAndroid Build Coastguard Worker if (!a || !b)
580*5e7646d2SAndroid Build Coastguard Worker return;
581*5e7646d2SAndroid Build Coastguard Worker
582*5e7646d2SAndroid Build Coastguard Worker puts(" Item cupsGetDest cupsGetNamedDest");
583*5e7646d2SAndroid Build Coastguard Worker puts(" -------------------- ------------------------ ------------------------");
584*5e7646d2SAndroid Build Coastguard Worker
585*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(a->name, b->name))
586*5e7646d2SAndroid Build Coastguard Worker printf(" name %-24.24s %-24.24s\n", a->name, b->name);
587*5e7646d2SAndroid Build Coastguard Worker
588*5e7646d2SAndroid Build Coastguard Worker if ((a->instance && !b->instance) ||
589*5e7646d2SAndroid Build Coastguard Worker (!a->instance && b->instance) ||
590*5e7646d2SAndroid Build Coastguard Worker (a->instance && _cups_strcasecmp(a->instance, b->instance)))
591*5e7646d2SAndroid Build Coastguard Worker printf(" instance %-24.24s %-24.24s\n",
592*5e7646d2SAndroid Build Coastguard Worker a->instance ? a->instance : "(null)",
593*5e7646d2SAndroid Build Coastguard Worker b->instance ? b->instance : "(null)");
594*5e7646d2SAndroid Build Coastguard Worker
595*5e7646d2SAndroid Build Coastguard Worker if (a->num_options != b->num_options)
596*5e7646d2SAndroid Build Coastguard Worker printf(" num_options %-24d %-24d\n", a->num_options,
597*5e7646d2SAndroid Build Coastguard Worker b->num_options);
598*5e7646d2SAndroid Build Coastguard Worker
599*5e7646d2SAndroid Build Coastguard Worker for (i = a->num_options, aoption = a->options; i > 0; i --, aoption ++)
600*5e7646d2SAndroid Build Coastguard Worker if ((bval = cupsGetOption(aoption->name, b->num_options,
601*5e7646d2SAndroid Build Coastguard Worker b->options)) == NULL ||
602*5e7646d2SAndroid Build Coastguard Worker strcmp(aoption->value, bval))
603*5e7646d2SAndroid Build Coastguard Worker printf(" %-20.20s %-24.24s %-24.24s\n", aoption->name,
604*5e7646d2SAndroid Build Coastguard Worker aoption->value, bval ? bval : "(null)");
605*5e7646d2SAndroid Build Coastguard Worker
606*5e7646d2SAndroid Build Coastguard Worker for (i = b->num_options, boption = b->options; i > 0; i --, boption ++)
607*5e7646d2SAndroid Build Coastguard Worker if (!cupsGetOption(boption->name, a->num_options, a->options))
608*5e7646d2SAndroid Build Coastguard Worker printf(" %-20.20s %-24.24s %-24.24s\n", boption->name,
609*5e7646d2SAndroid Build Coastguard Worker boption->value, "(null)");
610*5e7646d2SAndroid Build Coastguard Worker }
611