]> git.ipfire.org Git - thirdparty/cups.git/blob - berkeley/lprm.c
2abf68c16eb15f1dad6a79a90fe187b31ec77ea6
[thirdparty/cups.git] / berkeley / lprm.c
1 /*
2 * "$Id: lprm.c 177 2006-06-21 00:20:03Z jlovell $"
3 *
4 * "lprm" command for the Common UNIX Printing System (CUPS).
5 *
6 * Copyright 1997-2006 by Easy Software Products.
7 *
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE.txt" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
13 * at:
14 *
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
19 *
20 * Voice: (301) 373-9600
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
23 *
24 * Contents:
25 *
26 * main() - Parse options and cancel jobs.
27 */
28
29 /*
30 * Include necessary headers...
31 */
32
33 #include <stdio.h>
34 #include <stdlib.h>
35
36 #include <cups/cups.h>
37 #include <cups/i18n.h>
38 #include <cups/string.h>
39
40
41 /*
42 * 'main()' - Parse options and cancel jobs.
43 */
44
45 int /* O - Exit status */
46 main(int argc, /* I - Number of command-line arguments */
47 char *argv[]) /* I - Command-line arguments */
48 {
49 http_t *http; /* HTTP connection to server */
50 int i; /* Looping var */
51 int job_id; /* Job ID */
52 const char *dest; /* Destination printer */
53 char *instance; /* Pointer to instance name */
54 char uri[1024]; /* Printer or job URI */
55 ipp_t *request; /* IPP request */
56 ipp_t *response; /* IPP response */
57 ipp_op_t op; /* Operation */
58 cups_lang_t *language; /* Language */
59 int num_dests; /* Number of destinations */
60 cups_dest_t *dests; /* Destinations */
61 http_encryption_t encryption; /* Encryption? */
62
63
64 /*
65 * Setup to cancel individual print jobs...
66 */
67
68 op = IPP_CANCEL_JOB;
69 job_id = 0;
70 dest = NULL;
71 response = NULL;
72 http = NULL;
73 encryption = cupsEncryption();
74 language = cupsLangDefault();
75 num_dests = cupsGetDests(&dests);
76
77 for (i = 0; i < num_dests; i ++)
78 if (dests[i].is_default)
79 dest = dests[i].name;
80
81 /*
82 * Open a connection to the server...
83 */
84
85 if ((http = httpConnectEncrypt(cupsServer(), ippPort(), encryption)) == NULL)
86 {
87 _cupsLangPuts(stderr, _("lprm: Unable to contact server!\n"));
88 cupsFreeDests(num_dests, dests);
89 return (1);
90 }
91
92 /*
93 * Process command-line arguments...
94 */
95
96 for (i = 1; i < argc; i ++)
97 if (argv[i][0] == '-' && argv[i][1] != '\0')
98 switch (argv[i][1])
99 {
100 case 'E' : /* Encrypt */
101 #ifdef HAVE_SSL
102 encryption = HTTP_ENCRYPT_REQUIRED;
103
104 httpEncryption(http, encryption);
105 #else
106 _cupsLangPrintf(stderr,
107 _("%s: Sorry, no encryption support compiled in!\n"),
108 argv[0]);
109 #endif /* HAVE_SSL */
110 break;
111
112 case 'P' : /* Cancel jobs on a printer */
113 if (argv[i][2])
114 dest = argv[i] + 2;
115 else
116 {
117 i ++;
118 dest = argv[i];
119 }
120
121 if ((instance = strchr(dest, '/')) != NULL)
122 *instance = '\0';
123
124 if (cupsGetDest(dest, NULL, num_dests, dests) == NULL)
125 {
126 _cupsLangPrintf(stderr,
127 _("%s: Error - unknown destination \"%s\"!\n"),
128 argv[0], dest);
129 cupsFreeDests(num_dests, dests);
130 httpClose(http);
131 return(1);
132 }
133 break;
134
135 case 'U' : /* Username */
136 if (argv[i][2] != '\0')
137 cupsSetUser(argv[i] + 2);
138 else
139 {
140 i ++;
141 if (i >= argc)
142 {
143 _cupsLangPrintf(stderr,
144 _("%s: Error - expected username after "
145 "\'-U\' option!\n"),
146 argv[0]);
147 return (1);
148 }
149
150 cupsSetUser(argv[i]);
151 }
152 break;
153
154 case 'h' : /* Connect to host */
155 if (http != NULL)
156 httpClose(http);
157
158 if (argv[i][2] != '\0')
159 cupsSetServer(argv[i] + 2);
160 else
161 {
162 i ++;
163
164 if (i >= argc)
165 {
166 _cupsLangPrintf(stderr,
167 _("%s: Error - expected hostname after "
168 "\'-h\' option!\n"),
169 argv[0]);
170 return (1);
171 }
172 else
173 cupsSetServer(argv[i]);
174 }
175 break;
176
177 default :
178 _cupsLangPrintf(stderr,
179 _("%s: Error - unknown option \'%c\'!\n"),
180 argv[0], argv[i][1]);
181 cupsFreeDests(num_dests, dests);
182 httpClose(http);
183 return (1);
184 }
185 else
186 {
187 /*
188 * Cancel a job or printer...
189 */
190
191 if (isdigit(argv[i][0] & 255) &&
192 cupsGetDest(argv[i], NULL, num_dests, dests) == NULL)
193 {
194 dest = NULL;
195 op = IPP_CANCEL_JOB;
196 job_id = atoi(argv[i]);
197 }
198 else if (!strcmp(argv[i], "-"))
199 {
200 /*
201 * Cancel all jobs
202 */
203
204 op = IPP_PURGE_JOBS;
205 }
206 else
207 {
208 dest = argv[i];
209 job_id = 0;
210 }
211
212 /*
213 * Build an IPP request, which requires the following
214 * attributes:
215 *
216 * attributes-charset
217 * attributes-natural-language
218 * printer-uri + job-id *or* job-uri
219 * [requesting-user-name]
220 */
221
222 request = ippNewRequest(op);
223
224 if (dest)
225 {
226 httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
227 "localhost", 0, "/printers/%s", dest);
228 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
229 "printer-uri", NULL, uri);
230 ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
231 job_id);
232 }
233 else
234 {
235 sprintf(uri, "ipp://localhost/jobs/%d", job_id);
236 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
237 uri);
238 }
239
240 ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
241 "requesting-user-name", NULL, cupsUser());
242
243 /*
244 * Do the request and get back a response...
245 */
246
247 if (op == IPP_PURGE_JOBS)
248 response = cupsDoRequest(http, request, "/admin/");
249 else
250 response = cupsDoRequest(http, request, "/jobs/");
251
252 ippDelete(response);
253
254 if (cupsLastError() > IPP_OK_CONFLICT)
255 {
256 _cupsLangPrintf(stderr, "%s: %s\n", argv[0], cupsLastErrorString());
257
258 cupsFreeDests(num_dests, dests);
259 httpClose(http);
260 return (1);
261 }
262 }
263
264 /*
265 * If nothing has been cancelled yet, cancel the current job on the specified
266 * (or default) printer...
267 */
268
269 if (response == NULL)
270 if (!cupsCancelJob(dest, 0))
271 {
272 _cupsLangPrintf(stderr, "%s: %s\n", argv[0], cupsLastErrorString());
273 cupsFreeDests(num_dests, dests);
274 httpClose(http);
275 return (1);
276 }
277
278 cupsFreeDests(num_dests, dests);
279 httpClose(http);
280
281 return (0);
282 }
283
284
285 /*
286 * End of "$Id: lprm.c 177 2006-06-21 00:20:03Z jlovell $".
287 */