|
|
/*
|
|
|
* "lprm" command for CUPS.
|
|
|
*
|
|
|
* Copyright © 2007-2018 by Apple Inc.
|
|
|
* Copyright © 1997-2006 by Easy Software Products.
|
|
|
*
|
|
|
* Licensed under Apache License v2.0. See the file "LICENSE" for more
|
|
|
* information.
|
|
|
*/
|
|
|
|
|
|
/*
|
|
|
* Include necessary headers...
|
|
|
*/
|
|
|
|
|
|
#include <cups/cups-private.h>
|
|
|
|
|
|
|
|
|
/*
|
|
|
* Local functions...
|
|
|
*/
|
|
|
|
|
|
static void usage(void) _CUPS_NORETURN;
|
|
|
|
|
|
|
|
|
/*
|
|
|
* 'main()' - Parse options and cancel jobs.
|
|
|
*/
|
|
|
|
|
|
int /* O - Exit status */
|
|
|
main(int argc, /* I - Number of command-line arguments */
|
|
|
char *argv[]) /* I - Command-line arguments */
|
|
|
{
|
|
|
int i; /* Looping var */
|
|
|
int job_id; /* Job ID */
|
|
|
const char *name; /* Destination printer */
|
|
|
char *instance, /* Pointer to instance name */
|
|
|
*opt; /* Option pointer */
|
|
|
cups_dest_t *dest, /* Destination */
|
|
|
*defdest; /* Default destination */
|
|
|
int did_cancel; /* Did we cancel something? */
|
|
|
|
|
|
|
|
|
_cupsSetLocale(argv);
|
|
|
|
|
|
/*
|
|
|
* Setup to cancel individual print jobs...
|
|
|
*/
|
|
|
|
|
|
did_cancel = 0;
|
|
|
defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
|
|
|
name = defdest ? defdest->name : NULL;
|
|
|
|
|
|
/*
|
|
|
* Process command-line arguments...
|
|
|
*/
|
|
|
|
|
|
for (i = 1; i < argc; i ++)
|
|
|
{
|
|
|
if (!strcmp(argv[i], "--help"))
|
|
|
usage();
|
|
|
else if (argv[i][0] == '-' && argv[i][1] != '\0')
|
|
|
{
|
|
|
for (opt = argv[i] + 1; *opt; opt ++)
|
|
|
{
|
|
|
switch (*opt)
|
|
|
{
|
|
|
case 'E' : /* Encrypt */
|
|
|
#ifdef HAVE_SSL
|
|
|
cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
|
|
|
#else
|
|
|
_cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
|
|
|
#endif /* HAVE_SSL */
|
|
|
break;
|
|
|
|
|
|
case 'P' : /* Cancel jobs on a printer */
|
|
|
if (opt[1] != '\0')
|
|
|
{
|
|
|
name = opt + 1;
|
|
|
opt += strlen(opt) - 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
i ++;
|
|
|
name = argv[i];
|
|
|
}
|
|
|
|
|
|
if ((instance = strchr(name, '/')) != NULL)
|
|
|
*instance = '\0';
|
|
|
|
|
|
if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, name, NULL)) == NULL)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."), argv[0], name);
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
cupsFreeDests(1, dest);
|
|
|
break;
|
|
|
|
|
|
case 'U' : /* Username */
|
|
|
if (opt[1] != '\0')
|
|
|
{
|
|
|
cupsSetUser(opt + 1);
|
|
|
opt += strlen(opt) - 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
i ++;
|
|
|
if (i >= argc)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
|
|
|
usage();
|
|
|
}
|
|
|
|
|
|
cupsSetUser(argv[i]);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 'h' : /* Connect to host */
|
|
|
if (opt[1] != '\0')
|
|
|
{
|
|
|
cupsSetServer(opt + 1);
|
|
|
opt += strlen(opt) - 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
i ++;
|
|
|
|
|
|
if (i >= argc)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]);
|
|
|
usage();
|
|
|
}
|
|
|
else
|
|
|
cupsSetServer(argv[i]);
|
|
|
}
|
|
|
|
|
|
if (defdest)
|
|
|
cupsFreeDests(1, defdest);
|
|
|
|
|
|
defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
|
|
|
name = defdest ? defdest->name : NULL;
|
|
|
break;
|
|
|
|
|
|
default :
|
|
|
_cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt);
|
|
|
usage();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
/*
|
|
|
* Cancel a job or printer...
|
|
|
*/
|
|
|
|
|
|
if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[i], NULL)) != NULL)
|
|
|
cupsFreeDests(1, dest);
|
|
|
|
|
|
if (dest)
|
|
|
{
|
|
|
name = argv[i];
|
|
|
job_id = 0;
|
|
|
}
|
|
|
else if (isdigit(argv[i][0] & 255))
|
|
|
{
|
|
|
name = NULL;
|
|
|
job_id = atoi(argv[i]);
|
|
|
}
|
|
|
else if (!strcmp(argv[i], "-"))
|
|
|
{
|
|
|
/*
|
|
|
* Cancel all jobs
|
|
|
*/
|
|
|
|
|
|
job_id = -1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."),
|
|
|
argv[0], argv[i]);
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
if (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) != IPP_OK)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString());
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
did_cancel = 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* If nothing has been canceled yet, cancel the current job on the specified
|
|
|
* (or default) printer...
|
|
|
*/
|
|
|
|
|
|
if (!did_cancel && cupsCancelJob2(CUPS_HTTP_DEFAULT, name, 0, 0) != IPP_OK)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString());
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
if (defdest)
|
|
|
cupsFreeDests(1, defdest);
|
|
|
|
|
|
return (0);
|
|
|
|
|
|
/*
|
|
|
* If we get here there was an error, so clean up...
|
|
|
*/
|
|
|
|
|
|
error:
|
|
|
|
|
|
if (defdest)
|
|
|
cupsFreeDests(1, defdest);
|
|
|
|
|
|
return (1);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*
|
|
|
* 'usage()' - Show program usage and exit.
|
|
|
*/
|
|
|
|
|
|
static void
|
|
|
usage(void)
|
|
|
{
|
|
|
_cupsLangPuts(stdout, _("Usage: lprm [options] [id]\n"
|
|
|
" lprm [options] -"));
|
|
|
_cupsLangPuts(stdout, _("Options:"));
|
|
|
_cupsLangPuts(stdout, _("- Cancel all jobs"));
|
|
|
_cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
|
|
|
_cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
|
|
|
_cupsLangPuts(stdout, _("-P destination Specify the destination"));
|
|
|
_cupsLangPuts(stdout, _("-U username Specify the username to use for authentication"));
|
|
|
|
|
|
exit(1);
|
|
|
}
|