1/* 2 * "$Id: lpmove.c 11093 2013-07-03 20:48:42Z msweet $" 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 32static 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 40int 41main(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 146static int /* O - 0 on success, 1 on error */ 147move_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 11093 2013-07-03 20:48:42Z msweet $". 213 */ 214