xref: /aosp_15_r20/external/libcups/berkeley/lpc.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * "lpc" command for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2007-2014 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 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 #include <cups/cups-private.h>
15*5e7646d2SAndroid Build Coastguard Worker 
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker /*
18*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
19*5e7646d2SAndroid Build Coastguard Worker  */
20*5e7646d2SAndroid Build Coastguard Worker 
21*5e7646d2SAndroid Build Coastguard Worker static int	compare_strings(const char *, const char *, size_t);
22*5e7646d2SAndroid Build Coastguard Worker static void	do_command(http_t *, const char *, const char *);
23*5e7646d2SAndroid Build Coastguard Worker static void	show_help(const char *);
24*5e7646d2SAndroid Build Coastguard Worker static void	show_prompt(const char *message);
25*5e7646d2SAndroid Build Coastguard Worker static void	show_status(http_t *, const char *);
26*5e7646d2SAndroid Build Coastguard Worker 
27*5e7646d2SAndroid Build Coastguard Worker 
28*5e7646d2SAndroid Build Coastguard Worker /*
29*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Parse options and commands.
30*5e7646d2SAndroid Build Coastguard Worker  */
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker int
main(int argc,char * argv[])33*5e7646d2SAndroid Build Coastguard Worker main(int  argc,				/* I - Number of command-line arguments */
34*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
35*5e7646d2SAndroid Build Coastguard Worker {
36*5e7646d2SAndroid Build Coastguard Worker   http_t	*http;			/* Connection to server */
37*5e7646d2SAndroid Build Coastguard Worker   char		line[1024],		/* Input line from user */
38*5e7646d2SAndroid Build Coastguard Worker 		*params;		/* Pointer to parameters */
39*5e7646d2SAndroid Build Coastguard Worker 
40*5e7646d2SAndroid Build Coastguard Worker 
41*5e7646d2SAndroid Build Coastguard Worker   _cupsSetLocale(argv);
42*5e7646d2SAndroid Build Coastguard Worker 
43*5e7646d2SAndroid Build Coastguard Worker  /*
44*5e7646d2SAndroid Build Coastguard Worker   * Connect to the scheduler...
45*5e7646d2SAndroid Build Coastguard Worker   */
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker   http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
48*5e7646d2SAndroid Build Coastguard Worker 
49*5e7646d2SAndroid Build Coastguard Worker   if (argc > 1)
50*5e7646d2SAndroid Build Coastguard Worker   {
51*5e7646d2SAndroid Build Coastguard Worker    /*
52*5e7646d2SAndroid Build Coastguard Worker     * Process a single command on the command-line...
53*5e7646d2SAndroid Build Coastguard Worker     */
54*5e7646d2SAndroid Build Coastguard Worker 
55*5e7646d2SAndroid Build Coastguard Worker     do_command(http, argv[1], argv[2]);
56*5e7646d2SAndroid Build Coastguard Worker   }
57*5e7646d2SAndroid Build Coastguard Worker   else
58*5e7646d2SAndroid Build Coastguard Worker   {
59*5e7646d2SAndroid Build Coastguard Worker    /*
60*5e7646d2SAndroid Build Coastguard Worker     * Do the command prompt thing...
61*5e7646d2SAndroid Build Coastguard Worker     */
62*5e7646d2SAndroid Build Coastguard Worker 
63*5e7646d2SAndroid Build Coastguard Worker     show_prompt(_("lpc> "));
64*5e7646d2SAndroid Build Coastguard Worker     while (fgets(line, sizeof(line), stdin) != NULL)
65*5e7646d2SAndroid Build Coastguard Worker     {
66*5e7646d2SAndroid Build Coastguard Worker      /*
67*5e7646d2SAndroid Build Coastguard Worker       * Strip trailing whitespace...
68*5e7646d2SAndroid Build Coastguard Worker       */
69*5e7646d2SAndroid Build Coastguard Worker 
70*5e7646d2SAndroid Build Coastguard Worker       for (params = line + strlen(line) - 1; params >= line;)
71*5e7646d2SAndroid Build Coastguard Worker         if (!isspace(*params & 255))
72*5e7646d2SAndroid Build Coastguard Worker 	  break;
73*5e7646d2SAndroid Build Coastguard Worker 	else
74*5e7646d2SAndroid Build Coastguard Worker 	  *params-- = '\0';
75*5e7646d2SAndroid Build Coastguard Worker 
76*5e7646d2SAndroid Build Coastguard Worker      /*
77*5e7646d2SAndroid Build Coastguard Worker       * Strip leading whitespace...
78*5e7646d2SAndroid Build Coastguard Worker       */
79*5e7646d2SAndroid Build Coastguard Worker 
80*5e7646d2SAndroid Build Coastguard Worker       for (params = line; isspace(*params & 255); params ++);
81*5e7646d2SAndroid Build Coastguard Worker 
82*5e7646d2SAndroid Build Coastguard Worker       if (params > line)
83*5e7646d2SAndroid Build Coastguard Worker         _cups_strcpy(line, params);
84*5e7646d2SAndroid Build Coastguard Worker 
85*5e7646d2SAndroid Build Coastguard Worker       if (!line[0])
86*5e7646d2SAndroid Build Coastguard Worker       {
87*5e7646d2SAndroid Build Coastguard Worker        /*
88*5e7646d2SAndroid Build Coastguard Worker         * Nothing left, just show a prompt...
89*5e7646d2SAndroid Build Coastguard Worker 	*/
90*5e7646d2SAndroid Build Coastguard Worker 
91*5e7646d2SAndroid Build Coastguard Worker         show_prompt(_("lpc> "));
92*5e7646d2SAndroid Build Coastguard Worker 	continue;
93*5e7646d2SAndroid Build Coastguard Worker       }
94*5e7646d2SAndroid Build Coastguard Worker 
95*5e7646d2SAndroid Build Coastguard Worker      /*
96*5e7646d2SAndroid Build Coastguard Worker       * Find any options in the string...
97*5e7646d2SAndroid Build Coastguard Worker       */
98*5e7646d2SAndroid Build Coastguard Worker 
99*5e7646d2SAndroid Build Coastguard Worker       for (params = line; *params != '\0'; params ++)
100*5e7646d2SAndroid Build Coastguard Worker         if (isspace(*params & 255))
101*5e7646d2SAndroid Build Coastguard Worker 	  break;
102*5e7646d2SAndroid Build Coastguard Worker 
103*5e7646d2SAndroid Build Coastguard Worker      /*
104*5e7646d2SAndroid Build Coastguard Worker       * Remove whitespace between the command and parameters...
105*5e7646d2SAndroid Build Coastguard Worker       */
106*5e7646d2SAndroid Build Coastguard Worker 
107*5e7646d2SAndroid Build Coastguard Worker       while (isspace(*params & 255))
108*5e7646d2SAndroid Build Coastguard Worker         *params++ = '\0';
109*5e7646d2SAndroid Build Coastguard Worker 
110*5e7646d2SAndroid Build Coastguard Worker      /*
111*5e7646d2SAndroid Build Coastguard Worker       * The "quit" and "exit" commands exit; otherwise, process as needed...
112*5e7646d2SAndroid Build Coastguard Worker       */
113*5e7646d2SAndroid Build Coastguard Worker 
114*5e7646d2SAndroid Build Coastguard Worker       if (!compare_strings(line, "quit", 1) ||
115*5e7646d2SAndroid Build Coastguard Worker           !compare_strings(line, "exit", 2))
116*5e7646d2SAndroid Build Coastguard Worker         break;
117*5e7646d2SAndroid Build Coastguard Worker 
118*5e7646d2SAndroid Build Coastguard Worker       if (*params == '\0')
119*5e7646d2SAndroid Build Coastguard Worker         do_command(http, line, NULL);
120*5e7646d2SAndroid Build Coastguard Worker       else
121*5e7646d2SAndroid Build Coastguard Worker         do_command(http, line, params);
122*5e7646d2SAndroid Build Coastguard Worker 
123*5e7646d2SAndroid Build Coastguard Worker      /*
124*5e7646d2SAndroid Build Coastguard Worker       * Put another prompt out to the user...
125*5e7646d2SAndroid Build Coastguard Worker       */
126*5e7646d2SAndroid Build Coastguard Worker 
127*5e7646d2SAndroid Build Coastguard Worker       show_prompt(_("lpc> "));
128*5e7646d2SAndroid Build Coastguard Worker     }
129*5e7646d2SAndroid Build Coastguard Worker   }
130*5e7646d2SAndroid Build Coastguard Worker 
131*5e7646d2SAndroid Build Coastguard Worker  /*
132*5e7646d2SAndroid Build Coastguard Worker   * Close the connection to the server and return...
133*5e7646d2SAndroid Build Coastguard Worker   */
134*5e7646d2SAndroid Build Coastguard Worker 
135*5e7646d2SAndroid Build Coastguard Worker   httpClose(http);
136*5e7646d2SAndroid Build Coastguard Worker 
137*5e7646d2SAndroid Build Coastguard Worker   return (0);
138*5e7646d2SAndroid Build Coastguard Worker }
139*5e7646d2SAndroid Build Coastguard Worker 
140*5e7646d2SAndroid Build Coastguard Worker 
141*5e7646d2SAndroid Build Coastguard Worker /*
142*5e7646d2SAndroid Build Coastguard Worker  * 'compare_strings()' - Compare two command-line strings.
143*5e7646d2SAndroid Build Coastguard Worker  */
144*5e7646d2SAndroid Build Coastguard Worker 
145*5e7646d2SAndroid Build Coastguard Worker static int				/* O - -1 or 1 = no match, 0 = match */
compare_strings(const char * s,const char * t,size_t tmin)146*5e7646d2SAndroid Build Coastguard Worker compare_strings(const char *s,		/* I - Command-line string */
147*5e7646d2SAndroid Build Coastguard Worker                 const char *t,		/* I - Option string */
148*5e7646d2SAndroid Build Coastguard Worker                 size_t     tmin)	/* I - Minimum number of unique chars in option */
149*5e7646d2SAndroid Build Coastguard Worker {
150*5e7646d2SAndroid Build Coastguard Worker   size_t	slen;			/* Length of command-line string */
151*5e7646d2SAndroid Build Coastguard Worker 
152*5e7646d2SAndroid Build Coastguard Worker 
153*5e7646d2SAndroid Build Coastguard Worker   slen = strlen(s);
154*5e7646d2SAndroid Build Coastguard Worker   if (slen < tmin)
155*5e7646d2SAndroid Build Coastguard Worker     return (-1);
156*5e7646d2SAndroid Build Coastguard Worker   else
157*5e7646d2SAndroid Build Coastguard Worker     return (strncmp(s, t, slen));
158*5e7646d2SAndroid Build Coastguard Worker }
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker 
161*5e7646d2SAndroid Build Coastguard Worker /*
162*5e7646d2SAndroid Build Coastguard Worker  * 'do_command()' - Do an lpc command...
163*5e7646d2SAndroid Build Coastguard Worker  */
164*5e7646d2SAndroid Build Coastguard Worker 
165*5e7646d2SAndroid Build Coastguard Worker static void
do_command(http_t * http,const char * command,const char * params)166*5e7646d2SAndroid Build Coastguard Worker do_command(http_t     *http,		/* I - HTTP connection to server */
167*5e7646d2SAndroid Build Coastguard Worker            const char *command,		/* I - Command string */
168*5e7646d2SAndroid Build Coastguard Worker 	   const char *params)		/* I - Parameters for command */
169*5e7646d2SAndroid Build Coastguard Worker {
170*5e7646d2SAndroid Build Coastguard Worker   if (!compare_strings(command, "status", 4))
171*5e7646d2SAndroid Build Coastguard Worker     show_status(http, params);
172*5e7646d2SAndroid Build Coastguard Worker   else if (!compare_strings(command, "help", 1) || !strcmp(command, "?"))
173*5e7646d2SAndroid Build Coastguard Worker     show_help(params);
174*5e7646d2SAndroid Build Coastguard Worker   else
175*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stdout,
176*5e7646d2SAndroid Build Coastguard Worker                     _("%s is not implemented by the CUPS version of lpc."),
177*5e7646d2SAndroid Build Coastguard Worker 		    command);
178*5e7646d2SAndroid Build Coastguard Worker }
179*5e7646d2SAndroid Build Coastguard Worker 
180*5e7646d2SAndroid Build Coastguard Worker 
181*5e7646d2SAndroid Build Coastguard Worker /*
182*5e7646d2SAndroid Build Coastguard Worker  * 'show_help()' - Show help messages.
183*5e7646d2SAndroid Build Coastguard Worker  */
184*5e7646d2SAndroid Build Coastguard Worker 
185*5e7646d2SAndroid Build Coastguard Worker static void
show_help(const char * command)186*5e7646d2SAndroid Build Coastguard Worker show_help(const char *command)		/* I - Command to describe or NULL */
187*5e7646d2SAndroid Build Coastguard Worker {
188*5e7646d2SAndroid Build Coastguard Worker   if (!command)
189*5e7646d2SAndroid Build Coastguard Worker   {
190*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stdout,
191*5e7646d2SAndroid Build Coastguard Worker                     _("Commands may be abbreviated.  Commands are:\n"
192*5e7646d2SAndroid Build Coastguard Worker 		      "\n"
193*5e7646d2SAndroid Build Coastguard Worker 		      "exit    help    quit    status  ?"));
194*5e7646d2SAndroid Build Coastguard Worker   }
195*5e7646d2SAndroid Build Coastguard Worker   else if (!compare_strings(command, "help", 1) || !strcmp(command, "?"))
196*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stdout, _("help\t\tGet help on commands."));
197*5e7646d2SAndroid Build Coastguard Worker   else if (!compare_strings(command, "status", 4))
198*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stdout, _("status\t\tShow status of daemon and queue."));
199*5e7646d2SAndroid Build Coastguard Worker   else
200*5e7646d2SAndroid Build Coastguard Worker     _cupsLangPrintf(stdout, _("?Invalid help command unknown."));
201*5e7646d2SAndroid Build Coastguard Worker }
202*5e7646d2SAndroid Build Coastguard Worker 
203*5e7646d2SAndroid Build Coastguard Worker 
204*5e7646d2SAndroid Build Coastguard Worker /*
205*5e7646d2SAndroid Build Coastguard Worker  * 'show_prompt()' - Show a localized prompt message.
206*5e7646d2SAndroid Build Coastguard Worker  */
207*5e7646d2SAndroid Build Coastguard Worker 
208*5e7646d2SAndroid Build Coastguard Worker static void
show_prompt(const char * message)209*5e7646d2SAndroid Build Coastguard Worker show_prompt(const char *message)	/* I - Message string to use */
210*5e7646d2SAndroid Build Coastguard Worker {
211*5e7646d2SAndroid Build Coastguard Worker   ssize_t	bytes;			/* Number of bytes formatted */
212*5e7646d2SAndroid Build Coastguard Worker   char		output[8192];		/* Message buffer */
213*5e7646d2SAndroid Build Coastguard Worker   cups_lang_t	*lang = cupsLangDefault();
214*5e7646d2SAndroid Build Coastguard Worker 					/* Default language */
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker  /*
217*5e7646d2SAndroid Build Coastguard Worker   * Transcode to the destination charset and write the prompt...
218*5e7646d2SAndroid Build Coastguard Worker   */
219*5e7646d2SAndroid Build Coastguard Worker 
220*5e7646d2SAndroid Build Coastguard Worker   if ((bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)_cupsLangString(lang, message), sizeof(output), lang->encoding)) > 0)
221*5e7646d2SAndroid Build Coastguard Worker   {
222*5e7646d2SAndroid Build Coastguard Worker     fwrite(output, 1, (size_t)bytes, stdout);
223*5e7646d2SAndroid Build Coastguard Worker     fflush(stdout);
224*5e7646d2SAndroid Build Coastguard Worker   }
225*5e7646d2SAndroid Build Coastguard Worker }
226*5e7646d2SAndroid Build Coastguard Worker 
227*5e7646d2SAndroid Build Coastguard Worker 
228*5e7646d2SAndroid Build Coastguard Worker /*
229*5e7646d2SAndroid Build Coastguard Worker  * 'show_status()' - Show printers.
230*5e7646d2SAndroid Build Coastguard Worker  */
231*5e7646d2SAndroid Build Coastguard Worker 
232*5e7646d2SAndroid Build Coastguard Worker static void
show_status(http_t * http,const char * dests)233*5e7646d2SAndroid Build Coastguard Worker show_status(http_t     *http,		/* I - HTTP connection to server */
234*5e7646d2SAndroid Build Coastguard Worker             const char *dests)		/* I - Destinations */
235*5e7646d2SAndroid Build Coastguard Worker {
236*5e7646d2SAndroid Build Coastguard Worker   ipp_t		*request,		/* IPP Request */
237*5e7646d2SAndroid Build Coastguard Worker 		*response;		/* IPP Response */
238*5e7646d2SAndroid Build Coastguard Worker   ipp_attribute_t *attr;		/* Current attribute */
239*5e7646d2SAndroid Build Coastguard Worker   char		*printer,		/* Printer name */
240*5e7646d2SAndroid Build Coastguard Worker 		*device,		/* Device URI */
241*5e7646d2SAndroid Build Coastguard Worker                 *delimiter;		/* Char search result */
242*5e7646d2SAndroid Build Coastguard Worker   ipp_pstate_t	pstate;			/* Printer state */
243*5e7646d2SAndroid Build Coastguard Worker   int		accepting;		/* Is printer accepting jobs? */
244*5e7646d2SAndroid Build Coastguard Worker   int		jobcount;		/* Count of current jobs */
245*5e7646d2SAndroid Build Coastguard Worker   const char	*dptr,			/* Pointer into destination list */
246*5e7646d2SAndroid Build Coastguard Worker 		*ptr;			/* Pointer into printer name */
247*5e7646d2SAndroid Build Coastguard Worker   int		match;			/* Non-zero if this job matches */
248*5e7646d2SAndroid Build Coastguard Worker   static const char *requested[] =	/* Requested attributes */
249*5e7646d2SAndroid Build Coastguard Worker 		{
250*5e7646d2SAndroid Build Coastguard Worker 		  "device-uri",
251*5e7646d2SAndroid Build Coastguard Worker 		  "printer-is-accepting-jobs",
252*5e7646d2SAndroid Build Coastguard Worker 		  "printer-name",
253*5e7646d2SAndroid Build Coastguard Worker 		  "printer-state",
254*5e7646d2SAndroid Build Coastguard Worker 		  "queued-job-count"
255*5e7646d2SAndroid Build Coastguard Worker 		};
256*5e7646d2SAndroid Build Coastguard Worker 
257*5e7646d2SAndroid Build Coastguard Worker 
258*5e7646d2SAndroid Build Coastguard Worker   if (http == NULL)
259*5e7646d2SAndroid Build Coastguard Worker     return;
260*5e7646d2SAndroid Build Coastguard Worker 
261*5e7646d2SAndroid Build Coastguard Worker  /*
262*5e7646d2SAndroid Build Coastguard Worker   * Build a CUPS_GET_PRINTERS request, which requires the following
263*5e7646d2SAndroid Build Coastguard Worker   * attributes:
264*5e7646d2SAndroid Build Coastguard Worker   *
265*5e7646d2SAndroid Build Coastguard Worker   *    attributes-charset
266*5e7646d2SAndroid Build Coastguard Worker   *    attributes-natural-language
267*5e7646d2SAndroid Build Coastguard Worker   */
268*5e7646d2SAndroid Build Coastguard Worker 
269*5e7646d2SAndroid Build Coastguard Worker   request = ippNewRequest(CUPS_GET_PRINTERS);
270*5e7646d2SAndroid Build Coastguard Worker 
271*5e7646d2SAndroid Build Coastguard Worker   ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
272*5e7646d2SAndroid Build Coastguard Worker                 "requested-attributes", sizeof(requested) / sizeof(requested[0]),
273*5e7646d2SAndroid Build Coastguard Worker 		NULL, requested);
274*5e7646d2SAndroid Build Coastguard Worker 
275*5e7646d2SAndroid Build Coastguard Worker  /*
276*5e7646d2SAndroid Build Coastguard Worker   * Do the request and get back a response...
277*5e7646d2SAndroid Build Coastguard Worker   */
278*5e7646d2SAndroid Build Coastguard Worker 
279*5e7646d2SAndroid Build Coastguard Worker   if ((response = cupsDoRequest(http, request, "/")) != NULL)
280*5e7646d2SAndroid Build Coastguard Worker   {
281*5e7646d2SAndroid Build Coastguard Worker    /*
282*5e7646d2SAndroid Build Coastguard Worker     * Loop through the printers returned in the list and display
283*5e7646d2SAndroid Build Coastguard Worker     * their status...
284*5e7646d2SAndroid Build Coastguard Worker     */
285*5e7646d2SAndroid Build Coastguard Worker 
286*5e7646d2SAndroid Build Coastguard Worker     for (attr = response->attrs; attr != NULL; attr = attr->next)
287*5e7646d2SAndroid Build Coastguard Worker     {
288*5e7646d2SAndroid Build Coastguard Worker      /*
289*5e7646d2SAndroid Build Coastguard Worker       * Skip leading attributes until we hit a job...
290*5e7646d2SAndroid Build Coastguard Worker       */
291*5e7646d2SAndroid Build Coastguard Worker 
292*5e7646d2SAndroid Build Coastguard Worker       while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
293*5e7646d2SAndroid Build Coastguard Worker         attr = attr->next;
294*5e7646d2SAndroid Build Coastguard Worker 
295*5e7646d2SAndroid Build Coastguard Worker       if (attr == NULL)
296*5e7646d2SAndroid Build Coastguard Worker         break;
297*5e7646d2SAndroid Build Coastguard Worker 
298*5e7646d2SAndroid Build Coastguard Worker      /*
299*5e7646d2SAndroid Build Coastguard Worker       * Pull the needed attributes from this job...
300*5e7646d2SAndroid Build Coastguard Worker       */
301*5e7646d2SAndroid Build Coastguard Worker 
302*5e7646d2SAndroid Build Coastguard Worker       printer   = NULL;
303*5e7646d2SAndroid Build Coastguard Worker       device    = "file:/dev/null";
304*5e7646d2SAndroid Build Coastguard Worker       pstate    = IPP_PRINTER_IDLE;
305*5e7646d2SAndroid Build Coastguard Worker       jobcount  = 0;
306*5e7646d2SAndroid Build Coastguard Worker       accepting = 1;
307*5e7646d2SAndroid Build Coastguard Worker 
308*5e7646d2SAndroid Build Coastguard Worker       while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
309*5e7646d2SAndroid Build Coastguard Worker       {
310*5e7646d2SAndroid Build Coastguard Worker         if (!strcmp(attr->name, "device-uri") &&
311*5e7646d2SAndroid Build Coastguard Worker 	    attr->value_tag == IPP_TAG_URI)
312*5e7646d2SAndroid Build Coastguard Worker 	  device = attr->values[0].string.text;
313*5e7646d2SAndroid Build Coastguard Worker         else if (!strcmp(attr->name, "printer-is-accepting-jobs") &&
314*5e7646d2SAndroid Build Coastguard Worker 	         attr->value_tag == IPP_TAG_BOOLEAN)
315*5e7646d2SAndroid Build Coastguard Worker 	  accepting = attr->values[0].boolean;
316*5e7646d2SAndroid Build Coastguard Worker         else if (!strcmp(attr->name, "printer-name") &&
317*5e7646d2SAndroid Build Coastguard Worker 	         attr->value_tag == IPP_TAG_NAME)
318*5e7646d2SAndroid Build Coastguard Worker 	  printer = attr->values[0].string.text;
319*5e7646d2SAndroid Build Coastguard Worker         else if (!strcmp(attr->name, "printer-state") &&
320*5e7646d2SAndroid Build Coastguard Worker 	         attr->value_tag == IPP_TAG_ENUM)
321*5e7646d2SAndroid Build Coastguard Worker 	  pstate = (ipp_pstate_t)attr->values[0].integer;
322*5e7646d2SAndroid Build Coastguard Worker         else if (!strcmp(attr->name, "queued-job-count") &&
323*5e7646d2SAndroid Build Coastguard Worker 	         attr->value_tag == IPP_TAG_INTEGER)
324*5e7646d2SAndroid Build Coastguard Worker 	  jobcount = attr->values[0].integer;
325*5e7646d2SAndroid Build Coastguard Worker 
326*5e7646d2SAndroid Build Coastguard Worker         attr = attr->next;
327*5e7646d2SAndroid Build Coastguard Worker       }
328*5e7646d2SAndroid Build Coastguard Worker 
329*5e7646d2SAndroid Build Coastguard Worker      /*
330*5e7646d2SAndroid Build Coastguard Worker       * See if we have everything needed...
331*5e7646d2SAndroid Build Coastguard Worker       */
332*5e7646d2SAndroid Build Coastguard Worker 
333*5e7646d2SAndroid Build Coastguard Worker       if (printer == NULL)
334*5e7646d2SAndroid Build Coastguard Worker       {
335*5e7646d2SAndroid Build Coastguard Worker         if (attr == NULL)
336*5e7646d2SAndroid Build Coastguard Worker 	  break;
337*5e7646d2SAndroid Build Coastguard Worker 	else
338*5e7646d2SAndroid Build Coastguard Worker           continue;
339*5e7646d2SAndroid Build Coastguard Worker       }
340*5e7646d2SAndroid Build Coastguard Worker 
341*5e7646d2SAndroid Build Coastguard Worker      /*
342*5e7646d2SAndroid Build Coastguard Worker       * A single 'all' printer name is special, meaning all printers.
343*5e7646d2SAndroid Build Coastguard Worker       */
344*5e7646d2SAndroid Build Coastguard Worker 
345*5e7646d2SAndroid Build Coastguard Worker       if (dests != NULL && !strcmp(dests, "all"))
346*5e7646d2SAndroid Build Coastguard Worker         dests = NULL;
347*5e7646d2SAndroid Build Coastguard Worker 
348*5e7646d2SAndroid Build Coastguard Worker      /*
349*5e7646d2SAndroid Build Coastguard Worker       * See if this is a printer we're interested in...
350*5e7646d2SAndroid Build Coastguard Worker       */
351*5e7646d2SAndroid Build Coastguard Worker 
352*5e7646d2SAndroid Build Coastguard Worker       match = dests == NULL;
353*5e7646d2SAndroid Build Coastguard Worker 
354*5e7646d2SAndroid Build Coastguard Worker       if (dests != NULL)
355*5e7646d2SAndroid Build Coastguard Worker       {
356*5e7646d2SAndroid Build Coastguard Worker         for (dptr = dests; *dptr != '\0';)
357*5e7646d2SAndroid Build Coastguard Worker 	{
358*5e7646d2SAndroid Build Coastguard Worker 	 /*
359*5e7646d2SAndroid Build Coastguard Worker 	  * Skip leading whitespace and commas...
360*5e7646d2SAndroid Build Coastguard Worker 	  */
361*5e7646d2SAndroid Build Coastguard Worker 
362*5e7646d2SAndroid Build Coastguard Worker 	  while (isspace(*dptr & 255) || *dptr == ',')
363*5e7646d2SAndroid Build Coastguard Worker 	    dptr ++;
364*5e7646d2SAndroid Build Coastguard Worker 
365*5e7646d2SAndroid Build Coastguard Worker 	  if (*dptr == '\0')
366*5e7646d2SAndroid Build Coastguard Worker 	    break;
367*5e7646d2SAndroid Build Coastguard Worker 
368*5e7646d2SAndroid Build Coastguard Worker          /*
369*5e7646d2SAndroid Build Coastguard Worker 	  * Compare names...
370*5e7646d2SAndroid Build Coastguard Worker 	  */
371*5e7646d2SAndroid Build Coastguard Worker 
372*5e7646d2SAndroid Build Coastguard Worker 	  for (ptr = printer;
373*5e7646d2SAndroid Build Coastguard Worker 	       *ptr != '\0' && *dptr != '\0' && *ptr == *dptr;
374*5e7646d2SAndroid Build Coastguard Worker 	       ptr ++, dptr ++)
375*5e7646d2SAndroid Build Coastguard Worker 	    /* do nothing */;
376*5e7646d2SAndroid Build Coastguard Worker 
377*5e7646d2SAndroid Build Coastguard Worker           if (*ptr == '\0' && (*dptr == '\0' || *dptr == ',' ||
378*5e7646d2SAndroid Build Coastguard Worker 	                       isspace(*dptr & 255)))
379*5e7646d2SAndroid Build Coastguard Worker 	  {
380*5e7646d2SAndroid Build Coastguard Worker 	    match = 1;
381*5e7646d2SAndroid Build Coastguard Worker 	    break;
382*5e7646d2SAndroid Build Coastguard Worker 	  }
383*5e7646d2SAndroid Build Coastguard Worker 
384*5e7646d2SAndroid Build Coastguard Worker          /*
385*5e7646d2SAndroid Build Coastguard Worker 	  * Skip trailing junk...
386*5e7646d2SAndroid Build Coastguard Worker 	  */
387*5e7646d2SAndroid Build Coastguard Worker 
388*5e7646d2SAndroid Build Coastguard Worker           while (!isspace(*dptr & 255) && *dptr != '\0')
389*5e7646d2SAndroid Build Coastguard Worker 	    dptr ++;
390*5e7646d2SAndroid Build Coastguard Worker 	  while (isspace(*dptr & 255) || *dptr == ',')
391*5e7646d2SAndroid Build Coastguard Worker 	    dptr ++;
392*5e7646d2SAndroid Build Coastguard Worker 
393*5e7646d2SAndroid Build Coastguard Worker 	  if (*dptr == '\0')
394*5e7646d2SAndroid Build Coastguard Worker 	    break;
395*5e7646d2SAndroid Build Coastguard Worker         }
396*5e7646d2SAndroid Build Coastguard Worker       }
397*5e7646d2SAndroid Build Coastguard Worker 
398*5e7646d2SAndroid Build Coastguard Worker      /*
399*5e7646d2SAndroid Build Coastguard Worker       * Display the printer entry if needed...
400*5e7646d2SAndroid Build Coastguard Worker       */
401*5e7646d2SAndroid Build Coastguard Worker 
402*5e7646d2SAndroid Build Coastguard Worker       if (match)
403*5e7646d2SAndroid Build Coastguard Worker       {
404*5e7646d2SAndroid Build Coastguard Worker        /*
405*5e7646d2SAndroid Build Coastguard Worker         * Display it...
406*5e7646d2SAndroid Build Coastguard Worker 	*/
407*5e7646d2SAndroid Build Coastguard Worker 
408*5e7646d2SAndroid Build Coastguard Worker         printf("%s:\n", printer);
409*5e7646d2SAndroid Build Coastguard Worker 	if (!strncmp(device, "file:", 5))
410*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPrintf(stdout,
411*5e7646d2SAndroid Build Coastguard Worker 	                  _("\tprinter is on device \'%s\' speed -1"),
412*5e7646d2SAndroid Build Coastguard Worker 			  device + 5);
413*5e7646d2SAndroid Build Coastguard Worker 	else
414*5e7646d2SAndroid Build Coastguard Worker 	{
415*5e7646d2SAndroid Build Coastguard Worker 	 /*
416*5e7646d2SAndroid Build Coastguard Worker 	  * Just show the scheme...
417*5e7646d2SAndroid Build Coastguard Worker 	  */
418*5e7646d2SAndroid Build Coastguard Worker 
419*5e7646d2SAndroid Build Coastguard Worker 	  if ((delimiter = strchr(device, ':')) != NULL )
420*5e7646d2SAndroid Build Coastguard Worker 	  {
421*5e7646d2SAndroid Build Coastguard Worker 	    *delimiter = '\0';
422*5e7646d2SAndroid Build Coastguard Worker 	    _cupsLangPrintf(stdout,
423*5e7646d2SAndroid Build Coastguard Worker 	                    _("\tprinter is on device \'%s\' speed -1"),
424*5e7646d2SAndroid Build Coastguard Worker 			    device);
425*5e7646d2SAndroid Build Coastguard Worker 	  }
426*5e7646d2SAndroid Build Coastguard Worker 	}
427*5e7646d2SAndroid Build Coastguard Worker 
428*5e7646d2SAndroid Build Coastguard Worker         if (accepting)
429*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPuts(stdout, _("\tqueuing is enabled"));
430*5e7646d2SAndroid Build Coastguard Worker 	else
431*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPuts(stdout, _("\tqueuing is disabled"));
432*5e7646d2SAndroid Build Coastguard Worker 
433*5e7646d2SAndroid Build Coastguard Worker         if (pstate != IPP_PRINTER_STOPPED)
434*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPuts(stdout, _("\tprinting is enabled"));
435*5e7646d2SAndroid Build Coastguard Worker 	else
436*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPuts(stdout, _("\tprinting is disabled"));
437*5e7646d2SAndroid Build Coastguard Worker 
438*5e7646d2SAndroid Build Coastguard Worker 	if (jobcount == 0)
439*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPuts(stdout, _("\tno entries"));
440*5e7646d2SAndroid Build Coastguard Worker 	else
441*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPrintf(stdout, _("\t%d entries"), jobcount);
442*5e7646d2SAndroid Build Coastguard Worker 
443*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPuts(stdout, _("\tdaemon present"));
444*5e7646d2SAndroid Build Coastguard Worker       }
445*5e7646d2SAndroid Build Coastguard Worker 
446*5e7646d2SAndroid Build Coastguard Worker       if (attr == NULL)
447*5e7646d2SAndroid Build Coastguard Worker         break;
448*5e7646d2SAndroid Build Coastguard Worker     }
449*5e7646d2SAndroid Build Coastguard Worker 
450*5e7646d2SAndroid Build Coastguard Worker     ippDelete(response);
451*5e7646d2SAndroid Build Coastguard Worker   }
452*5e7646d2SAndroid Build Coastguard Worker }
453