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