]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - systemv/lp.c
Merge changes from CUPS 1.5svn-r8849.
[thirdparty/cups.git] / systemv / lp.c
index f4658ccf9c9ea86192477309ecebd74f44b67e5b..f7048392b4fe82196ff9f19bf9fcca46a5dfbb18 100644 (file)
@@ -1,32 +1,22 @@
 /*
- * "$Id: lp.c 5926 2006-09-05 20:45:47Z mike $"
+ * "$Id: lp.c 7170 2008-01-04 02:21:30Z mike $"
  *
  *   "lp" command for the Common UNIX Printing System (CUPS).
  *
- *   Copyright 1997-2006 by Easy Software Products.
+ *   Copyright 2007-2009 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
+ *   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:
  *
  *   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...
  */
 
 /*
 #include <cups/i18n.h>
 
 
-#ifndef WIN32
-#  include <unistd.h>
-#  include <signal.h>
-
-
 /*
  * Local functions.
  */
 
-void   sighandler(int);
-#endif /* !WIN32 */
 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);
 
 
-/*
- * Globals...
- */
-
-char   tempfile[1024];         /* Temporary file for printing from stdin */
-
-
 /*
  * 'main()' - Parse options and send files for printing.
  */
@@ -82,21 +58,12 @@ main(int  argc,                             /* I - Number of command-line arguments */
   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 */
-  ssize_t      bytes;                  /* Bytes copied */
-  off_t                filesize;               /* Size of temp file */
-  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
@@ -121,8 +88,7 @@ main(int  argc,                              /* I - Number of command-line arguments */
 
   silent      = 0;
   printer     = NULL;
-  num_dests   = 0;
-  dests       = NULL;
+  dest        = NULL;
   num_options = 0;
   options     = NULL;
   num_files   = 0;
@@ -139,7 +105,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
            cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
 #else
             _cupsLangPrintf(stderr,
-                           _("%s: Sorry, no encryption support compiled in!\n"),
+                           _("%s: Sorry, no encryption support compiled in\n"),
                            argv[0]);
 #endif /* HAVE_SSL */
            break;
@@ -154,7 +120,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected username after "
-                                 "\'-U\' option!\n"),
+                                 "\'-U\' option\n"),
                                argv[0]);
                return (1);
              }
@@ -177,7 +143,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected destination after "
-                                 "\'-d\' option!\n"),
+                                 "\'-d\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -188,10 +154,7 @@ 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(NULL, printer, instance)) != NULL)
            {
              for (j = 0; j < dest->num_options; j ++)
                if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
@@ -210,13 +173,13 @@ main(int  argc,                           /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected form after \'-f\' "
-                                 "option!\n"),
+                                 "option\n"),
                                argv[0]);
                return (1);
               }
            }
 
-           _cupsLangPrintf(stderr, _("%s: Warning - form option ignored!\n"),
+           _cupsLangPrintf(stderr, _("%s: Warning - form option ignored\n"),
                            argv[0]);
            break;
 
@@ -231,7 +194,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected hostname after "
-                                 "\'-h\' option!\n"),
+                                 "\'-h\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -250,7 +213,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              if (i >= argc)
              {
                _cupsLangPrintf(stderr,
-                               _("%s: Expected job ID after \'-i\' option!\n"),
+                               _("%s: Expected job ID after \'-i\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -262,7 +225,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
            {
              _cupsLangPrintf(stderr,
                              _("%s: Error - cannot print files and alter "
-                               "jobs simultaneously!\n"),
+                               "jobs simultaneously\n"),
                              argv[0]);
              return (1);
            }
@@ -274,7 +237,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
             if (job_id < 0)
            {
-             _cupsLangPrintf(stderr, _("%s: Error - bad job ID!\n"), argv[0]);
+             _cupsLangPrintf(stderr, _("%s: Error - bad job ID\n"), argv[0]);
              break;
            }
            break;
@@ -290,7 +253,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
 
              snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(),
                       httpGetHostname(NULL, buffer, sizeof(buffer)));
-             num_options = cupsAddOption("notify-recipient", email,
+             num_options = cupsAddOption("notify-recipient-uri", email,
                                          num_options, &options);
            }
 
@@ -308,7 +271,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected copies after "
-                                 "\'-n\' option!\n"),
+                                 "\'-n\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -331,7 +294,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected option string after "
-                                 "\'-o\' option!\n"),
+                                 "\'-o\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -352,7 +315,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected priority after "
-                                 "\'-%c\' option!\n"),
+                                 "\'-%c\' option\n"),
                                argv[0], argv[i][1]);
                return (1);
               }
@@ -399,7 +362,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected title after "
-                                 "\'-t\' option!\n"),
+                                 "\'-t\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -417,14 +380,14 @@ main(int  argc,                           /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected mode list after "
-                                 "\'-y\' option!\n"),
+                                 "\'-y\' option\n"),
                                argv[0]);
                return (1);
               }
            }
 
            _cupsLangPrintf(stderr,
-                           _("%s: Warning - mode option ignored!\n"),
+                           _("%s: Warning - mode option ignored\n"),
                            argv[0]);
            break;
 
@@ -439,7 +402,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected hold name after "
-                                 "\'-H\' option!\n"),
+                                 "\'-H\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -455,15 +418,19 @@ 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)
              {
                _cupsLangPrintf(stderr,
                                _("%s: Need job ID (\'-i jobid\') before "
-                                 "\'-H restart\'!\n"),
+                                 "\'-H restart\'\n"),
                                argv[0]);
                return (1);
              }
@@ -487,7 +454,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected page list after "
-                                 "\'-P\' option!\n"),
+                                 "\'-P\' option\n"),
                                argv[0]);
                return (1);
               }
@@ -508,14 +475,14 @@ main(int  argc,                           /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected character set after "
-                                 "\'-S\' option!\n"),
+                                 "\'-S\' option\n"),
                                argv[0]);
                return (1);
               }
            }
 
            _cupsLangPrintf(stderr,
-                           _("%s: Warning - character set option ignored!\n"),
+                           _("%s: Warning - character set option ignored\n"),
                            argv[0]);
            break;
 
@@ -528,14 +495,14 @@ main(int  argc,                           /* I - Number of command-line arguments */
              {
                _cupsLangPrintf(stderr,
                                _("%s: Error - expected content type after "
-                                 "\'-T\' option!\n"),
+                                 "\'-T\' option\n"),
                                argv[0]);
                return (1);
               }
            }
 
            _cupsLangPrintf(stderr,
-                           _("%s: Warning - content type option ignored!\n"),
+                           _("%s: Warning - content type option ignored\n"),
                            argv[0]);
            break;
 
@@ -544,7 +511,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
            break;
 
        default :
-           _cupsLangPrintf(stderr, _("%s: Error - unknown option \'%c\'!\n"),
+           _cupsLangPrintf(stderr, _("%s: Error - unknown option \'%c\'\n"),
                            argv[0], argv[i][1]);
            return (1);
       }
@@ -554,7 +521,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
       {
         _cupsLangPrintf(stderr,
                        _("%s: Error - cannot print from stdin if files or a "
-                         "job ID are provided!\n"),
+                         "job ID are provided\n"),
                         argv[0]);
        return (1);
       }
@@ -602,10 +569,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;
 
@@ -634,10 +598,10 @@ main(int  argc,                           /* I - Number of command-line arguments */
     else
       val = "LPDEST";
 
-    if (printer && !cupsGetDest(printer, NULL, num_dests, dests))
+    if (printer && !cupsGetNamedDest(NULL, printer, NULL))
       _cupsLangPrintf(stderr,
                      _("%s: Error - %s environment variable names "
-                       "non-existent destination \"%s\"!\n"),
+                       "non-existent destination \"%s\"\n"),
                      argv[0], val, printer);
     else if (cupsLastError() == IPP_NOT_FOUND)
       _cupsLangPrintf(stderr,
@@ -645,7 +609,7 @@ main(int  argc,                             /* I - Number of command-line arguments */
                      argv[0]);
     else
       _cupsLangPrintf(stderr,
-                     _("%s: Error - scheduler not responding!\n"),
+                     _("%s: Error - scheduler not responding\n"),
                      argv[0]);
 
     return (1);
@@ -653,73 +617,38 @@ main(int  argc,                           /* I - Number of command-line arguments */
 
   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,
-                     _("%s: Error - unable to create temporary file \"%s\" - %s\n"),
-                     argv[0], tempfile, strerror(errno));
-      return (1);
-    }
+    http_status_t      status;         /* Write status */
+    const char         *format;        /* Document format */
+    ssize_t            bytes;          /* Bytes read */
 
-    while ((bytes = read(0, buffer, sizeof(buffer))) > 0)
-      if (write(temp, buffer, bytes) < 0)
-      {
-       _cupsLangPrintf(stderr,
-                       _("%s: Error - unable to write to temporary file "
-                         "\"%s\" - %s\n"),
-                       argv[0], tempfile, strerror(errno));
-        close(temp);
-        unlink(tempfile);
-       return (1);
-      }
 
-    filesize = lseek(temp, 0, SEEK_CUR);
-    close(temp);
+    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);
+
+    while (status == HTTP_CONTINUE &&
+           (bytes = read(0, buffer, sizeof(buffer))) > 0)
+      status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes);
 
-    if (filesize <= 0)
+    if (status != HTTP_CONTINUE)
     {
       _cupsLangPrintf(stderr,
-                     _("%s: Error - stdin is empty, so no job has been sent.\n"),
-                     argv[0]);
-      unlink(tempfile);
+                     _("%s: Error - unable to queue from stdin - %s\n"),
+                     argv[0], httpStatus(status));
       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)
+      job_id = 0;
   }
 
   if (job_id < 1)
@@ -743,13 +672,10 @@ int                                       /* O - Exit status */
 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 */
   char         uri[HTTP_MAX_URI];      /* URI for job */
 
 
-  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-
   request = ippNewRequest(IPP_RESTART_JOB);
 
   sprintf(uri, "ipp://localhost/jobs/%d", job_id);
@@ -760,7 +686,7 @@ restart_job(const char *command,    /* I - Command name */
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
                "requesting-user-name", NULL, cupsUser());
 
-  ippDelete(cupsDoRequest(http, request, "/jobs"));
+  ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
 
   if (cupsLastError() > IPP_OK_CONFLICT)
   {
@@ -782,7 +708,6 @@ set_job_attrs(const char    *command,       /* I - Command name */
               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 */
   char         uri[HTTP_MAX_URI];      /* URI for job */
 
@@ -790,8 +715,6 @@ set_job_attrs(const char    *command,       /* I - Command name */
   if (num_options == 0)
     return (0);
 
-  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
-
   request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES);
 
   sprintf(uri, "ipp://localhost/jobs/%d", job_id);
@@ -804,7 +727,7 @@ set_job_attrs(const char    *command,       /* I - Command name */
 
   cupsEncodeOptions(request, num_options, options);
 
-  ippDelete(cupsDoRequest(http, request, "/jobs"));
+  ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs"));
 
   if (cupsLastError() > IPP_OK_CONFLICT)
   {
@@ -816,29 +739,6 @@ set_job_attrs(const char    *command,      /* I - Command name */
 }
 
 
-#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 5926 2006-09-05 20:45:47Z mike $".
+ * End of "$Id: lp.c 7170 2008-01-04 02:21:30Z mike $".
  */