1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * "cancel" command for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/cups-private.h>
16*5e7646d2SAndroid Build Coastguard Worker
17*5e7646d2SAndroid Build Coastguard Worker
18*5e7646d2SAndroid Build Coastguard Worker /*
19*5e7646d2SAndroid Build Coastguard Worker * Local functions...
20*5e7646d2SAndroid Build Coastguard Worker */
21*5e7646d2SAndroid Build Coastguard Worker
22*5e7646d2SAndroid Build Coastguard Worker static void usage(void) _CUPS_NORETURN;
23*5e7646d2SAndroid Build Coastguard Worker
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker /*
26*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Parse options and cancel jobs.
27*5e7646d2SAndroid Build Coastguard Worker */
28*5e7646d2SAndroid Build Coastguard Worker
29*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])30*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
31*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
32*5e7646d2SAndroid Build Coastguard Worker {
33*5e7646d2SAndroid Build Coastguard Worker http_t *http; /* HTTP connection to server */
34*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
35*5e7646d2SAndroid Build Coastguard Worker int job_id; /* Job ID */
36*5e7646d2SAndroid Build Coastguard Worker int num_dests; /* Number of destinations */
37*5e7646d2SAndroid Build Coastguard Worker cups_dest_t *dests; /* Destinations */
38*5e7646d2SAndroid Build Coastguard Worker char *opt, /* Option pointer */
39*5e7646d2SAndroid Build Coastguard Worker *dest, /* Destination printer */
40*5e7646d2SAndroid Build Coastguard Worker *job, /* Job ID pointer */
41*5e7646d2SAndroid Build Coastguard Worker *user; /* Cancel jobs for a user */
42*5e7646d2SAndroid Build Coastguard Worker int purge; /* Purge or cancel jobs? */
43*5e7646d2SAndroid Build Coastguard Worker char uri[1024]; /* Printer or job URI */
44*5e7646d2SAndroid Build Coastguard Worker ipp_t *request; /* IPP request */
45*5e7646d2SAndroid Build Coastguard Worker ipp_t *response; /* IPP response */
46*5e7646d2SAndroid Build Coastguard Worker ipp_op_t op; /* Operation */
47*5e7646d2SAndroid Build Coastguard Worker
48*5e7646d2SAndroid Build Coastguard Worker
49*5e7646d2SAndroid Build Coastguard Worker _cupsSetLocale(argv);
50*5e7646d2SAndroid Build Coastguard Worker
51*5e7646d2SAndroid Build Coastguard Worker /*
52*5e7646d2SAndroid Build Coastguard Worker * Setup to cancel individual print jobs...
53*5e7646d2SAndroid Build Coastguard Worker */
54*5e7646d2SAndroid Build Coastguard Worker
55*5e7646d2SAndroid Build Coastguard Worker op = IPP_CANCEL_JOB;
56*5e7646d2SAndroid Build Coastguard Worker purge = 0;
57*5e7646d2SAndroid Build Coastguard Worker dest = NULL;
58*5e7646d2SAndroid Build Coastguard Worker user = NULL;
59*5e7646d2SAndroid Build Coastguard Worker http = NULL;
60*5e7646d2SAndroid Build Coastguard Worker num_dests = 0;
61*5e7646d2SAndroid Build Coastguard Worker dests = NULL;
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker
64*5e7646d2SAndroid Build Coastguard Worker /*
65*5e7646d2SAndroid Build Coastguard Worker * Process command-line arguments...
66*5e7646d2SAndroid Build Coastguard Worker */
67*5e7646d2SAndroid Build Coastguard Worker
68*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < argc; i ++)
69*5e7646d2SAndroid Build Coastguard Worker {
70*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[i], "--help"))
71*5e7646d2SAndroid Build Coastguard Worker usage();
72*5e7646d2SAndroid Build Coastguard Worker else if (argv[i][0] == '-' && argv[i][1])
73*5e7646d2SAndroid Build Coastguard Worker {
74*5e7646d2SAndroid Build Coastguard Worker for (opt = argv[i] + 1; *opt; opt ++)
75*5e7646d2SAndroid Build Coastguard Worker {
76*5e7646d2SAndroid Build Coastguard Worker switch (*opt)
77*5e7646d2SAndroid Build Coastguard Worker {
78*5e7646d2SAndroid Build Coastguard Worker case 'E' : /* Encrypt */
79*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
80*5e7646d2SAndroid Build Coastguard Worker cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
81*5e7646d2SAndroid Build Coastguard Worker
82*5e7646d2SAndroid Build Coastguard Worker if (http)
83*5e7646d2SAndroid Build Coastguard Worker httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
84*5e7646d2SAndroid Build Coastguard Worker #else
85*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
86*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
87*5e7646d2SAndroid Build Coastguard Worker break;
88*5e7646d2SAndroid Build Coastguard Worker
89*5e7646d2SAndroid Build Coastguard Worker case 'U' : /* Username */
90*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
91*5e7646d2SAndroid Build Coastguard Worker {
92*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(opt + 1);
93*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
94*5e7646d2SAndroid Build Coastguard Worker }
95*5e7646d2SAndroid Build Coastguard Worker else
96*5e7646d2SAndroid Build Coastguard Worker {
97*5e7646d2SAndroid Build Coastguard Worker i ++;
98*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
99*5e7646d2SAndroid Build Coastguard Worker {
100*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
101*5e7646d2SAndroid Build Coastguard Worker usage();
102*5e7646d2SAndroid Build Coastguard Worker }
103*5e7646d2SAndroid Build Coastguard Worker
104*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(argv[i]);
105*5e7646d2SAndroid Build Coastguard Worker }
106*5e7646d2SAndroid Build Coastguard Worker break;
107*5e7646d2SAndroid Build Coastguard Worker
108*5e7646d2SAndroid Build Coastguard Worker case 'a' : /* Cancel all jobs */
109*5e7646d2SAndroid Build Coastguard Worker op = purge ? IPP_PURGE_JOBS : IPP_CANCEL_JOBS;
110*5e7646d2SAndroid Build Coastguard Worker break;
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker case 'h' : /* Connect to host */
113*5e7646d2SAndroid Build Coastguard Worker if (http != NULL)
114*5e7646d2SAndroid Build Coastguard Worker {
115*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
116*5e7646d2SAndroid Build Coastguard Worker http = NULL;
117*5e7646d2SAndroid Build Coastguard Worker }
118*5e7646d2SAndroid Build Coastguard Worker
119*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
120*5e7646d2SAndroid Build Coastguard Worker {
121*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(opt + 1);
122*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
123*5e7646d2SAndroid Build Coastguard Worker }
124*5e7646d2SAndroid Build Coastguard Worker else
125*5e7646d2SAndroid Build Coastguard Worker {
126*5e7646d2SAndroid Build Coastguard Worker i ++;
127*5e7646d2SAndroid Build Coastguard Worker
128*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
129*5e7646d2SAndroid Build Coastguard Worker {
130*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected hostname after \"-h\" option."), argv[0]);
131*5e7646d2SAndroid Build Coastguard Worker usage();
132*5e7646d2SAndroid Build Coastguard Worker }
133*5e7646d2SAndroid Build Coastguard Worker else
134*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(argv[i]);
135*5e7646d2SAndroid Build Coastguard Worker }
136*5e7646d2SAndroid Build Coastguard Worker break;
137*5e7646d2SAndroid Build Coastguard Worker
138*5e7646d2SAndroid Build Coastguard Worker case 'u' : /* Username */
139*5e7646d2SAndroid Build Coastguard Worker op = IPP_CANCEL_MY_JOBS;
140*5e7646d2SAndroid Build Coastguard Worker
141*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
142*5e7646d2SAndroid Build Coastguard Worker {
143*5e7646d2SAndroid Build Coastguard Worker user = opt + 1;
144*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
145*5e7646d2SAndroid Build Coastguard Worker }
146*5e7646d2SAndroid Build Coastguard Worker else
147*5e7646d2SAndroid Build Coastguard Worker {
148*5e7646d2SAndroid Build Coastguard Worker i ++;
149*5e7646d2SAndroid Build Coastguard Worker
150*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
151*5e7646d2SAndroid Build Coastguard Worker {
152*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-u\" option."), argv[0]);
153*5e7646d2SAndroid Build Coastguard Worker usage();
154*5e7646d2SAndroid Build Coastguard Worker }
155*5e7646d2SAndroid Build Coastguard Worker else
156*5e7646d2SAndroid Build Coastguard Worker user = argv[i];
157*5e7646d2SAndroid Build Coastguard Worker }
158*5e7646d2SAndroid Build Coastguard Worker break;
159*5e7646d2SAndroid Build Coastguard Worker
160*5e7646d2SAndroid Build Coastguard Worker case 'x' : /* Purge job(s) */
161*5e7646d2SAndroid Build Coastguard Worker purge = 1;
162*5e7646d2SAndroid Build Coastguard Worker
163*5e7646d2SAndroid Build Coastguard Worker if (op == IPP_CANCEL_JOBS)
164*5e7646d2SAndroid Build Coastguard Worker op = IPP_PURGE_JOBS;
165*5e7646d2SAndroid Build Coastguard Worker break;
166*5e7646d2SAndroid Build Coastguard Worker
167*5e7646d2SAndroid Build Coastguard Worker default :
168*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt);
169*5e7646d2SAndroid Build Coastguard Worker return (1);
170*5e7646d2SAndroid Build Coastguard Worker }
171*5e7646d2SAndroid Build Coastguard Worker }
172*5e7646d2SAndroid Build Coastguard Worker }
173*5e7646d2SAndroid Build Coastguard Worker else
174*5e7646d2SAndroid Build Coastguard Worker {
175*5e7646d2SAndroid Build Coastguard Worker /*
176*5e7646d2SAndroid Build Coastguard Worker * Cancel a job or printer...
177*5e7646d2SAndroid Build Coastguard Worker */
178*5e7646d2SAndroid Build Coastguard Worker
179*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0)
180*5e7646d2SAndroid Build Coastguard Worker num_dests = cupsGetDests(&dests);
181*5e7646d2SAndroid Build Coastguard Worker
182*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[i], "-"))
183*5e7646d2SAndroid Build Coastguard Worker {
184*5e7646d2SAndroid Build Coastguard Worker /*
185*5e7646d2SAndroid Build Coastguard Worker * Delete the current job...
186*5e7646d2SAndroid Build Coastguard Worker */
187*5e7646d2SAndroid Build Coastguard Worker
188*5e7646d2SAndroid Build Coastguard Worker dest = "";
189*5e7646d2SAndroid Build Coastguard Worker job_id = 0;
190*5e7646d2SAndroid Build Coastguard Worker }
191*5e7646d2SAndroid Build Coastguard Worker else if (cupsGetDest(argv[i], NULL, num_dests, dests) != NULL)
192*5e7646d2SAndroid Build Coastguard Worker {
193*5e7646d2SAndroid Build Coastguard Worker /*
194*5e7646d2SAndroid Build Coastguard Worker * Delete the current job on the named destination...
195*5e7646d2SAndroid Build Coastguard Worker */
196*5e7646d2SAndroid Build Coastguard Worker
197*5e7646d2SAndroid Build Coastguard Worker dest = argv[i];
198*5e7646d2SAndroid Build Coastguard Worker job_id = 0;
199*5e7646d2SAndroid Build Coastguard Worker }
200*5e7646d2SAndroid Build Coastguard Worker else if ((job = strrchr(argv[i], '-')) != NULL && isdigit(job[1] & 255))
201*5e7646d2SAndroid Build Coastguard Worker {
202*5e7646d2SAndroid Build Coastguard Worker /*
203*5e7646d2SAndroid Build Coastguard Worker * Delete the specified job ID.
204*5e7646d2SAndroid Build Coastguard Worker */
205*5e7646d2SAndroid Build Coastguard Worker
206*5e7646d2SAndroid Build Coastguard Worker dest = NULL;
207*5e7646d2SAndroid Build Coastguard Worker op = IPP_CANCEL_JOB;
208*5e7646d2SAndroid Build Coastguard Worker job_id = atoi(job + 1);
209*5e7646d2SAndroid Build Coastguard Worker }
210*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(argv[i][0] & 255))
211*5e7646d2SAndroid Build Coastguard Worker {
212*5e7646d2SAndroid Build Coastguard Worker /*
213*5e7646d2SAndroid Build Coastguard Worker * Delete the specified job ID.
214*5e7646d2SAndroid Build Coastguard Worker */
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker dest = NULL;
217*5e7646d2SAndroid Build Coastguard Worker op = IPP_CANCEL_JOB;
218*5e7646d2SAndroid Build Coastguard Worker job_id = atoi(argv[i]);
219*5e7646d2SAndroid Build Coastguard Worker }
220*5e7646d2SAndroid Build Coastguard Worker else
221*5e7646d2SAndroid Build Coastguard Worker {
222*5e7646d2SAndroid Build Coastguard Worker /*
223*5e7646d2SAndroid Build Coastguard Worker * Bad printer name!
224*5e7646d2SAndroid Build Coastguard Worker */
225*5e7646d2SAndroid Build Coastguard Worker
226*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
227*5e7646d2SAndroid Build Coastguard Worker _("%s: Error - unknown destination \"%s\"."),
228*5e7646d2SAndroid Build Coastguard Worker argv[0], argv[i]);
229*5e7646d2SAndroid Build Coastguard Worker return (1);
230*5e7646d2SAndroid Build Coastguard Worker }
231*5e7646d2SAndroid Build Coastguard Worker
232*5e7646d2SAndroid Build Coastguard Worker /*
233*5e7646d2SAndroid Build Coastguard Worker * For Solaris LP compatibility, ignore a destination name after
234*5e7646d2SAndroid Build Coastguard Worker * cancelling a specific job ID...
235*5e7646d2SAndroid Build Coastguard Worker */
236*5e7646d2SAndroid Build Coastguard Worker
237*5e7646d2SAndroid Build Coastguard Worker if (job_id && (i + 1) < argc &&
238*5e7646d2SAndroid Build Coastguard Worker cupsGetDest(argv[i + 1], NULL, num_dests, dests) != NULL)
239*5e7646d2SAndroid Build Coastguard Worker i ++;
240*5e7646d2SAndroid Build Coastguard Worker
241*5e7646d2SAndroid Build Coastguard Worker /*
242*5e7646d2SAndroid Build Coastguard Worker * Open a connection to the server...
243*5e7646d2SAndroid Build Coastguard Worker */
244*5e7646d2SAndroid Build Coastguard Worker
245*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
246*5e7646d2SAndroid Build Coastguard Worker if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
247*5e7646d2SAndroid Build Coastguard Worker cupsEncryption())) == NULL)
248*5e7646d2SAndroid Build Coastguard Worker {
249*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
250*5e7646d2SAndroid Build Coastguard Worker _("%s: Unable to connect to server."), argv[0]);
251*5e7646d2SAndroid Build Coastguard Worker return (1);
252*5e7646d2SAndroid Build Coastguard Worker }
253*5e7646d2SAndroid Build Coastguard Worker
254*5e7646d2SAndroid Build Coastguard Worker /*
255*5e7646d2SAndroid Build Coastguard Worker * Build an IPP request, which requires the following
256*5e7646d2SAndroid Build Coastguard Worker * attributes:
257*5e7646d2SAndroid Build Coastguard Worker *
258*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
259*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
260*5e7646d2SAndroid Build Coastguard Worker * printer-uri + job-id *or* job-uri
261*5e7646d2SAndroid Build Coastguard Worker * [requesting-user-name]
262*5e7646d2SAndroid Build Coastguard Worker */
263*5e7646d2SAndroid Build Coastguard Worker
264*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(op);
265*5e7646d2SAndroid Build Coastguard Worker
266*5e7646d2SAndroid Build Coastguard Worker if (dest)
267*5e7646d2SAndroid Build Coastguard Worker {
268*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
269*5e7646d2SAndroid Build Coastguard Worker "localhost", 0, "/printers/%s", dest);
270*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
271*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
272*5e7646d2SAndroid Build Coastguard Worker ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
273*5e7646d2SAndroid Build Coastguard Worker job_id);
274*5e7646d2SAndroid Build Coastguard Worker }
275*5e7646d2SAndroid Build Coastguard Worker else
276*5e7646d2SAndroid Build Coastguard Worker {
277*5e7646d2SAndroid Build Coastguard Worker snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id);
278*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
279*5e7646d2SAndroid Build Coastguard Worker uri);
280*5e7646d2SAndroid Build Coastguard Worker }
281*5e7646d2SAndroid Build Coastguard Worker
282*5e7646d2SAndroid Build Coastguard Worker if (user)
283*5e7646d2SAndroid Build Coastguard Worker {
284*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
285*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, user);
286*5e7646d2SAndroid Build Coastguard Worker ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
287*5e7646d2SAndroid Build Coastguard Worker
288*5e7646d2SAndroid Build Coastguard Worker if (op == IPP_CANCEL_JOBS)
289*5e7646d2SAndroid Build Coastguard Worker op = IPP_CANCEL_MY_JOBS;
290*5e7646d2SAndroid Build Coastguard Worker }
291*5e7646d2SAndroid Build Coastguard Worker else
292*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
293*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, cupsUser());
294*5e7646d2SAndroid Build Coastguard Worker
295*5e7646d2SAndroid Build Coastguard Worker if (purge)
296*5e7646d2SAndroid Build Coastguard Worker ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", (char)purge);
297*5e7646d2SAndroid Build Coastguard Worker
298*5e7646d2SAndroid Build Coastguard Worker /*
299*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
300*5e7646d2SAndroid Build Coastguard Worker */
301*5e7646d2SAndroid Build Coastguard Worker
302*5e7646d2SAndroid Build Coastguard Worker if (op == IPP_CANCEL_JOBS && (!user || _cups_strcasecmp(user, cupsUser())))
303*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(http, request, "/admin/");
304*5e7646d2SAndroid Build Coastguard Worker else
305*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(http, request, "/jobs/");
306*5e7646d2SAndroid Build Coastguard Worker
307*5e7646d2SAndroid Build Coastguard Worker if (response == NULL ||
308*5e7646d2SAndroid Build Coastguard Worker response->request.status.status_code > IPP_OK_CONFLICT)
309*5e7646d2SAndroid Build Coastguard Worker {
310*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s failed: %s"), argv[0],
311*5e7646d2SAndroid Build Coastguard Worker op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job",
312*5e7646d2SAndroid Build Coastguard Worker cupsLastErrorString());
313*5e7646d2SAndroid Build Coastguard Worker
314*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
315*5e7646d2SAndroid Build Coastguard Worker
316*5e7646d2SAndroid Build Coastguard Worker return (1);
317*5e7646d2SAndroid Build Coastguard Worker }
318*5e7646d2SAndroid Build Coastguard Worker
319*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
320*5e7646d2SAndroid Build Coastguard Worker }
321*5e7646d2SAndroid Build Coastguard Worker }
322*5e7646d2SAndroid Build Coastguard Worker
323*5e7646d2SAndroid Build Coastguard Worker if (num_dests == 0 && op != IPP_CANCEL_JOB)
324*5e7646d2SAndroid Build Coastguard Worker {
325*5e7646d2SAndroid Build Coastguard Worker /*
326*5e7646d2SAndroid Build Coastguard Worker * Open a connection to the server...
327*5e7646d2SAndroid Build Coastguard Worker */
328*5e7646d2SAndroid Build Coastguard Worker
329*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
330*5e7646d2SAndroid Build Coastguard Worker if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
331*5e7646d2SAndroid Build Coastguard Worker cupsEncryption())) == NULL)
332*5e7646d2SAndroid Build Coastguard Worker {
333*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Unable to contact server."), argv[0]);
334*5e7646d2SAndroid Build Coastguard Worker return (1);
335*5e7646d2SAndroid Build Coastguard Worker }
336*5e7646d2SAndroid Build Coastguard Worker
337*5e7646d2SAndroid Build Coastguard Worker /*
338*5e7646d2SAndroid Build Coastguard Worker * Build an IPP request, which requires the following
339*5e7646d2SAndroid Build Coastguard Worker * attributes:
340*5e7646d2SAndroid Build Coastguard Worker *
341*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
342*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
343*5e7646d2SAndroid Build Coastguard Worker * printer-uri + job-id *or* job-uri
344*5e7646d2SAndroid Build Coastguard Worker * [requesting-user-name]
345*5e7646d2SAndroid Build Coastguard Worker */
346*5e7646d2SAndroid Build Coastguard Worker
347*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(op);
348*5e7646d2SAndroid Build Coastguard Worker
349*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
350*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, "ipp://localhost/printers/");
351*5e7646d2SAndroid Build Coastguard Worker
352*5e7646d2SAndroid Build Coastguard Worker if (user)
353*5e7646d2SAndroid Build Coastguard Worker {
354*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
355*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, user);
356*5e7646d2SAndroid Build Coastguard Worker ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1);
357*5e7646d2SAndroid Build Coastguard Worker }
358*5e7646d2SAndroid Build Coastguard Worker else
359*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
360*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, cupsUser());
361*5e7646d2SAndroid Build Coastguard Worker
362*5e7646d2SAndroid Build Coastguard Worker ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", (char)purge);
363*5e7646d2SAndroid Build Coastguard Worker
364*5e7646d2SAndroid Build Coastguard Worker /*
365*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
366*5e7646d2SAndroid Build Coastguard Worker */
367*5e7646d2SAndroid Build Coastguard Worker
368*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(http, request, "/admin/");
369*5e7646d2SAndroid Build Coastguard Worker
370*5e7646d2SAndroid Build Coastguard Worker if (response == NULL ||
371*5e7646d2SAndroid Build Coastguard Worker response->request.status.status_code > IPP_OK_CONFLICT)
372*5e7646d2SAndroid Build Coastguard Worker {
373*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s failed: %s"), argv[0],
374*5e7646d2SAndroid Build Coastguard Worker op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job",
375*5e7646d2SAndroid Build Coastguard Worker cupsLastErrorString());
376*5e7646d2SAndroid Build Coastguard Worker
377*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
378*5e7646d2SAndroid Build Coastguard Worker
379*5e7646d2SAndroid Build Coastguard Worker return (1);
380*5e7646d2SAndroid Build Coastguard Worker }
381*5e7646d2SAndroid Build Coastguard Worker
382*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
383*5e7646d2SAndroid Build Coastguard Worker }
384*5e7646d2SAndroid Build Coastguard Worker
385*5e7646d2SAndroid Build Coastguard Worker return (0);
386*5e7646d2SAndroid Build Coastguard Worker }
387*5e7646d2SAndroid Build Coastguard Worker
388*5e7646d2SAndroid Build Coastguard Worker
389*5e7646d2SAndroid Build Coastguard Worker /*
390*5e7646d2SAndroid Build Coastguard Worker * 'usage()' - Show program usage and exit.
391*5e7646d2SAndroid Build Coastguard Worker */
392*5e7646d2SAndroid Build Coastguard Worker
393*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)394*5e7646d2SAndroid Build Coastguard Worker usage(void)
395*5e7646d2SAndroid Build Coastguard Worker {
396*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Usage: cancel [options] [id]\n"
397*5e7646d2SAndroid Build Coastguard Worker " cancel [options] [destination]\n"
398*5e7646d2SAndroid Build Coastguard Worker " cancel [options] [destination-id]"));
399*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Options:"));
400*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-a Cancel all jobs"));
401*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
402*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
403*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-u owner Specify the owner to use for jobs"));
404*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication"));
405*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-x Purge jobs rather than just canceling"));
406*5e7646d2SAndroid Build Coastguard Worker
407*5e7646d2SAndroid Build Coastguard Worker exit(1);
408*5e7646d2SAndroid Build Coastguard Worker }
409