1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * "lpadmin" command for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2021 by OpenPrinting.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2021 by Apple Inc.
6*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2006 by Easy Software Products.
7*5e7646d2SAndroid Build Coastguard Worker *
8*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
9*5e7646d2SAndroid Build Coastguard Worker * information.
10*5e7646d2SAndroid Build Coastguard Worker */
11*5e7646d2SAndroid Build Coastguard Worker
12*5e7646d2SAndroid Build Coastguard Worker /*
13*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
14*5e7646d2SAndroid Build Coastguard Worker */
15*5e7646d2SAndroid Build Coastguard Worker
16*5e7646d2SAndroid Build Coastguard Worker #include <cups/cups-private.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <cups/ppd-private.h>
18*5e7646d2SAndroid Build Coastguard Worker
19*5e7646d2SAndroid Build Coastguard Worker
20*5e7646d2SAndroid Build Coastguard Worker /*
21*5e7646d2SAndroid Build Coastguard Worker * Local functions...
22*5e7646d2SAndroid Build Coastguard Worker */
23*5e7646d2SAndroid Build Coastguard Worker
24*5e7646d2SAndroid Build Coastguard Worker static int add_printer_to_class(http_t *http, char *printer, char *pclass);
25*5e7646d2SAndroid Build Coastguard Worker static int default_printer(http_t *http, char *printer);
26*5e7646d2SAndroid Build Coastguard Worker static int delete_printer(http_t *http, char *printer);
27*5e7646d2SAndroid Build Coastguard Worker static int delete_printer_from_class(http_t *http, char *printer,
28*5e7646d2SAndroid Build Coastguard Worker char *pclass);
29*5e7646d2SAndroid Build Coastguard Worker static int delete_printer_option(http_t *http, char *printer,
30*5e7646d2SAndroid Build Coastguard Worker char *option);
31*5e7646d2SAndroid Build Coastguard Worker static int enable_printer(http_t *http, char *printer);
32*5e7646d2SAndroid Build Coastguard Worker static cups_ptype_t get_printer_type(http_t *http, char *printer, char *uri,
33*5e7646d2SAndroid Build Coastguard Worker size_t urisize);
34*5e7646d2SAndroid Build Coastguard Worker static int set_printer_options(http_t *http, char *printer,
35*5e7646d2SAndroid Build Coastguard Worker int num_options, cups_option_t *options,
36*5e7646d2SAndroid Build Coastguard Worker char *file, int enable);
37*5e7646d2SAndroid Build Coastguard Worker static void usage(void) _CUPS_NORETURN;
38*5e7646d2SAndroid Build Coastguard Worker static int validate_name(const char *name);
39*5e7646d2SAndroid Build Coastguard Worker
40*5e7646d2SAndroid Build Coastguard Worker
41*5e7646d2SAndroid Build Coastguard Worker /*
42*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Parse options and configure the scheduler.
43*5e7646d2SAndroid Build Coastguard Worker */
44*5e7646d2SAndroid Build Coastguard Worker
45*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])46*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
47*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
48*5e7646d2SAndroid Build Coastguard Worker {
49*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
50*5e7646d2SAndroid Build Coastguard Worker http_t *http; /* Connection to server */
51*5e7646d2SAndroid Build Coastguard Worker char *printer, /* Destination printer */
52*5e7646d2SAndroid Build Coastguard Worker *pclass, /* Printer class name */
53*5e7646d2SAndroid Build Coastguard Worker *opt, /* Option pointer */
54*5e7646d2SAndroid Build Coastguard Worker *val; /* Pointer to allow/deny value */
55*5e7646d2SAndroid Build Coastguard Worker int enable = 0; /* Enable/resume printer? */
56*5e7646d2SAndroid Build Coastguard Worker int num_options; /* Number of options */
57*5e7646d2SAndroid Build Coastguard Worker cups_option_t *options; /* Options */
58*5e7646d2SAndroid Build Coastguard Worker char *file, /* New PPD file */
59*5e7646d2SAndroid Build Coastguard Worker evefile[1024] = ""; /* IPP Everywhere PPD */
60*5e7646d2SAndroid Build Coastguard Worker const char *ppd_name, /* ppd-name value */
61*5e7646d2SAndroid Build Coastguard Worker *device_uri; /* device-uri value */
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker
64*5e7646d2SAndroid Build Coastguard Worker _cupsSetLocale(argv);
65*5e7646d2SAndroid Build Coastguard Worker
66*5e7646d2SAndroid Build Coastguard Worker http = NULL;
67*5e7646d2SAndroid Build Coastguard Worker printer = NULL;
68*5e7646d2SAndroid Build Coastguard Worker num_options = 0;
69*5e7646d2SAndroid Build Coastguard Worker options = NULL;
70*5e7646d2SAndroid Build Coastguard Worker file = NULL;
71*5e7646d2SAndroid Build Coastguard Worker
72*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < argc; i ++)
73*5e7646d2SAndroid Build Coastguard Worker {
74*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[i], "--help"))
75*5e7646d2SAndroid Build Coastguard Worker usage();
76*5e7646d2SAndroid Build Coastguard Worker else if (argv[i][0] == '-')
77*5e7646d2SAndroid Build Coastguard Worker {
78*5e7646d2SAndroid Build Coastguard Worker for (opt = argv[i] + 1; *opt; opt ++)
79*5e7646d2SAndroid Build Coastguard Worker {
80*5e7646d2SAndroid Build Coastguard Worker switch (*opt)
81*5e7646d2SAndroid Build Coastguard Worker {
82*5e7646d2SAndroid Build Coastguard Worker case 'c' : /* Add printer to class */
83*5e7646d2SAndroid Build Coastguard Worker if (!http)
84*5e7646d2SAndroid Build Coastguard Worker {
85*5e7646d2SAndroid Build Coastguard Worker http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
86*5e7646d2SAndroid Build Coastguard Worker
87*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
88*5e7646d2SAndroid Build Coastguard Worker {
89*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unable to connect to server: %s"), strerror(errno));
90*5e7646d2SAndroid Build Coastguard Worker return (1);
91*5e7646d2SAndroid Build Coastguard Worker }
92*5e7646d2SAndroid Build Coastguard Worker }
93*5e7646d2SAndroid Build Coastguard Worker
94*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
95*5e7646d2SAndroid Build Coastguard Worker {
96*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr,
97*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Unable to add a printer to the class:\n"
98*5e7646d2SAndroid Build Coastguard Worker " You must specify a printer name first."));
99*5e7646d2SAndroid Build Coastguard Worker return (1);
100*5e7646d2SAndroid Build Coastguard Worker }
101*5e7646d2SAndroid Build Coastguard Worker
102*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
103*5e7646d2SAndroid Build Coastguard Worker {
104*5e7646d2SAndroid Build Coastguard Worker pclass = opt + 1;
105*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
106*5e7646d2SAndroid Build Coastguard Worker }
107*5e7646d2SAndroid Build Coastguard Worker else
108*5e7646d2SAndroid Build Coastguard Worker {
109*5e7646d2SAndroid Build Coastguard Worker i ++;
110*5e7646d2SAndroid Build Coastguard Worker
111*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
112*5e7646d2SAndroid Build Coastguard Worker {
113*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected class name after \"-c\" option."));
114*5e7646d2SAndroid Build Coastguard Worker usage();
115*5e7646d2SAndroid Build Coastguard Worker }
116*5e7646d2SAndroid Build Coastguard Worker
117*5e7646d2SAndroid Build Coastguard Worker pclass = argv[i];
118*5e7646d2SAndroid Build Coastguard Worker }
119*5e7646d2SAndroid Build Coastguard Worker
120*5e7646d2SAndroid Build Coastguard Worker if (!validate_name(pclass))
121*5e7646d2SAndroid Build Coastguard Worker {
122*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr,
123*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Class name can only contain printable "
124*5e7646d2SAndroid Build Coastguard Worker "characters."));
125*5e7646d2SAndroid Build Coastguard Worker return (1);
126*5e7646d2SAndroid Build Coastguard Worker }
127*5e7646d2SAndroid Build Coastguard Worker
128*5e7646d2SAndroid Build Coastguard Worker if (add_printer_to_class(http, printer, pclass))
129*5e7646d2SAndroid Build Coastguard Worker return (1);
130*5e7646d2SAndroid Build Coastguard Worker break;
131*5e7646d2SAndroid Build Coastguard Worker
132*5e7646d2SAndroid Build Coastguard Worker case 'd' : /* Set as default destination */
133*5e7646d2SAndroid Build Coastguard Worker if (!http)
134*5e7646d2SAndroid Build Coastguard Worker {
135*5e7646d2SAndroid Build Coastguard Worker http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
136*5e7646d2SAndroid Build Coastguard Worker
137*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
138*5e7646d2SAndroid Build Coastguard Worker {
139*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unable to connect to server: %s"), strerror(errno));
140*5e7646d2SAndroid Build Coastguard Worker return (1);
141*5e7646d2SAndroid Build Coastguard Worker }
142*5e7646d2SAndroid Build Coastguard Worker }
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
145*5e7646d2SAndroid Build Coastguard Worker {
146*5e7646d2SAndroid Build Coastguard Worker printer = opt + 1;
147*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
148*5e7646d2SAndroid Build Coastguard Worker }
149*5e7646d2SAndroid Build Coastguard Worker else
150*5e7646d2SAndroid Build Coastguard Worker {
151*5e7646d2SAndroid Build Coastguard Worker i ++;
152*5e7646d2SAndroid Build Coastguard Worker
153*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
154*5e7646d2SAndroid Build Coastguard Worker {
155*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected printer name after \"-d\" option."));
156*5e7646d2SAndroid Build Coastguard Worker usage();
157*5e7646d2SAndroid Build Coastguard Worker }
158*5e7646d2SAndroid Build Coastguard Worker
159*5e7646d2SAndroid Build Coastguard Worker printer = argv[i];
160*5e7646d2SAndroid Build Coastguard Worker }
161*5e7646d2SAndroid Build Coastguard Worker
162*5e7646d2SAndroid Build Coastguard Worker if (!validate_name(printer))
163*5e7646d2SAndroid Build Coastguard Worker {
164*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Printer name can only contain printable characters."));
165*5e7646d2SAndroid Build Coastguard Worker return (1);
166*5e7646d2SAndroid Build Coastguard Worker }
167*5e7646d2SAndroid Build Coastguard Worker
168*5e7646d2SAndroid Build Coastguard Worker if (default_printer(http, printer))
169*5e7646d2SAndroid Build Coastguard Worker return (1);
170*5e7646d2SAndroid Build Coastguard Worker
171*5e7646d2SAndroid Build Coastguard Worker i = argc;
172*5e7646d2SAndroid Build Coastguard Worker break;
173*5e7646d2SAndroid Build Coastguard Worker
174*5e7646d2SAndroid Build Coastguard Worker case 'h' : /* Connect to host */
175*5e7646d2SAndroid Build Coastguard Worker if (http)
176*5e7646d2SAndroid Build Coastguard Worker {
177*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
178*5e7646d2SAndroid Build Coastguard Worker http = NULL;
179*5e7646d2SAndroid Build Coastguard Worker }
180*5e7646d2SAndroid Build Coastguard Worker
181*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
182*5e7646d2SAndroid Build Coastguard Worker {
183*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(opt + 1);
184*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
185*5e7646d2SAndroid Build Coastguard Worker }
186*5e7646d2SAndroid Build Coastguard Worker else
187*5e7646d2SAndroid Build Coastguard Worker {
188*5e7646d2SAndroid Build Coastguard Worker i ++;
189*5e7646d2SAndroid Build Coastguard Worker
190*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
191*5e7646d2SAndroid Build Coastguard Worker {
192*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected hostname after \"-h\" option."));
193*5e7646d2SAndroid Build Coastguard Worker usage();
194*5e7646d2SAndroid Build Coastguard Worker }
195*5e7646d2SAndroid Build Coastguard Worker
196*5e7646d2SAndroid Build Coastguard Worker cupsSetServer(argv[i]);
197*5e7646d2SAndroid Build Coastguard Worker }
198*5e7646d2SAndroid Build Coastguard Worker break;
199*5e7646d2SAndroid Build Coastguard Worker
200*5e7646d2SAndroid Build Coastguard Worker case 'P' : /* Use the specified PPD file */
201*5e7646d2SAndroid Build Coastguard Worker case 'i' : /* Use the specified PPD file */
202*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
203*5e7646d2SAndroid Build Coastguard Worker {
204*5e7646d2SAndroid Build Coastguard Worker file = opt + 1;
205*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
206*5e7646d2SAndroid Build Coastguard Worker }
207*5e7646d2SAndroid Build Coastguard Worker else
208*5e7646d2SAndroid Build Coastguard Worker {
209*5e7646d2SAndroid Build Coastguard Worker i ++;
210*5e7646d2SAndroid Build Coastguard Worker
211*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
212*5e7646d2SAndroid Build Coastguard Worker {
213*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Expected PPD after \"-%c\" option."), argv[i - 1][1]);
214*5e7646d2SAndroid Build Coastguard Worker usage();
215*5e7646d2SAndroid Build Coastguard Worker }
216*5e7646d2SAndroid Build Coastguard Worker
217*5e7646d2SAndroid Build Coastguard Worker file = argv[i];
218*5e7646d2SAndroid Build Coastguard Worker }
219*5e7646d2SAndroid Build Coastguard Worker
220*5e7646d2SAndroid Build Coastguard Worker if (*opt == 'i')
221*5e7646d2SAndroid Build Coastguard Worker {
222*5e7646d2SAndroid Build Coastguard Worker /*
223*5e7646d2SAndroid Build Coastguard Worker * Check to see that the specified file is, in fact, a PPD...
224*5e7646d2SAndroid Build Coastguard Worker */
225*5e7646d2SAndroid Build Coastguard Worker
226*5e7646d2SAndroid Build Coastguard Worker cups_file_t *fp = cupsFileOpen(file, "r");
227*5e7646d2SAndroid Build Coastguard Worker char line[256];
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker if (!cupsFileGets(fp, line, sizeof(line)) || strncmp(line, "*PPD-Adobe", 10))
230*5e7646d2SAndroid Build Coastguard Worker {
231*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: System V interface scripts are no longer supported for security reasons."));
232*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
233*5e7646d2SAndroid Build Coastguard Worker return (1);
234*5e7646d2SAndroid Build Coastguard Worker }
235*5e7646d2SAndroid Build Coastguard Worker
236*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
237*5e7646d2SAndroid Build Coastguard Worker }
238*5e7646d2SAndroid Build Coastguard Worker break;
239*5e7646d2SAndroid Build Coastguard Worker
240*5e7646d2SAndroid Build Coastguard Worker case 'E' : /* Enable the printer/enable encryption */
241*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
242*5e7646d2SAndroid Build Coastguard Worker {
243*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_TLS
244*5e7646d2SAndroid Build Coastguard Worker cupsSetEncryption(HTTP_ENCRYPTION_REQUIRED);
245*5e7646d2SAndroid Build Coastguard Worker
246*5e7646d2SAndroid Build Coastguard Worker if (http)
247*5e7646d2SAndroid Build Coastguard Worker httpEncryption(http, HTTP_ENCRYPTION_REQUIRED);
248*5e7646d2SAndroid Build Coastguard Worker #else
249*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), argv[0]);
250*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_TLS */
251*5e7646d2SAndroid Build Coastguard Worker break;
252*5e7646d2SAndroid Build Coastguard Worker }
253*5e7646d2SAndroid Build Coastguard Worker
254*5e7646d2SAndroid Build Coastguard Worker if (!http)
255*5e7646d2SAndroid Build Coastguard Worker {
256*5e7646d2SAndroid Build Coastguard Worker http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
257*5e7646d2SAndroid Build Coastguard Worker
258*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
259*5e7646d2SAndroid Build Coastguard Worker {
260*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
261*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Unable to connect to server: %s"),
262*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
263*5e7646d2SAndroid Build Coastguard Worker return (1);
264*5e7646d2SAndroid Build Coastguard Worker }
265*5e7646d2SAndroid Build Coastguard Worker }
266*5e7646d2SAndroid Build Coastguard Worker
267*5e7646d2SAndroid Build Coastguard Worker enable = 1;
268*5e7646d2SAndroid Build Coastguard Worker break;
269*5e7646d2SAndroid Build Coastguard Worker
270*5e7646d2SAndroid Build Coastguard Worker case 'm' : /* Use the specified standard script/PPD file */
271*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
272*5e7646d2SAndroid Build Coastguard Worker {
273*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("ppd-name", opt + 1, num_options, &options);
274*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
275*5e7646d2SAndroid Build Coastguard Worker }
276*5e7646d2SAndroid Build Coastguard Worker else
277*5e7646d2SAndroid Build Coastguard Worker {
278*5e7646d2SAndroid Build Coastguard Worker i ++;
279*5e7646d2SAndroid Build Coastguard Worker
280*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
281*5e7646d2SAndroid Build Coastguard Worker {
282*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected model after \"-m\" option."));
283*5e7646d2SAndroid Build Coastguard Worker usage();
284*5e7646d2SAndroid Build Coastguard Worker }
285*5e7646d2SAndroid Build Coastguard Worker
286*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("ppd-name", argv[i], num_options, &options);
287*5e7646d2SAndroid Build Coastguard Worker }
288*5e7646d2SAndroid Build Coastguard Worker break;
289*5e7646d2SAndroid Build Coastguard Worker
290*5e7646d2SAndroid Build Coastguard Worker case 'o' : /* Set option */
291*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
292*5e7646d2SAndroid Build Coastguard Worker {
293*5e7646d2SAndroid Build Coastguard Worker num_options = cupsParseOptions(opt + 1, num_options, &options);
294*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
295*5e7646d2SAndroid Build Coastguard Worker }
296*5e7646d2SAndroid Build Coastguard Worker else
297*5e7646d2SAndroid Build Coastguard Worker {
298*5e7646d2SAndroid Build Coastguard Worker i ++;
299*5e7646d2SAndroid Build Coastguard Worker
300*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
301*5e7646d2SAndroid Build Coastguard Worker {
302*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected name=value after \"-o\" option."));
303*5e7646d2SAndroid Build Coastguard Worker usage();
304*5e7646d2SAndroid Build Coastguard Worker }
305*5e7646d2SAndroid Build Coastguard Worker
306*5e7646d2SAndroid Build Coastguard Worker num_options = cupsParseOptions(argv[i], num_options, &options);
307*5e7646d2SAndroid Build Coastguard Worker }
308*5e7646d2SAndroid Build Coastguard Worker break;
309*5e7646d2SAndroid Build Coastguard Worker
310*5e7646d2SAndroid Build Coastguard Worker case 'p' : /* Add/modify a printer */
311*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
312*5e7646d2SAndroid Build Coastguard Worker {
313*5e7646d2SAndroid Build Coastguard Worker printer = opt + 1;
314*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
315*5e7646d2SAndroid Build Coastguard Worker }
316*5e7646d2SAndroid Build Coastguard Worker else
317*5e7646d2SAndroid Build Coastguard Worker {
318*5e7646d2SAndroid Build Coastguard Worker i ++;
319*5e7646d2SAndroid Build Coastguard Worker
320*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
321*5e7646d2SAndroid Build Coastguard Worker {
322*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected printer after \"-p\" option."));
323*5e7646d2SAndroid Build Coastguard Worker usage();
324*5e7646d2SAndroid Build Coastguard Worker }
325*5e7646d2SAndroid Build Coastguard Worker
326*5e7646d2SAndroid Build Coastguard Worker printer = argv[i];
327*5e7646d2SAndroid Build Coastguard Worker }
328*5e7646d2SAndroid Build Coastguard Worker
329*5e7646d2SAndroid Build Coastguard Worker if (!validate_name(printer))
330*5e7646d2SAndroid Build Coastguard Worker {
331*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Printer name can only contain printable characters."));
332*5e7646d2SAndroid Build Coastguard Worker return (1);
333*5e7646d2SAndroid Build Coastguard Worker }
334*5e7646d2SAndroid Build Coastguard Worker break;
335*5e7646d2SAndroid Build Coastguard Worker
336*5e7646d2SAndroid Build Coastguard Worker case 'r' : /* Remove printer from class */
337*5e7646d2SAndroid Build Coastguard Worker if (!http)
338*5e7646d2SAndroid Build Coastguard Worker {
339*5e7646d2SAndroid Build Coastguard Worker http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
340*5e7646d2SAndroid Build Coastguard Worker
341*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
342*5e7646d2SAndroid Build Coastguard Worker {
343*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
344*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Unable to connect to server: %s"),
345*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
346*5e7646d2SAndroid Build Coastguard Worker return (1);
347*5e7646d2SAndroid Build Coastguard Worker }
348*5e7646d2SAndroid Build Coastguard Worker }
349*5e7646d2SAndroid Build Coastguard Worker
350*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
351*5e7646d2SAndroid Build Coastguard Worker {
352*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr,
353*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Unable to remove a printer from the class:\n"
354*5e7646d2SAndroid Build Coastguard Worker " You must specify a printer name first."));
355*5e7646d2SAndroid Build Coastguard Worker return (1);
356*5e7646d2SAndroid Build Coastguard Worker }
357*5e7646d2SAndroid Build Coastguard Worker
358*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
359*5e7646d2SAndroid Build Coastguard Worker {
360*5e7646d2SAndroid Build Coastguard Worker pclass = opt + 1;
361*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
362*5e7646d2SAndroid Build Coastguard Worker }
363*5e7646d2SAndroid Build Coastguard Worker else
364*5e7646d2SAndroid Build Coastguard Worker {
365*5e7646d2SAndroid Build Coastguard Worker i ++;
366*5e7646d2SAndroid Build Coastguard Worker
367*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
368*5e7646d2SAndroid Build Coastguard Worker {
369*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected class after \"-r\" option."));
370*5e7646d2SAndroid Build Coastguard Worker usage();
371*5e7646d2SAndroid Build Coastguard Worker }
372*5e7646d2SAndroid Build Coastguard Worker
373*5e7646d2SAndroid Build Coastguard Worker pclass = argv[i];
374*5e7646d2SAndroid Build Coastguard Worker }
375*5e7646d2SAndroid Build Coastguard Worker
376*5e7646d2SAndroid Build Coastguard Worker if (!validate_name(pclass))
377*5e7646d2SAndroid Build Coastguard Worker {
378*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Class name can only contain printable characters."));
379*5e7646d2SAndroid Build Coastguard Worker return (1);
380*5e7646d2SAndroid Build Coastguard Worker }
381*5e7646d2SAndroid Build Coastguard Worker
382*5e7646d2SAndroid Build Coastguard Worker if (delete_printer_from_class(http, printer, pclass))
383*5e7646d2SAndroid Build Coastguard Worker return (1);
384*5e7646d2SAndroid Build Coastguard Worker break;
385*5e7646d2SAndroid Build Coastguard Worker
386*5e7646d2SAndroid Build Coastguard Worker case 'R' : /* Remove option */
387*5e7646d2SAndroid Build Coastguard Worker if (!http)
388*5e7646d2SAndroid Build Coastguard Worker {
389*5e7646d2SAndroid Build Coastguard Worker http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
390*5e7646d2SAndroid Build Coastguard Worker
391*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
392*5e7646d2SAndroid Build Coastguard Worker {
393*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unable to connect to server: %s"), strerror(errno));
394*5e7646d2SAndroid Build Coastguard Worker return (1);
395*5e7646d2SAndroid Build Coastguard Worker }
396*5e7646d2SAndroid Build Coastguard Worker }
397*5e7646d2SAndroid Build Coastguard Worker
398*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
399*5e7646d2SAndroid Build Coastguard Worker {
400*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr,
401*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Unable to delete option:\n"
402*5e7646d2SAndroid Build Coastguard Worker " You must specify a printer name first."));
403*5e7646d2SAndroid Build Coastguard Worker return (1);
404*5e7646d2SAndroid Build Coastguard Worker }
405*5e7646d2SAndroid Build Coastguard Worker
406*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
407*5e7646d2SAndroid Build Coastguard Worker {
408*5e7646d2SAndroid Build Coastguard Worker val = opt + 1;
409*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
410*5e7646d2SAndroid Build Coastguard Worker }
411*5e7646d2SAndroid Build Coastguard Worker else
412*5e7646d2SAndroid Build Coastguard Worker {
413*5e7646d2SAndroid Build Coastguard Worker i ++;
414*5e7646d2SAndroid Build Coastguard Worker
415*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
416*5e7646d2SAndroid Build Coastguard Worker {
417*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected name after \"-R\" option."));
418*5e7646d2SAndroid Build Coastguard Worker usage();
419*5e7646d2SAndroid Build Coastguard Worker }
420*5e7646d2SAndroid Build Coastguard Worker
421*5e7646d2SAndroid Build Coastguard Worker val = argv[i];
422*5e7646d2SAndroid Build Coastguard Worker }
423*5e7646d2SAndroid Build Coastguard Worker
424*5e7646d2SAndroid Build Coastguard Worker if (delete_printer_option(http, printer, val))
425*5e7646d2SAndroid Build Coastguard Worker return (1);
426*5e7646d2SAndroid Build Coastguard Worker break;
427*5e7646d2SAndroid Build Coastguard Worker
428*5e7646d2SAndroid Build Coastguard Worker case 'U' : /* Username */
429*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
430*5e7646d2SAndroid Build Coastguard Worker {
431*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(opt + 1);
432*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
433*5e7646d2SAndroid Build Coastguard Worker }
434*5e7646d2SAndroid Build Coastguard Worker else
435*5e7646d2SAndroid Build Coastguard Worker {
436*5e7646d2SAndroid Build Coastguard Worker i ++;
437*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
438*5e7646d2SAndroid Build Coastguard Worker {
439*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: Error - expected username after \"-U\" option."), argv[0]);
440*5e7646d2SAndroid Build Coastguard Worker usage();
441*5e7646d2SAndroid Build Coastguard Worker }
442*5e7646d2SAndroid Build Coastguard Worker
443*5e7646d2SAndroid Build Coastguard Worker cupsSetUser(argv[i]);
444*5e7646d2SAndroid Build Coastguard Worker }
445*5e7646d2SAndroid Build Coastguard Worker break;
446*5e7646d2SAndroid Build Coastguard Worker
447*5e7646d2SAndroid Build Coastguard Worker case 'u' : /* Allow/deny users */
448*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
449*5e7646d2SAndroid Build Coastguard Worker {
450*5e7646d2SAndroid Build Coastguard Worker val = opt + 1;
451*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
452*5e7646d2SAndroid Build Coastguard Worker }
453*5e7646d2SAndroid Build Coastguard Worker else
454*5e7646d2SAndroid Build Coastguard Worker {
455*5e7646d2SAndroid Build Coastguard Worker i ++;
456*5e7646d2SAndroid Build Coastguard Worker
457*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
458*5e7646d2SAndroid Build Coastguard Worker {
459*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected allow/deny:userlist after \"-u\" option."));
460*5e7646d2SAndroid Build Coastguard Worker usage();
461*5e7646d2SAndroid Build Coastguard Worker }
462*5e7646d2SAndroid Build Coastguard Worker
463*5e7646d2SAndroid Build Coastguard Worker val = argv[i];
464*5e7646d2SAndroid Build Coastguard Worker }
465*5e7646d2SAndroid Build Coastguard Worker
466*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strncasecmp(val, "allow:", 6))
467*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("requesting-user-name-allowed", val + 6, num_options, &options);
468*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strncasecmp(val, "deny:", 5))
469*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("requesting-user-name-denied", val + 5, num_options, &options);
470*5e7646d2SAndroid Build Coastguard Worker else
471*5e7646d2SAndroid Build Coastguard Worker {
472*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unknown allow/deny option \"%s\"."), val);
473*5e7646d2SAndroid Build Coastguard Worker return (1);
474*5e7646d2SAndroid Build Coastguard Worker }
475*5e7646d2SAndroid Build Coastguard Worker break;
476*5e7646d2SAndroid Build Coastguard Worker
477*5e7646d2SAndroid Build Coastguard Worker case 'v' : /* Set the device-uri attribute */
478*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
479*5e7646d2SAndroid Build Coastguard Worker {
480*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("device-uri", opt + 1, num_options, &options);
481*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
482*5e7646d2SAndroid Build Coastguard Worker }
483*5e7646d2SAndroid Build Coastguard Worker else
484*5e7646d2SAndroid Build Coastguard Worker {
485*5e7646d2SAndroid Build Coastguard Worker i ++;
486*5e7646d2SAndroid Build Coastguard Worker
487*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
488*5e7646d2SAndroid Build Coastguard Worker {
489*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected device URI after \"-v\" option."));
490*5e7646d2SAndroid Build Coastguard Worker usage();
491*5e7646d2SAndroid Build Coastguard Worker }
492*5e7646d2SAndroid Build Coastguard Worker
493*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("device-uri", argv[i], num_options, &options);
494*5e7646d2SAndroid Build Coastguard Worker }
495*5e7646d2SAndroid Build Coastguard Worker break;
496*5e7646d2SAndroid Build Coastguard Worker
497*5e7646d2SAndroid Build Coastguard Worker case 'x' : /* Delete a printer */
498*5e7646d2SAndroid Build Coastguard Worker if (!http)
499*5e7646d2SAndroid Build Coastguard Worker {
500*5e7646d2SAndroid Build Coastguard Worker http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC, cupsEncryption(), 1, 30000, NULL);
501*5e7646d2SAndroid Build Coastguard Worker
502*5e7646d2SAndroid Build Coastguard Worker if (http == NULL)
503*5e7646d2SAndroid Build Coastguard Worker {
504*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
505*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Unable to connect to server: %s"),
506*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
507*5e7646d2SAndroid Build Coastguard Worker return (1);
508*5e7646d2SAndroid Build Coastguard Worker }
509*5e7646d2SAndroid Build Coastguard Worker }
510*5e7646d2SAndroid Build Coastguard Worker
511*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
512*5e7646d2SAndroid Build Coastguard Worker {
513*5e7646d2SAndroid Build Coastguard Worker printer = opt + 1;
514*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
515*5e7646d2SAndroid Build Coastguard Worker }
516*5e7646d2SAndroid Build Coastguard Worker else
517*5e7646d2SAndroid Build Coastguard Worker {
518*5e7646d2SAndroid Build Coastguard Worker i ++;
519*5e7646d2SAndroid Build Coastguard Worker
520*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
521*5e7646d2SAndroid Build Coastguard Worker {
522*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected printer or class after \"-x\" option."));
523*5e7646d2SAndroid Build Coastguard Worker usage();
524*5e7646d2SAndroid Build Coastguard Worker }
525*5e7646d2SAndroid Build Coastguard Worker
526*5e7646d2SAndroid Build Coastguard Worker printer = argv[i];
527*5e7646d2SAndroid Build Coastguard Worker }
528*5e7646d2SAndroid Build Coastguard Worker
529*5e7646d2SAndroid Build Coastguard Worker if (!validate_name(printer))
530*5e7646d2SAndroid Build Coastguard Worker {
531*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Printer name can only contain printable characters."));
532*5e7646d2SAndroid Build Coastguard Worker return (1);
533*5e7646d2SAndroid Build Coastguard Worker }
534*5e7646d2SAndroid Build Coastguard Worker
535*5e7646d2SAndroid Build Coastguard Worker if (delete_printer(http, printer))
536*5e7646d2SAndroid Build Coastguard Worker return (1);
537*5e7646d2SAndroid Build Coastguard Worker
538*5e7646d2SAndroid Build Coastguard Worker i = argc;
539*5e7646d2SAndroid Build Coastguard Worker break;
540*5e7646d2SAndroid Build Coastguard Worker
541*5e7646d2SAndroid Build Coastguard Worker case 'D' : /* Set the printer-info attribute */
542*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
543*5e7646d2SAndroid Build Coastguard Worker {
544*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("printer-info", opt + 1, num_options, &options);
545*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
546*5e7646d2SAndroid Build Coastguard Worker }
547*5e7646d2SAndroid Build Coastguard Worker else
548*5e7646d2SAndroid Build Coastguard Worker {
549*5e7646d2SAndroid Build Coastguard Worker i ++;
550*5e7646d2SAndroid Build Coastguard Worker
551*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
552*5e7646d2SAndroid Build Coastguard Worker {
553*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected description after \"-D\" option."));
554*5e7646d2SAndroid Build Coastguard Worker usage();
555*5e7646d2SAndroid Build Coastguard Worker }
556*5e7646d2SAndroid Build Coastguard Worker
557*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("printer-info", argv[i], num_options, &options);
558*5e7646d2SAndroid Build Coastguard Worker }
559*5e7646d2SAndroid Build Coastguard Worker break;
560*5e7646d2SAndroid Build Coastguard Worker
561*5e7646d2SAndroid Build Coastguard Worker case 'I' : /* Set the supported file types (ignored) */
562*5e7646d2SAndroid Build Coastguard Worker i ++;
563*5e7646d2SAndroid Build Coastguard Worker
564*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
565*5e7646d2SAndroid Build Coastguard Worker {
566*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected file type(s) after \"-I\" option."));
567*5e7646d2SAndroid Build Coastguard Worker usage();
568*5e7646d2SAndroid Build Coastguard Worker }
569*5e7646d2SAndroid Build Coastguard Worker
570*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Warning - content type list ignored."));
571*5e7646d2SAndroid Build Coastguard Worker break;
572*5e7646d2SAndroid Build Coastguard Worker
573*5e7646d2SAndroid Build Coastguard Worker case 'L' : /* Set the printer-location attribute */
574*5e7646d2SAndroid Build Coastguard Worker if (opt[1] != '\0')
575*5e7646d2SAndroid Build Coastguard Worker {
576*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("printer-location", opt + 1, num_options, &options);
577*5e7646d2SAndroid Build Coastguard Worker opt += strlen(opt) - 1;
578*5e7646d2SAndroid Build Coastguard Worker }
579*5e7646d2SAndroid Build Coastguard Worker else
580*5e7646d2SAndroid Build Coastguard Worker {
581*5e7646d2SAndroid Build Coastguard Worker i ++;
582*5e7646d2SAndroid Build Coastguard Worker
583*5e7646d2SAndroid Build Coastguard Worker if (i >= argc)
584*5e7646d2SAndroid Build Coastguard Worker {
585*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Expected location after \"-L\" option."));
586*5e7646d2SAndroid Build Coastguard Worker usage();
587*5e7646d2SAndroid Build Coastguard Worker }
588*5e7646d2SAndroid Build Coastguard Worker
589*5e7646d2SAndroid Build Coastguard Worker num_options = cupsAddOption("printer-location", argv[i], num_options, &options);
590*5e7646d2SAndroid Build Coastguard Worker }
591*5e7646d2SAndroid Build Coastguard Worker break;
592*5e7646d2SAndroid Build Coastguard Worker
593*5e7646d2SAndroid Build Coastguard Worker default :
594*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unknown option \"%c\"."), *opt);
595*5e7646d2SAndroid Build Coastguard Worker usage();
596*5e7646d2SAndroid Build Coastguard Worker }
597*5e7646d2SAndroid Build Coastguard Worker }
598*5e7646d2SAndroid Build Coastguard Worker }
599*5e7646d2SAndroid Build Coastguard Worker else
600*5e7646d2SAndroid Build Coastguard Worker {
601*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unknown argument \"%s\"."), argv[i]);
602*5e7646d2SAndroid Build Coastguard Worker usage();
603*5e7646d2SAndroid Build Coastguard Worker }
604*5e7646d2SAndroid Build Coastguard Worker }
605*5e7646d2SAndroid Build Coastguard Worker
606*5e7646d2SAndroid Build Coastguard Worker /*
607*5e7646d2SAndroid Build Coastguard Worker * Set options as needed...
608*5e7646d2SAndroid Build Coastguard Worker */
609*5e7646d2SAndroid Build Coastguard Worker
610*5e7646d2SAndroid Build Coastguard Worker ppd_name = cupsGetOption("ppd-name", num_options, options);
611*5e7646d2SAndroid Build Coastguard Worker device_uri = cupsGetOption("device-uri", num_options, options);
612*5e7646d2SAndroid Build Coastguard Worker
613*5e7646d2SAndroid Build Coastguard Worker if (ppd_name && !strcmp(ppd_name, "raw"))
614*5e7646d2SAndroid Build Coastguard Worker {
615*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
616*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Raw queues are no longer supported on macOS."));
617*5e7646d2SAndroid Build Coastguard Worker #else
618*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Raw queues are deprecated and will stop working in a future version of CUPS."));
619*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
620*5e7646d2SAndroid Build Coastguard Worker
621*5e7646d2SAndroid Build Coastguard Worker if (device_uri && (!strncmp(device_uri, "ipp://", 6) || !strncmp(device_uri, "ipps://", 7)) && strstr(device_uri, "/printers/"))
622*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Use the 'everywhere' model for shared printers."));
623*5e7646d2SAndroid Build Coastguard Worker
624*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
625*5e7646d2SAndroid Build Coastguard Worker return (1);
626*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
627*5e7646d2SAndroid Build Coastguard Worker }
628*5e7646d2SAndroid Build Coastguard Worker else if ((ppd_name && strcmp(ppd_name, "everywhere")) || file)
629*5e7646d2SAndroid Build Coastguard Worker {
630*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: Printer drivers are deprecated and will stop working in a future version of CUPS."));
631*5e7646d2SAndroid Build Coastguard Worker }
632*5e7646d2SAndroid Build Coastguard Worker
633*5e7646d2SAndroid Build Coastguard Worker if (num_options || file)
634*5e7646d2SAndroid Build Coastguard Worker {
635*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
636*5e7646d2SAndroid Build Coastguard Worker {
637*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr,
638*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Unable to set the printer options:\n"
639*5e7646d2SAndroid Build Coastguard Worker " You must specify a printer name first."));
640*5e7646d2SAndroid Build Coastguard Worker return (1);
641*5e7646d2SAndroid Build Coastguard Worker }
642*5e7646d2SAndroid Build Coastguard Worker
643*5e7646d2SAndroid Build Coastguard Worker if (!http)
644*5e7646d2SAndroid Build Coastguard Worker {
645*5e7646d2SAndroid Build Coastguard Worker http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
646*5e7646d2SAndroid Build Coastguard Worker cupsEncryption(), 1, 30000, NULL);
647*5e7646d2SAndroid Build Coastguard Worker
648*5e7646d2SAndroid Build Coastguard Worker if (http == NULL) {
649*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unable to connect to server: %s"),
650*5e7646d2SAndroid Build Coastguard Worker strerror(errno));
651*5e7646d2SAndroid Build Coastguard Worker return (1);
652*5e7646d2SAndroid Build Coastguard Worker }
653*5e7646d2SAndroid Build Coastguard Worker }
654*5e7646d2SAndroid Build Coastguard Worker
655*5e7646d2SAndroid Build Coastguard Worker if (set_printer_options(http, printer, num_options, options, file, enable))
656*5e7646d2SAndroid Build Coastguard Worker return (1);
657*5e7646d2SAndroid Build Coastguard Worker }
658*5e7646d2SAndroid Build Coastguard Worker else if (enable && enable_printer(http, printer))
659*5e7646d2SAndroid Build Coastguard Worker return (1);
660*5e7646d2SAndroid Build Coastguard Worker
661*5e7646d2SAndroid Build Coastguard Worker if (evefile[0])
662*5e7646d2SAndroid Build Coastguard Worker unlink(evefile);
663*5e7646d2SAndroid Build Coastguard Worker
664*5e7646d2SAndroid Build Coastguard Worker if (printer == NULL)
665*5e7646d2SAndroid Build Coastguard Worker usage();
666*5e7646d2SAndroid Build Coastguard Worker
667*5e7646d2SAndroid Build Coastguard Worker if (http)
668*5e7646d2SAndroid Build Coastguard Worker httpClose(http);
669*5e7646d2SAndroid Build Coastguard Worker
670*5e7646d2SAndroid Build Coastguard Worker return (0);
671*5e7646d2SAndroid Build Coastguard Worker }
672*5e7646d2SAndroid Build Coastguard Worker
673*5e7646d2SAndroid Build Coastguard Worker
674*5e7646d2SAndroid Build Coastguard Worker /*
675*5e7646d2SAndroid Build Coastguard Worker * 'add_printer_to_class()' - Add a printer to a class.
676*5e7646d2SAndroid Build Coastguard Worker */
677*5e7646d2SAndroid Build Coastguard Worker
678*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
add_printer_to_class(http_t * http,char * printer,char * pclass)679*5e7646d2SAndroid Build Coastguard Worker add_printer_to_class(http_t *http, /* I - Server connection */
680*5e7646d2SAndroid Build Coastguard Worker char *printer, /* I - Printer to add */
681*5e7646d2SAndroid Build Coastguard Worker char *pclass) /* I - Class to add to */
682*5e7646d2SAndroid Build Coastguard Worker {
683*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
684*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
685*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP Response */
686*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr, /* Current attribute */
687*5e7646d2SAndroid Build Coastguard Worker *members; /* Members in class */
688*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI]; /* URI for printer/class */
689*5e7646d2SAndroid Build Coastguard Worker
690*5e7646d2SAndroid Build Coastguard Worker
691*5e7646d2SAndroid Build Coastguard Worker /*
692*5e7646d2SAndroid Build Coastguard Worker * Build an IPP_OP_GET_PRINTER_ATTRIBUTES request, which requires the following
693*5e7646d2SAndroid Build Coastguard Worker * attributes:
694*5e7646d2SAndroid Build Coastguard Worker *
695*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
696*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
697*5e7646d2SAndroid Build Coastguard Worker * printer-uri
698*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
699*5e7646d2SAndroid Build Coastguard Worker */
700*5e7646d2SAndroid Build Coastguard Worker
701*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
702*5e7646d2SAndroid Build Coastguard Worker
703*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
704*5e7646d2SAndroid Build Coastguard Worker "localhost", 0, "/classes/%s", pclass);
705*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
706*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
707*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
708*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
709*5e7646d2SAndroid Build Coastguard Worker
710*5e7646d2SAndroid Build Coastguard Worker /*
711*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
712*5e7646d2SAndroid Build Coastguard Worker */
713*5e7646d2SAndroid Build Coastguard Worker
714*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(http, request, "/");
715*5e7646d2SAndroid Build Coastguard Worker
716*5e7646d2SAndroid Build Coastguard Worker /*
717*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS-Add-Modify-Class request, which requires the following
718*5e7646d2SAndroid Build Coastguard Worker * attributes:
719*5e7646d2SAndroid Build Coastguard Worker *
720*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
721*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
722*5e7646d2SAndroid Build Coastguard Worker * printer-uri
723*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
724*5e7646d2SAndroid Build Coastguard Worker * member-uris
725*5e7646d2SAndroid Build Coastguard Worker */
726*5e7646d2SAndroid Build Coastguard Worker
727*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
728*5e7646d2SAndroid Build Coastguard Worker
729*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
730*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
731*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
732*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
733*5e7646d2SAndroid Build Coastguard Worker
734*5e7646d2SAndroid Build Coastguard Worker /*
735*5e7646d2SAndroid Build Coastguard Worker * See if the printer is already in the class...
736*5e7646d2SAndroid Build Coastguard Worker */
737*5e7646d2SAndroid Build Coastguard Worker
738*5e7646d2SAndroid Build Coastguard Worker if (response != NULL &&
739*5e7646d2SAndroid Build Coastguard Worker (members = ippFindAttribute(response, "member-names",
740*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_NAME)) != NULL)
741*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < members->num_values; i ++)
742*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(printer, members->values[i].string.text) == 0)
743*5e7646d2SAndroid Build Coastguard Worker {
744*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
745*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Printer %s is already a member of class "
746*5e7646d2SAndroid Build Coastguard Worker "%s."), printer, pclass);
747*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
748*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
749*5e7646d2SAndroid Build Coastguard Worker return (0);
750*5e7646d2SAndroid Build Coastguard Worker }
751*5e7646d2SAndroid Build Coastguard Worker
752*5e7646d2SAndroid Build Coastguard Worker /*
753*5e7646d2SAndroid Build Coastguard Worker * OK, the printer isn't part of the class, so add it...
754*5e7646d2SAndroid Build Coastguard Worker */
755*5e7646d2SAndroid Build Coastguard Worker
756*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
757*5e7646d2SAndroid Build Coastguard Worker "localhost", 0, "/printers/%s", printer);
758*5e7646d2SAndroid Build Coastguard Worker
759*5e7646d2SAndroid Build Coastguard Worker if (response != NULL &&
760*5e7646d2SAndroid Build Coastguard Worker (members = ippFindAttribute(response, "member-uris",
761*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_URI)) != NULL)
762*5e7646d2SAndroid Build Coastguard Worker {
763*5e7646d2SAndroid Build Coastguard Worker /*
764*5e7646d2SAndroid Build Coastguard Worker * Add the printer to the existing list...
765*5e7646d2SAndroid Build Coastguard Worker */
766*5e7646d2SAndroid Build Coastguard Worker
767*5e7646d2SAndroid Build Coastguard Worker attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI,
768*5e7646d2SAndroid Build Coastguard Worker "member-uris", members->num_values + 1, NULL, NULL);
769*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < members->num_values; i ++)
770*5e7646d2SAndroid Build Coastguard Worker attr->values[i].string.text =
771*5e7646d2SAndroid Build Coastguard Worker _cupsStrAlloc(members->values[i].string.text);
772*5e7646d2SAndroid Build Coastguard Worker
773*5e7646d2SAndroid Build Coastguard Worker attr->values[i].string.text = _cupsStrAlloc(uri);
774*5e7646d2SAndroid Build Coastguard Worker }
775*5e7646d2SAndroid Build Coastguard Worker else
776*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris", NULL,
777*5e7646d2SAndroid Build Coastguard Worker uri);
778*5e7646d2SAndroid Build Coastguard Worker
779*5e7646d2SAndroid Build Coastguard Worker /*
780*5e7646d2SAndroid Build Coastguard Worker * Then send the request...
781*5e7646d2SAndroid Build Coastguard Worker */
782*5e7646d2SAndroid Build Coastguard Worker
783*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
784*5e7646d2SAndroid Build Coastguard Worker
785*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
786*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
787*5e7646d2SAndroid Build Coastguard Worker {
788*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
789*5e7646d2SAndroid Build Coastguard Worker
790*5e7646d2SAndroid Build Coastguard Worker return (1);
791*5e7646d2SAndroid Build Coastguard Worker }
792*5e7646d2SAndroid Build Coastguard Worker else
793*5e7646d2SAndroid Build Coastguard Worker return (0);
794*5e7646d2SAndroid Build Coastguard Worker }
795*5e7646d2SAndroid Build Coastguard Worker
796*5e7646d2SAndroid Build Coastguard Worker
797*5e7646d2SAndroid Build Coastguard Worker /*
798*5e7646d2SAndroid Build Coastguard Worker * 'default_printer()' - Set the default printing destination.
799*5e7646d2SAndroid Build Coastguard Worker */
800*5e7646d2SAndroid Build Coastguard Worker
801*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
default_printer(http_t * http,char * printer)802*5e7646d2SAndroid Build Coastguard Worker default_printer(http_t *http, /* I - Server connection */
803*5e7646d2SAndroid Build Coastguard Worker char *printer) /* I - Printer name */
804*5e7646d2SAndroid Build Coastguard Worker {
805*5e7646d2SAndroid Build Coastguard Worker ipp_t *request; /* IPP Request */
806*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI]; /* URI for printer/class */
807*5e7646d2SAndroid Build Coastguard Worker
808*5e7646d2SAndroid Build Coastguard Worker
809*5e7646d2SAndroid Build Coastguard Worker /*
810*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS-Set-Default request, which requires the following
811*5e7646d2SAndroid Build Coastguard Worker * attributes:
812*5e7646d2SAndroid Build Coastguard Worker *
813*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
814*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
815*5e7646d2SAndroid Build Coastguard Worker * printer-uri
816*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
817*5e7646d2SAndroid Build Coastguard Worker */
818*5e7646d2SAndroid Build Coastguard Worker
819*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
820*5e7646d2SAndroid Build Coastguard Worker "localhost", 0, "/printers/%s", printer);
821*5e7646d2SAndroid Build Coastguard Worker
822*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_SET_DEFAULT);
823*5e7646d2SAndroid Build Coastguard Worker
824*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
825*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
826*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
827*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
828*5e7646d2SAndroid Build Coastguard Worker
829*5e7646d2SAndroid Build Coastguard Worker /*
830*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
831*5e7646d2SAndroid Build Coastguard Worker */
832*5e7646d2SAndroid Build Coastguard Worker
833*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
834*5e7646d2SAndroid Build Coastguard Worker
835*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
836*5e7646d2SAndroid Build Coastguard Worker {
837*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
838*5e7646d2SAndroid Build Coastguard Worker
839*5e7646d2SAndroid Build Coastguard Worker return (1);
840*5e7646d2SAndroid Build Coastguard Worker }
841*5e7646d2SAndroid Build Coastguard Worker else
842*5e7646d2SAndroid Build Coastguard Worker return (0);
843*5e7646d2SAndroid Build Coastguard Worker }
844*5e7646d2SAndroid Build Coastguard Worker
845*5e7646d2SAndroid Build Coastguard Worker
846*5e7646d2SAndroid Build Coastguard Worker /*
847*5e7646d2SAndroid Build Coastguard Worker * 'delete_printer()' - Delete a printer from the system...
848*5e7646d2SAndroid Build Coastguard Worker */
849*5e7646d2SAndroid Build Coastguard Worker
850*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
delete_printer(http_t * http,char * printer)851*5e7646d2SAndroid Build Coastguard Worker delete_printer(http_t *http, /* I - Server connection */
852*5e7646d2SAndroid Build Coastguard Worker char *printer) /* I - Printer to delete */
853*5e7646d2SAndroid Build Coastguard Worker {
854*5e7646d2SAndroid Build Coastguard Worker ipp_t *request; /* IPP Request */
855*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI]; /* URI for printer/class */
856*5e7646d2SAndroid Build Coastguard Worker
857*5e7646d2SAndroid Build Coastguard Worker
858*5e7646d2SAndroid Build Coastguard Worker /*
859*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS-Delete-Printer request, which requires the following
860*5e7646d2SAndroid Build Coastguard Worker * attributes:
861*5e7646d2SAndroid Build Coastguard Worker *
862*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
863*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
864*5e7646d2SAndroid Build Coastguard Worker * printer-uri
865*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
866*5e7646d2SAndroid Build Coastguard Worker */
867*5e7646d2SAndroid Build Coastguard Worker
868*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_DELETE_PRINTER);
869*5e7646d2SAndroid Build Coastguard Worker
870*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
871*5e7646d2SAndroid Build Coastguard Worker "localhost", 0, "/printers/%s", printer);
872*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
873*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
874*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
875*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
876*5e7646d2SAndroid Build Coastguard Worker
877*5e7646d2SAndroid Build Coastguard Worker /*
878*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
879*5e7646d2SAndroid Build Coastguard Worker */
880*5e7646d2SAndroid Build Coastguard Worker
881*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
882*5e7646d2SAndroid Build Coastguard Worker
883*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
884*5e7646d2SAndroid Build Coastguard Worker {
885*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
886*5e7646d2SAndroid Build Coastguard Worker
887*5e7646d2SAndroid Build Coastguard Worker return (1);
888*5e7646d2SAndroid Build Coastguard Worker }
889*5e7646d2SAndroid Build Coastguard Worker else
890*5e7646d2SAndroid Build Coastguard Worker return (0);
891*5e7646d2SAndroid Build Coastguard Worker }
892*5e7646d2SAndroid Build Coastguard Worker
893*5e7646d2SAndroid Build Coastguard Worker
894*5e7646d2SAndroid Build Coastguard Worker /*
895*5e7646d2SAndroid Build Coastguard Worker * 'delete_printer_from_class()' - Delete a printer from a class.
896*5e7646d2SAndroid Build Coastguard Worker */
897*5e7646d2SAndroid Build Coastguard Worker
898*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
delete_printer_from_class(http_t * http,char * printer,char * pclass)899*5e7646d2SAndroid Build Coastguard Worker delete_printer_from_class(
900*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Server connection */
901*5e7646d2SAndroid Build Coastguard Worker char *printer, /* I - Printer to remove */
902*5e7646d2SAndroid Build Coastguard Worker char *pclass) /* I - Class to remove from */
903*5e7646d2SAndroid Build Coastguard Worker {
904*5e7646d2SAndroid Build Coastguard Worker int i, j, k; /* Looping vars */
905*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP Request */
906*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP Response */
907*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr, /* Current attribute */
908*5e7646d2SAndroid Build Coastguard Worker *members; /* Members in class */
909*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI]; /* URI for printer/class */
910*5e7646d2SAndroid Build Coastguard Worker
911*5e7646d2SAndroid Build Coastguard Worker
912*5e7646d2SAndroid Build Coastguard Worker /*
913*5e7646d2SAndroid Build Coastguard Worker * Build an IPP_OP_GET_PRINTER_ATTRIBUTES request, which requires the following
914*5e7646d2SAndroid Build Coastguard Worker * attributes:
915*5e7646d2SAndroid Build Coastguard Worker *
916*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
917*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
918*5e7646d2SAndroid Build Coastguard Worker * printer-uri
919*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
920*5e7646d2SAndroid Build Coastguard Worker */
921*5e7646d2SAndroid Build Coastguard Worker
922*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
923*5e7646d2SAndroid Build Coastguard Worker
924*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
925*5e7646d2SAndroid Build Coastguard Worker "localhost", 0, "/classes/%s", pclass);
926*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
927*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
928*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
929*5e7646d2SAndroid Build Coastguard Worker NULL, cupsUser());
930*5e7646d2SAndroid Build Coastguard Worker
931*5e7646d2SAndroid Build Coastguard Worker /*
932*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
933*5e7646d2SAndroid Build Coastguard Worker */
934*5e7646d2SAndroid Build Coastguard Worker
935*5e7646d2SAndroid Build Coastguard Worker if ((response = cupsDoRequest(http, request, "/classes/")) == NULL ||
936*5e7646d2SAndroid Build Coastguard Worker response->request.status.status_code == IPP_STATUS_ERROR_NOT_FOUND)
937*5e7646d2SAndroid Build Coastguard Worker {
938*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
939*5e7646d2SAndroid Build Coastguard Worker
940*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
941*5e7646d2SAndroid Build Coastguard Worker
942*5e7646d2SAndroid Build Coastguard Worker return (1);
943*5e7646d2SAndroid Build Coastguard Worker }
944*5e7646d2SAndroid Build Coastguard Worker
945*5e7646d2SAndroid Build Coastguard Worker /*
946*5e7646d2SAndroid Build Coastguard Worker * See if the printer is already in the class...
947*5e7646d2SAndroid Build Coastguard Worker */
948*5e7646d2SAndroid Build Coastguard Worker
949*5e7646d2SAndroid Build Coastguard Worker if ((members = ippFindAttribute(response, "member-names", IPP_TAG_NAME)) == NULL)
950*5e7646d2SAndroid Build Coastguard Worker {
951*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stderr, _("lpadmin: No member names were seen."));
952*5e7646d2SAndroid Build Coastguard Worker
953*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
954*5e7646d2SAndroid Build Coastguard Worker
955*5e7646d2SAndroid Build Coastguard Worker return (1);
956*5e7646d2SAndroid Build Coastguard Worker }
957*5e7646d2SAndroid Build Coastguard Worker
958*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < members->num_values; i ++)
959*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(printer, members->values[i].string.text))
960*5e7646d2SAndroid Build Coastguard Worker break;
961*5e7646d2SAndroid Build Coastguard Worker
962*5e7646d2SAndroid Build Coastguard Worker if (i >= members->num_values)
963*5e7646d2SAndroid Build Coastguard Worker {
964*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr,
965*5e7646d2SAndroid Build Coastguard Worker _("lpadmin: Printer %s is not a member of class %s."),
966*5e7646d2SAndroid Build Coastguard Worker printer, pclass);
967*5e7646d2SAndroid Build Coastguard Worker
968*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
969*5e7646d2SAndroid Build Coastguard Worker
970*5e7646d2SAndroid Build Coastguard Worker return (1);
971*5e7646d2SAndroid Build Coastguard Worker }
972*5e7646d2SAndroid Build Coastguard Worker
973*5e7646d2SAndroid Build Coastguard Worker if (members->num_values == 1)
974*5e7646d2SAndroid Build Coastguard Worker {
975*5e7646d2SAndroid Build Coastguard Worker /*
976*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS-Delete-Class request, which requires the following
977*5e7646d2SAndroid Build Coastguard Worker * attributes:
978*5e7646d2SAndroid Build Coastguard Worker *
979*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
980*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
981*5e7646d2SAndroid Build Coastguard Worker * printer-uri
982*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
983*5e7646d2SAndroid Build Coastguard Worker */
984*5e7646d2SAndroid Build Coastguard Worker
985*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_DELETE_CLASS);
986*5e7646d2SAndroid Build Coastguard Worker
987*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
988*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
989*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
990*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, cupsUser());
991*5e7646d2SAndroid Build Coastguard Worker }
992*5e7646d2SAndroid Build Coastguard Worker else
993*5e7646d2SAndroid Build Coastguard Worker {
994*5e7646d2SAndroid Build Coastguard Worker /*
995*5e7646d2SAndroid Build Coastguard Worker * Build a IPP_OP_CUPS_ADD_MODIFY_CLASS request, which requires the following
996*5e7646d2SAndroid Build Coastguard Worker * attributes:
997*5e7646d2SAndroid Build Coastguard Worker *
998*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
999*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1000*5e7646d2SAndroid Build Coastguard Worker * printer-uri
1001*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1002*5e7646d2SAndroid Build Coastguard Worker * member-uris
1003*5e7646d2SAndroid Build Coastguard Worker */
1004*5e7646d2SAndroid Build Coastguard Worker
1005*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
1006*5e7646d2SAndroid Build Coastguard Worker
1007*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1008*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
1009*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
1010*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, cupsUser());
1011*5e7646d2SAndroid Build Coastguard Worker
1012*5e7646d2SAndroid Build Coastguard Worker /*
1013*5e7646d2SAndroid Build Coastguard Worker * Delete the printer from the class...
1014*5e7646d2SAndroid Build Coastguard Worker */
1015*5e7646d2SAndroid Build Coastguard Worker
1016*5e7646d2SAndroid Build Coastguard Worker members = ippFindAttribute(response, "member-uris", IPP_TAG_URI);
1017*5e7646d2SAndroid Build Coastguard Worker attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI,
1018*5e7646d2SAndroid Build Coastguard Worker "member-uris", members->num_values - 1, NULL, NULL);
1019*5e7646d2SAndroid Build Coastguard Worker
1020*5e7646d2SAndroid Build Coastguard Worker for (j = 0, k = 0; j < members->num_values; j ++)
1021*5e7646d2SAndroid Build Coastguard Worker if (j != i)
1022*5e7646d2SAndroid Build Coastguard Worker attr->values[k ++].string.text =
1023*5e7646d2SAndroid Build Coastguard Worker _cupsStrAlloc(members->values[j].string.text);
1024*5e7646d2SAndroid Build Coastguard Worker }
1025*5e7646d2SAndroid Build Coastguard Worker
1026*5e7646d2SAndroid Build Coastguard Worker /*
1027*5e7646d2SAndroid Build Coastguard Worker * Then send the request...
1028*5e7646d2SAndroid Build Coastguard Worker */
1029*5e7646d2SAndroid Build Coastguard Worker
1030*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1031*5e7646d2SAndroid Build Coastguard Worker
1032*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
1033*5e7646d2SAndroid Build Coastguard Worker
1034*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1035*5e7646d2SAndroid Build Coastguard Worker {
1036*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
1037*5e7646d2SAndroid Build Coastguard Worker
1038*5e7646d2SAndroid Build Coastguard Worker return (1);
1039*5e7646d2SAndroid Build Coastguard Worker }
1040*5e7646d2SAndroid Build Coastguard Worker else
1041*5e7646d2SAndroid Build Coastguard Worker return (0);
1042*5e7646d2SAndroid Build Coastguard Worker }
1043*5e7646d2SAndroid Build Coastguard Worker
1044*5e7646d2SAndroid Build Coastguard Worker
1045*5e7646d2SAndroid Build Coastguard Worker /*
1046*5e7646d2SAndroid Build Coastguard Worker * 'delete_printer_option()' - Delete a printer option.
1047*5e7646d2SAndroid Build Coastguard Worker */
1048*5e7646d2SAndroid Build Coastguard Worker
1049*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
delete_printer_option(http_t * http,char * printer,char * option)1050*5e7646d2SAndroid Build Coastguard Worker delete_printer_option(http_t *http, /* I - Server connection */
1051*5e7646d2SAndroid Build Coastguard Worker char *printer, /* I - Printer */
1052*5e7646d2SAndroid Build Coastguard Worker char *option) /* I - Option to delete */
1053*5e7646d2SAndroid Build Coastguard Worker {
1054*5e7646d2SAndroid Build Coastguard Worker ipp_t *request; /* IPP request */
1055*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI]; /* URI for printer/class */
1056*5e7646d2SAndroid Build Coastguard Worker
1057*5e7646d2SAndroid Build Coastguard Worker
1058*5e7646d2SAndroid Build Coastguard Worker /*
1059*5e7646d2SAndroid Build Coastguard Worker * Build a IPP_OP_CUPS_ADD_MODIFY_PRINTER or IPP_OP_CUPS_ADD_MODIFY_CLASS request, which
1060*5e7646d2SAndroid Build Coastguard Worker * requires the following attributes:
1061*5e7646d2SAndroid Build Coastguard Worker *
1062*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1063*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1064*5e7646d2SAndroid Build Coastguard Worker * printer-uri
1065*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1066*5e7646d2SAndroid Build Coastguard Worker * option with deleteAttr tag
1067*5e7646d2SAndroid Build Coastguard Worker */
1068*5e7646d2SAndroid Build Coastguard Worker
1069*5e7646d2SAndroid Build Coastguard Worker if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
1070*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
1071*5e7646d2SAndroid Build Coastguard Worker else
1072*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
1073*5e7646d2SAndroid Build Coastguard Worker
1074*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1075*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
1076*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
1077*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, cupsUser());
1078*5e7646d2SAndroid Build Coastguard Worker ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_DELETEATTR, option, 0);
1079*5e7646d2SAndroid Build Coastguard Worker
1080*5e7646d2SAndroid Build Coastguard Worker /*
1081*5e7646d2SAndroid Build Coastguard Worker * Do the request and get back a response...
1082*5e7646d2SAndroid Build Coastguard Worker */
1083*5e7646d2SAndroid Build Coastguard Worker
1084*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
1085*5e7646d2SAndroid Build Coastguard Worker
1086*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1087*5e7646d2SAndroid Build Coastguard Worker {
1088*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
1089*5e7646d2SAndroid Build Coastguard Worker
1090*5e7646d2SAndroid Build Coastguard Worker return (1);
1091*5e7646d2SAndroid Build Coastguard Worker }
1092*5e7646d2SAndroid Build Coastguard Worker else
1093*5e7646d2SAndroid Build Coastguard Worker return (0);
1094*5e7646d2SAndroid Build Coastguard Worker }
1095*5e7646d2SAndroid Build Coastguard Worker
1096*5e7646d2SAndroid Build Coastguard Worker
1097*5e7646d2SAndroid Build Coastguard Worker /*
1098*5e7646d2SAndroid Build Coastguard Worker * 'enable_printer()' - Enable a printer...
1099*5e7646d2SAndroid Build Coastguard Worker */
1100*5e7646d2SAndroid Build Coastguard Worker
1101*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
enable_printer(http_t * http,char * printer)1102*5e7646d2SAndroid Build Coastguard Worker enable_printer(http_t *http, /* I - Server connection */
1103*5e7646d2SAndroid Build Coastguard Worker char *printer) /* I - Printer to enable */
1104*5e7646d2SAndroid Build Coastguard Worker {
1105*5e7646d2SAndroid Build Coastguard Worker ipp_t *request; /* IPP Request */
1106*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI]; /* URI for printer/class */
1107*5e7646d2SAndroid Build Coastguard Worker
1108*5e7646d2SAndroid Build Coastguard Worker
1109*5e7646d2SAndroid Build Coastguard Worker /*
1110*5e7646d2SAndroid Build Coastguard Worker * Send IPP_OP_ENABLE_PRINTER and IPP_OP_RESUME_PRINTER requests, which
1111*5e7646d2SAndroid Build Coastguard Worker * require the following attributes:
1112*5e7646d2SAndroid Build Coastguard Worker *
1113*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1114*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1115*5e7646d2SAndroid Build Coastguard Worker * printer-uri
1116*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1117*5e7646d2SAndroid Build Coastguard Worker */
1118*5e7646d2SAndroid Build Coastguard Worker
1119*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_ENABLE_PRINTER);
1120*5e7646d2SAndroid Build Coastguard Worker
1121*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", ippPort(), "/printers/%s", printer);
1122*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1123*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
1124*5e7646d2SAndroid Build Coastguard Worker
1125*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
1126*5e7646d2SAndroid Build Coastguard Worker
1127*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1128*5e7646d2SAndroid Build Coastguard Worker {
1129*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
1130*5e7646d2SAndroid Build Coastguard Worker
1131*5e7646d2SAndroid Build Coastguard Worker return (1);
1132*5e7646d2SAndroid Build Coastguard Worker }
1133*5e7646d2SAndroid Build Coastguard Worker
1134*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_RESUME_PRINTER);
1135*5e7646d2SAndroid Build Coastguard Worker
1136*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1137*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
1138*5e7646d2SAndroid Build Coastguard Worker
1139*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
1140*5e7646d2SAndroid Build Coastguard Worker
1141*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1142*5e7646d2SAndroid Build Coastguard Worker {
1143*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
1144*5e7646d2SAndroid Build Coastguard Worker
1145*5e7646d2SAndroid Build Coastguard Worker return (1);
1146*5e7646d2SAndroid Build Coastguard Worker }
1147*5e7646d2SAndroid Build Coastguard Worker
1148*5e7646d2SAndroid Build Coastguard Worker return (0);
1149*5e7646d2SAndroid Build Coastguard Worker }
1150*5e7646d2SAndroid Build Coastguard Worker
1151*5e7646d2SAndroid Build Coastguard Worker
1152*5e7646d2SAndroid Build Coastguard Worker /*
1153*5e7646d2SAndroid Build Coastguard Worker * 'get_printer_type()' - Determine the printer type and URI.
1154*5e7646d2SAndroid Build Coastguard Worker */
1155*5e7646d2SAndroid Build Coastguard Worker
1156*5e7646d2SAndroid Build Coastguard Worker static cups_ptype_t /* O - printer-type value */
get_printer_type(http_t * http,char * printer,char * uri,size_t urisize)1157*5e7646d2SAndroid Build Coastguard Worker get_printer_type(http_t *http, /* I - Server connection */
1158*5e7646d2SAndroid Build Coastguard Worker char *printer, /* I - Printer name */
1159*5e7646d2SAndroid Build Coastguard Worker char *uri, /* I - URI buffer */
1160*5e7646d2SAndroid Build Coastguard Worker size_t urisize) /* I - Size of URI buffer */
1161*5e7646d2SAndroid Build Coastguard Worker {
1162*5e7646d2SAndroid Build Coastguard Worker ipp_t *request, /* IPP request */
1163*5e7646d2SAndroid Build Coastguard Worker *response; /* IPP response */
1164*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* printer-type attribute */
1165*5e7646d2SAndroid Build Coastguard Worker cups_ptype_t type; /* printer-type value */
1166*5e7646d2SAndroid Build Coastguard Worker
1167*5e7646d2SAndroid Build Coastguard Worker
1168*5e7646d2SAndroid Build Coastguard Worker /*
1169*5e7646d2SAndroid Build Coastguard Worker * Build a GET_PRINTER_ATTRIBUTES request, which requires the following
1170*5e7646d2SAndroid Build Coastguard Worker * attributes:
1171*5e7646d2SAndroid Build Coastguard Worker *
1172*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1173*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1174*5e7646d2SAndroid Build Coastguard Worker * printer-uri
1175*5e7646d2SAndroid Build Coastguard Worker * requested-attributes
1176*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1177*5e7646d2SAndroid Build Coastguard Worker */
1178*5e7646d2SAndroid Build Coastguard Worker
1179*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, (int)urisize, "ipp", NULL, "localhost", ippPort(), "/printers/%s", printer);
1180*5e7646d2SAndroid Build Coastguard Worker
1181*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES);
1182*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
1183*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, uri);
1184*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
1185*5e7646d2SAndroid Build Coastguard Worker "requested-attributes", NULL, "printer-type");
1186*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
1187*5e7646d2SAndroid Build Coastguard Worker "requesting-user-name", NULL, cupsUser());
1188*5e7646d2SAndroid Build Coastguard Worker
1189*5e7646d2SAndroid Build Coastguard Worker /*
1190*5e7646d2SAndroid Build Coastguard Worker * Do the request...
1191*5e7646d2SAndroid Build Coastguard Worker */
1192*5e7646d2SAndroid Build Coastguard Worker
1193*5e7646d2SAndroid Build Coastguard Worker response = cupsDoRequest(http, request, "/");
1194*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(response, "printer-type",
1195*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ENUM)) != NULL)
1196*5e7646d2SAndroid Build Coastguard Worker {
1197*5e7646d2SAndroid Build Coastguard Worker type = (cups_ptype_t)attr->values[0].integer;
1198*5e7646d2SAndroid Build Coastguard Worker
1199*5e7646d2SAndroid Build Coastguard Worker if (type & CUPS_PRINTER_CLASS)
1200*5e7646d2SAndroid Build Coastguard Worker httpAssembleURIf(HTTP_URI_CODING_ALL, uri, (int)urisize, "ipp", NULL, "localhost", ippPort(), "/classes/%s", printer);
1201*5e7646d2SAndroid Build Coastguard Worker }
1202*5e7646d2SAndroid Build Coastguard Worker else
1203*5e7646d2SAndroid Build Coastguard Worker type = CUPS_PRINTER_LOCAL;
1204*5e7646d2SAndroid Build Coastguard Worker
1205*5e7646d2SAndroid Build Coastguard Worker ippDelete(response);
1206*5e7646d2SAndroid Build Coastguard Worker
1207*5e7646d2SAndroid Build Coastguard Worker return (type);
1208*5e7646d2SAndroid Build Coastguard Worker }
1209*5e7646d2SAndroid Build Coastguard Worker
1210*5e7646d2SAndroid Build Coastguard Worker
1211*5e7646d2SAndroid Build Coastguard Worker /*
1212*5e7646d2SAndroid Build Coastguard Worker * 'set_printer_options()' - Set the printer options.
1213*5e7646d2SAndroid Build Coastguard Worker */
1214*5e7646d2SAndroid Build Coastguard Worker
1215*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 on success, 1 on fail */
set_printer_options(http_t * http,char * printer,int num_options,cups_option_t * options,char * file,int enable)1216*5e7646d2SAndroid Build Coastguard Worker set_printer_options(
1217*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Server connection */
1218*5e7646d2SAndroid Build Coastguard Worker char *printer, /* I - Printer */
1219*5e7646d2SAndroid Build Coastguard Worker int num_options, /* I - Number of options */
1220*5e7646d2SAndroid Build Coastguard Worker cups_option_t *options, /* I - Options */
1221*5e7646d2SAndroid Build Coastguard Worker char *file, /* I - PPD file */
1222*5e7646d2SAndroid Build Coastguard Worker int enable) /* I - Enable printer? */
1223*5e7646d2SAndroid Build Coastguard Worker {
1224*5e7646d2SAndroid Build Coastguard Worker ipp_t *request; /* IPP Request */
1225*5e7646d2SAndroid Build Coastguard Worker const char *ppdfile; /* PPD filename */
1226*5e7646d2SAndroid Build Coastguard Worker int ppdchanged = 0; /* PPD changed? */
1227*5e7646d2SAndroid Build Coastguard Worker ppd_file_t *ppd; /* PPD file */
1228*5e7646d2SAndroid Build Coastguard Worker ppd_choice_t *choice; /* Marked choice */
1229*5e7646d2SAndroid Build Coastguard Worker char uri[HTTP_MAX_URI], /* URI for printer/class */
1230*5e7646d2SAndroid Build Coastguard Worker line[1024], /* Line from PPD file */
1231*5e7646d2SAndroid Build Coastguard Worker keyword[1024], /* Keyword from Default line */
1232*5e7646d2SAndroid Build Coastguard Worker *keyptr, /* Pointer into keyword... */
1233*5e7646d2SAndroid Build Coastguard Worker tempfile[1024]; /* Temporary filename */
1234*5e7646d2SAndroid Build Coastguard Worker cups_file_t *in, /* PPD file */
1235*5e7646d2SAndroid Build Coastguard Worker *out; /* Temporary file */
1236*5e7646d2SAndroid Build Coastguard Worker const char *ppdname, /* ppd-name value */
1237*5e7646d2SAndroid Build Coastguard Worker *protocol, /* Old protocol option */
1238*5e7646d2SAndroid Build Coastguard Worker *customval, /* Custom option value */
1239*5e7646d2SAndroid Build Coastguard Worker *boolval; /* Boolean value */
1240*5e7646d2SAndroid Build Coastguard Worker int wrote_ipp_supplies = 0, /* Wrote cupsIPPSupplies keyword? */
1241*5e7646d2SAndroid Build Coastguard Worker wrote_snmp_supplies = 0,/* Wrote cupsSNMPSupplies keyword? */
1242*5e7646d2SAndroid Build Coastguard Worker copied_options = 0; /* Copied options? */
1243*5e7646d2SAndroid Build Coastguard Worker
1244*5e7646d2SAndroid Build Coastguard Worker
1245*5e7646d2SAndroid Build Coastguard Worker /*
1246*5e7646d2SAndroid Build Coastguard Worker * Build a CUPS-Add-Modify-Printer or CUPS-Add-Modify-Class request,
1247*5e7646d2SAndroid Build Coastguard Worker * which requires the following attributes:
1248*5e7646d2SAndroid Build Coastguard Worker *
1249*5e7646d2SAndroid Build Coastguard Worker * attributes-charset
1250*5e7646d2SAndroid Build Coastguard Worker * attributes-natural-language
1251*5e7646d2SAndroid Build Coastguard Worker * printer-uri
1252*5e7646d2SAndroid Build Coastguard Worker * requesting-user-name
1253*5e7646d2SAndroid Build Coastguard Worker * other options
1254*5e7646d2SAndroid Build Coastguard Worker */
1255*5e7646d2SAndroid Build Coastguard Worker
1256*5e7646d2SAndroid Build Coastguard Worker if (get_printer_type(http, printer, uri, sizeof(uri)) & CUPS_PRINTER_CLASS)
1257*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS);
1258*5e7646d2SAndroid Build Coastguard Worker else
1259*5e7646d2SAndroid Build Coastguard Worker request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER);
1260*5e7646d2SAndroid Build Coastguard Worker
1261*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
1262*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", NULL, cupsUser());
1263*5e7646d2SAndroid Build Coastguard Worker
1264*5e7646d2SAndroid Build Coastguard Worker /*
1265*5e7646d2SAndroid Build Coastguard Worker * Add the options...
1266*5e7646d2SAndroid Build Coastguard Worker */
1267*5e7646d2SAndroid Build Coastguard Worker
1268*5e7646d2SAndroid Build Coastguard Worker if (file)
1269*5e7646d2SAndroid Build Coastguard Worker ppdfile = file;
1270*5e7646d2SAndroid Build Coastguard Worker else if ((ppdname = cupsGetOption("ppd-name", num_options, options)) != NULL && strcmp(ppdname, "everywhere") && strcmp(ppdname, "raw") && num_options > 1)
1271*5e7646d2SAndroid Build Coastguard Worker {
1272*5e7646d2SAndroid Build Coastguard Worker if ((ppdfile = cupsGetServerPPD(http, ppdname)) != NULL)
1273*5e7646d2SAndroid Build Coastguard Worker {
1274*5e7646d2SAndroid Build Coastguard Worker /*
1275*5e7646d2SAndroid Build Coastguard Worker * Copy options array and remove ppd-name from it...
1276*5e7646d2SAndroid Build Coastguard Worker */
1277*5e7646d2SAndroid Build Coastguard Worker
1278*5e7646d2SAndroid Build Coastguard Worker cups_option_t *temp = NULL, *optr;
1279*5e7646d2SAndroid Build Coastguard Worker int i, num_temp = 0;
1280*5e7646d2SAndroid Build Coastguard Worker for (i = num_options, optr = options; i > 0; i --, optr ++)
1281*5e7646d2SAndroid Build Coastguard Worker if (strcmp(optr->name, "ppd-name"))
1282*5e7646d2SAndroid Build Coastguard Worker num_temp = cupsAddOption(optr->name, optr->value, num_temp, &temp);
1283*5e7646d2SAndroid Build Coastguard Worker
1284*5e7646d2SAndroid Build Coastguard Worker copied_options = 1;
1285*5e7646d2SAndroid Build Coastguard Worker ppdchanged = 1;
1286*5e7646d2SAndroid Build Coastguard Worker num_options = num_temp;
1287*5e7646d2SAndroid Build Coastguard Worker options = temp;
1288*5e7646d2SAndroid Build Coastguard Worker }
1289*5e7646d2SAndroid Build Coastguard Worker }
1290*5e7646d2SAndroid Build Coastguard Worker else if (request->request.op.operation_id == IPP_OP_CUPS_ADD_MODIFY_PRINTER)
1291*5e7646d2SAndroid Build Coastguard Worker ppdfile = cupsGetPPD(printer);
1292*5e7646d2SAndroid Build Coastguard Worker else
1293*5e7646d2SAndroid Build Coastguard Worker ppdfile = NULL;
1294*5e7646d2SAndroid Build Coastguard Worker
1295*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION);
1296*5e7646d2SAndroid Build Coastguard Worker
1297*5e7646d2SAndroid Build Coastguard Worker if (enable)
1298*5e7646d2SAndroid Build Coastguard Worker {
1299*5e7646d2SAndroid Build Coastguard Worker ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", IPP_PSTATE_IDLE);
1300*5e7646d2SAndroid Build Coastguard Worker ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1);
1301*5e7646d2SAndroid Build Coastguard Worker }
1302*5e7646d2SAndroid Build Coastguard Worker
1303*5e7646d2SAndroid Build Coastguard Worker cupsEncodeOptions2(request, num_options, options, IPP_TAG_PRINTER);
1304*5e7646d2SAndroid Build Coastguard Worker
1305*5e7646d2SAndroid Build Coastguard Worker if ((protocol = cupsGetOption("protocol", num_options, options)) != NULL)
1306*5e7646d2SAndroid Build Coastguard Worker {
1307*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(protocol, "bcp"))
1308*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor",
1309*5e7646d2SAndroid Build Coastguard Worker NULL, "bcp");
1310*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(protocol, "tbcp"))
1311*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor",
1312*5e7646d2SAndroid Build Coastguard Worker NULL, "tbcp");
1313*5e7646d2SAndroid Build Coastguard Worker }
1314*5e7646d2SAndroid Build Coastguard Worker
1315*5e7646d2SAndroid Build Coastguard Worker if (ppdfile)
1316*5e7646d2SAndroid Build Coastguard Worker {
1317*5e7646d2SAndroid Build Coastguard Worker /*
1318*5e7646d2SAndroid Build Coastguard Worker * Set default options in the PPD file...
1319*5e7646d2SAndroid Build Coastguard Worker */
1320*5e7646d2SAndroid Build Coastguard Worker
1321*5e7646d2SAndroid Build Coastguard Worker if ((ppd = ppdOpenFile(ppdfile)) == NULL)
1322*5e7646d2SAndroid Build Coastguard Worker {
1323*5e7646d2SAndroid Build Coastguard Worker int linenum; /* Line number of error */
1324*5e7646d2SAndroid Build Coastguard Worker ppd_status_t status = ppdLastError(&linenum);
1325*5e7646d2SAndroid Build Coastguard Worker /* Status code */
1326*5e7646d2SAndroid Build Coastguard Worker
1327*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unable to open PPD \"%s\": %s on line %d."), ppdfile, ppdErrorString(status), linenum);
1328*5e7646d2SAndroid Build Coastguard Worker return (1);
1329*5e7646d2SAndroid Build Coastguard Worker }
1330*5e7646d2SAndroid Build Coastguard Worker
1331*5e7646d2SAndroid Build Coastguard Worker ppdMarkDefaults(ppd);
1332*5e7646d2SAndroid Build Coastguard Worker cupsMarkOptions(ppd, num_options, options);
1333*5e7646d2SAndroid Build Coastguard Worker
1334*5e7646d2SAndroid Build Coastguard Worker if ((out = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL)
1335*5e7646d2SAndroid Build Coastguard Worker {
1336*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintError(NULL, _("lpadmin: Unable to create temporary file"));
1337*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
1338*5e7646d2SAndroid Build Coastguard Worker if (ppdfile != file)
1339*5e7646d2SAndroid Build Coastguard Worker unlink(ppdfile);
1340*5e7646d2SAndroid Build Coastguard Worker if (copied_options)
1341*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_options, options);
1342*5e7646d2SAndroid Build Coastguard Worker return (1);
1343*5e7646d2SAndroid Build Coastguard Worker }
1344*5e7646d2SAndroid Build Coastguard Worker
1345*5e7646d2SAndroid Build Coastguard Worker if ((in = cupsFileOpen(ppdfile, "r")) == NULL)
1346*5e7646d2SAndroid Build Coastguard Worker {
1347*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("lpadmin: Unable to open PPD \"%s\": %s"), ppdfile, strerror(errno));
1348*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
1349*5e7646d2SAndroid Build Coastguard Worker if (ppdfile != file)
1350*5e7646d2SAndroid Build Coastguard Worker unlink(ppdfile);
1351*5e7646d2SAndroid Build Coastguard Worker if (copied_options)
1352*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_options, options);
1353*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(out);
1354*5e7646d2SAndroid Build Coastguard Worker unlink(tempfile);
1355*5e7646d2SAndroid Build Coastguard Worker return (1);
1356*5e7646d2SAndroid Build Coastguard Worker }
1357*5e7646d2SAndroid Build Coastguard Worker
1358*5e7646d2SAndroid Build Coastguard Worker while (cupsFileGets(in, line, sizeof(line)))
1359*5e7646d2SAndroid Build Coastguard Worker {
1360*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(line, "*cupsIPPSupplies:", 17) &&
1361*5e7646d2SAndroid Build Coastguard Worker (boolval = cupsGetOption("cupsIPPSupplies", num_options,
1362*5e7646d2SAndroid Build Coastguard Worker options)) != NULL)
1363*5e7646d2SAndroid Build Coastguard Worker {
1364*5e7646d2SAndroid Build Coastguard Worker ppdchanged = 1;
1365*5e7646d2SAndroid Build Coastguard Worker wrote_ipp_supplies = 1;
1366*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "*cupsIPPSupplies: %s\n",
1367*5e7646d2SAndroid Build Coastguard Worker (!_cups_strcasecmp(boolval, "true") ||
1368*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "yes") ||
1369*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "on")) ? "True" : "False");
1370*5e7646d2SAndroid Build Coastguard Worker }
1371*5e7646d2SAndroid Build Coastguard Worker else if (!strncmp(line, "*cupsSNMPSupplies:", 18) &&
1372*5e7646d2SAndroid Build Coastguard Worker (boolval = cupsGetOption("cupsSNMPSupplies", num_options,
1373*5e7646d2SAndroid Build Coastguard Worker options)) != NULL)
1374*5e7646d2SAndroid Build Coastguard Worker {
1375*5e7646d2SAndroid Build Coastguard Worker ppdchanged = 1;
1376*5e7646d2SAndroid Build Coastguard Worker wrote_snmp_supplies = 1;
1377*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "*cupsSNMPSupplies: %s\n",
1378*5e7646d2SAndroid Build Coastguard Worker (!_cups_strcasecmp(boolval, "true") ||
1379*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "yes") ||
1380*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "on")) ? "True" : "False");
1381*5e7646d2SAndroid Build Coastguard Worker }
1382*5e7646d2SAndroid Build Coastguard Worker else if (strncmp(line, "*Default", 8))
1383*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "%s\n", line);
1384*5e7646d2SAndroid Build Coastguard Worker else
1385*5e7646d2SAndroid Build Coastguard Worker {
1386*5e7646d2SAndroid Build Coastguard Worker /*
1387*5e7646d2SAndroid Build Coastguard Worker * Get default option name...
1388*5e7646d2SAndroid Build Coastguard Worker */
1389*5e7646d2SAndroid Build Coastguard Worker
1390*5e7646d2SAndroid Build Coastguard Worker strlcpy(keyword, line + 8, sizeof(keyword));
1391*5e7646d2SAndroid Build Coastguard Worker
1392*5e7646d2SAndroid Build Coastguard Worker for (keyptr = keyword; *keyptr; keyptr ++)
1393*5e7646d2SAndroid Build Coastguard Worker if (*keyptr == ':' || isspace(*keyptr & 255))
1394*5e7646d2SAndroid Build Coastguard Worker break;
1395*5e7646d2SAndroid Build Coastguard Worker
1396*5e7646d2SAndroid Build Coastguard Worker *keyptr++ = '\0';
1397*5e7646d2SAndroid Build Coastguard Worker while (isspace(*keyptr & 255))
1398*5e7646d2SAndroid Build Coastguard Worker keyptr ++;
1399*5e7646d2SAndroid Build Coastguard Worker
1400*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(keyword, "PageRegion") ||
1401*5e7646d2SAndroid Build Coastguard Worker !strcmp(keyword, "PageSize") ||
1402*5e7646d2SAndroid Build Coastguard Worker !strcmp(keyword, "PaperDimension") ||
1403*5e7646d2SAndroid Build Coastguard Worker !strcmp(keyword, "ImageableArea"))
1404*5e7646d2SAndroid Build Coastguard Worker {
1405*5e7646d2SAndroid Build Coastguard Worker if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) == NULL)
1406*5e7646d2SAndroid Build Coastguard Worker choice = ppdFindMarkedChoice(ppd, "PageRegion");
1407*5e7646d2SAndroid Build Coastguard Worker }
1408*5e7646d2SAndroid Build Coastguard Worker else
1409*5e7646d2SAndroid Build Coastguard Worker choice = ppdFindMarkedChoice(ppd, keyword);
1410*5e7646d2SAndroid Build Coastguard Worker
1411*5e7646d2SAndroid Build Coastguard Worker if (choice && strcmp(choice->choice, keyptr))
1412*5e7646d2SAndroid Build Coastguard Worker {
1413*5e7646d2SAndroid Build Coastguard Worker if (strcmp(choice->choice, "Custom"))
1414*5e7646d2SAndroid Build Coastguard Worker {
1415*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "*Default%s: %s\n", keyword, choice->choice);
1416*5e7646d2SAndroid Build Coastguard Worker ppdchanged = 1;
1417*5e7646d2SAndroid Build Coastguard Worker }
1418*5e7646d2SAndroid Build Coastguard Worker else if ((customval = cupsGetOption(keyword, num_options,
1419*5e7646d2SAndroid Build Coastguard Worker options)) != NULL)
1420*5e7646d2SAndroid Build Coastguard Worker {
1421*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "*Default%s: %s\n", keyword, customval);
1422*5e7646d2SAndroid Build Coastguard Worker ppdchanged = 1;
1423*5e7646d2SAndroid Build Coastguard Worker }
1424*5e7646d2SAndroid Build Coastguard Worker else
1425*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "%s\n", line);
1426*5e7646d2SAndroid Build Coastguard Worker }
1427*5e7646d2SAndroid Build Coastguard Worker else
1428*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "%s\n", line);
1429*5e7646d2SAndroid Build Coastguard Worker }
1430*5e7646d2SAndroid Build Coastguard Worker }
1431*5e7646d2SAndroid Build Coastguard Worker
1432*5e7646d2SAndroid Build Coastguard Worker if (!wrote_ipp_supplies &&
1433*5e7646d2SAndroid Build Coastguard Worker (boolval = cupsGetOption("cupsIPPSupplies", num_options,
1434*5e7646d2SAndroid Build Coastguard Worker options)) != NULL)
1435*5e7646d2SAndroid Build Coastguard Worker {
1436*5e7646d2SAndroid Build Coastguard Worker ppdchanged = 1;
1437*5e7646d2SAndroid Build Coastguard Worker
1438*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "*cupsIPPSupplies: %s\n",
1439*5e7646d2SAndroid Build Coastguard Worker (!_cups_strcasecmp(boolval, "true") ||
1440*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "yes") ||
1441*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "on")) ? "True" : "False");
1442*5e7646d2SAndroid Build Coastguard Worker }
1443*5e7646d2SAndroid Build Coastguard Worker
1444*5e7646d2SAndroid Build Coastguard Worker if (!wrote_snmp_supplies &&
1445*5e7646d2SAndroid Build Coastguard Worker (boolval = cupsGetOption("cupsSNMPSupplies", num_options,
1446*5e7646d2SAndroid Build Coastguard Worker options)) != NULL)
1447*5e7646d2SAndroid Build Coastguard Worker {
1448*5e7646d2SAndroid Build Coastguard Worker ppdchanged = 1;
1449*5e7646d2SAndroid Build Coastguard Worker
1450*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(out, "*cupsSNMPSupplies: %s\n",
1451*5e7646d2SAndroid Build Coastguard Worker (!_cups_strcasecmp(boolval, "true") ||
1452*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "yes") ||
1453*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(boolval, "on")) ? "True" : "False");
1454*5e7646d2SAndroid Build Coastguard Worker }
1455*5e7646d2SAndroid Build Coastguard Worker
1456*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(in);
1457*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(out);
1458*5e7646d2SAndroid Build Coastguard Worker ppdClose(ppd);
1459*5e7646d2SAndroid Build Coastguard Worker
1460*5e7646d2SAndroid Build Coastguard Worker /*
1461*5e7646d2SAndroid Build Coastguard Worker * Do the request...
1462*5e7646d2SAndroid Build Coastguard Worker */
1463*5e7646d2SAndroid Build Coastguard Worker
1464*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoFileRequest(http, request, "/admin/", ppdchanged ? tempfile : file));
1465*5e7646d2SAndroid Build Coastguard Worker
1466*5e7646d2SAndroid Build Coastguard Worker /*
1467*5e7646d2SAndroid Build Coastguard Worker * Clean up temp files... (TODO: catch signals in case we CTRL-C during
1468*5e7646d2SAndroid Build Coastguard Worker * lpadmin)
1469*5e7646d2SAndroid Build Coastguard Worker */
1470*5e7646d2SAndroid Build Coastguard Worker
1471*5e7646d2SAndroid Build Coastguard Worker if (ppdfile != file)
1472*5e7646d2SAndroid Build Coastguard Worker unlink(ppdfile);
1473*5e7646d2SAndroid Build Coastguard Worker unlink(tempfile);
1474*5e7646d2SAndroid Build Coastguard Worker }
1475*5e7646d2SAndroid Build Coastguard Worker else
1476*5e7646d2SAndroid Build Coastguard Worker {
1477*5e7646d2SAndroid Build Coastguard Worker /*
1478*5e7646d2SAndroid Build Coastguard Worker * No PPD file - just set the options...
1479*5e7646d2SAndroid Build Coastguard Worker */
1480*5e7646d2SAndroid Build Coastguard Worker
1481*5e7646d2SAndroid Build Coastguard Worker ippDelete(cupsDoRequest(http, request, "/admin/"));
1482*5e7646d2SAndroid Build Coastguard Worker }
1483*5e7646d2SAndroid Build Coastguard Worker
1484*5e7646d2SAndroid Build Coastguard Worker if (copied_options)
1485*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(num_options, options);
1486*5e7646d2SAndroid Build Coastguard Worker
1487*5e7646d2SAndroid Build Coastguard Worker /*
1488*5e7646d2SAndroid Build Coastguard Worker * Check the response...
1489*5e7646d2SAndroid Build Coastguard Worker */
1490*5e7646d2SAndroid Build Coastguard Worker
1491*5e7646d2SAndroid Build Coastguard Worker if (cupsLastError() > IPP_STATUS_OK_CONFLICTING)
1492*5e7646d2SAndroid Build Coastguard Worker {
1493*5e7646d2SAndroid Build Coastguard Worker _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString());
1494*5e7646d2SAndroid Build Coastguard Worker
1495*5e7646d2SAndroid Build Coastguard Worker return (1);
1496*5e7646d2SAndroid Build Coastguard Worker }
1497*5e7646d2SAndroid Build Coastguard Worker else
1498*5e7646d2SAndroid Build Coastguard Worker return (0);
1499*5e7646d2SAndroid Build Coastguard Worker }
1500*5e7646d2SAndroid Build Coastguard Worker
1501*5e7646d2SAndroid Build Coastguard Worker
1502*5e7646d2SAndroid Build Coastguard Worker /*
1503*5e7646d2SAndroid Build Coastguard Worker * 'usage()' - Show program usage and exit.
1504*5e7646d2SAndroid Build Coastguard Worker */
1505*5e7646d2SAndroid Build Coastguard Worker
1506*5e7646d2SAndroid Build Coastguard Worker static void
usage(void)1507*5e7646d2SAndroid Build Coastguard Worker usage(void)
1508*5e7646d2SAndroid Build Coastguard Worker {
1509*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Usage: lpadmin [options] -d destination\n"
1510*5e7646d2SAndroid Build Coastguard Worker " lpadmin [options] -p destination\n"
1511*5e7646d2SAndroid Build Coastguard Worker " lpadmin [options] -p destination -c class\n"
1512*5e7646d2SAndroid Build Coastguard Worker " lpadmin [options] -p destination -r class\n"
1513*5e7646d2SAndroid Build Coastguard Worker " lpadmin [options] -x destination"));
1514*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("Options:"));
1515*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-c class Add the named destination to a class"));
1516*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-d destination Set the named destination as the server default"));
1517*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-D description Specify the textual description of the printer"));
1518*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-E Encrypt the connection to the server"));
1519*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-E Enable and accept jobs on the printer (after -p)"));
1520*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-h server[:port] Connect to the named server and port"));
1521*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-i ppd-file Specify a PPD file for the printer"));
1522*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-L location Specify the textual location of the printer"));
1523*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-m model Specify a standard model/PPD file for the printer"));
1524*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-m everywhere Specify the printer is compatible with IPP Everywhere"));
1525*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o name-default=value Specify the default value for the named option"));
1526*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o Name=Value Specify the default value for the named PPD option "));
1527*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o cupsIPPSupplies=false\n"
1528*5e7646d2SAndroid Build Coastguard Worker " Disable supply level reporting via IPP"));
1529*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o cupsSNMPSupplies=false\n"
1530*5e7646d2SAndroid Build Coastguard Worker " Disable supply level reporting via SNMP"));
1531*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o job-k-limit=N Specify the kilobyte limit for per-user quotas"));
1532*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o job-page-limit=N Specify the page limit for per-user quotas"));
1533*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o job-quota-period=N Specify the per-user quota period in seconds"));
1534*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o printer-error-policy=name\n"
1535*5e7646d2SAndroid Build Coastguard Worker " Specify the printer error policy"));
1536*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o printer-is-shared=true\n"
1537*5e7646d2SAndroid Build Coastguard Worker " Share the printer"));
1538*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-o printer-op-policy=name\n"
1539*5e7646d2SAndroid Build Coastguard Worker " Specify the printer operation policy"));
1540*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-p destination Specify/add the named destination"));
1541*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-r class Remove the named destination from a class"));
1542*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-R name-default Remove the default value for the named option"));
1543*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-u allow:all Allow all users to print"));
1544*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-u allow:list Allow the list of users or groups (@name) to print"));
1545*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-u deny:list Prevent the list of users or groups (@name) to print"));
1546*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-U username Specify the username to use for authentication"));
1547*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-v device-uri Specify the device URI for the printer"));
1548*5e7646d2SAndroid Build Coastguard Worker _cupsLangPuts(stdout, _("-x destination Remove the named destination"));
1549*5e7646d2SAndroid Build Coastguard Worker
1550*5e7646d2SAndroid Build Coastguard Worker exit(1);
1551*5e7646d2SAndroid Build Coastguard Worker }
1552*5e7646d2SAndroid Build Coastguard Worker
1553*5e7646d2SAndroid Build Coastguard Worker
1554*5e7646d2SAndroid Build Coastguard Worker /*
1555*5e7646d2SAndroid Build Coastguard Worker * 'validate_name()' - Make sure the printer name only contains valid chars.
1556*5e7646d2SAndroid Build Coastguard Worker */
1557*5e7646d2SAndroid Build Coastguard Worker
1558*5e7646d2SAndroid Build Coastguard Worker static int /* O - 0 if name is no good, 1 if name is good */
validate_name(const char * name)1559*5e7646d2SAndroid Build Coastguard Worker validate_name(const char *name) /* I - Name to check */
1560*5e7646d2SAndroid Build Coastguard Worker {
1561*5e7646d2SAndroid Build Coastguard Worker const char *ptr; /* Pointer into name */
1562*5e7646d2SAndroid Build Coastguard Worker
1563*5e7646d2SAndroid Build Coastguard Worker
1564*5e7646d2SAndroid Build Coastguard Worker /*
1565*5e7646d2SAndroid Build Coastguard Worker * Scan the whole name...
1566*5e7646d2SAndroid Build Coastguard Worker */
1567*5e7646d2SAndroid Build Coastguard Worker
1568*5e7646d2SAndroid Build Coastguard Worker for (ptr = name; *ptr; ptr ++)
1569*5e7646d2SAndroid Build Coastguard Worker if (*ptr == '@')
1570*5e7646d2SAndroid Build Coastguard Worker break;
1571*5e7646d2SAndroid Build Coastguard Worker else if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || *ptr == '\\' || *ptr == '?' || *ptr == '\'' || *ptr == '\"' || *ptr == '#')
1572*5e7646d2SAndroid Build Coastguard Worker return (0);
1573*5e7646d2SAndroid Build Coastguard Worker
1574*5e7646d2SAndroid Build Coastguard Worker /*
1575*5e7646d2SAndroid Build Coastguard Worker * All the characters are good; validate the length, too...
1576*5e7646d2SAndroid Build Coastguard Worker */
1577*5e7646d2SAndroid Build Coastguard Worker
1578*5e7646d2SAndroid Build Coastguard Worker return ((ptr - name) < 128);
1579*5e7646d2SAndroid Build Coastguard Worker }
1580