Code sync
[external/cups.git] / systemv / lpmove.c
1 /*
2  * "$Id: lpmove.c 9384 2010-11-22 07:06:39Z mike $"
3  *
4  *   "lpmove" command for CUPS.
5  *
6  *   Copyright 2007-2010 by Apple Inc.
7  *   Copyright 1997-2006 by Easy Software Products.
8  *
9  *   These coded instructions, statements, and computer programs are the
10  *   property of Apple Inc. and are protected by Federal copyright
11  *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
12  *   which should have been included with this file.  If this file is
13  *   file is missing or damaged, see the license at "http://www.cups.org/".
14  *
15  * Contents:
16  *
17  *   main()     - Parse options and move jobs.
18  *   move_job() - Move a job.
19  */
20
21 /*
22  * Include necessary headers...
23  */
24
25 #include <cups/cups-private.h>
26
27
28 /*
29  * Local functions...
30  */
31
32 static int      move_job(http_t *http, const char *src, int jobid,
33                          const char *dest);
34
35
36 /*
37  * 'main()' - Parse options and show status information.
38  */
39
40 int
41 main(int  argc,                         /* I - Number of command-line arguments */
42      char *argv[])                      /* I - Command-line arguments */
43 {
44   int           i;                      /* Looping var */
45   http_t        *http;                  /* Connection to server */
46   const char    *job;                   /* Job name */
47   int           jobid;                  /* Job ID */
48   int           num_dests;              /* Number of destinations */
49   cups_dest_t   *dests;                 /* Destinations */
50   const char    *src,                   /* Original queue */
51                 *dest;                  /* New destination */
52
53
54   _cupsSetLocale(argv);
55
56   dest      = NULL;
57   dests     = NULL;
58   job       = NULL;
59   jobid     = 0;
60   num_dests = 0;
61   src       = NULL;
62
63   for (i = 1; i < argc; i ++)
64     if (argv[i][0] == '-')
65       switch (argv[i][1])
66       {
67         case 'E' : /* Encrypt */
68 #ifdef HAVE_SSL
69             cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
70
71 #else
72             _cupsLangPrintf(stderr,
73                             _("%s: Sorry, no encryption support."),
74                             argv[0]);
75 #endif /* HAVE_SSL */
76             break;
77
78         case 'h' : /* Connect to host */
79             if (argv[i][2] != '\0')
80               cupsSetServer(argv[i] + 2);
81             else
82             {
83               i ++;
84
85               if (i >= argc)
86               {
87                 _cupsLangPuts(stderr,
88                               _("Error: need hostname after \"-h\" option."));
89                 return (1);
90               }
91
92               cupsSetServer(argv[i]);
93             }
94             break;
95
96         default :
97             _cupsLangPrintf(stderr, _("lpmove: Unknown option \"%c\"."),
98                             argv[i][1]);
99             return (1);
100       }
101     else if (!jobid && !src)
102     {
103       if (num_dests == 0)
104         num_dests = cupsGetDests(&dests);
105
106       if ((job = strrchr(argv[i], '-')) != NULL &&
107           cupsGetDest(argv[i], NULL, num_dests, dests) == NULL)
108         jobid = atoi(job + 1);
109       else if (isdigit(argv[i][0] & 255) &&
110                !cupsGetDest(argv[i], NULL, num_dests, dests))
111         jobid = atoi(argv[i]);
112       else
113         src = argv[i];
114     }
115     else if (dest == NULL)
116       dest = argv[i];
117     else
118     {
119       _cupsLangPrintf(stderr, _("lpmove: Unknown argument \"%s\"."), argv[i]);
120       return (1);
121     }
122
123   if ((!jobid && !src) || !dest)
124   {
125     _cupsLangPuts(stdout, _("Usage: lpmove job/src dest"));
126     return (1);
127   }
128
129   http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
130
131   if (http == NULL)
132   {
133     _cupsLangPrintf(stderr, _("lpmove: Unable to connect to server: %s"),
134                     strerror(errno));
135     return (1);
136   }
137
138   return (move_job(http, src, jobid, dest));
139 }
140
141
142 /*
143  * 'move_job()' - Move a job.
144  */
145
146 static int                              /* O - 0 on success, 1 on error */
147 move_job(http_t     *http,              /* I - HTTP connection to server */
148          const char *src,               /* I - Source queue */
149          int        jobid,              /* I - Job ID */
150          const char *dest)              /* I - Destination queue */
151 {
152   ipp_t *request;                       /* IPP Request */
153   char  job_uri[HTTP_MAX_URI],          /* job-uri */
154         printer_uri[HTTP_MAX_URI];      /* job-printer-uri */
155
156
157   if (!http)
158     return (1);
159
160  /*
161   * Build a CUPS_MOVE_JOB request, which requires the following
162   * attributes:
163   *
164   *    attributes-charset
165   *    attributes-natural-language
166   *    job-uri/printer-uri
167   *    job-printer-uri
168   *    requesting-user-name
169   */
170
171   request = ippNewRequest(CUPS_MOVE_JOB);
172
173   if (jobid)
174   {
175     snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", jobid);
176     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
177                  job_uri);
178   }
179   else
180   {
181     httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL,
182                      "localhost", 0, "/printers/%s", src);
183     ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
184                  job_uri);
185   }
186
187   ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
188                NULL, cupsUser());
189
190   httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri),
191                    "ipp", NULL, "localhost", 0, "/printers/%s", dest);
192   ippAddString(request, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri",
193                NULL, printer_uri);
194
195  /*
196   * Do the request and get back a response...
197   */
198
199   ippDelete(cupsDoRequest(http, request, "/jobs"));
200
201   if (cupsLastError() > IPP_OK_CONFLICT)
202   {
203     _cupsLangPrintf(stderr, "lpmove: %s", cupsLastErrorString());
204     return (1);
205   }
206   else
207     return (0);
208 }
209
210
211 /*
212  * End of "$Id: lpmove.c 9384 2010-11-22 07:06:39Z mike $".
213  */