diff options
author | jlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2006-01-13 01:51:53 +0000 |
---|---|---|
committer | jlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2006-01-13 01:51:53 +0000 |
commit | ef416fc25c4af449e930416117bedb12fc9924ba (patch) | |
tree | 11f8aa8c5d3565a17d4a6d5121d3edba22e2a21e /berkeley/lprm.c | |
parent | 9ec11526e139aeacf6a052799a6aa22cbbe6ebb2 (diff) | |
download | cups-ef416fc25c4af449e930416117bedb12fc9924ba.tar.gz |
Load cups into easysw/current.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@2 a1ca3aef-8c08-0410-bb20-df032aa958be
Diffstat (limited to 'berkeley/lprm.c')
-rw-r--r-- | berkeley/lprm.c | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/berkeley/lprm.c b/berkeley/lprm.c new file mode 100644 index 000000000..f6fe9fc6b --- /dev/null +++ b/berkeley/lprm.c @@ -0,0 +1,284 @@ +/* + * "$Id: lprm.c 4906 2006-01-10 20:53:28Z mike $" + * + * "lprm" command for the Common UNIX Printing System (CUPS). + * + * 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 + * + * Contents: + * + * main() - Parse options and cancel jobs. + */ + +/* + * Include necessary headers... + */ + +#include <stdio.h> +#include <stdlib.h> + +#include <cups/cups.h> +#include <cups/i18n.h> +#include <cups/string.h> + + +/* + * '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 */ +{ + http_t *http; /* HTTP connection to server */ + int i; /* Looping var */ + int job_id; /* Job ID */ + const char *dest; /* Destination printer */ + char *instance; /* Pointer to instance name */ + char uri[1024]; /* Printer or job URI */ + ipp_t *request; /* IPP request */ + ipp_t *response; /* IPP response */ + ipp_op_t op; /* Operation */ + cups_lang_t *language; /* Language */ + int num_dests; /* Number of destinations */ + cups_dest_t *dests; /* Destinations */ + http_encryption_t encryption; /* Encryption? */ + + + /* + * Setup to cancel individual print jobs... + */ + + op = IPP_CANCEL_JOB; + job_id = 0; + dest = NULL; + response = NULL; + http = NULL; + encryption = cupsEncryption(); + language = cupsLangDefault(); + num_dests = cupsGetDests(&dests); + + for (i = 0; i < num_dests; i ++) + if (dests[i].is_default) + dest = dests[i].name; + + /* + * Open a connection to the server... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), encryption)) == NULL) + { + _cupsLangPuts(stderr, language, _("lprm: Unable to contact server!\n")); + cupsFreeDests(num_dests, dests); + return (1); + } + + /* + * Process command-line arguments... + */ + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-' && argv[i][1] != '\0') + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + encryption = HTTP_ENCRYPT_REQUIRED; + + httpEncryption(http, encryption); +#else + _cupsLangPrintf(stderr, language, + _("%s: Sorry, no encryption support compiled in!\n"), + argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'P' : /* Cancel jobs on a printer */ + if (argv[i][2]) + dest = argv[i] + 2; + else + { + i ++; + dest = argv[i]; + } + + if ((instance = strchr(dest, '/')) != NULL) + *instance = '\0'; + + if (cupsGetDest(dest, NULL, num_dests, dests) == NULL) + { + _cupsLangPrintf(stderr, language, + _("lprm: Unknown destination \"%s\"!\n"), dest); + cupsFreeDests(num_dests, dests); + httpClose(http); + return(1); + } + break; + + default : + _cupsLangPrintf(stderr, language, + _("lprm: Unknown option \'%c\'!\n"), argv[i][1]); + cupsFreeDests(num_dests, dests); + httpClose(http); + return (1); + } + else + { + /* + * Cancel a job or printer... + */ + + if (isdigit(argv[i][0] & 255) && + cupsGetDest(argv[i], NULL, num_dests, dests) == NULL) + { + dest = NULL; + op = IPP_CANCEL_JOB; + job_id = atoi(argv[i]); + } + else if (strcmp(argv[i], "-") == 0) + { + /* + * Cancel all jobs + */ + + op = IPP_PURGE_JOBS; + } + else + { + dest = argv[i]; + job_id = 0; + } + + /* + * Build an IPP request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + job-id *or* job-uri + * [requesting-user-name] + */ + + request = ippNew(); + + request->request.op.operation_id = op; + request->request.op.request_id = 1; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, + "attributes-charset", NULL, cupsLangEncoding(language)); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, + "attributes-natural-language", NULL, language->language); + + if (dest) + { + httpAssembleURIf(uri, sizeof(uri), "ipp", NULL, "localhost", 0, + "/printers/%s", dest); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + job_id); + } + else + { + sprintf(uri, "ipp://localhost/jobs/%d", job_id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, + uri); + } + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + if (op == IPP_PURGE_JOBS) + response = cupsDoRequest(http, request, "/admin/"); + else + response = cupsDoRequest(http, request, "/jobs/"); + + if (response != NULL) + { + switch (response->request.status.status_code) + { + case IPP_NOT_FOUND : + _cupsLangPuts(stderr, language, + _("lprm: Job or printer not found!\n")); + break; + case IPP_NOT_AUTHORIZED : + _cupsLangPuts(stderr, language, + _("lprm: Not authorized to lprm job(s)!\n")); + break; + case IPP_FORBIDDEN : + _cupsLangPrintf(stderr, language, + _("lprm: You don't own job ID %d!\n"), job_id); + break; + default : + if (response->request.status.status_code > IPP_OK_CONFLICT) + _cupsLangPuts(stderr, language, + _("lprm: Unable to lprm job(s)!\n")); + break; + } + + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + ippDelete(response); + cupsFreeDests(num_dests, dests); + httpClose(http); + return (1); + } + + ippDelete(response); + } + else + { + _cupsLangPuts(stderr, language, + _("lprm: Unable to cancel job(s)!\n")); + cupsFreeDests(num_dests, dests); + httpClose(http); + return (1); + } + } + + /* + * If nothing has been cancelled yet, cancel the current job on the specified + * (or default) printer... + */ + + if (response == NULL) + if (!cupsCancelJob(dest, 0)) + { + _cupsLangPuts(stderr, language, + _("lprm: Unable to cancel job(s)!\n")); + cupsFreeDests(num_dests, dests); + httpClose(http); + return (1); + } + + cupsFreeDests(num_dests, dests); + httpClose(http); + + return (0); +} + + +/* + * End of "$Id: lprm.c 4906 2006-01-10 20:53:28Z mike $". + */ |