X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=systemv%2Flp.c;h=9e895d4d6400be9518625da5a37027ae1db91ed7;hb=28af862a1c19fb19b2813406ce12728a9f599cbb;hp=13acd16761a1e1daba02410abfd0498d60e6ea4a;hpb=ef416fc25c4af449e930416117bedb12fc9924ba;p=thirdparty%2Fcups.git diff --git a/systemv/lp.c b/systemv/lp.c index 13acd1676..9e895d4d6 100644 --- a/systemv/lp.c +++ b/systemv/lp.c @@ -1,66 +1,32 @@ /* - * "$Id: lp.c 4906 2006-01-10 20:53:28Z mike $" + * "$Id$" * - * "lp" command for the Common UNIX Printing System (CUPS). + * "lp" command for CUPS. * - * Copyright 1997-2006 by Easy Software Products. + * Copyright 2007-2014 by Apple Inc. + * Copyright 1997-2007 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 send files for printing. - * restart_job() - Restart a job. - * set_job_attrs() - Set job attributes. - * sighandler() - Signal catcher for when we print from stdin... + * 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/". */ /* * Include necessary headers... */ -#include -#include -#include -#include -#include -#include - - -#ifndef WIN32 -# include -# include +#include /* * Local functions. */ -void sighandler(int); -#endif /* !WIN32 */ -int restart_job(int job_id); -int set_job_attrs(int job_id, int num_options, cups_option_t *options); - - -/* - * Globals... - */ - -char tempfile[1024]; /* Temporary file for printing from stdin */ +int restart_job(const char *command, int job_id); +int set_job_attrs(const char *command, int job_id, int num_options, + cups_option_t *options); /* @@ -74,25 +40,19 @@ main(int argc, /* I - Number of command-line arguments */ int i, j; /* Looping vars */ int job_id; /* Job ID */ char *printer, /* Printer name */ - *instance, /* Instance name */ + *instance, /* Instance name */ *val, /* Option value */ *title; /* Job title */ int priority; /* Job priority (1-100) */ int num_copies; /* Number of copies per file */ int num_files; /* Number of files to print */ const char *files[1000]; /* Files to print */ - int num_dests; /* Number of destinations */ - cups_dest_t *dests, /* Destinations */ - *dest; /* Selected destination */ + cups_dest_t *dest; /* Selected destination */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ + int end_options; /* No more options? */ int silent; /* Silent or verbose output? */ char buffer[8192]; /* Copy buffer */ - int temp; /* Temporary file descriptor */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Signal action */ - struct sigaction oldaction; /* Old signal action */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET*/ #ifdef __sun @@ -113,30 +73,49 @@ main(int argc, /* I - Number of command-line arguments */ return (0); #endif /* __sun */ + _cupsSetLocale(argv); + silent = 0; printer = NULL; - num_dests = 0; - dests = NULL; + dest = NULL; num_options = 0; options = NULL; num_files = 0; title = NULL; job_id = 0; + end_options = 0; for (i = 1; i < argc; i ++) - if (argv[i][0] == '-' && argv[i][1]) + if (argv[i][0] == '-' && argv[i][1] && !end_options) switch (argv[i][1]) { case 'E' : /* Encrypt */ #ifdef HAVE_SSL cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); #else - _cupsLangPrintf(stderr, NULL, - _("%s: Sorry, no encryption support compiled in!\n"), + _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) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after \"-U\" " + "option."), argv[0]); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + case 'c' : /* Copy to spool dir (always enabled) */ break; @@ -149,8 +128,9 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected destination after -d option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected destination after " + "\"-d\" option."), argv[0]); return (1); } @@ -160,17 +140,24 @@ main(int argc, /* I - Number of command-line arguments */ if ((instance = strrchr(printer, '/')) != NULL) *instance++ = '\0'; - if (num_dests == 0) - num_dests = cupsGetDests(&dests); - - if ((dest = cupsGetDest(printer, instance, num_dests, dests)) != NULL) + if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, + instance)) != NULL) { for (j = 0; j < dest->num_options; j ++) - if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) + if (cupsGetOption(dest->options[j].name, num_options, + options) == NULL) num_options = cupsAddOption(dest->options[j].name, dest->options[j].value, num_options, &options); } + else 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); + } break; case 'f' : /* Form */ @@ -180,13 +167,16 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected form after -f option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected form after \"-f\" " + "option."), + argv[0]); return (1); } } - fputs("lp: Warning - form option ignored!\n", stderr); + _cupsLangPrintf(stderr, _("%s: Warning - form option ignored."), + argv[0]); break; case 'h' : /* Destination host */ @@ -198,8 +188,9 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected hostname after -h option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-h\" option."), argv[0]); return (1); } @@ -216,8 +207,9 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected job ID after -i option!\n")); + _cupsLangPrintf(stderr, + _("%s: Expected job ID after \"-i\" option."), + argv[0]); return (1); } @@ -226,9 +218,9 @@ main(int argc, /* I - Number of command-line arguments */ if (num_files > 0) { - _cupsLangPuts(stderr, NULL, - _("lp: Error - cannot print files and alter " - "jobs simultaneously!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - cannot print files and alter " + "jobs simultaneously."), argv[0]); return (1); } @@ -239,7 +231,7 @@ main(int argc, /* I - Number of command-line arguments */ if (job_id < 0) { - _cupsLangPuts(stderr, NULL, _("lp: Error - bad job ID!\n")); + _cupsLangPrintf(stderr, _("%s: Error - bad job ID."), argv[0]); break; } break; @@ -249,6 +241,17 @@ main(int argc, /* I - Number of command-line arguments */ case 'p' : /* Notify on completion */ #endif /* __sun */ case 'w' : /* Write to console or email */ + { + char email[1024]; /* EMail address */ + + + snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(), + httpGetHostname(NULL, buffer, sizeof(buffer))); + num_options = cupsAddOption("notify-recipient-uri", email, + num_options, &options); + } + + silent = 1; break; case 'n' : /* Number of copies */ @@ -260,8 +263,9 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected copies after -n option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected copies after " + "\"-n\" option."), argv[0]); return (1); } @@ -269,20 +273,23 @@ main(int argc, /* I - Number of command-line arguments */ } sprintf(buffer, "%d", num_copies); - num_options = cupsAddOption("copies", buffer, num_options, &options); + num_options = cupsAddOption("copies", buffer, num_options, + &options); break; case 'o' : /* Option */ if (argv[i][2] != '\0') - num_options = cupsParseOptions(argv[i] + 2, num_options, &options); + num_options = cupsParseOptions(argv[i] + 2, num_options, + &options); else { i ++; if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected option string after -o option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected option=value after " + "\"-o\" option."), argv[0]); return (1); } @@ -300,9 +307,9 @@ main(int argc, /* I - Number of command-line arguments */ { if ((i + 1) >= argc) { - _cupsLangPrintf(stderr, NULL, - _("lp: Expected priority after -%c option!\n"), - argv[i][1]); + _cupsLangPrintf(stderr, + _("%s: Error - expected priority after " + "\"-%c\" option."), argv[0], argv[i][1]); return (1); } @@ -322,13 +329,15 @@ main(int argc, /* I - Number of command-line arguments */ if (priority < 1 || priority > 100) { - _cupsLangPuts(stderr, NULL, - _("lp: Priority must be between 1 and 100.\n")); + _cupsLangPrintf(stderr, + _("%s: Error - priority must be between 1 and " + "100."), argv[0]); return (1); } sprintf(buffer, "%d", priority); - num_options = cupsAddOption("job-priority", buffer, num_options, &options); + num_options = cupsAddOption("job-priority", buffer, num_options, + &options); break; case 's' : /* Silent */ @@ -344,8 +353,9 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected title after -t option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected title after " + "\"-t\" option."), argv[0]); return (1); } @@ -360,14 +370,15 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected mode list after -y option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected mode list after " + "\"-y\" option."), argv[0]); return (1); } } - _cupsLangPuts(stderr, NULL, - _("lp: Warning - mode option ignored!\n")); + _cupsLangPrintf(stderr, + _("%s: Warning - mode option ignored."), argv[0]); break; case 'H' : /* Hold job */ @@ -379,8 +390,9 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected hold name after -H option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected hold name after " + "\"-H\" option."), argv[0]); return (1); } @@ -395,18 +407,23 @@ main(int argc, /* I - Number of command-line arguments */ num_options = cupsAddOption("job-hold-until", "no-hold", num_options, &options); else if (!strcmp(val, "immediate")) + { + num_options = cupsAddOption("job-hold-until", "no-hold", + num_options, &options); num_options = cupsAddOption("job-priority", "100", num_options, &options); + } else if (!strcmp(val, "restart")) { if (job_id < 1) { - _cupsLangPuts(stderr, NULL, - _("lp: Need job ID (-i) before \"-H restart\"!\n")); + _cupsLangPrintf(stderr, + _("%s: Need job ID (\"-i jobid\") before " + "\"-H restart\"."), argv[0]); return (1); } - if (restart_job(job_id)) + if (restart_job(argv[0], job_id)) return (1); } else @@ -423,8 +440,9 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected page list after -P option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected page list after " + "\"-P\" option."), argv[0]); return (1); } @@ -442,14 +460,16 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected character set after -S option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected character set after " + "\"-S\" option."), argv[0]); return (1); } } - _cupsLangPuts(stderr, NULL, - _("lp: Warning - character set option ignored!\n")); + _cupsLangPrintf(stderr, + _("%s: Warning - character set option ignored."), + argv[0]); break; case 'T' : /* Content-Type */ @@ -459,28 +479,41 @@ main(int argc, /* I - Number of command-line arguments */ if (i >= argc) { - _cupsLangPuts(stderr, NULL, - _("lp: Expected content type after -T option!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - expected content type after " + "\"-T\" option."), argv[0]); return (1); } } - _cupsLangPuts(stderr, NULL, - _("lp: Warning - content type option ignored!\n")); + _cupsLangPrintf(stderr, + _("%s: Warning - content type option ignored."), + argv[0]); + break; + + case '-' : /* Stop processing options */ + if (argv[i][2]) + { + _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%s\"."), + argv[0], argv[i]); + return (1); + } + + end_options = 1; break; default : - _cupsLangPrintf(stderr, NULL, _("lp: Unknown option \'%c\'!\n"), - argv[i][1]); + _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), + argv[0], argv[i][1]); return (1); } else if (!strcmp(argv[i], "-")) { if (num_files || job_id) { - _cupsLangPuts(stderr, NULL, - _("lp: Error - cannot print from stdin if files or a " - "job ID are provided!\n")); + _cupsLangPrintf(stderr, + _("%s: Error - cannot print from stdin if files or a " + "job ID are provided."), argv[0]); return (1); } @@ -494,8 +527,8 @@ main(int argc, /* I - Number of command-line arguments */ if (access(argv[i], R_OK) != 0) { - _cupsLangPrintf(stderr, NULL, _("lp: Unable to access \"%s\" - %s\n"), - argv[i], strerror(errno)); + _cupsLangPrintf(stderr, _("%s: Error - unable to access \"%s\" - %s"), + argv[0], argv[i], strerror(errno)); return (1); } @@ -511,15 +544,15 @@ main(int argc, /* I - Number of command-line arguments */ } } else - _cupsLangPrintf(stderr, NULL, _("lp: Too many files - \"%s\"\n"), - argv[i]); + _cupsLangPrintf(stderr, _("%s: Error - too many files - \"%s\"."), + argv[0], argv[i]); /* * See if we are altering an existing job... */ if (job_id) - return (set_job_attrs(job_id, num_options, options)); + return (set_job_attrs(argv[0], job_id, num_options, options)); /* * See if we have any files to print; if not, print from stdin... @@ -527,10 +560,7 @@ main(int argc, /* I - Number of command-line arguments */ if (printer == NULL) { - if (num_dests == 0) - num_dests = cupsGetDests(&dests); - - if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) != NULL) + if ((dest = cupsGetNamedDest(NULL, NULL, NULL)) != NULL) { printer = dest->name; @@ -540,6 +570,14 @@ main(int argc, /* I - Number of command-line arguments */ dest->options[j].value, num_options, &options); } + else 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); + } } if (printer == NULL) @@ -559,101 +597,69 @@ main(int argc, /* I - Number of command-line arguments */ else val = "LPDEST"; - if (printer && !cupsGetDest(printer, NULL, num_dests, dests)) - _cupsLangPrintf(stderr, NULL, - _("lp: error - %s environment variable names " - "non-existent destination \"%s\"!\n"), - val, printer); + if (printer && !cupsGetNamedDest(NULL, printer, NULL)) + _cupsLangPrintf(stderr, + _("%s: Error - %s environment variable names " + "non-existent destination \"%s\"."), argv[0], val, + printer); else if (cupsLastError() == IPP_NOT_FOUND) - _cupsLangPuts(stderr, NULL, - _("lp: error - no default destination available.\n")); + _cupsLangPrintf(stderr, + _("%s: Error - no default destination available."), + argv[0]); else - _cupsLangPuts(stderr, NULL, - _("lp: error - scheduler not responding!\n")); + _cupsLangPrintf(stderr, _("%s: Error - scheduler not responding."), + argv[0]); return (1); } if (num_files > 0) job_id = cupsPrintFiles(printer, num_files, files, title, num_options, options); - else + else if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, printer, + title ? title : "(stdin)", + num_options, options)) > 0) { - num_files = 1; - -#ifndef WIN32 -# if defined(HAVE_SIGSET) - sigset(SIGHUP, sighandler); - if (sigset(SIGINT, sighandler) == SIG_IGN) - sigset(SIGINT, SIG_IGN); - sigset(SIGTERM, sighandler); -# elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - action.sa_handler = sighandler; - - sigaction(SIGHUP, &action, NULL); - sigaction(SIGINT, NULL, &oldaction); - if (oldaction.sa_handler != SIG_IGN) - sigaction(SIGINT, &action, NULL); - sigaction(SIGTERM, &action, NULL); -# else - signal(SIGHUP, sighandler); - if (signal(SIGINT, sighandler) == SIG_IGN) - signal(SIGINT, SIG_IGN); - signal(SIGTERM, sighandler); -# endif -#endif /* !WIN32 */ - - temp = cupsTempFd(tempfile, sizeof(tempfile)); - - if (temp < 0) - { - _cupsLangPrintf(stderr, NULL, - _("lp: unable to create temporary file \"%s\" - %s\n"), - tempfile, strerror(errno)); - return (1); - } + http_status_t status; /* Write status */ + const char *format; /* Document format */ + ssize_t bytes; /* Bytes read */ - while ((i = read(0, buffer, sizeof(buffer))) > 0) - if (write(temp, buffer, i) < 0) - { - _cupsLangPrintf(stderr, NULL, - _("lp: error - unable to write to temporary file " - "\"%s\" - %s\n"), - tempfile, strerror(errno)); - close(temp); - unlink(tempfile); - return (1); - } + if (cupsGetOption("raw", num_options, options)) + format = CUPS_FORMAT_RAW; + else if ((format = cupsGetOption("document-format", num_options, + options)) == NULL) + format = CUPS_FORMAT_AUTO; + + status = cupsStartDocument(CUPS_HTTP_DEFAULT, printer, job_id, NULL, + format, 1); - i = lseek(temp, 0, SEEK_CUR); - close(temp); + while (status == HTTP_CONTINUE && + (bytes = read(0, buffer, sizeof(buffer))) > 0) + status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, (size_t)bytes); - if (i == 0) + if (status != HTTP_CONTINUE) { - _cupsLangPuts(stderr, NULL, - _("lp: stdin is empty, so no job has been sent.\n")); - unlink(tempfile); + _cupsLangPrintf(stderr, _("%s: Error - unable to queue from stdin - %s."), + argv[0], httpStatus(status)); + cupsFinishDocument(CUPS_HTTP_DEFAULT, printer); + cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0); return (1); } - if (title) - job_id = cupsPrintFile(printer, tempfile, title, num_options, options); - else - job_id = cupsPrintFile(printer, tempfile, "(stdin)", num_options, options); - - unlink(tempfile); + if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_OK) + { + _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); + cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0); + return (1); + } } if (job_id < 1) { - _cupsLangPrintf(stderr, NULL, - _("lp: unable to print file: %s\n"), - ippErrorString(cupsLastError())); + _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); return (1); } else if (!silent) - _cupsLangPrintf(stdout, NULL, - _("request id is %s-%d (%d file(s))\n"), + _cupsLangPrintf(stdout, _("request id is %s-%d (%d file(s))"), printer, job_id, num_files); return (0); @@ -665,28 +671,14 @@ main(int argc, /* I - Number of command-line arguments */ */ int /* O - Exit status */ -restart_job(int job_id) /* I - Job ID */ +restart_job(const char *command, /* I - Command name */ + int job_id) /* I - Job ID */ { - http_t *http; /* HTTP connection to server */ - ipp_t *request, /* IPP request */ - *response; /* IPP response */ - cups_lang_t *language; /* Language for request */ + ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* URI for job */ - http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); - - language = cupsLangDefault(); - - request = ippNew(); - request->request.op.operation_id = IPP_RESTART_JOB; - 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); + request = ippNewRequest(IPP_RESTART_JOB); sprintf(uri, "ipp://localhost/jobs/%d", job_id); @@ -696,22 +688,19 @@ restart_job(int job_id) /* I - Job ID */ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser()); - if ((response = cupsDoRequest(http, request, "/jobs")) != NULL) - { - if (response->request.status.status_code > IPP_OK_CONFLICT) - { - _cupsLangPrintf(stderr, NULL, _("lp: restart-job failed: %s\n"), - ippErrorString(response->request.status.status_code)); - ippDelete(response); - return (1); - } + ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs")); - ippDelete(response); + 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."), command); + return (1); } - else + else if (cupsLastError() > IPP_OK_CONFLICT) { - _cupsLangPrintf(stderr, NULL, _("lp: restart-job failed: %s\n"), - ippErrorString(cupsLastError())); + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); return (1); } @@ -724,33 +713,19 @@ restart_job(int job_id) /* I - Job ID */ */ int /* O - Exit status */ -set_job_attrs(int job_id, /* I - Job ID */ +set_job_attrs(const char *command, /* I - Command name */ + int job_id, /* I - Job ID */ int num_options,/* I - Number of options */ cups_option_t *options) /* I - Options */ { - http_t *http; /* HTTP connection to server */ - ipp_t *request, /* IPP request */ - *response; /* IPP response */ - cups_lang_t *language; /* Language for request */ + ipp_t *request; /* IPP request */ char uri[HTTP_MAX_URI]; /* URI for job */ if (num_options == 0) return (0); - http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); - - language = cupsLangDefault(); - - request = ippNew(); - request->request.op.operation_id = IPP_SET_JOB_ATTRIBUTES; - 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); + request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES); sprintf(uri, "ipp://localhost/jobs/%d", job_id); @@ -762,22 +737,19 @@ set_job_attrs(int job_id, /* I - Job ID */ cupsEncodeOptions(request, num_options, options); - if ((response = cupsDoRequest(http, request, "/jobs")) != NULL) - { - if (response->request.status.status_code > IPP_OK_CONFLICT) - { - _cupsLangPrintf(stderr, NULL, _("lp: set-job-attributes failed: %s\n"), - ippErrorString(response->request.status.status_code)); - ippDelete(response); - return (1); - } + ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs")); - ippDelete(response); + 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."), command); + return (1); } - else + else if (cupsLastError() > IPP_OK_CONFLICT) { - _cupsLangPrintf(stderr, NULL, _("lp: set-job-attributes failed: %s\n"), - ippErrorString(cupsLastError())); + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); return (1); } @@ -785,29 +757,6 @@ set_job_attrs(int job_id, /* I - Job ID */ } -#ifndef WIN32 -/* - * 'sighandler()' - Signal catcher for when we print from stdin... - */ - -void -sighandler(int s) /* I - Signal number */ -{ - /* - * Remove the temporary file we're using to print from stdin... - */ - - unlink(tempfile); - - /* - * Exit... - */ - - exit(s); -} -#endif /* !WIN32 */ - - /* - * End of "$Id: lp.c 4906 2006-01-10 20:53:28Z mike $". + * End of "$Id$". */