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