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