]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - systemv/lpmove.c
License change: Apache License, Version 2.0.
[thirdparty/cups.git] / systemv / lpmove.c
index 5980a972d5136f7dbe6a00157ac3329d2fb5b629..fa8a863ff3d613842298297ca7b7d336521aac8f 100644 (file)
@@ -1,50 +1,25 @@
 /*
- * "$Id: lpmove.c 4906 2006-01-10 20:53:28Z mike $"
+ * "lpmove" command for CUPS.
  *
- *   "lpmove" command for the Common UNIX Printing System (CUPS).
+ * Copyright 2007-2016 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   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 move jobs.
- *   move_job() - Move a job.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
  */
 
 /*
  * Include necessary headers...
  */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <cups/string.h>
-#include <cups/cups.h>
-#include <cups/i18n.h>
-#include <cups/debug.h>
+#include <cups/cups-private.h>
 
 
 /*
  * Local functions...
  */
 
-static void    move_job(http_t *, int, const char *);
+static int     move_job(http_t *http, const char *src, int jobid,
+                        const char *dest);
 
 
 /*
@@ -57,106 +32,106 @@ main(int  argc,                           /* I - Number of command-line arguments */
 {
   int          i;                      /* Looping var */
   http_t       *http;                  /* Connection to server */
-  const char   *job;                   /* Job name */
+  const char   *opt,                   /* Option pointer */
+               *job;                   /* Job name */
+  int          jobid;                  /* Job ID */
   int          num_dests;              /* Number of destinations */
   cups_dest_t  *dests;                 /* Destinations */
-  const char   *dest;                  /* New destination */
+  const char   *src,                   /* Original queue */
+               *dest;                  /* New destination */
 
 
-  http      = NULL;
-  job       = NULL;
+  _cupsSetLocale(argv);
+
   dest      = NULL;
-  num_dests = 0;
   dests     = NULL;
+  job       = NULL;
+  jobid     = 0;
+  num_dests = 0;
+  src       = NULL;
 
   for (i = 1; i < argc; i ++)
+  {
     if (argv[i][0] == '-')
-      switch (argv[i][1])
+    {
+      for (opt = argv[i] + 1; *opt; opt ++)
       {
-        case 'E' : /* Encrypt */
+       switch (*opt)
+       {
+         case 'E' : /* Encrypt */
 #ifdef HAVE_SSL
-           cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
+             cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
 
-           if (http)
-             httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
 #else
-            _cupsLangPrintf(stderr, NULL,
-                           _("%s: Sorry, no encryption support compiled in!\n"),
-                           argv[0]);
+             _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
 #endif /* HAVE_SSL */
-           break;
-
-        case 'h' : /* Connect to host */
-           if (http)
-           {
-             httpClose(http);
-             http = NULL;
-           }
-
-           if (argv[i][2] != '\0')
-             cupsSetServer(argv[i] + 2);
-           else
-           {
-             i ++;
-
-             if (i >= argc)
+             break;
+
+         case 'h' : /* Connect to host */
+             if (opt[1] != '\0')
+             {
+               cupsSetServer(opt + 1);
+               opt += strlen(opt) - 1;
+             }
+             else
              {
-               _cupsLangPuts(stderr, NULL,
-                             _("Error: need hostname after \'-h\' option!\n"));
-               return (1);
-              }
-
-             cupsSetServer(argv[i]);
-           }
-           break;
-
-       default :
-           _cupsLangPrintf(stderr, NULL, _("lpmove: Unknown option \'%c\'!\n"),
-                           argv[i][1]);
-           return (1);
+               i ++;
+
+               if (i >= argc)
+               {
+                 _cupsLangPuts(stderr, _("Error: need hostname after \"-h\" option."));
+                 return (1);
+               }
+
+               cupsSetServer(argv[i]);
+             }
+             break;
+
+         default :
+             _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), argv[0], *opt);
+             return (1);
+       }
       }
-    else if (job == NULL)
+    }
+    else if (!jobid && !src)
     {
       if (num_dests == 0)
         num_dests = cupsGetDests(&dests);
 
       if ((job = strrchr(argv[i], '-')) != NULL &&
           cupsGetDest(argv[i], NULL, num_dests, dests) == NULL)
-        job ++;
+        jobid = atoi(job + 1);
+      else if (isdigit(argv[i][0] & 255) &&
+               !cupsGetDest(argv[i], NULL, num_dests, dests))
+        jobid = atoi(argv[i]);
       else
-        job = argv[i];
+        src = argv[i];
     }
     else if (dest == NULL)
       dest = argv[i];
     else
     {
-      _cupsLangPrintf(stderr, NULL, _("lpmove: Unknown argument \'%s\'!\n"),
-                      argv[i]);
+      _cupsLangPrintf(stderr, _("lpmove: Unknown argument \"%s\"."), argv[i]);
       return (1);
     }
+  }
 
-  if (job == NULL || dest == NULL)
+  if ((!jobid && !src) || !dest)
   {
-    _cupsLangPuts(stdout, NULL, _("Usage: lpmove job dest\n"));
+    _cupsLangPuts(stdout, _("Usage: lpmove job/src dest"));
     return (1);
   }
 
-  if (!http)
-  {
-    http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
+  http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
 
-    if (http == NULL)
-    {
-      _cupsLangPrintf(stderr, NULL,
-                      _("lpmove: Unable to connect to server: %s\n"),
-                     strerror(errno));
-      return (1);
-    }
+  if (http == NULL)
+  {
+    _cupsLangPrintf(stderr, _("lpmove: Unable to connect to server: %s"),
+                   strerror(errno));
+    return (1);
   }
 
-  move_job(http, atoi(job), dest);
-
-  return (0);
+  return (move_job(http, src, jobid, dest));
 }
 
 
@@ -164,21 +139,19 @@ main(int  argc,                           /* I - Number of command-line arguments */
  * 'move_job()' - Move a job.
  */
 
-static void
+static int                             /* O - 0 on success, 1 on error */
 move_job(http_t     *http,             /* I - HTTP connection to server */
+         const char *src,              /* I - Source queue */
          int        jobid,             /* I - Job ID */
-        const char *dest)              /* I - Destination */
+        const char *dest)              /* I - Destination queue */
 {
-  ipp_t                *request,               /* IPP Request */
-               *response;              /* IPP Response */
-  cups_lang_t  *language;              /* Default language */
-  char         job_uri[HTTP_MAX_URI],  /* job-uri */
-               printer_uri[HTTP_MAX_URI];
-                                       /* job-printer-uri */
+  ipp_t        *request;                       /* IPP Request */
+  char job_uri[HTTP_MAX_URI],          /* job-uri */
+       printer_uri[HTTP_MAX_URI];      /* job-printer-uri */
 
 
-  if (http == NULL)
-    return;
+  if (!http)
+    return (1);
 
  /*
   * Build a CUPS_MOVE_JOB request, which requires the following
@@ -186,31 +159,32 @@ move_job(http_t     *http,                /* I - HTTP connection to server */
   *
   *    attributes-charset
   *    attributes-natural-language
-  *    job-uri
+  *    job-uri/printer-uri
   *    job-printer-uri
+  *    requesting-user-name
   */
 
-  request = ippNew();
-
-  request->request.op.operation_id = CUPS_MOVE_JOB;
-  request->request.op.request_id   = 1;
+  request = ippNewRequest(CUPS_MOVE_JOB);
 
-  language = cupsLangDefault();
-
-  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);
-
-  snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", jobid);
-  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, job_uri);
+  if (jobid)
+  {
+    snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", jobid);
+    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
+                job_uri);
+  }
+  else
+  {
+    httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
+                     "localhost", 0, "/printers/%s", src);
+    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
+                job_uri);
+  }
 
   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
                NULL, cupsUser());
 
-  httpAssembleURIf(printer_uri, sizeof(printer_uri), "ipp", NULL, "localhost", 0,
-                   "/printers/%s", dest);
+  httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
+                   "ipp", NULL, "localhost", 0, "/printers/%s", dest);
   ippAddString(request, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri",
                NULL, printer_uri);
 
@@ -218,24 +192,13 @@ move_job(http_t     *http,                /* I - HTTP connection to server */
   * Do the request and get back a response...
   */
 
-  if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
-  {
-    if (response->request.status.status_code > IPP_OK_CONFLICT)
-    {
-      _cupsLangPrintf(stderr, NULL, _("lpmove: move-job failed: %s\n"),
-                     ippErrorString(response->request.status.status_code));
-      ippDelete(response);
-      return;
-    }
+  ippDelete(cupsDoRequest(http, request, "/jobs"));
 
-    ippDelete(response);
+  if (cupsLastError() > IPP_OK_CONFLICT)
+  {
+    _cupsLangPrintf(stderr, "lpmove: %s", cupsLastErrorString());
+    return (1);
   }
   else
-    _cupsLangPrintf(stderr, NULL, _("lpmove: move-job failed: %s\n"),
-                   ippErrorString(cupsLastError()));
+    return (0);
 }
-
-
-/*
- * End of "$Id: lpmove.c 4906 2006-01-10 20:53:28Z mike $".
- */