xref: /aosp_15_r20/external/libcups/systemv/cancel.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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