]>
git.ipfire.org Git - thirdparty/cups.git/blob - berkeley/lpc.c
2 * "$Id: lpc.c 5023 2006-01-29 14:39:44Z mike $"
4 * "lpc" command for the Common UNIX Printing System (CUPS).
6 * Copyright 1997-2006 by Easy Software Products.
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE.txt" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
20 * Voice: (301) 373-9600
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
26 * main() - Parse options and commands.
27 * compare_strings() - Compare two command-line strings.
28 * do_command() - Do an lpc command...
29 * show_help() - Show help messages.
30 * show_status() - Show printers.
34 * Include necessary headers...
39 #include <cups/cups.h>
40 #include <cups/i18n.h>
41 #include <cups/debug.h>
42 #include <cups/string.h>
49 static int compare_strings(const char *, const char *, int);
50 static void do_command(http_t
*, const char *, const char *);
51 static void show_help(const char *);
52 static void show_status(http_t
*, const char *);
56 * 'main()' - Parse options and commands.
60 main(int argc
, /* I - Number of command-line arguments */
61 char *argv
[]) /* I - Command-line arguments */
63 http_t
*http
; /* Connection to server */
64 char line
[1024], /* Input line from user */
65 *params
; /* Pointer to parameters */
69 * Connect to the scheduler...
72 http
= httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
77 * Process a single command on the command-line...
80 do_command(http
, argv
[1], argv
[2]);
85 * Do the command prompt thing...
88 _cupsLangPuts(stdout
, _("lpc> "));
89 while (fgets(line
, sizeof(line
), stdin
) != NULL
)
92 * Strip trailing whitespace...
95 for (params
= line
+ strlen(line
) - 1; params
>= line
;)
96 if (!isspace(*params
& 255))
102 * Strip leading whitespace...
105 for (params
= line
; isspace(*params
& 255); params
++);
108 _cups_strcpy(line
, params
);
113 * Nothing left, just show a prompt...
116 _cupsLangPuts(stdout
, _("lpc> "));
121 * Find any options in the string...
124 for (params
= line
; *params
!= '\0'; params
++)
125 if (isspace(*params
& 255))
129 * Remove whitespace between the command and parameters...
132 while (isspace(*params
& 255))
136 * The "quit" and "exit" commands exit; otherwise, process as needed...
139 if (!compare_strings(line
, "quit", 1) ||
140 !compare_strings(line
, "exit", 2))
144 do_command(http
, line
, NULL
);
146 do_command(http
, line
, params
);
149 * Put another prompt out to the user...
152 _cupsLangPuts(stdout
, _("lpc> "));
157 * Close the connection to the server and return...
167 * 'compare_strings()' - Compare two command-line strings.
170 static int /* O - -1 or 1 = no match, 0 = match */
171 compare_strings(const char *s
, /* I - Command-line string */
172 const char *t
, /* I - Option string */
173 int tmin
) /* I - Minimum number of unique chars in option */
175 int slen
; /* Length of command-line string */
182 return (strncmp(s
, t
, slen
));
187 * 'do_command()' - Do an lpc command...
191 do_command(http_t
*http
, /* I - HTTP connection to server */
192 const char *command
, /* I - Command string */
193 const char *params
) /* I - Parameters for command */
195 if (!compare_strings(command
, "status", 4))
196 show_status(http
, params
);
197 else if (!compare_strings(command
, "help", 1) || !strcmp(command
, "?"))
200 _cupsLangPrintf(stdout
,
201 _("%s is not implemented by the CUPS version of lpc.\n"),
207 * 'show_help()' - Show help messages.
211 show_help(const char *command
) /* I - Command to describe or NULL */
215 _cupsLangPrintf(stdout
,
216 _("Commands may be abbreviated. Commands are:\n"
218 "exit help quit status ?\n"));
220 else if (!compare_strings(command
, "help", 1) || !strcmp(command
, "?"))
221 _cupsLangPrintf(stdout
, _("help\t\tget help on commands\n"));
222 else if (!compare_strings(command
, "status", 4))
223 _cupsLangPrintf(stdout
, _("status\t\tshow status of daemon and queue\n"));
225 _cupsLangPrintf(stdout
, _("?Invalid help command unknown\n"));
230 * 'show_status()' - Show printers.
234 show_status(http_t
*http
, /* I - HTTP connection to server */
235 const char *dests
) /* I - Destinations */
237 ipp_t
*request
, /* IPP Request */
238 *response
, /* IPP Response */
239 *jobs
; /* IPP Get Jobs response */
240 ipp_attribute_t
*attr
, /* Current attribute */
241 *jattr
; /* Current job attribute */
242 cups_lang_t
*language
; /* Default language */
243 char *printer
, /* Printer name */
244 *device
, /* Device URI */
245 *delimiter
; /* Char search result */
246 ipp_pstate_t pstate
; /* Printer state */
247 int accepting
; /* Is printer accepting jobs? */
248 int jobcount
; /* Count of current jobs */
249 const char *dptr
, /* Pointer into destination list */
250 *ptr
; /* Pointer into printer name */
251 int match
; /* Non-zero if this job matches */
252 char printer_uri
[HTTP_MAX_URI
];
254 static const char *requested
[] = /* Requested attributes */
259 "printer-is-accepting-jobs"
263 DEBUG_printf(("show_status(http=%p, dests=\"%s\")\n", http
, dests
));
269 * Build a CUPS_GET_PRINTERS request, which requires the following
273 * attributes-natural-language
278 request
->request
.op
.operation_id
= CUPS_GET_PRINTERS
;
279 request
->request
.op
.request_id
= 1;
281 language
= cupsLangDefault();
283 ippAddString(request
, IPP_TAG_OPERATION
, IPP_TAG_CHARSET
,
284 "attributes-charset", NULL
, cupsLangEncoding(language
));
286 ippAddString(request
, IPP_TAG_OPERATION
, IPP_TAG_LANGUAGE
,
287 "attributes-natural-language", NULL
, language
->language
);
289 ippAddStrings(request
, IPP_TAG_OPERATION
, IPP_TAG_KEYWORD
,
290 "requested-attributes", sizeof(requested
) / sizeof(requested
[0]),
294 * Do the request and get back a response...
297 if ((response
= cupsDoRequest(http
, request
, "/")) != NULL
)
299 DEBUG_puts("show_status: request succeeded...");
302 * Loop through the printers returned in the list and display
306 for (attr
= response
->attrs
; attr
!= NULL
; attr
= attr
->next
)
309 * Skip leading attributes until we hit a job...
312 while (attr
!= NULL
&& attr
->group_tag
!= IPP_TAG_PRINTER
)
319 * Pull the needed attributes from this job...
323 device
= "file:/dev/null";
324 pstate
= IPP_PRINTER_IDLE
;
328 while (attr
!= NULL
&& attr
->group_tag
== IPP_TAG_PRINTER
)
330 if (!strcmp(attr
->name
, "printer-name") &&
331 attr
->value_tag
== IPP_TAG_NAME
)
332 printer
= attr
->values
[0].string
.text
;
334 if (!strcmp(attr
->name
, "device-uri") &&
335 attr
->value_tag
== IPP_TAG_URI
)
336 device
= attr
->values
[0].string
.text
;
338 if (!strcmp(attr
->name
, "printer-state") &&
339 attr
->value_tag
== IPP_TAG_ENUM
)
340 pstate
= (ipp_pstate_t
)attr
->values
[0].integer
;
342 if (!strcmp(attr
->name
, "printer-is-accepting-jobs") &&
343 attr
->value_tag
== IPP_TAG_BOOLEAN
)
344 accepting
= attr
->values
[0].boolean
;
350 * See if we have everything needed...
362 * A single 'all' printer name is special, meaning all printers.
365 if (dests
!= NULL
&& !strcmp(dests
, "all"))
369 * See if this is a printer we're interested in...
372 match
= dests
== NULL
;
376 for (dptr
= dests
; *dptr
!= '\0';)
379 * Skip leading whitespace and commas...
382 while (isspace(*dptr
& 255) || *dptr
== ',')
393 *ptr
!= '\0' && *dptr
!= '\0' && *ptr
== *dptr
;
396 if (*ptr
== '\0' && (*dptr
== '\0' || *dptr
== ',' || isspace(*dptr
& 255)))
403 * Skip trailing junk...
406 while (!isspace(*dptr
& 255) && *dptr
!= '\0')
408 while (isspace(*dptr
& 255) || *dptr
== ',')
417 * Display the printer entry if needed...
423 * Build an IPP_GET_JOBS request, which requires the following
427 * attributes-natural-language
434 request
->request
.op
.operation_id
= IPP_GET_JOBS
;
435 request
->request
.op
.request_id
= 1;
437 language
= cupsLangDefault();
439 ippAddString(request
, IPP_TAG_OPERATION
, IPP_TAG_CHARSET
,
440 "attributes-charset", NULL
,
441 cupsLangEncoding(language
));
443 ippAddString(request
, IPP_TAG_OPERATION
, IPP_TAG_LANGUAGE
,
444 "attributes-natural-language", NULL
,
447 httpAssembleURIf(HTTP_URI_CODING_ALL
, printer_uri
, sizeof(printer_uri
),
448 "ipp", NULL
, "localhost", 631, "/printers/%s",
450 ippAddString(request
, IPP_TAG_OPERATION
, IPP_TAG_URI
,
451 "printer-uri", NULL
, printer_uri
);
453 ippAddString(request
, IPP_TAG_OPERATION
, IPP_TAG_KEYWORD
,
454 "requested-attributes", NULL
, "job-id");
456 if ((jobs
= cupsDoRequest(http
, request
, "/")) != NULL
)
459 * Grab the number of jobs for the printer.
462 for (jattr
= jobs
->attrs
; jattr
!= NULL
; jattr
= jattr
->next
)
463 if (jattr
->name
&& !strcmp(jattr
->name
, "job-id"))
473 printf("%s:\n", printer
);
474 if (!strncmp(device
, "file:", 5))
475 _cupsLangPrintf(stdout
,
476 _("\tprinter is on device \'%s\' speed -1\n"),
481 * Just show the scheme...
484 if ((delimiter
= strchr(device
, ':')) != NULL
)
487 _cupsLangPrintf(stdout
,
488 _("\tprinter is on device \'%s\' speed -1\n"),
494 _cupsLangPuts(stdout
, _("\tqueuing is enabled\n"));
496 _cupsLangPuts(stdout
, _("\tqueuing is disabled\n"));
498 if (pstate
!= IPP_PRINTER_STOPPED
)
499 _cupsLangPuts(stdout
, _("\tprinting is enabled\n"));
501 _cupsLangPuts(stdout
, _("\tprinting is disabled\n"));
504 _cupsLangPuts(stdout
, _("\tno entries\n"));
506 _cupsLangPrintf(stdout
, _("\t%d entries\n"), jobcount
);
508 _cupsLangPuts(stdout
, _("\tdaemon present\n"));
521 * End of "$Id: lpc.c 5023 2006-01-29 14:39:44Z mike $".