/*
- * "$Id: lpq.c 4948 2006-01-19 03:23:41Z mike $"
+ * "$Id: lpq.c 7460 2008-04-16 02:19:54Z mike $"
*
- * "lpq" command for the Common UNIX Printing System (CUPS).
+ * "lpq" command for CUPS.
*
+ * Copyright 2007-2011 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
- * property of Easy Software Products 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 please contact Easy Software Products
- * at:
- *
- * Attn: CUPS Licensing Information
- * Easy Software Products
- * 44141 Airport View Drive, Suite 204
- * Hollywood, Maryland 20636 USA
- *
- * Voice: (301) 373-9600
- * EMail: cups-info@cups.org
- * WWW: http://www.cups.org
+ * 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:
*
* 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>
/*
* Local functions...
*/
+static http_t *connect_server(const char *, http_t *);
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 *);
longstatus; /* Show file details */
int num_dests; /* Number of destinations */
cups_dest_t *dests; /* Destinations */
- cups_lang_t *language; /* Language */
-#ifdef HAVE_SSL
- http_encryption_t encryption; /* Encryption? */
-#endif /* HAVE_SSL */
- language = cupsLangDefault();
-
- /*
- * Connect to the scheduler...
- */
-
- if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
- cupsEncryption())) == NULL)
- {
- _cupsLangPrintf(stderr, _("%s: Unable to contact server!\n"), argv[0]);
- return (1);
- }
+ _cupsSetLocale(argv);
/*
* Check for command-line options...
*/
+ http = NULL;
dest = NULL;
user = NULL;
id = 0;
interval = 0;
longstatus = 0;
all = 0;
- num_dests = cupsGetDests(&dests);
+ num_dests = 0;
+ dests = NULL;
for (i = 1; i < argc; i ++)
if (argv[i][0] == '+')
{
case 'E' : /* Encrypt */
#ifdef HAVE_SSL
- encryption = HTTP_ENCRYPT_REQUIRED;
+ cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
if (http)
- httpEncryption(http, encryption);
+ httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
#else
- _cupsLangPrintf(stderr,
- _("%s: Sorry, no encryption support compiled in!\n"),
+ _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."),
argv[0]);
#endif /* HAVE_SSL */
break;
{
_cupsLangPrintf(stderr,
_("%s: Error - expected username after "
- "\'-U\' option!\n"),
- argv[0]);
+ "\"-U\" option."), argv[0]);
return (1);
}
cupsSetUser(argv[i]);
}
break;
-
+
case 'P' : /* Printer */
if (argv[i][2])
dest = argv[i] + 2;
{
httpClose(http);
cupsFreeDests(num_dests, dests);
-
+
usage();
}
if ((instance = strchr(dest, '/')) != NULL)
*instance++ = '\0';
+ http = connect_server(argv[0], http);
+
+ if (num_dests == 0)
+ num_dests = cupsGetDests2(http, &dests);
+
if (cupsGetDest(dest, instance, num_dests, dests) == NULL)
{
if (instance)
_cupsLangPrintf(stderr,
- _("%s: Error - unknown destination \"%s/%s\"!\n"),
+ _("%s: Error - unknown destination \"%s/%s\"."),
argv[0], dest, instance);
else
- _cupsLangPrintf(stderr,
- _("%s: Unknown destination \"%s\"!\n"),
+ _cupsLangPrintf(stderr, _("%s: Unknown destination \"%s\"."),
argv[0], dest);
return (1);
break;
case 'h' : /* Connect to host */
- if (http != NULL)
+ if (http)
+ {
httpClose(http);
+ http = NULL;
+ }
if (argv[i][2] != '\0')
cupsSetServer(argv[i] + 2);
{
_cupsLangPrintf(stderr,
_("%s: Error - expected hostname after "
- "\'-h\' option!\n"),
- argv[0]);
+ "\"-h\" option."), argv[0]);
return (1);
}
else
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 && !cupsGetDest(dest, NULL, num_dests, dests))
_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);
}
+/*
+ * 'connect_server()' - Connect to the server as necessary...
+ */
+
+static http_t * /* O - New HTTP connection */
+connect_server(const char *command, /* I - Command name */
+ http_t *http) /* I - Current HTTP connection */
+{
+ if (!http)
+ {
+ http = httpConnectEncrypt(cupsServer(), ippPort(),
+ cupsEncryption());
+
+ if (http == NULL)
+ {
+ _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), command);
+ exit(1);
+ }
+ }
+
+ return (http);
+}
+
+
/*
* 'show_jobs()' - Show jobs.
*/
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",
};
- DEBUG_printf(("show_jobs(%08x, %08x, %08x, %d, %d)\n", http, dest, user, id,
- longstatus));
+ DEBUG_printf(("show_jobs(http=%p, dest=%p, user=%p, id=%d, longstatus%d)\n",
+ http, dest, user, id, longstatus));
if (http == NULL)
return (0);
* attributes-charset
* attributes-natural-language
* job-uri or printer-uri
+ * requested-attributes
*/
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(resource, sizeof(resource), "ipp", NULL, "localhost", 0,
- "/printers/%s", 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)
{
ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
}
+ 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);
}
if (!longstatus && jobcount == 0)
#ifdef __osf__
_cupsLangPuts(stdout,
+ /* TRANSLATORS: Pri is job priority. */
_("Rank Owner Pri Job Files"
- " Total Size\n"));
+ " Total Size"));
#else
_cupsLangPuts(stdout,
_("Rank Owner Job File(s)"
- " Total Size\n"));
+ " Total Size"));
#endif /* __osf__ */
jobcount ++;
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"),
+ _("%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"),
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 */
}
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);
}
request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
- httpAssembleURIf(uri, sizeof(uri), "ipp", NULL, "localhost", 0,
- "/printers/%s", dest);
+ httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+ "localhost", 0, "/printers/%s", dest);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
{
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 4948 2006-01-19 03:23:41Z mike $".
+ * End of "$Id: lpq.c 7460 2008-04-16 02:19:54Z mike $".
*/