/*
- * "$Id: lpq.c 6649 2007-07-11 21:46:42Z mike $"
+ * "lpq" command for CUPS.
*
- * "lpq" command for the Common UNIX Printing System (CUPS).
+ * Copyright 2007-2018 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
*
- * Copyright 2007-2008 by Apple Inc.
- * Copyright 1997-2006 by Easy Software Products.
- *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law. Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file. If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * Contents:
- *
- * main() - Parse options and commands.
- * show_jobs() - Show jobs.
- * show_printer() - Show printer status.
- * usage() - Show program usage.
+ * These coded instructions, statements, and computer programs are the
+ * property of Apple Inc. and are protected by Federal copyright
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
+ * which should have been included with this file. If this file is
+ * missing or damaged, see the license at "http://www.cups.org/".
*/
/*
* Include necessary headers...
*/
-/*
- * Include necessary headers...
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <cups/string.h>
-#include <cups/cups.h>
-#include <cups/i18n.h>
-#include <cups/debug.h>
+#include <cups/cups-private.h>
/*
static int show_jobs(const char *, http_t *, const char *,
const char *, const int, const int);
static void show_printer(const char *, http_t *, const char *);
-static void usage(void);
+static void usage(void) _CUPS_NORETURN;
/*
{
int i; /* Looping var */
http_t *http; /* Connection to server */
- const char *dest, /* Desired printer */
+ const char *opt, /* Option pointer */
+ *dest, /* Desired printer */
*user, /* Desired user */
*val; /* Environment variable name */
char *instance; /* Printer instance */
all, /* All printers */
interval, /* Reporting interval */
longstatus; /* Show file details */
- int num_dests; /* Number of destinations */
- cups_dest_t *dests; /* Destinations */
+ cups_dest_t *named_dest; /* Named destination */
_cupsSetLocale(argv);
interval = 0;
longstatus = 0;
all = 0;
- num_dests = 0;
- dests = NULL;
for (i = 1; i < argc; i ++)
+ {
if (argv[i][0] == '+')
+ {
interval = atoi(argv[i] + 1);
+ }
else if (argv[i][0] == '-')
{
- switch (argv[i][1])
+ for (opt = argv[i] + 1; *opt; opt ++)
{
- case 'E' : /* Encrypt */
+ switch (*opt)
+ {
+ case 'E' : /* Encrypt */
#ifdef HAVE_SSL
- cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
+ cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
- if (http)
- httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
+ if (http)
+ httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
#else
- _cupsLangPrintf(stderr,
- _("%s: Sorry, no encryption support compiled in!\n"),
- argv[0]);
+ _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
#endif /* HAVE_SSL */
- break;
-
- case 'U' : /* Username */
- if (argv[i][2] != '\0')
- cupsSetUser(argv[i] + 2);
- else
- {
- i ++;
- if (i >= argc)
+ break;
+
+ case 'U' : /* Username */
+ if (opt[1] != '\0')
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected username after "
- "\'-U\' option!\n"),
- argv[0]);
- return (1);
+ cupsSetUser(opt + 1);
+ opt += strlen(opt) - 1;
}
+ else
+ {
+ i ++;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
+ return (1);
+ }
+
+ cupsSetUser(argv[i]);
+ }
+ break;
- cupsSetUser(argv[i]);
- }
- break;
-
- case 'P' : /* Printer */
- if (argv[i][2])
- dest = argv[i] + 2;
- else
- {
- i ++;
-
- if (i >= argc)
+ case 'P' : /* Printer */
+ if (opt[1] != '\0')
{
- httpClose(http);
- cupsFreeDests(num_dests, dests);
-
- usage();
+ dest = opt + 1;
+ opt += strlen(opt) - 1;
}
+ else
+ {
+ i ++;
- dest = argv[i];
- }
+ if (i >= argc)
+ {
+ httpClose(http);
- if ((instance = strchr(dest, '/')) != NULL)
- *instance++ = '\0';
+ usage();
+ }
- http = connect_server(argv[0], http);
+ dest = argv[i];
+ }
- if (num_dests == 0)
- num_dests = cupsGetDests2(http, &dests);
+ if ((instance = strchr(dest, '/')) != NULL)
+ *instance++ = '\0';
- if (cupsGetDest(dest, instance, num_dests, dests) == NULL)
- {
- if (instance)
- _cupsLangPrintf(stderr,
- _("%s: Error - unknown destination \"%s/%s\"!\n"),
- argv[0], dest, instance);
- else
- _cupsLangPrintf(stderr,
- _("%s: Unknown destination \"%s\"!\n"),
- argv[0], dest);
+ http = connect_server(argv[0], http);
- return (1);
- }
- break;
+ if ((named_dest = cupsGetNamedDest(http, dest, instance)) == NULL)
+ {
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
+ _cupsLangPrintf(stderr, _("%s: Error - add '/version=1.1' to server name."), argv[0]);
+ else if (instance)
+ _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s/%s\"."), argv[0], dest, instance);
+ else
+ _cupsLangPrintf(stderr, _("%s: Unknown destination \"%s\"."), argv[0], dest);
- case 'a' : /* All printers */
- all = 1;
- break;
+ return (1);
+ }
- case 'h' : /* Connect to host */
- if (http)
- {
- httpClose(http);
- http = NULL;
- }
+ cupsFreeDests(1, named_dest);
+ break;
- if (argv[i][2] != '\0')
- cupsSetServer(argv[i] + 2);
- else
- {
- i ++;
+ case 'a' : /* All printers */
+ all = 1;
+ break;
- if (i >= argc)
+ case 'h' : /* Connect to host */
+ if (http)
{
- _cupsLangPrintf(stderr,
- _("%s: Error - expected hostname after "
- "\'-h\' option!\n"),
- argv[0]);
- return (1);
- }
+ httpClose(http);
+ http = NULL;
+ }
+
+ if (opt[1] != '\0')
+ {
+ cupsSetServer(opt + 1);
+ opt += strlen(opt) - 1;
+ }
else
- cupsSetServer(argv[i]);
- }
- break;
+ {
+ i ++;
- case 'l' : /* Long status */
- longstatus = 1;
- break;
+ if (i >= argc)
+ {
+ _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]);
+ return (1);
+ }
+ else
+ cupsSetServer(argv[i]);
+ }
+ break;
- default :
- httpClose(http);
- cupsFreeDests(num_dests, dests);
+ case 'l' : /* Long status */
+ longstatus = 1;
+ break;
- usage();
- break;
+ default :
+ httpClose(http);
+
+ usage();
+ }
}
}
else if (isdigit(argv[i][0] & 255))
+ {
id = atoi(argv[i]);
+ }
else
+ {
user = argv[i];
+ }
+ }
http = connect_server(argv[0], http);
if (dest == NULL && !all)
{
- if (num_dests == 0)
- num_dests = cupsGetDests2(http, &dests);
-
- for (i = 0; i < num_dests; i ++)
- if (dests[i].is_default)
- dest = dests[i].name;
-
- if (dest == NULL)
+ if ((named_dest = cupsGetNamedDest(http, NULL, NULL)) == NULL)
{
+ if (cupsLastError() == IPP_STATUS_ERROR_BAD_REQUEST ||
+ cupsLastError() == IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED)
+ {
+ _cupsLangPrintf(stderr,
+ _("%s: Error - add '/version=1.1' to server name."),
+ argv[0]);
+ return (1);
+ }
+
val = NULL;
if ((dest = getenv("LPDEST")) == NULL)
else
val = "LPDEST";
- if (dest && !cupsGetDest(dest, NULL, num_dests, dests))
+ if (dest && val)
_cupsLangPrintf(stderr,
- _("%s: error - %s environment variable names "
- "non-existent destination \"%s\"!\n"),
- argv[0], val, dest);
+ _("%s: Error - %s environment variable names "
+ "non-existent destination \"%s\"."), argv[0], val,
+ dest);
else
_cupsLangPrintf(stderr,
- _("%s: error - no default destination available.\n"),
+ _("%s: Error - no default destination available."),
argv[0]);
httpClose(http);
- cupsFreeDests(num_dests, dests);
return (1);
}
+
+ dest = named_dest->name;
}
/*
if (i && interval)
{
fflush(stdout);
- sleep(interval);
+ sleep((unsigned)interval);
}
else
break;
* Close the connection to the server and return...
*/
- cupsFreeDests(num_dests, dests);
httpClose(http);
return (0);
if (http == NULL)
{
- _cupsLangPrintf(stderr, _("%s: Unable to connect to server\n"), command);
+ _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), command);
exit(1);
}
}
ipp_jstate_t jobstate; /* job-state */
int jobid, /* job-id */
jobsize, /* job-k-octets */
-#ifdef __osf__
- jobpriority, /* job-priority */
-#endif /* __osf__ */
jobcount, /* Number of jobs */
jobcopies, /* Number of copies */
rank; /* Rank of job */
char resource[1024]; /* Resource string */
char rankstr[255]; /* Rank string */
char namestr[1024]; /* Job name string */
- static const char *ranks[10] = /* Ranking strings */
+ static const char * const jobattrs[] =/* Job attributes we want to see */
+ {
+ "copies",
+ "job-id",
+ "job-k-octets",
+ "job-name",
+ "job-originating-user-name",
+ "job-printer-uri",
+ "job-priority",
+ "job-state"
+ };
+ static const char * const ranks[10] = /* Ranking strings */
{
"th",
"st",
* attributes-charset
* attributes-natural-language
* job-uri or printer-uri
+ * requested-attributes
+ * requesting-user-name
*/
request = ippNewRequest(id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS);
- if (dest == NULL)
+ if (id)
{
- if (id)
- sprintf(resource, "ipp://localhost/jobs/%d", id);
- else
- strcpy(resource, "ipp://localhost/jobs");
-
+ snprintf(resource, sizeof(resource), "ipp://localhost/jobs/%d", id);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
NULL, resource);
}
- else
+ else if (dest)
{
httpAssembleURIf(HTTP_URI_CODING_ALL, resource, sizeof(resource), "ipp",
NULL, "localhost", 0, "/printers/%s", dest);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, resource);
}
+ else
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+ NULL, "ipp://localhost/");
if (user)
{
"requesting-user-name", NULL, user);
ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
}
+ else
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
+ "requesting-user-name", NULL, cupsUser());
+
+ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+ "requested-attributes",
+ (int)(sizeof(jobattrs) / sizeof(jobattrs[0])), NULL, jobattrs);
/*
* Do the request and get back a response...
{
if (response->request.status.status_code > IPP_OK_CONFLICT)
{
- _cupsLangPrintf(stderr, "%s: %s\n", command, cupsLastErrorString());
+ _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
ippDelete(response);
return (0);
}
jobid = 0;
jobsize = 0;
-#ifdef __osf__
- jobpriority = 50;
-#endif /* __osf__ */
jobstate = IPP_JOB_PENDING;
- jobname = "untitled";
- jobuser = NULL;
+ jobname = "unknown";
+ jobuser = "unknown";
jobdest = NULL;
jobcopies = 1;
attr->value_tag == IPP_TAG_INTEGER)
jobsize = attr->values[0].integer;
-#ifdef __osf__
- if (!strcmp(attr->name, "job-priority") &&
- attr->value_tag == IPP_TAG_INTEGER)
- jobpriority = attr->values[0].integer;
-#endif /* __osf__ */
-
if (!strcmp(attr->name, "job-state") &&
attr->value_tag == IPP_TAG_ENUM)
jobstate = (ipp_jstate_t)attr->values[0].integer;
}
if (!longstatus && jobcount == 0)
-#ifdef __osf__
- _cupsLangPuts(stdout,
- _("Rank Owner Pri Job Files"
- " Total Size\n"));
-#else
_cupsLangPuts(stdout,
_("Rank Owner Job File(s)"
- " Total Size\n"));
-#endif /* __osf__ */
+ " Total Size"));
jobcount ++;
*/
if (jobstate == IPP_JOB_PROCESSING)
- strcpy(rankstr, "active");
+ strlcpy(rankstr, "active", sizeof(rankstr));
else
{
/*
else
strlcpy(namestr, jobname, sizeof(namestr));
- _cupsLangPrintf(stdout, _("%s: %-33.33s [job %d localhost]\n"),
+ _cupsLangPrintf(stdout, _("%s: %-33.33s [job %d localhost]"),
jobuser, rankstr, jobid);
- _cupsLangPrintf(stdout, _(" %-39.39s %.0f bytes\n"),
+ _cupsLangPrintf(stdout, _(" %-39.39s %.0f bytes"),
namestr, 1024.0 * jobsize);
}
else
-#ifdef __osf__
- _cupsLangPrintf(stdout,
- _("%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"),
- rankstr, jobuser, jobpriority, jobid, jobname,
- 1024.0 * jobsize);
-#else
_cupsLangPrintf(stdout,
- _("%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"),
+ _("%-7s %-7.7s %-7d %-31.31s %.0f bytes"),
rankstr, jobuser, jobid, jobname, 1024.0 * jobsize);
-#endif /* __osf */
if (attr == NULL)
break;
}
else
{
- _cupsLangPrintf(stderr, "%s: %s\n", command, cupsLastErrorString());
+ _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
return (0);
}
if (jobcount == 0)
- _cupsLangPuts(stdout, _("no entries\n"));
+ _cupsLangPuts(stdout, _("no entries"));
return (jobcount);
}
{
if (response->request.status.status_code > IPP_OK_CONFLICT)
{
- _cupsLangPrintf(stderr, "%s: %s\n", command, cupsLastErrorString());
+ _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
ippDelete(response);
return;
}
switch (state)
{
case IPP_PRINTER_IDLE :
- _cupsLangPrintf(stdout, _("%s is ready\n"), dest);
+ _cupsLangPrintf(stdout, _("%s is ready"), dest);
break;
case IPP_PRINTER_PROCESSING :
- _cupsLangPrintf(stdout, _("%s is ready and printing\n"),
+ _cupsLangPrintf(stdout, _("%s is ready and printing"),
dest);
break;
case IPP_PRINTER_STOPPED :
- _cupsLangPrintf(stdout, _("%s is not ready\n"), dest);
+ _cupsLangPrintf(stdout, _("%s is not ready"), dest);
break;
}
ippDelete(response);
}
else
- _cupsLangPrintf(stderr, "%s: %s\n", command, cupsLastErrorString());
+ _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
}
{
_cupsLangPuts(stderr,
_("Usage: lpq [-P dest] [-U username] [-h hostname[:port]] "
- "[-l] [+interval]\n"));
+ "[-l] [+interval]"));
exit(1);
}
-
-
-/*
- * End of "$Id: lpq.c 6649 2007-07-11 21:46:42Z mike $".
- */