|
|
/*
|
|
|
* "cupsaccept", "cupsdisable", "cupsenable", and "cupsreject" commands 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(const char *command) _CUPS_NORETURN;
|
|
|
|
|
|
|
|
|
/*
|
|
|
* 'main()' - Parse options and accept/reject jobs or disable/enable printers.
|
|
|
*/
|
|
|
|
|
|
int /* O - Exit status */
|
|
|
main(int argc, /* I - Number of command-line arguments */
|
|
|
char *argv[]) /* I - Command-line arguments */
|
|
|
{
|
|
|
int i; /* Looping var */
|
|
|
char *command, /* Command to do */
|
|
|
*opt, /* Option pointer */
|
|
|
uri[1024], /* Printer URI */
|
|
|
*reason; /* Reason for reject/disable */
|
|
|
ipp_t *request; /* IPP request */
|
|
|
ipp_op_t op; /* Operation */
|
|
|
int cancel; /* Cancel jobs? */
|
|
|
|
|
|
|
|
|
_cupsSetLocale(argv);
|
|
|
|
|
|
/*
|
|
|
* See what operation we're supposed to do...
|
|
|
*/
|
|
|
|
|
|
if ((command = strrchr(argv[0], '/')) != NULL)
|
|
|
command ++;
|
|
|
else
|
|
|
command = argv[0];
|
|
|
|
|
|
cancel = 0;
|
|
|
|
|
|
if (!strcmp(command, "cupsaccept"))
|
|
|
op = CUPS_ACCEPT_JOBS;
|
|
|
else if (!strcmp(command, "cupsreject"))
|
|
|
op = CUPS_REJECT_JOBS;
|
|
|
else if (!strcmp(command, "cupsdisable"))
|
|
|
op = IPP_PAUSE_PRINTER;
|
|
|
else if (!strcmp(command, "cupsenable"))
|
|
|
op = IPP_RESUME_PRINTER;
|
|
|
else
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, _("%s: Don't know what to do."), command);
|
|
|
return (1);
|
|
|
}
|
|
|
|
|
|
reason = NULL;
|
|
|
|
|
|
/*
|
|
|
* Process command-line arguments...
|
|
|
*/
|
|
|
|
|
|
for (i = 1; i < argc; i ++)
|
|
|
{
|
|
|
if (!strcmp(argv[i], "--help"))
|
|
|
usage(command);
|
|
|
else if (!strcmp(argv[i], "--hold"))
|
|
|
op = IPP_HOLD_NEW_JOBS;
|
|
|
else if (!strcmp(argv[i], "--release"))
|
|
|
op = IPP_RELEASE_HELD_NEW_JOBS;
|
|
|
else if (argv[i][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."), command);
|
|
|
#endif /* HAVE_SSL */
|
|
|
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."), command);
|
|
|
usage(command);
|
|
|
}
|
|
|
|
|
|
cupsSetUser(argv[i]);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 'c' : /* Cancel jobs */
|
|
|
cancel = 1;
|
|
|
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."), command);
|
|
|
usage(command);
|
|
|
}
|
|
|
|
|
|
cupsSetServer(argv[i]);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 'r' : /* Reason for cancellation */
|
|
|
if (opt[1] != '\0')
|
|
|
{
|
|
|
reason = opt + 1;
|
|
|
opt += strlen(opt) - 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
i ++;
|
|
|
if (i >= argc)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, _("%s: Error - expected reason text after \"-r\" option."), command);
|
|
|
usage(command);
|
|
|
}
|
|
|
|
|
|
reason = argv[i];
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
default :
|
|
|
_cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), command, *opt);
|
|
|
usage(command);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
/*
|
|
|
* Accept/disable/enable/reject a destination...
|
|
|
*/
|
|
|
|
|
|
request = ippNewRequest(op);
|
|
|
|
|
|
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
|
|
|
"localhost", 0, "/printers/%s", argv[i]);
|
|
|
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
|
|
"printer-uri", NULL, uri);
|
|
|
|
|
|
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
|
|
|
"requesting-user-name", NULL, cupsUser());
|
|
|
|
|
|
if (reason != NULL)
|
|
|
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT,
|
|
|
"printer-state-message", NULL, reason);
|
|
|
|
|
|
/*
|
|
|
* Do the request and get back a response...
|
|
|
*/
|
|
|
|
|
|
ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/"));
|
|
|
|
|
|
if (cupsLastError() > IPP_OK_CONFLICT)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr,
|
|
|
_("%s: Operation failed: %s"),
|
|
|
command, ippErrorString(cupsLastError()));
|
|
|
return (1);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* Cancel all jobs if requested...
|
|
|
*/
|
|
|
|
|
|
if (cancel)
|
|
|
{
|
|
|
/*
|
|
|
* Build an IPP_PURGE_JOBS request, which requires the following
|
|
|
* attributes:
|
|
|
*
|
|
|
* attributes-charset
|
|
|
* attributes-natural-language
|
|
|
* printer-uri
|
|
|
*/
|
|
|
|
|
|
request = ippNewRequest(IPP_PURGE_JOBS);
|
|
|
|
|
|
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
|
|
"printer-uri", NULL, uri);
|
|
|
|
|
|
ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/"));
|
|
|
|
|
|
if (cupsLastError() > IPP_OK_CONFLICT)
|
|
|
{
|
|
|
_cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString());
|
|
|
return (1);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return (0);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*
|
|
|
* 'usage()' - Show program usage and exit.
|
|
|
*/
|
|
|
|
|
|
static void
|
|
|
usage(const char *command) /* I - Command name */
|
|
|
{
|
|
|
_cupsLangPrintf(stdout, _("Usage: %s [options] destination(s)"), command);
|
|
|
_cupsLangPuts(stdout, _("Options:"));
|
|
|
_cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
|
|
|
_cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
|
|
|
_cupsLangPuts(stdout, _("-r reason Specify a reason message that others can see"));
|
|
|
_cupsLangPuts(stdout, _("-U username Specify the username to use for authentication"));
|
|
|
if (!strcmp(command, "cupsdisable"))
|
|
|
_cupsLangPuts(stdout, _("--hold Hold new jobs"));
|
|
|
if (!strcmp(command, "cupsenable"))
|
|
|
_cupsLangPuts(stdout, _("--release Release previously held jobs"));
|
|
|
|
|
|
exit(1);
|
|
|
}
|