xref: /aosp_15_r20/external/libcups/berkeley/lprm.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * "lprm" 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   int		i;		/* Looping var */
34*5e7646d2SAndroid Build Coastguard Worker   int		job_id;		/* Job ID */
35*5e7646d2SAndroid Build Coastguard Worker   const char	*name;		/* Destination printer */
36*5e7646d2SAndroid Build Coastguard Worker   char		*instance,	/* Pointer to instance name */
37*5e7646d2SAndroid Build Coastguard Worker 		*opt;		/* Option pointer */
38*5e7646d2SAndroid Build Coastguard Worker   cups_dest_t	*dest,		/* Destination */
39*5e7646d2SAndroid Build Coastguard Worker 		*defdest;	/* Default destination */
40*5e7646d2SAndroid Build Coastguard Worker   int		did_cancel;	/* Did we cancel something? */
41*5e7646d2SAndroid Build Coastguard Worker 
42*5e7646d2SAndroid Build Coastguard Worker 
43*5e7646d2SAndroid Build Coastguard Worker   _cupsSetLocale(argv);
44*5e7646d2SAndroid Build Coastguard Worker 
45*5e7646d2SAndroid Build Coastguard Worker  /*
46*5e7646d2SAndroid Build Coastguard Worker   * Setup to cancel individual print jobs...
47*5e7646d2SAndroid Build Coastguard Worker   */
48*5e7646d2SAndroid Build Coastguard Worker 
49*5e7646d2SAndroid Build Coastguard Worker   did_cancel = 0;
50*5e7646d2SAndroid Build Coastguard Worker   defdest    = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
51*5e7646d2SAndroid Build Coastguard Worker   name       = defdest ? defdest->name : NULL;
52*5e7646d2SAndroid Build Coastguard Worker 
53*5e7646d2SAndroid Build Coastguard Worker  /*
54*5e7646d2SAndroid Build Coastguard Worker   * Process command-line arguments...
55*5e7646d2SAndroid Build Coastguard Worker   */
56*5e7646d2SAndroid Build Coastguard Worker 
57*5e7646d2SAndroid Build Coastguard Worker   for (i = 1; i < argc; i ++)
58*5e7646d2SAndroid Build Coastguard Worker   {
59*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(argv[i], "--help"))
60*5e7646d2SAndroid Build Coastguard Worker       usage();
61*5e7646d2SAndroid Build Coastguard Worker     else if (argv[i][0] == '-' && argv[i][1] != '\0')
62*5e7646d2SAndroid Build Coastguard Worker     {
63*5e7646d2SAndroid Build Coastguard Worker       for (opt = argv[i] + 1; *opt; opt ++)
64*5e7646d2SAndroid Build Coastguard Worker       {
65*5e7646d2SAndroid Build Coastguard Worker 	switch (*opt)
66*5e7646d2SAndroid Build Coastguard Worker 	{
67*5e7646d2SAndroid Build Coastguard Worker 	  case 'E' : /* Encrypt */
68*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
69*5e7646d2SAndroid Build Coastguard Worker 	      cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
70*5e7646d2SAndroid Build Coastguard Worker #else
71*5e7646d2SAndroid Build Coastguard Worker 	      _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
72*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
73*5e7646d2SAndroid Build Coastguard Worker 	      break;
74*5e7646d2SAndroid Build Coastguard Worker 
75*5e7646d2SAndroid Build Coastguard Worker 	  case 'P' : /* Cancel jobs on a printer */
76*5e7646d2SAndroid Build Coastguard Worker 	      if (opt[1] != '\0')
77*5e7646d2SAndroid Build Coastguard Worker 	      {
78*5e7646d2SAndroid Build Coastguard Worker 		name = opt + 1;
79*5e7646d2SAndroid Build Coastguard Worker 		opt += strlen(opt) - 1;
80*5e7646d2SAndroid Build Coastguard Worker 	      }
81*5e7646d2SAndroid Build Coastguard Worker 	      else
82*5e7646d2SAndroid Build Coastguard Worker 	      {
83*5e7646d2SAndroid Build Coastguard Worker 		i ++;
84*5e7646d2SAndroid Build Coastguard Worker 		name = argv[i];
85*5e7646d2SAndroid Build Coastguard Worker 	      }
86*5e7646d2SAndroid Build Coastguard Worker 
87*5e7646d2SAndroid Build Coastguard Worker 	      if ((instance = strchr(name, '/')) != NULL)
88*5e7646d2SAndroid Build Coastguard Worker 		*instance = '\0';
89*5e7646d2SAndroid Build Coastguard Worker 
90*5e7646d2SAndroid Build Coastguard Worker 	      if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, name, NULL)) == NULL)
91*5e7646d2SAndroid Build Coastguard Worker 	      {
92*5e7646d2SAndroid Build Coastguard Worker 		_cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."), argv[0], name);
93*5e7646d2SAndroid Build Coastguard Worker 		goto error;
94*5e7646d2SAndroid Build Coastguard Worker 	      }
95*5e7646d2SAndroid Build Coastguard Worker 
96*5e7646d2SAndroid Build Coastguard Worker 	      cupsFreeDests(1, dest);
97*5e7646d2SAndroid Build Coastguard Worker 	      break;
98*5e7646d2SAndroid Build Coastguard Worker 
99*5e7646d2SAndroid Build Coastguard Worker 	  case 'U' : /* Username */
100*5e7646d2SAndroid Build Coastguard Worker 	      if (opt[1] != '\0')
101*5e7646d2SAndroid Build Coastguard Worker 	      {
102*5e7646d2SAndroid Build Coastguard Worker 		cupsSetUser(opt + 1);
103*5e7646d2SAndroid Build Coastguard Worker 		opt += strlen(opt) - 1;
104*5e7646d2SAndroid Build Coastguard Worker 	      }
105*5e7646d2SAndroid Build Coastguard Worker 	      else
106*5e7646d2SAndroid Build Coastguard Worker 	      {
107*5e7646d2SAndroid Build Coastguard Worker 		i ++;
108*5e7646d2SAndroid Build Coastguard Worker 		if (i >= argc)
109*5e7646d2SAndroid Build Coastguard Worker 		{
110*5e7646d2SAndroid Build Coastguard Worker 		  _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
111*5e7646d2SAndroid Build Coastguard Worker 		  usage();
112*5e7646d2SAndroid Build Coastguard Worker 		}
113*5e7646d2SAndroid Build Coastguard Worker 
114*5e7646d2SAndroid Build Coastguard Worker 		cupsSetUser(argv[i]);
115*5e7646d2SAndroid Build Coastguard Worker 	      }
116*5e7646d2SAndroid Build Coastguard Worker 	      break;
117*5e7646d2SAndroid Build Coastguard Worker 
118*5e7646d2SAndroid Build Coastguard Worker 	  case 'h' : /* Connect to host */
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 
137*5e7646d2SAndroid Build Coastguard Worker 	      if (defdest)
138*5e7646d2SAndroid Build Coastguard Worker 		cupsFreeDests(1, defdest);
139*5e7646d2SAndroid Build Coastguard Worker 
140*5e7646d2SAndroid Build Coastguard Worker 	      defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
141*5e7646d2SAndroid Build Coastguard Worker 	      name    = defdest ? defdest->name : NULL;
142*5e7646d2SAndroid Build Coastguard Worker 	      break;
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker 	  default :
145*5e7646d2SAndroid Build Coastguard Worker 	      _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), argv[0], *opt);
146*5e7646d2SAndroid Build Coastguard Worker 	      usage();
147*5e7646d2SAndroid Build Coastguard Worker 	}
148*5e7646d2SAndroid Build Coastguard Worker       }
149*5e7646d2SAndroid Build Coastguard Worker     }
150*5e7646d2SAndroid Build Coastguard Worker     else
151*5e7646d2SAndroid Build Coastguard Worker     {
152*5e7646d2SAndroid Build Coastguard Worker      /*
153*5e7646d2SAndroid Build Coastguard Worker       * Cancel a job or printer...
154*5e7646d2SAndroid Build Coastguard Worker       */
155*5e7646d2SAndroid Build Coastguard Worker 
156*5e7646d2SAndroid Build Coastguard Worker       if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[i], NULL)) != NULL)
157*5e7646d2SAndroid Build Coastguard Worker         cupsFreeDests(1, dest);
158*5e7646d2SAndroid Build Coastguard Worker 
159*5e7646d2SAndroid Build Coastguard Worker       if (dest)
160*5e7646d2SAndroid Build Coastguard Worker       {
161*5e7646d2SAndroid Build Coastguard Worker         name   = argv[i];
162*5e7646d2SAndroid Build Coastguard Worker         job_id = 0;
163*5e7646d2SAndroid Build Coastguard Worker       }
164*5e7646d2SAndroid Build Coastguard Worker       else if (isdigit(argv[i][0] & 255))
165*5e7646d2SAndroid Build Coastguard Worker       {
166*5e7646d2SAndroid Build Coastguard Worker         name   = NULL;
167*5e7646d2SAndroid Build Coastguard Worker         job_id = atoi(argv[i]);
168*5e7646d2SAndroid Build Coastguard Worker       }
169*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "-"))
170*5e7646d2SAndroid Build Coastguard Worker       {
171*5e7646d2SAndroid Build Coastguard Worker        /*
172*5e7646d2SAndroid Build Coastguard Worker         * Cancel all jobs
173*5e7646d2SAndroid Build Coastguard Worker         */
174*5e7646d2SAndroid Build Coastguard Worker 
175*5e7646d2SAndroid Build Coastguard Worker         job_id = -1;
176*5e7646d2SAndroid Build Coastguard Worker       }
177*5e7646d2SAndroid Build Coastguard Worker       else
178*5e7646d2SAndroid Build Coastguard Worker       {
179*5e7646d2SAndroid Build Coastguard Worker 	_cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."),
180*5e7646d2SAndroid Build Coastguard Worker 			argv[0], argv[i]);
181*5e7646d2SAndroid Build Coastguard Worker 	goto error;
182*5e7646d2SAndroid Build Coastguard Worker       }
183*5e7646d2SAndroid Build Coastguard Worker 
184*5e7646d2SAndroid Build Coastguard Worker       if (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) != IPP_OK)
185*5e7646d2SAndroid Build Coastguard Worker       {
186*5e7646d2SAndroid Build Coastguard Worker         _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString());
187*5e7646d2SAndroid Build Coastguard Worker 	goto error;
188*5e7646d2SAndroid Build Coastguard Worker       }
189*5e7646d2SAndroid Build Coastguard Worker 
190*5e7646d2SAndroid Build Coastguard Worker       did_cancel = 1;
191*5e7646d2SAndroid Build Coastguard Worker     }
192*5e7646d2SAndroid Build Coastguard Worker   }
193*5e7646d2SAndroid Build Coastguard Worker 
194*5e7646d2SAndroid Build Coastguard Worker  /*
195*5e7646d2SAndroid Build Coastguard Worker   * If nothing has been canceled yet, cancel the current job on the specified
196*5e7646d2SAndroid Build Coastguard Worker   * (or default) printer...
197*5e7646d2SAndroid Build Coastguard Worker   */
198*5e7646d2SAndroid Build Coastguard Worker 
199*5e7646d2SAndroid Build Coastguard Worker   if (!did_cancel && cupsCancelJob2(CUPS_HTTP_DEFAULT, name, 0, 0) != IPP_OK)
200*5e7646d2SAndroid Build Coastguard Worker     {
201*5e7646d2SAndroid Build Coastguard Worker       _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString());
202*5e7646d2SAndroid Build Coastguard Worker       goto error;
203*5e7646d2SAndroid Build Coastguard Worker     }
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker   if (defdest)
206*5e7646d2SAndroid Build Coastguard Worker     cupsFreeDests(1, defdest);
207*5e7646d2SAndroid Build Coastguard Worker 
208*5e7646d2SAndroid Build Coastguard Worker   return (0);
209*5e7646d2SAndroid Build Coastguard Worker 
210*5e7646d2SAndroid Build Coastguard Worker  /*
211*5e7646d2SAndroid Build Coastguard Worker   * If we get here there was an error, so clean up...
212*5e7646d2SAndroid Build Coastguard Worker   */
213*5e7646d2SAndroid Build Coastguard Worker 
214*5e7646d2SAndroid Build Coastguard Worker   error:
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker   if (defdest)
217*5e7646d2SAndroid Build Coastguard Worker     cupsFreeDests(1, defdest);
218*5e7646d2SAndroid Build Coastguard Worker 
219*5e7646d2SAndroid Build Coastguard Worker   return (1);
220*5e7646d2SAndroid Build Coastguard Worker }
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker 
223*5e7646d2SAndroid Build Coastguard Worker /*
224*5e7646d2SAndroid Build Coastguard Worker  * 'usage()' - Show program usage and exit.
225*5e7646d2SAndroid Build Coastguard Worker  */
226*5e7646d2SAndroid Build Coastguard Worker 
227*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)228*5e7646d2SAndroid Build Coastguard Worker usage(void)
229*5e7646d2SAndroid Build Coastguard Worker {
230*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Usage: lprm [options] [id]\n"
231*5e7646d2SAndroid Build Coastguard Worker                           "       lprm [options] -"));
232*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("Options:"));
233*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-                       Cancel all jobs"));
234*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-E                      Encrypt the connection to the server"));
235*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-h server[:port]        Connect to the named server and port"));
236*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-P destination          Specify the destination"));
237*5e7646d2SAndroid Build Coastguard Worker   _cupsLangPuts(stdout, _("-U username             Specify the username to use for authentication"));
238*5e7646d2SAndroid Build Coastguard Worker 
239*5e7646d2SAndroid Build Coastguard Worker   exit(1);
240*5e7646d2SAndroid Build Coastguard Worker }
241