1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Administration utility API definitions for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2019 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2001-2007 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include "cups-private.h"
16*5e7646d2SAndroid Build Coastguard Worker #include "debug-internal.h"
17*5e7646d2SAndroid Build Coastguard Worker #include "ppd.h"
18*5e7646d2SAndroid Build Coastguard Worker #include "adminutil.h"
19*5e7646d2SAndroid Build Coastguard Worker #include <fcntl.h>
20*5e7646d2SAndroid Build Coastguard Worker #include <sys/stat.h>
21*5e7646d2SAndroid Build Coastguard Worker #ifndef _WIN32
22*5e7646d2SAndroid Build Coastguard Worker # include <unistd.h>
23*5e7646d2SAndroid Build Coastguard Worker # include <sys/wait.h>
24*5e7646d2SAndroid Build Coastguard Worker #endif /* !_WIN32 */
25*5e7646d2SAndroid Build Coastguard Worker
26*5e7646d2SAndroid Build Coastguard Worker
27*5e7646d2SAndroid Build Coastguard Worker /*
28*5e7646d2SAndroid Build Coastguard Worker * Local functions...
29*5e7646d2SAndroid Build Coastguard Worker */
30*5e7646d2SAndroid Build Coastguard Worker
31*5e7646d2SAndroid Build Coastguard Worker static http_status_t get_cupsd_conf(http_t *http, _cups_globals_t *cg,
32*5e7646d2SAndroid Build Coastguard Worker time_t last_update, char *name,
33*5e7646d2SAndroid Build Coastguard Worker size_t namelen, int *remote);
34*5e7646d2SAndroid Build Coastguard Worker static void invalidate_cupsd_cache(_cups_globals_t *cg);
35*5e7646d2SAndroid Build Coastguard Worker
36*5e7646d2SAndroid Build Coastguard Worker
37*5e7646d2SAndroid Build Coastguard Worker /*
38*5e7646d2SAndroid Build Coastguard Worker * 'cupsAdminCreateWindowsPPD()' - Create the Windows PPD file for a printer.
39*5e7646d2SAndroid Build Coastguard Worker *
40*5e7646d2SAndroid Build Coastguard Worker * @deprecated@
41*5e7646d2SAndroid Build Coastguard Worker */
42*5e7646d2SAndroid Build Coastguard Worker
43*5e7646d2SAndroid Build Coastguard Worker char * /* O - PPD file or NULL */
cupsAdminCreateWindowsPPD(http_t * http,const char * dest,char * buffer,int bufsize)44*5e7646d2SAndroid Build Coastguard Worker cupsAdminCreateWindowsPPD(
45*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */
46*5e7646d2SAndroid Build Coastguard Worker const char *dest, /* I - Printer or class */
47*5e7646d2SAndroid Build Coastguard Worker char *buffer, /* I - Filename buffer */
48*5e7646d2SAndroid Build Coastguard Worker int bufsize) /* I - Size of filename buffer */
49*5e7646d2SAndroid Build Coastguard Worker {
50*5e7646d2SAndroid Build Coastguard Worker (void)http;
51*5e7646d2SAndroid Build Coastguard Worker (void)dest;
52*5e7646d2SAndroid Build Coastguard Worker (void)bufsize;
53*5e7646d2SAndroid Build Coastguard Worker
54*5e7646d2SAndroid Build Coastguard Worker if (buffer)
55*5e7646d2SAndroid Build Coastguard Worker *buffer = '\0';
56*5e7646d2SAndroid Build Coastguard Worker
57*5e7646d2SAndroid Build Coastguard Worker return (NULL);
58*5e7646d2SAndroid Build Coastguard Worker }
59*5e7646d2SAndroid Build Coastguard Worker
60*5e7646d2SAndroid Build Coastguard Worker
61*5e7646d2SAndroid Build Coastguard Worker /*
62*5e7646d2SAndroid Build Coastguard Worker * 'cupsAdminExportSamba()' - Export a printer to Samba.
63*5e7646d2SAndroid Build Coastguard Worker *
64*5e7646d2SAndroid Build Coastguard Worker * @deprecated@
65*5e7646d2SAndroid Build Coastguard Worker */
66*5e7646d2SAndroid Build Coastguard Worker
67*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on failure */
cupsAdminExportSamba(const char * dest,const char * ppd,const char * samba_server,const char * samba_user,const char * samba_password,FILE * logfile)68*5e7646d2SAndroid Build Coastguard Worker cupsAdminExportSamba(
69*5e7646d2SAndroid Build Coastguard Worker const char *dest, /* I - Destination to export */
70*5e7646d2SAndroid Build Coastguard Worker const char *ppd, /* I - PPD file */
71*5e7646d2SAndroid Build Coastguard Worker const char *samba_server, /* I - Samba server */
72*5e7646d2SAndroid Build Coastguard Worker const char *samba_user, /* I - Samba username */
73*5e7646d2SAndroid Build Coastguard Worker const char *samba_password, /* I - Samba password */
74*5e7646d2SAndroid Build Coastguard Worker FILE *logfile) /* I - Log file, if any */
75*5e7646d2SAndroid Build Coastguard Worker {
76*5e7646d2SAndroid Build Coastguard Worker (void)dest;
77*5e7646d2SAndroid Build Coastguard Worker (void)ppd;
78*5e7646d2SAndroid Build Coastguard Worker (void)samba_server;
79*5e7646d2SAndroid Build Coastguard Worker (void)samba_user;
80*5e7646d2SAndroid Build Coastguard Worker (void)samba_password;
81*5e7646d2SAndroid Build Coastguard Worker (void)logfile;
82*5e7646d2SAndroid Build Coastguard Worker
83*5e7646d2SAndroid Build Coastguard Worker return (0);
84*5e7646d2SAndroid Build Coastguard Worker }
85*5e7646d2SAndroid Build Coastguard Worker
86*5e7646d2SAndroid Build Coastguard Worker
87*5e7646d2SAndroid Build Coastguard Worker /*
88*5e7646d2SAndroid Build Coastguard Worker * 'cupsAdminGetServerSettings()' - Get settings from the server.
89*5e7646d2SAndroid Build Coastguard Worker *
90*5e7646d2SAndroid Build Coastguard Worker * The returned settings should be freed with cupsFreeOptions() when
91*5e7646d2SAndroid Build Coastguard Worker * you are done with them.
92*5e7646d2SAndroid Build Coastguard Worker *
93*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.3/macOS 10.5@
94*5e7646d2SAndroid Build Coastguard Worker */
95*5e7646d2SAndroid Build Coastguard Worker
96*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on failure */
cupsAdminGetServerSettings(http_t * http,int * num_settings,cups_option_t ** settings)97*5e7646d2SAndroid Build Coastguard Worker cupsAdminGetServerSettings(
98*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */
99*5e7646d2SAndroid Build Coastguard Worker int *num_settings, /* O - Number of settings */
100*5e7646d2SAndroid Build Coastguard Worker cups_option_t **settings) /* O - Settings */
101*5e7646d2SAndroid Build Coastguard Worker {
102*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
103*5e7646d2SAndroid Build Coastguard Worker cups_file_t *cupsd; /* cupsd.conf file */
104*5e7646d2SAndroid Build Coastguard Worker char cupsdconf[1024]; /* cupsd.conf filename */
105*5e7646d2SAndroid Build Coastguard Worker int remote; /* Remote cupsd.conf file? */
106*5e7646d2SAndroid Build Coastguard Worker http_status_t status; /* Status of getting cupsd.conf */
107*5e7646d2SAndroid Build Coastguard Worker char line[1024], /* Line from cupsd.conf file */
108*5e7646d2SAndroid Build Coastguard Worker *value; /* Value on line */
109*5e7646d2SAndroid Build Coastguard Worker cups_option_t *setting; /* Current setting */
110*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg = _cupsGlobals(); /* Global data */
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker
113*5e7646d2SAndroid Build Coastguard Worker /*
114*5e7646d2SAndroid Build Coastguard Worker * Range check input...
115*5e7646d2SAndroid Build Coastguard Worker */
116*5e7646d2SAndroid Build Coastguard Worker
117*5e7646d2SAndroid Build Coastguard Worker if (!http)
118*5e7646d2SAndroid Build Coastguard Worker {
119*5e7646d2SAndroid Build Coastguard Worker /*
120*5e7646d2SAndroid Build Coastguard Worker * See if we are connected to the same server...
121*5e7646d2SAndroid Build Coastguard Worker */
122*5e7646d2SAndroid Build Coastguard Worker
123*5e7646d2SAndroid Build Coastguard Worker if (cg->http)
124*5e7646d2SAndroid Build Coastguard Worker {
125*5e7646d2SAndroid Build Coastguard Worker /*
126*5e7646d2SAndroid Build Coastguard Worker * Compare the connection hostname, port, and encryption settings to
127*5e7646d2SAndroid Build Coastguard Worker * the cached defaults; these were initialized the first time we
128*5e7646d2SAndroid Build Coastguard Worker * connected...
129*5e7646d2SAndroid Build Coastguard Worker */
130*5e7646d2SAndroid Build Coastguard Worker
131*5e7646d2SAndroid Build Coastguard Worker if (strcmp(cg->http->hostname, cg->server) ||
132*5e7646d2SAndroid Build Coastguard Worker cg->ipp_port != httpAddrPort(cg->http->hostaddr) ||
133*5e7646d2SAndroid Build Coastguard Worker (cg->http->encryption != cg->encryption &&
134*5e7646d2SAndroid Build Coastguard Worker cg->http->encryption == HTTP_ENCRYPTION_NEVER))
135*5e7646d2SAndroid Build Coastguard Worker {
136*5e7646d2SAndroid Build Coastguard Worker /*
137*5e7646d2SAndroid Build Coastguard Worker * Need to close the current connection because something has changed...
138*5e7646d2SAndroid Build Coastguard Worker */
139*5e7646d2SAndroid Build Coastguard Worker
140*5e7646d2SAndroid Build Coastguard Worker httpClose(cg->http);
141*5e7646d2SAndroid Build Coastguard Worker cg->http = NULL;
142*5e7646d2SAndroid Build Coastguard Worker }
143*5e7646d2SAndroid Build Coastguard Worker }
144*5e7646d2SAndroid Build Coastguard Worker
145*5e7646d2SAndroid Build Coastguard Worker /*
146*5e7646d2SAndroid Build Coastguard Worker * (Re)connect as needed...
147*5e7646d2SAndroid Build Coastguard Worker */
148*5e7646d2SAndroid Build Coastguard Worker
149*5e7646d2SAndroid Build Coastguard Worker if (!cg->http)
150*5e7646d2SAndroid Build Coastguard Worker {
151*5e7646d2SAndroid Build Coastguard Worker if ((cg->http = httpConnect2(cupsServer(), ippPort(), NULL, AF_UNSPEC,
152*5e7646d2SAndroid Build Coastguard Worker cupsEncryption(), 1, 0, NULL)) == NULL)
153*5e7646d2SAndroid Build Coastguard Worker {
154*5e7646d2SAndroid Build Coastguard Worker if (errno)
155*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, NULL, 0);
156*5e7646d2SAndroid Build Coastguard Worker else
157*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE,
158*5e7646d2SAndroid Build Coastguard Worker _("Unable to connect to host."), 1);
159*5e7646d2SAndroid Build Coastguard Worker
160*5e7646d2SAndroid Build Coastguard Worker if (num_settings)
161*5e7646d2SAndroid Build Coastguard Worker *num_settings = 0;
162*5e7646d2SAndroid Build Coastguard Worker
163*5e7646d2SAndroid Build Coastguard Worker if (settings)
164*5e7646d2SAndroid Build Coastguard Worker *settings = NULL;
165*5e7646d2SAndroid Build Coastguard Worker
166*5e7646d2SAndroid Build Coastguard Worker return (0);
167*5e7646d2SAndroid Build Coastguard Worker }
168*5e7646d2SAndroid Build Coastguard Worker }
169*5e7646d2SAndroid Build Coastguard Worker
170*5e7646d2SAndroid Build Coastguard Worker http = cg->http;
171*5e7646d2SAndroid Build Coastguard Worker }
172*5e7646d2SAndroid Build Coastguard Worker
173*5e7646d2SAndroid Build Coastguard Worker if (!http || !num_settings || !settings)
174*5e7646d2SAndroid Build Coastguard Worker {
175*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
176*5e7646d2SAndroid Build Coastguard Worker
177*5e7646d2SAndroid Build Coastguard Worker if (num_settings)
178*5e7646d2SAndroid Build Coastguard Worker *num_settings = 0;
179*5e7646d2SAndroid Build Coastguard Worker
180*5e7646d2SAndroid Build Coastguard Worker if (settings)
181*5e7646d2SAndroid Build Coastguard Worker *settings = NULL;
182*5e7646d2SAndroid Build Coastguard Worker
183*5e7646d2SAndroid Build Coastguard Worker return (0);
184*5e7646d2SAndroid Build Coastguard Worker }
185*5e7646d2SAndroid Build Coastguard Worker
186*5e7646d2SAndroid Build Coastguard Worker *num_settings = 0;
187*5e7646d2SAndroid Build Coastguard Worker *settings = NULL;
188*5e7646d2SAndroid Build Coastguard Worker
189*5e7646d2SAndroid Build Coastguard Worker /*
190*5e7646d2SAndroid Build Coastguard Worker * Get the cupsd.conf file...
191*5e7646d2SAndroid Build Coastguard Worker */
192*5e7646d2SAndroid Build Coastguard Worker
193*5e7646d2SAndroid Build Coastguard Worker if ((status = get_cupsd_conf(http, cg, cg->cupsd_update, cupsdconf,
194*5e7646d2SAndroid Build Coastguard Worker sizeof(cupsdconf), &remote)) == HTTP_STATUS_OK)
195*5e7646d2SAndroid Build Coastguard Worker {
196*5e7646d2SAndroid Build Coastguard Worker if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL)
197*5e7646d2SAndroid Build Coastguard Worker {
198*5e7646d2SAndroid Build Coastguard Worker char message[1024]; /* Message string */
199*5e7646d2SAndroid Build Coastguard Worker
200*5e7646d2SAndroid Build Coastguard Worker
201*5e7646d2SAndroid Build Coastguard Worker snprintf(message, sizeof(message),
202*5e7646d2SAndroid Build Coastguard Worker _cupsLangString(cupsLangDefault(), _("Open of %s failed: %s")),
203*5e7646d2SAndroid Build Coastguard Worker cupsdconf, strerror(errno));
204*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
205*5e7646d2SAndroid Build Coastguard Worker }
206*5e7646d2SAndroid Build Coastguard Worker }
207*5e7646d2SAndroid Build Coastguard Worker else
208*5e7646d2SAndroid Build Coastguard Worker cupsd = NULL;
209*5e7646d2SAndroid Build Coastguard Worker
210*5e7646d2SAndroid Build Coastguard Worker if (cupsd)
211*5e7646d2SAndroid Build Coastguard Worker {
212*5e7646d2SAndroid Build Coastguard Worker /*
213*5e7646d2SAndroid Build Coastguard Worker * Read the file, keeping track of what settings are enabled...
214*5e7646d2SAndroid Build Coastguard Worker */
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker int remote_access = 0, /* Remote access allowed? */
217*5e7646d2SAndroid Build Coastguard Worker remote_admin = 0, /* Remote administration allowed? */
218*5e7646d2SAndroid Build Coastguard Worker remote_any = 0, /* Remote access from anywhere allowed? */
219*5e7646d2SAndroid Build Coastguard Worker browsing = 1, /* Browsing enabled? */
220*5e7646d2SAndroid Build Coastguard Worker cancel_policy = 1, /* Cancel-job policy set? */
221*5e7646d2SAndroid Build Coastguard Worker debug_logging = 0; /* LogLevel debug set? */
222*5e7646d2SAndroid Build Coastguard Worker int linenum = 0, /* Line number in file */
223*5e7646d2SAndroid Build Coastguard Worker in_location = 0, /* In a location section? */
224*5e7646d2SAndroid Build Coastguard Worker in_policy = 0, /* In a policy section? */
225*5e7646d2SAndroid Build Coastguard Worker in_cancel_job = 0, /* In a cancel-job section? */
226*5e7646d2SAndroid Build Coastguard Worker in_admin_location = 0; /* In the /admin location? */
227*5e7646d2SAndroid Build Coastguard Worker
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker invalidate_cupsd_cache(cg);
230*5e7646d2SAndroid Build Coastguard Worker
231*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_update = time(NULL);
232*5e7646d2SAndroid Build Coastguard Worker httpGetHostname(http, cg->cupsd_hostname, sizeof(cg->cupsd_hostname));
233*5e7646d2SAndroid Build Coastguard Worker
234*5e7646d2SAndroid Build Coastguard Worker while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum))
235*5e7646d2SAndroid Build Coastguard Worker {
236*5e7646d2SAndroid Build Coastguard Worker if (!value && strncmp(line, "</", 2))
237*5e7646d2SAndroid Build Coastguard Worker value = line + strlen(line);
238*5e7646d2SAndroid Build Coastguard Worker
239*5e7646d2SAndroid Build Coastguard Worker if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")) && value)
240*5e7646d2SAndroid Build Coastguard Worker {
241*5e7646d2SAndroid Build Coastguard Worker char *port; /* Pointer to port number, if any */
242*5e7646d2SAndroid Build Coastguard Worker
243*5e7646d2SAndroid Build Coastguard Worker
244*5e7646d2SAndroid Build Coastguard Worker if ((port = strrchr(value, ':')) != NULL)
245*5e7646d2SAndroid Build Coastguard Worker *port = '\0';
246*5e7646d2SAndroid Build Coastguard Worker else if (isdigit(*value & 255))
247*5e7646d2SAndroid Build Coastguard Worker {
248*5e7646d2SAndroid Build Coastguard Worker /*
249*5e7646d2SAndroid Build Coastguard Worker * Listen on a port number implies remote access...
250*5e7646d2SAndroid Build Coastguard Worker */
251*5e7646d2SAndroid Build Coastguard Worker
252*5e7646d2SAndroid Build Coastguard Worker remote_access = 1;
253*5e7646d2SAndroid Build Coastguard Worker continue;
254*5e7646d2SAndroid Build Coastguard Worker }
255*5e7646d2SAndroid Build Coastguard Worker
256*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(value, "localhost") && strcmp(value, "127.0.0.1")
257*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_LOCAL
258*5e7646d2SAndroid Build Coastguard Worker && *value != '/'
259*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_LOCAL */
260*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
261*5e7646d2SAndroid Build Coastguard Worker && strcmp(value, "[::1]")
262*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
263*5e7646d2SAndroid Build Coastguard Worker )
264*5e7646d2SAndroid Build Coastguard Worker remote_access = 1;
265*5e7646d2SAndroid Build Coastguard Worker }
266*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Browsing"))
267*5e7646d2SAndroid Build Coastguard Worker {
268*5e7646d2SAndroid Build Coastguard Worker browsing = !_cups_strcasecmp(value, "yes") ||
269*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "on") ||
270*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "true");
271*5e7646d2SAndroid Build Coastguard Worker }
272*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "LogLevel"))
273*5e7646d2SAndroid Build Coastguard Worker {
274*5e7646d2SAndroid Build Coastguard Worker debug_logging = !_cups_strncasecmp(value, "debug", 5);
275*5e7646d2SAndroid Build Coastguard Worker }
276*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Policy") &&
277*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "default"))
278*5e7646d2SAndroid Build Coastguard Worker {
279*5e7646d2SAndroid Build Coastguard Worker in_policy = 1;
280*5e7646d2SAndroid Build Coastguard Worker }
281*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Policy>"))
282*5e7646d2SAndroid Build Coastguard Worker {
283*5e7646d2SAndroid Build Coastguard Worker in_policy = 0;
284*5e7646d2SAndroid Build Coastguard Worker }
285*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Limit") && in_policy && value)
286*5e7646d2SAndroid Build Coastguard Worker {
287*5e7646d2SAndroid Build Coastguard Worker /*
288*5e7646d2SAndroid Build Coastguard Worker * See if the policy limit is for the Cancel-Job operation...
289*5e7646d2SAndroid Build Coastguard Worker */
290*5e7646d2SAndroid Build Coastguard Worker
291*5e7646d2SAndroid Build Coastguard Worker char *valptr; /* Pointer into value */
292*5e7646d2SAndroid Build Coastguard Worker
293*5e7646d2SAndroid Build Coastguard Worker
294*5e7646d2SAndroid Build Coastguard Worker while (*value)
295*5e7646d2SAndroid Build Coastguard Worker {
296*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++);
297*5e7646d2SAndroid Build Coastguard Worker
298*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
299*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
300*5e7646d2SAndroid Build Coastguard Worker
301*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "cancel-job") ||
302*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(value, "all"))
303*5e7646d2SAndroid Build Coastguard Worker {
304*5e7646d2SAndroid Build Coastguard Worker in_cancel_job = 1;
305*5e7646d2SAndroid Build Coastguard Worker break;
306*5e7646d2SAndroid Build Coastguard Worker }
307*5e7646d2SAndroid Build Coastguard Worker
308*5e7646d2SAndroid Build Coastguard Worker for (value = valptr; _cups_isspace(*value); value ++);
309*5e7646d2SAndroid Build Coastguard Worker }
310*5e7646d2SAndroid Build Coastguard Worker }
311*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Limit>"))
312*5e7646d2SAndroid Build Coastguard Worker {
313*5e7646d2SAndroid Build Coastguard Worker in_cancel_job = 0;
314*5e7646d2SAndroid Build Coastguard Worker }
315*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Require") && in_cancel_job)
316*5e7646d2SAndroid Build Coastguard Worker {
317*5e7646d2SAndroid Build Coastguard Worker cancel_policy = 0;
318*5e7646d2SAndroid Build Coastguard Worker }
319*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Location") && value)
320*5e7646d2SAndroid Build Coastguard Worker {
321*5e7646d2SAndroid Build Coastguard Worker in_admin_location = !_cups_strcasecmp(value, "/admin");
322*5e7646d2SAndroid Build Coastguard Worker in_location = 1;
323*5e7646d2SAndroid Build Coastguard Worker }
324*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Location>"))
325*5e7646d2SAndroid Build Coastguard Worker {
326*5e7646d2SAndroid Build Coastguard Worker in_admin_location = 0;
327*5e7646d2SAndroid Build Coastguard Worker in_location = 0;
328*5e7646d2SAndroid Build Coastguard Worker }
329*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "Allow") && value &&
330*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(value, "localhost") &&
331*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(value, "127.0.0.1")
332*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_LOCAL
333*5e7646d2SAndroid Build Coastguard Worker && *value != '/'
334*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_LOCAL */
335*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
336*5e7646d2SAndroid Build Coastguard Worker && strcmp(value, "::1")
337*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
338*5e7646d2SAndroid Build Coastguard Worker )
339*5e7646d2SAndroid Build Coastguard Worker {
340*5e7646d2SAndroid Build Coastguard Worker if (in_admin_location)
341*5e7646d2SAndroid Build Coastguard Worker remote_admin = 1;
342*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(value, "all"))
343*5e7646d2SAndroid Build Coastguard Worker remote_any = 1;
344*5e7646d2SAndroid Build Coastguard Worker }
345*5e7646d2SAndroid Build Coastguard Worker else if (line[0] != '<' && !in_location && !in_policy &&
346*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(line, "Allow") &&
347*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(line, "AuthType") &&
348*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(line, "Deny") &&
349*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(line, "Order") &&
350*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(line, "Require") &&
351*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(line, "Satisfy"))
352*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = cupsAddOption(line, value,
353*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings,
354*5e7646d2SAndroid Build Coastguard Worker &(cg->cupsd_settings));
355*5e7646d2SAndroid Build Coastguard Worker }
356*5e7646d2SAndroid Build Coastguard Worker
357*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(cupsd);
358*5e7646d2SAndroid Build Coastguard Worker
359*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING,
360*5e7646d2SAndroid Build Coastguard Worker debug_logging ? "1" : "0",
361*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings,
362*5e7646d2SAndroid Build Coastguard Worker &(cg->cupsd_settings));
363*5e7646d2SAndroid Build Coastguard Worker
364*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN,
365*5e7646d2SAndroid Build Coastguard Worker (remote_access && remote_admin) ?
366*5e7646d2SAndroid Build Coastguard Worker "1" : "0",
367*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings,
368*5e7646d2SAndroid Build Coastguard Worker &(cg->cupsd_settings));
369*5e7646d2SAndroid Build Coastguard Worker
370*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY,
371*5e7646d2SAndroid Build Coastguard Worker remote_any ? "1" : "0",
372*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings,
373*5e7646d2SAndroid Build Coastguard Worker &(cg->cupsd_settings));
374*5e7646d2SAndroid Build Coastguard Worker
375*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS,
376*5e7646d2SAndroid Build Coastguard Worker (remote_access && browsing) ? "1" :
377*5e7646d2SAndroid Build Coastguard Worker "0",
378*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings,
379*5e7646d2SAndroid Build Coastguard Worker &(cg->cupsd_settings));
380*5e7646d2SAndroid Build Coastguard Worker
381*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY,
382*5e7646d2SAndroid Build Coastguard Worker cancel_policy ? "1" : "0",
383*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings,
384*5e7646d2SAndroid Build Coastguard Worker &(cg->cupsd_settings));
385*5e7646d2SAndroid Build Coastguard Worker }
386*5e7646d2SAndroid Build Coastguard Worker else if (status != HTTP_STATUS_NOT_MODIFIED)
387*5e7646d2SAndroid Build Coastguard Worker invalidate_cupsd_cache(cg);
388*5e7646d2SAndroid Build Coastguard Worker
389*5e7646d2SAndroid Build Coastguard Worker /*
390*5e7646d2SAndroid Build Coastguard Worker * Remove any temporary files and copy the settings array...
391*5e7646d2SAndroid Build Coastguard Worker */
392*5e7646d2SAndroid Build Coastguard Worker
393*5e7646d2SAndroid Build Coastguard Worker if (remote)
394*5e7646d2SAndroid Build Coastguard Worker unlink(cupsdconf);
395*5e7646d2SAndroid Build Coastguard Worker
396*5e7646d2SAndroid Build Coastguard Worker for (i = cg->cupsd_num_settings, setting = cg->cupsd_settings;
397*5e7646d2SAndroid Build Coastguard Worker i > 0;
398*5e7646d2SAndroid Build Coastguard Worker i --, setting ++)
399*5e7646d2SAndroid Build Coastguard Worker *num_settings = cupsAddOption(setting->name, setting->value,
400*5e7646d2SAndroid Build Coastguard Worker *num_settings, settings);
401*5e7646d2SAndroid Build Coastguard Worker
402*5e7646d2SAndroid Build Coastguard Worker return (cg->cupsd_num_settings > 0);
403*5e7646d2SAndroid Build Coastguard Worker }
404*5e7646d2SAndroid Build Coastguard Worker
405*5e7646d2SAndroid Build Coastguard Worker
406*5e7646d2SAndroid Build Coastguard Worker /*
407*5e7646d2SAndroid Build Coastguard Worker * 'cupsAdminSetServerSettings()' - Set settings on the server.
408*5e7646d2SAndroid Build Coastguard Worker *
409*5e7646d2SAndroid Build Coastguard Worker * @since CUPS 1.3/macOS 10.5@
410*5e7646d2SAndroid Build Coastguard Worker */
411*5e7646d2SAndroid Build Coastguard Worker
412*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on failure */
cupsAdminSetServerSettings(http_t * http,int num_settings,cups_option_t * settings)413*5e7646d2SAndroid Build Coastguard Worker cupsAdminSetServerSettings(
414*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */
415*5e7646d2SAndroid Build Coastguard Worker int num_settings, /* I - Number of settings */
416*5e7646d2SAndroid Build Coastguard Worker cups_option_t *settings) /* I - Settings */
417*5e7646d2SAndroid Build Coastguard Worker {
418*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
419*5e7646d2SAndroid Build Coastguard Worker http_status_t status; /* GET/PUT status */
420*5e7646d2SAndroid Build Coastguard Worker const char *server_port_env; /* SERVER_PORT env var */
421*5e7646d2SAndroid Build Coastguard Worker int server_port; /* IPP port for server */
422*5e7646d2SAndroid Build Coastguard Worker cups_file_t *cupsd; /* cupsd.conf file */
423*5e7646d2SAndroid Build Coastguard Worker char cupsdconf[1024]; /* cupsd.conf filename */
424*5e7646d2SAndroid Build Coastguard Worker int remote; /* Remote cupsd.conf file? */
425*5e7646d2SAndroid Build Coastguard Worker char tempfile[1024]; /* Temporary new cupsd.conf */
426*5e7646d2SAndroid Build Coastguard Worker cups_file_t *temp; /* Temporary file */
427*5e7646d2SAndroid Build Coastguard Worker char line[1024], /* Line from cupsd.conf file */
428*5e7646d2SAndroid Build Coastguard Worker *value; /* Value on line */
429*5e7646d2SAndroid Build Coastguard Worker int linenum, /* Line number in file */
430*5e7646d2SAndroid Build Coastguard Worker in_location, /* In a location section? */
431*5e7646d2SAndroid Build Coastguard Worker in_policy, /* In a policy section? */
432*5e7646d2SAndroid Build Coastguard Worker in_default_policy, /* In the default policy section? */
433*5e7646d2SAndroid Build Coastguard Worker in_cancel_job, /* In a cancel-job section? */
434*5e7646d2SAndroid Build Coastguard Worker in_admin_location, /* In the /admin location? */
435*5e7646d2SAndroid Build Coastguard Worker in_conf_location, /* In the /admin/conf location? */
436*5e7646d2SAndroid Build Coastguard Worker in_log_location, /* In the /admin/log location? */
437*5e7646d2SAndroid Build Coastguard Worker in_root_location; /* In the / location? */
438*5e7646d2SAndroid Build Coastguard Worker const char *val; /* Setting value */
439*5e7646d2SAndroid Build Coastguard Worker int share_printers, /* Share local printers */
440*5e7646d2SAndroid Build Coastguard Worker remote_admin, /* Remote administration allowed? */
441*5e7646d2SAndroid Build Coastguard Worker remote_any, /* Remote access from anywhere? */
442*5e7646d2SAndroid Build Coastguard Worker user_cancel_any, /* Cancel-job policy set? */
443*5e7646d2SAndroid Build Coastguard Worker debug_logging; /* LogLevel debug set? */
444*5e7646d2SAndroid Build Coastguard Worker int wrote_port_listen, /* Wrote the port/listen lines? */
445*5e7646d2SAndroid Build Coastguard Worker wrote_browsing, /* Wrote the browsing lines? */
446*5e7646d2SAndroid Build Coastguard Worker wrote_policy, /* Wrote the policy? */
447*5e7646d2SAndroid Build Coastguard Worker wrote_loglevel, /* Wrote the LogLevel line? */
448*5e7646d2SAndroid Build Coastguard Worker wrote_admin_location, /* Wrote the /admin location? */
449*5e7646d2SAndroid Build Coastguard Worker wrote_conf_location, /* Wrote the /admin/conf location? */
450*5e7646d2SAndroid Build Coastguard Worker wrote_log_location, /* Wrote the /admin/log location? */
451*5e7646d2SAndroid Build Coastguard Worker wrote_root_location; /* Wrote the / location? */
452*5e7646d2SAndroid Build Coastguard Worker int indent; /* Indentation */
453*5e7646d2SAndroid Build Coastguard Worker int cupsd_num_settings; /* New number of settings */
454*5e7646d2SAndroid Build Coastguard Worker int old_share_printers, /* Share local printers */
455*5e7646d2SAndroid Build Coastguard Worker old_remote_admin, /* Remote administration allowed? */
456*5e7646d2SAndroid Build Coastguard Worker old_remote_any, /* Remote access from anywhere? */
457*5e7646d2SAndroid Build Coastguard Worker old_user_cancel_any, /* Cancel-job policy set? */
458*5e7646d2SAndroid Build Coastguard Worker old_debug_logging; /* LogLevel debug set? */
459*5e7646d2SAndroid Build Coastguard Worker cups_option_t *cupsd_settings, /* New settings */
460*5e7646d2SAndroid Build Coastguard Worker *setting; /* Current setting */
461*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg = _cupsGlobals(); /* Global data */
462*5e7646d2SAndroid Build Coastguard Worker
463*5e7646d2SAndroid Build Coastguard Worker
464*5e7646d2SAndroid Build Coastguard Worker /*
465*5e7646d2SAndroid Build Coastguard Worker * Range check input...
466*5e7646d2SAndroid Build Coastguard Worker */
467*5e7646d2SAndroid Build Coastguard Worker
468*5e7646d2SAndroid Build Coastguard Worker if (!http)
469*5e7646d2SAndroid Build Coastguard Worker http = _cupsConnect();
470*5e7646d2SAndroid Build Coastguard Worker
471*5e7646d2SAndroid Build Coastguard Worker if (!http || !num_settings || !settings)
472*5e7646d2SAndroid Build Coastguard Worker {
473*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0);
474*5e7646d2SAndroid Build Coastguard Worker
475*5e7646d2SAndroid Build Coastguard Worker return (0);
476*5e7646d2SAndroid Build Coastguard Worker }
477*5e7646d2SAndroid Build Coastguard Worker
478*5e7646d2SAndroid Build Coastguard Worker /*
479*5e7646d2SAndroid Build Coastguard Worker * Get the cupsd.conf file...
480*5e7646d2SAndroid Build Coastguard Worker */
481*5e7646d2SAndroid Build Coastguard Worker
482*5e7646d2SAndroid Build Coastguard Worker if (get_cupsd_conf(http, cg, 0, cupsdconf, sizeof(cupsdconf),
483*5e7646d2SAndroid Build Coastguard Worker &remote) == HTTP_STATUS_OK)
484*5e7646d2SAndroid Build Coastguard Worker {
485*5e7646d2SAndroid Build Coastguard Worker if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL)
486*5e7646d2SAndroid Build Coastguard Worker {
487*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
488*5e7646d2SAndroid Build Coastguard Worker return (0);
489*5e7646d2SAndroid Build Coastguard Worker }
490*5e7646d2SAndroid Build Coastguard Worker }
491*5e7646d2SAndroid Build Coastguard Worker else
492*5e7646d2SAndroid Build Coastguard Worker return (0);
493*5e7646d2SAndroid Build Coastguard Worker
494*5e7646d2SAndroid Build Coastguard Worker /*
495*5e7646d2SAndroid Build Coastguard Worker * Get current settings...
496*5e7646d2SAndroid Build Coastguard Worker */
497*5e7646d2SAndroid Build Coastguard Worker
498*5e7646d2SAndroid Build Coastguard Worker if (!cupsAdminGetServerSettings(http, &cupsd_num_settings,
499*5e7646d2SAndroid Build Coastguard Worker &cupsd_settings))
500*5e7646d2SAndroid Build Coastguard Worker return (0);
501*5e7646d2SAndroid Build Coastguard Worker
502*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, cupsd_num_settings,
503*5e7646d2SAndroid Build Coastguard Worker cupsd_settings)) != NULL)
504*5e7646d2SAndroid Build Coastguard Worker old_debug_logging = atoi(val);
505*5e7646d2SAndroid Build Coastguard Worker else
506*5e7646d2SAndroid Build Coastguard Worker old_debug_logging = 0;
507*5e7646d2SAndroid Build Coastguard Worker
508*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: old debug_logging=%d",
509*5e7646d2SAndroid Build Coastguard Worker old_debug_logging));
510*5e7646d2SAndroid Build Coastguard Worker
511*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, cupsd_num_settings,
512*5e7646d2SAndroid Build Coastguard Worker cupsd_settings)) != NULL)
513*5e7646d2SAndroid Build Coastguard Worker old_remote_admin = atoi(val);
514*5e7646d2SAndroid Build Coastguard Worker else
515*5e7646d2SAndroid Build Coastguard Worker old_remote_admin = 0;
516*5e7646d2SAndroid Build Coastguard Worker
517*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: old remote_admin=%d",
518*5e7646d2SAndroid Build Coastguard Worker old_remote_admin));
519*5e7646d2SAndroid Build Coastguard Worker
520*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, cupsd_num_settings,
521*5e7646d2SAndroid Build Coastguard Worker cupsd_settings)) != NULL)
522*5e7646d2SAndroid Build Coastguard Worker old_remote_any = atoi(val);
523*5e7646d2SAndroid Build Coastguard Worker else
524*5e7646d2SAndroid Build Coastguard Worker old_remote_any = 0;
525*5e7646d2SAndroid Build Coastguard Worker
526*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: old remote_any=%d",
527*5e7646d2SAndroid Build Coastguard Worker old_remote_any));
528*5e7646d2SAndroid Build Coastguard Worker
529*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, cupsd_num_settings,
530*5e7646d2SAndroid Build Coastguard Worker cupsd_settings)) != NULL)
531*5e7646d2SAndroid Build Coastguard Worker old_share_printers = atoi(val);
532*5e7646d2SAndroid Build Coastguard Worker else
533*5e7646d2SAndroid Build Coastguard Worker old_share_printers = 0;
534*5e7646d2SAndroid Build Coastguard Worker
535*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: old share_printers=%d",
536*5e7646d2SAndroid Build Coastguard Worker old_share_printers));
537*5e7646d2SAndroid Build Coastguard Worker
538*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, cupsd_num_settings,
539*5e7646d2SAndroid Build Coastguard Worker cupsd_settings)) != NULL)
540*5e7646d2SAndroid Build Coastguard Worker old_user_cancel_any = atoi(val);
541*5e7646d2SAndroid Build Coastguard Worker else
542*5e7646d2SAndroid Build Coastguard Worker old_user_cancel_any = 0;
543*5e7646d2SAndroid Build Coastguard Worker
544*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: old user_cancel_any=%d",
545*5e7646d2SAndroid Build Coastguard Worker old_user_cancel_any));
546*5e7646d2SAndroid Build Coastguard Worker
547*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(cupsd_num_settings, cupsd_settings);
548*5e7646d2SAndroid Build Coastguard Worker
549*5e7646d2SAndroid Build Coastguard Worker /*
550*5e7646d2SAndroid Build Coastguard Worker * Get basic settings...
551*5e7646d2SAndroid Build Coastguard Worker */
552*5e7646d2SAndroid Build Coastguard Worker
553*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, num_settings,
554*5e7646d2SAndroid Build Coastguard Worker settings)) != NULL)
555*5e7646d2SAndroid Build Coastguard Worker {
556*5e7646d2SAndroid Build Coastguard Worker debug_logging = atoi(val);
557*5e7646d2SAndroid Build Coastguard Worker
558*5e7646d2SAndroid Build Coastguard Worker if (debug_logging == old_debug_logging)
559*5e7646d2SAndroid Build Coastguard Worker {
560*5e7646d2SAndroid Build Coastguard Worker /*
561*5e7646d2SAndroid Build Coastguard Worker * No change to this setting...
562*5e7646d2SAndroid Build Coastguard Worker */
563*5e7646d2SAndroid Build Coastguard Worker
564*5e7646d2SAndroid Build Coastguard Worker debug_logging = -1;
565*5e7646d2SAndroid Build Coastguard Worker }
566*5e7646d2SAndroid Build Coastguard Worker }
567*5e7646d2SAndroid Build Coastguard Worker else
568*5e7646d2SAndroid Build Coastguard Worker debug_logging = -1;
569*5e7646d2SAndroid Build Coastguard Worker
570*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: debug_logging=%d",
571*5e7646d2SAndroid Build Coastguard Worker debug_logging));
572*5e7646d2SAndroid Build Coastguard Worker
573*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings, settings)) != NULL)
574*5e7646d2SAndroid Build Coastguard Worker {
575*5e7646d2SAndroid Build Coastguard Worker remote_any = atoi(val);
576*5e7646d2SAndroid Build Coastguard Worker
577*5e7646d2SAndroid Build Coastguard Worker if (remote_any == old_remote_any)
578*5e7646d2SAndroid Build Coastguard Worker {
579*5e7646d2SAndroid Build Coastguard Worker /*
580*5e7646d2SAndroid Build Coastguard Worker * No change to this setting...
581*5e7646d2SAndroid Build Coastguard Worker */
582*5e7646d2SAndroid Build Coastguard Worker
583*5e7646d2SAndroid Build Coastguard Worker remote_any = -1;
584*5e7646d2SAndroid Build Coastguard Worker }
585*5e7646d2SAndroid Build Coastguard Worker }
586*5e7646d2SAndroid Build Coastguard Worker else
587*5e7646d2SAndroid Build Coastguard Worker remote_any = -1;
588*5e7646d2SAndroid Build Coastguard Worker
589*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: remote_any=%d", remote_any));
590*5e7646d2SAndroid Build Coastguard Worker
591*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings,
592*5e7646d2SAndroid Build Coastguard Worker settings)) != NULL)
593*5e7646d2SAndroid Build Coastguard Worker {
594*5e7646d2SAndroid Build Coastguard Worker remote_admin = atoi(val);
595*5e7646d2SAndroid Build Coastguard Worker
596*5e7646d2SAndroid Build Coastguard Worker if (remote_admin == old_remote_admin)
597*5e7646d2SAndroid Build Coastguard Worker {
598*5e7646d2SAndroid Build Coastguard Worker /*
599*5e7646d2SAndroid Build Coastguard Worker * No change to this setting...
600*5e7646d2SAndroid Build Coastguard Worker */
601*5e7646d2SAndroid Build Coastguard Worker
602*5e7646d2SAndroid Build Coastguard Worker remote_admin = -1;
603*5e7646d2SAndroid Build Coastguard Worker }
604*5e7646d2SAndroid Build Coastguard Worker }
605*5e7646d2SAndroid Build Coastguard Worker else
606*5e7646d2SAndroid Build Coastguard Worker remote_admin = -1;
607*5e7646d2SAndroid Build Coastguard Worker
608*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: remote_admin=%d",
609*5e7646d2SAndroid Build Coastguard Worker remote_admin));
610*5e7646d2SAndroid Build Coastguard Worker
611*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings,
612*5e7646d2SAndroid Build Coastguard Worker settings)) != NULL)
613*5e7646d2SAndroid Build Coastguard Worker {
614*5e7646d2SAndroid Build Coastguard Worker share_printers = atoi(val);
615*5e7646d2SAndroid Build Coastguard Worker
616*5e7646d2SAndroid Build Coastguard Worker if (share_printers == old_share_printers)
617*5e7646d2SAndroid Build Coastguard Worker {
618*5e7646d2SAndroid Build Coastguard Worker /*
619*5e7646d2SAndroid Build Coastguard Worker * No change to this setting...
620*5e7646d2SAndroid Build Coastguard Worker */
621*5e7646d2SAndroid Build Coastguard Worker
622*5e7646d2SAndroid Build Coastguard Worker share_printers = -1;
623*5e7646d2SAndroid Build Coastguard Worker }
624*5e7646d2SAndroid Build Coastguard Worker }
625*5e7646d2SAndroid Build Coastguard Worker else
626*5e7646d2SAndroid Build Coastguard Worker share_printers = -1;
627*5e7646d2SAndroid Build Coastguard Worker
628*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: share_printers=%d",
629*5e7646d2SAndroid Build Coastguard Worker share_printers));
630*5e7646d2SAndroid Build Coastguard Worker
631*5e7646d2SAndroid Build Coastguard Worker if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings,
632*5e7646d2SAndroid Build Coastguard Worker settings)) != NULL)
633*5e7646d2SAndroid Build Coastguard Worker {
634*5e7646d2SAndroid Build Coastguard Worker user_cancel_any = atoi(val);
635*5e7646d2SAndroid Build Coastguard Worker
636*5e7646d2SAndroid Build Coastguard Worker if (user_cancel_any == old_user_cancel_any)
637*5e7646d2SAndroid Build Coastguard Worker {
638*5e7646d2SAndroid Build Coastguard Worker /*
639*5e7646d2SAndroid Build Coastguard Worker * No change to this setting...
640*5e7646d2SAndroid Build Coastguard Worker */
641*5e7646d2SAndroid Build Coastguard Worker
642*5e7646d2SAndroid Build Coastguard Worker user_cancel_any = -1;
643*5e7646d2SAndroid Build Coastguard Worker }
644*5e7646d2SAndroid Build Coastguard Worker }
645*5e7646d2SAndroid Build Coastguard Worker else
646*5e7646d2SAndroid Build Coastguard Worker user_cancel_any = -1;
647*5e7646d2SAndroid Build Coastguard Worker
648*5e7646d2SAndroid Build Coastguard Worker DEBUG_printf(("1cupsAdminSetServerSettings: user_cancel_any=%d",
649*5e7646d2SAndroid Build Coastguard Worker user_cancel_any));
650*5e7646d2SAndroid Build Coastguard Worker
651*5e7646d2SAndroid Build Coastguard Worker /*
652*5e7646d2SAndroid Build Coastguard Worker * Create a temporary file for the new cupsd.conf file...
653*5e7646d2SAndroid Build Coastguard Worker */
654*5e7646d2SAndroid Build Coastguard Worker
655*5e7646d2SAndroid Build Coastguard Worker if ((temp = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL)
656*5e7646d2SAndroid Build Coastguard Worker {
657*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(cupsd);
658*5e7646d2SAndroid Build Coastguard Worker
659*5e7646d2SAndroid Build Coastguard Worker if (remote)
660*5e7646d2SAndroid Build Coastguard Worker unlink(cupsdconf);
661*5e7646d2SAndroid Build Coastguard Worker
662*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
663*5e7646d2SAndroid Build Coastguard Worker return (0);
664*5e7646d2SAndroid Build Coastguard Worker }
665*5e7646d2SAndroid Build Coastguard Worker
666*5e7646d2SAndroid Build Coastguard Worker /*
667*5e7646d2SAndroid Build Coastguard Worker * Copy the old file to the new, making changes along the way...
668*5e7646d2SAndroid Build Coastguard Worker */
669*5e7646d2SAndroid Build Coastguard Worker
670*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = 0;
671*5e7646d2SAndroid Build Coastguard Worker in_admin_location = 0;
672*5e7646d2SAndroid Build Coastguard Worker in_cancel_job = 0;
673*5e7646d2SAndroid Build Coastguard Worker in_conf_location = 0;
674*5e7646d2SAndroid Build Coastguard Worker in_default_policy = 0;
675*5e7646d2SAndroid Build Coastguard Worker in_location = 0;
676*5e7646d2SAndroid Build Coastguard Worker in_log_location = 0;
677*5e7646d2SAndroid Build Coastguard Worker in_policy = 0;
678*5e7646d2SAndroid Build Coastguard Worker in_root_location = 0;
679*5e7646d2SAndroid Build Coastguard Worker linenum = 0;
680*5e7646d2SAndroid Build Coastguard Worker wrote_admin_location = 0;
681*5e7646d2SAndroid Build Coastguard Worker wrote_browsing = 0;
682*5e7646d2SAndroid Build Coastguard Worker wrote_conf_location = 0;
683*5e7646d2SAndroid Build Coastguard Worker wrote_log_location = 0;
684*5e7646d2SAndroid Build Coastguard Worker wrote_loglevel = 0;
685*5e7646d2SAndroid Build Coastguard Worker wrote_policy = 0;
686*5e7646d2SAndroid Build Coastguard Worker wrote_port_listen = 0;
687*5e7646d2SAndroid Build Coastguard Worker wrote_root_location = 0;
688*5e7646d2SAndroid Build Coastguard Worker indent = 0;
689*5e7646d2SAndroid Build Coastguard Worker
690*5e7646d2SAndroid Build Coastguard Worker if ((server_port_env = getenv("SERVER_PORT")) != NULL)
691*5e7646d2SAndroid Build Coastguard Worker {
692*5e7646d2SAndroid Build Coastguard Worker if ((server_port = atoi(server_port_env)) <= 0)
693*5e7646d2SAndroid Build Coastguard Worker server_port = ippPort();
694*5e7646d2SAndroid Build Coastguard Worker }
695*5e7646d2SAndroid Build Coastguard Worker else
696*5e7646d2SAndroid Build Coastguard Worker server_port = ippPort();
697*5e7646d2SAndroid Build Coastguard Worker
698*5e7646d2SAndroid Build Coastguard Worker if (server_port <= 0)
699*5e7646d2SAndroid Build Coastguard Worker server_port = IPP_PORT;
700*5e7646d2SAndroid Build Coastguard Worker
701*5e7646d2SAndroid Build Coastguard Worker while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum))
702*5e7646d2SAndroid Build Coastguard Worker {
703*5e7646d2SAndroid Build Coastguard Worker if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")) &&
704*5e7646d2SAndroid Build Coastguard Worker (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0))
705*5e7646d2SAndroid Build Coastguard Worker {
706*5e7646d2SAndroid Build Coastguard Worker if (!wrote_port_listen)
707*5e7646d2SAndroid Build Coastguard Worker {
708*5e7646d2SAndroid Build Coastguard Worker wrote_port_listen = 1;
709*5e7646d2SAndroid Build Coastguard Worker
710*5e7646d2SAndroid Build Coastguard Worker if (remote_admin > 0 || remote_any > 0 || share_printers > 0)
711*5e7646d2SAndroid Build Coastguard Worker {
712*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Allow remote access\n");
713*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "Port %d\n", server_port);
714*5e7646d2SAndroid Build Coastguard Worker }
715*5e7646d2SAndroid Build Coastguard Worker else
716*5e7646d2SAndroid Build Coastguard Worker {
717*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Only listen for connections from the local "
718*5e7646d2SAndroid Build Coastguard Worker "machine.\n");
719*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "Listen localhost:%d\n", server_port);
720*5e7646d2SAndroid Build Coastguard Worker }
721*5e7646d2SAndroid Build Coastguard Worker
722*5e7646d2SAndroid Build Coastguard Worker #ifdef CUPS_DEFAULT_DOMAINSOCKET
723*5e7646d2SAndroid Build Coastguard Worker if ((!value || strcmp(CUPS_DEFAULT_DOMAINSOCKET, value)) &&
724*5e7646d2SAndroid Build Coastguard Worker !access(CUPS_DEFAULT_DOMAINSOCKET, 0))
725*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "Listen " CUPS_DEFAULT_DOMAINSOCKET "\n");
726*5e7646d2SAndroid Build Coastguard Worker #endif /* CUPS_DEFAULT_DOMAINSOCKET */
727*5e7646d2SAndroid Build Coastguard Worker }
728*5e7646d2SAndroid Build Coastguard Worker else if (value && value[0] == '/'
729*5e7646d2SAndroid Build Coastguard Worker #ifdef CUPS_DEFAULT_DOMAINSOCKET
730*5e7646d2SAndroid Build Coastguard Worker && strcmp(CUPS_DEFAULT_DOMAINSOCKET, value)
731*5e7646d2SAndroid Build Coastguard Worker #endif /* CUPS_DEFAULT_DOMAINSOCKET */
732*5e7646d2SAndroid Build Coastguard Worker )
733*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "Listen %s\n", value);
734*5e7646d2SAndroid Build Coastguard Worker }
735*5e7646d2SAndroid Build Coastguard Worker else if ((!_cups_strcasecmp(line, "Browsing") ||
736*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "BrowseLocalProtocols")) &&
737*5e7646d2SAndroid Build Coastguard Worker share_printers >= 0)
738*5e7646d2SAndroid Build Coastguard Worker {
739*5e7646d2SAndroid Build Coastguard Worker if (!wrote_browsing)
740*5e7646d2SAndroid Build Coastguard Worker {
741*5e7646d2SAndroid Build Coastguard Worker wrote_browsing = 1;
742*5e7646d2SAndroid Build Coastguard Worker
743*5e7646d2SAndroid Build Coastguard Worker if (share_printers)
744*5e7646d2SAndroid Build Coastguard Worker {
745*5e7646d2SAndroid Build Coastguard Worker const char *localp = cupsGetOption("BrowseLocalProtocols",
746*5e7646d2SAndroid Build Coastguard Worker num_settings, settings);
747*5e7646d2SAndroid Build Coastguard Worker
748*5e7646d2SAndroid Build Coastguard Worker if (!localp || !localp[0])
749*5e7646d2SAndroid Build Coastguard Worker localp = cupsGetOption("BrowseLocalProtocols", cupsd_num_settings,
750*5e7646d2SAndroid Build Coastguard Worker cupsd_settings);
751*5e7646d2SAndroid Build Coastguard Worker
752*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Share local printers on the local network.\n");
753*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "Browsing On\n");
754*5e7646d2SAndroid Build Coastguard Worker
755*5e7646d2SAndroid Build Coastguard Worker if (!localp)
756*5e7646d2SAndroid Build Coastguard Worker localp = CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS;
757*5e7646d2SAndroid Build Coastguard Worker
758*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "BrowseLocalProtocols %s\n", localp);
759*5e7646d2SAndroid Build Coastguard Worker
760*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption("BrowseLocalProtocols", localp,
761*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings,
762*5e7646d2SAndroid Build Coastguard Worker &cupsd_settings);
763*5e7646d2SAndroid Build Coastguard Worker }
764*5e7646d2SAndroid Build Coastguard Worker else
765*5e7646d2SAndroid Build Coastguard Worker {
766*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Disable printer sharing.\n");
767*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "Browsing Off\n");
768*5e7646d2SAndroid Build Coastguard Worker }
769*5e7646d2SAndroid Build Coastguard Worker }
770*5e7646d2SAndroid Build Coastguard Worker }
771*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "LogLevel") && debug_logging >= 0)
772*5e7646d2SAndroid Build Coastguard Worker {
773*5e7646d2SAndroid Build Coastguard Worker wrote_loglevel = 1;
774*5e7646d2SAndroid Build Coastguard Worker
775*5e7646d2SAndroid Build Coastguard Worker if (debug_logging)
776*5e7646d2SAndroid Build Coastguard Worker {
777*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp,
778*5e7646d2SAndroid Build Coastguard Worker "# Show troubleshooting information in error_log.\n");
779*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "LogLevel debug\n");
780*5e7646d2SAndroid Build Coastguard Worker }
781*5e7646d2SAndroid Build Coastguard Worker else
782*5e7646d2SAndroid Build Coastguard Worker {
783*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Show general information in error_log.\n");
784*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n");
785*5e7646d2SAndroid Build Coastguard Worker }
786*5e7646d2SAndroid Build Coastguard Worker }
787*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Policy"))
788*5e7646d2SAndroid Build Coastguard Worker {
789*5e7646d2SAndroid Build Coastguard Worker in_default_policy = !_cups_strcasecmp(value, "default");
790*5e7646d2SAndroid Build Coastguard Worker in_policy = 1;
791*5e7646d2SAndroid Build Coastguard Worker
792*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%s %s>\n", line, value);
793*5e7646d2SAndroid Build Coastguard Worker indent += 2;
794*5e7646d2SAndroid Build Coastguard Worker }
795*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Policy>"))
796*5e7646d2SAndroid Build Coastguard Worker {
797*5e7646d2SAndroid Build Coastguard Worker indent -= 2;
798*5e7646d2SAndroid Build Coastguard Worker if (!wrote_policy && in_default_policy)
799*5e7646d2SAndroid Build Coastguard Worker {
800*5e7646d2SAndroid Build Coastguard Worker wrote_policy = 1;
801*5e7646d2SAndroid Build Coastguard Worker
802*5e7646d2SAndroid Build Coastguard Worker if (!user_cancel_any)
803*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Only the owner or an administrator can "
804*5e7646d2SAndroid Build Coastguard Worker "cancel a job...\n"
805*5e7646d2SAndroid Build Coastguard Worker " <Limit Cancel-Job>\n"
806*5e7646d2SAndroid Build Coastguard Worker " Order deny,allow\n"
807*5e7646d2SAndroid Build Coastguard Worker " Require user @OWNER "
808*5e7646d2SAndroid Build Coastguard Worker CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n"
809*5e7646d2SAndroid Build Coastguard Worker " </Limit>\n");
810*5e7646d2SAndroid Build Coastguard Worker }
811*5e7646d2SAndroid Build Coastguard Worker
812*5e7646d2SAndroid Build Coastguard Worker in_policy = 0;
813*5e7646d2SAndroid Build Coastguard Worker in_default_policy = 0;
814*5e7646d2SAndroid Build Coastguard Worker
815*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "</Policy>\n");
816*5e7646d2SAndroid Build Coastguard Worker }
817*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Location"))
818*5e7646d2SAndroid Build Coastguard Worker {
819*5e7646d2SAndroid Build Coastguard Worker in_location = 1;
820*5e7646d2SAndroid Build Coastguard Worker indent += 2;
821*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(value, "/admin"))
822*5e7646d2SAndroid Build Coastguard Worker in_admin_location = 1;
823*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "/admin/conf"))
824*5e7646d2SAndroid Build Coastguard Worker in_conf_location = 1;
825*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "/admin/log"))
826*5e7646d2SAndroid Build Coastguard Worker in_log_location = 1;
827*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(value, "/"))
828*5e7646d2SAndroid Build Coastguard Worker in_root_location = 1;
829*5e7646d2SAndroid Build Coastguard Worker
830*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%s %s>\n", line, value);
831*5e7646d2SAndroid Build Coastguard Worker }
832*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Location>"))
833*5e7646d2SAndroid Build Coastguard Worker {
834*5e7646d2SAndroid Build Coastguard Worker in_location = 0;
835*5e7646d2SAndroid Build Coastguard Worker indent -= 2;
836*5e7646d2SAndroid Build Coastguard Worker if (in_admin_location && remote_admin >= 0)
837*5e7646d2SAndroid Build Coastguard Worker {
838*5e7646d2SAndroid Build Coastguard Worker wrote_admin_location = 1;
839*5e7646d2SAndroid Build Coastguard Worker
840*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
841*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Allow remote administration...\n");
842*5e7646d2SAndroid Build Coastguard Worker else if (remote_admin == 0)
843*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Restrict access to the admin pages...\n");
844*5e7646d2SAndroid Build Coastguard Worker
845*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " Order allow,deny\n");
846*5e7646d2SAndroid Build Coastguard Worker
847*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
848*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n",
849*5e7646d2SAndroid Build Coastguard Worker remote_any > 0 ? "all" : "@LOCAL");
850*5e7646d2SAndroid Build Coastguard Worker }
851*5e7646d2SAndroid Build Coastguard Worker else if (in_conf_location && remote_admin >= 0)
852*5e7646d2SAndroid Build Coastguard Worker {
853*5e7646d2SAndroid Build Coastguard Worker wrote_conf_location = 1;
854*5e7646d2SAndroid Build Coastguard Worker
855*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
856*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Allow remote access to the configuration "
857*5e7646d2SAndroid Build Coastguard Worker "files...\n");
858*5e7646d2SAndroid Build Coastguard Worker else
859*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Restrict access to the configuration "
860*5e7646d2SAndroid Build Coastguard Worker "files...\n");
861*5e7646d2SAndroid Build Coastguard Worker
862*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " Order allow,deny\n");
863*5e7646d2SAndroid Build Coastguard Worker
864*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
865*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n",
866*5e7646d2SAndroid Build Coastguard Worker remote_any > 0 ? "all" : "@LOCAL");
867*5e7646d2SAndroid Build Coastguard Worker }
868*5e7646d2SAndroid Build Coastguard Worker else if (in_log_location && remote_admin >= 0)
869*5e7646d2SAndroid Build Coastguard Worker {
870*5e7646d2SAndroid Build Coastguard Worker wrote_log_location = 1;
871*5e7646d2SAndroid Build Coastguard Worker
872*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
873*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Allow remote access to the log "
874*5e7646d2SAndroid Build Coastguard Worker "files...\n");
875*5e7646d2SAndroid Build Coastguard Worker else
876*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Restrict access to the log "
877*5e7646d2SAndroid Build Coastguard Worker "files...\n");
878*5e7646d2SAndroid Build Coastguard Worker
879*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " Order allow,deny\n");
880*5e7646d2SAndroid Build Coastguard Worker
881*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
882*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n",
883*5e7646d2SAndroid Build Coastguard Worker remote_any > 0 ? "all" : "@LOCAL");
884*5e7646d2SAndroid Build Coastguard Worker }
885*5e7646d2SAndroid Build Coastguard Worker else if (in_root_location &&
886*5e7646d2SAndroid Build Coastguard Worker (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0))
887*5e7646d2SAndroid Build Coastguard Worker {
888*5e7646d2SAndroid Build Coastguard Worker wrote_root_location = 1;
889*5e7646d2SAndroid Build Coastguard Worker
890*5e7646d2SAndroid Build Coastguard Worker if (remote_admin > 0 && share_printers > 0)
891*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Allow shared printing and remote "
892*5e7646d2SAndroid Build Coastguard Worker "administration...\n");
893*5e7646d2SAndroid Build Coastguard Worker else if (remote_admin > 0)
894*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Allow remote administration...\n");
895*5e7646d2SAndroid Build Coastguard Worker else if (share_printers > 0)
896*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Allow shared printing...\n");
897*5e7646d2SAndroid Build Coastguard Worker else if (remote_any > 0)
898*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Allow remote access...\n");
899*5e7646d2SAndroid Build Coastguard Worker else
900*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Restrict access to the server...\n");
901*5e7646d2SAndroid Build Coastguard Worker
902*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " Order allow,deny\n");
903*5e7646d2SAndroid Build Coastguard Worker
904*5e7646d2SAndroid Build Coastguard Worker if (remote_admin > 0 || remote_any > 0 || share_printers > 0)
905*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n",
906*5e7646d2SAndroid Build Coastguard Worker remote_any > 0 ? "all" : "@LOCAL");
907*5e7646d2SAndroid Build Coastguard Worker }
908*5e7646d2SAndroid Build Coastguard Worker
909*5e7646d2SAndroid Build Coastguard Worker in_admin_location = 0;
910*5e7646d2SAndroid Build Coastguard Worker in_conf_location = 0;
911*5e7646d2SAndroid Build Coastguard Worker in_log_location = 0;
912*5e7646d2SAndroid Build Coastguard Worker in_root_location = 0;
913*5e7646d2SAndroid Build Coastguard Worker
914*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "</Location>\n");
915*5e7646d2SAndroid Build Coastguard Worker }
916*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "<Limit"))
917*5e7646d2SAndroid Build Coastguard Worker {
918*5e7646d2SAndroid Build Coastguard Worker if (in_default_policy)
919*5e7646d2SAndroid Build Coastguard Worker {
920*5e7646d2SAndroid Build Coastguard Worker /*
921*5e7646d2SAndroid Build Coastguard Worker * See if the policy limit is for the Cancel-Job operation...
922*5e7646d2SAndroid Build Coastguard Worker */
923*5e7646d2SAndroid Build Coastguard Worker
924*5e7646d2SAndroid Build Coastguard Worker char *valptr; /* Pointer into value */
925*5e7646d2SAndroid Build Coastguard Worker
926*5e7646d2SAndroid Build Coastguard Worker
927*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "cancel-job") && user_cancel_any >= 0)
928*5e7646d2SAndroid Build Coastguard Worker {
929*5e7646d2SAndroid Build Coastguard Worker /*
930*5e7646d2SAndroid Build Coastguard Worker * Don't write anything for this limit section...
931*5e7646d2SAndroid Build Coastguard Worker */
932*5e7646d2SAndroid Build Coastguard Worker
933*5e7646d2SAndroid Build Coastguard Worker in_cancel_job = 2;
934*5e7646d2SAndroid Build Coastguard Worker }
935*5e7646d2SAndroid Build Coastguard Worker else
936*5e7646d2SAndroid Build Coastguard Worker {
937*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%*s%s", indent, "", line);
938*5e7646d2SAndroid Build Coastguard Worker
939*5e7646d2SAndroid Build Coastguard Worker while (*value)
940*5e7646d2SAndroid Build Coastguard Worker {
941*5e7646d2SAndroid Build Coastguard Worker for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++);
942*5e7646d2SAndroid Build Coastguard Worker
943*5e7646d2SAndroid Build Coastguard Worker if (*valptr)
944*5e7646d2SAndroid Build Coastguard Worker *valptr++ = '\0';
945*5e7646d2SAndroid Build Coastguard Worker
946*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(value, "cancel-job") && user_cancel_any >= 0)
947*5e7646d2SAndroid Build Coastguard Worker {
948*5e7646d2SAndroid Build Coastguard Worker /*
949*5e7646d2SAndroid Build Coastguard Worker * Write everything except for this definition...
950*5e7646d2SAndroid Build Coastguard Worker */
951*5e7646d2SAndroid Build Coastguard Worker
952*5e7646d2SAndroid Build Coastguard Worker in_cancel_job = 1;
953*5e7646d2SAndroid Build Coastguard Worker }
954*5e7646d2SAndroid Build Coastguard Worker else
955*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " %s", value);
956*5e7646d2SAndroid Build Coastguard Worker
957*5e7646d2SAndroid Build Coastguard Worker for (value = valptr; _cups_isspace(*value); value ++);
958*5e7646d2SAndroid Build Coastguard Worker }
959*5e7646d2SAndroid Build Coastguard Worker
960*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, ">\n");
961*5e7646d2SAndroid Build Coastguard Worker }
962*5e7646d2SAndroid Build Coastguard Worker }
963*5e7646d2SAndroid Build Coastguard Worker else
964*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value);
965*5e7646d2SAndroid Build Coastguard Worker
966*5e7646d2SAndroid Build Coastguard Worker indent += 2;
967*5e7646d2SAndroid Build Coastguard Worker }
968*5e7646d2SAndroid Build Coastguard Worker else if (!_cups_strcasecmp(line, "</Limit>") && in_cancel_job)
969*5e7646d2SAndroid Build Coastguard Worker {
970*5e7646d2SAndroid Build Coastguard Worker indent -= 2;
971*5e7646d2SAndroid Build Coastguard Worker
972*5e7646d2SAndroid Build Coastguard Worker if (in_cancel_job == 1)
973*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " </Limit>\n");
974*5e7646d2SAndroid Build Coastguard Worker
975*5e7646d2SAndroid Build Coastguard Worker wrote_policy = 1;
976*5e7646d2SAndroid Build Coastguard Worker
977*5e7646d2SAndroid Build Coastguard Worker if (!user_cancel_any)
978*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Only the owner or an administrator can cancel "
979*5e7646d2SAndroid Build Coastguard Worker "a job...\n"
980*5e7646d2SAndroid Build Coastguard Worker " <Limit Cancel-Job>\n"
981*5e7646d2SAndroid Build Coastguard Worker " Order deny,allow\n"
982*5e7646d2SAndroid Build Coastguard Worker " Require user @OWNER "
983*5e7646d2SAndroid Build Coastguard Worker CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n"
984*5e7646d2SAndroid Build Coastguard Worker " </Limit>\n");
985*5e7646d2SAndroid Build Coastguard Worker
986*5e7646d2SAndroid Build Coastguard Worker in_cancel_job = 0;
987*5e7646d2SAndroid Build Coastguard Worker }
988*5e7646d2SAndroid Build Coastguard Worker else if ((((in_admin_location || in_conf_location || in_root_location || in_log_location) &&
989*5e7646d2SAndroid Build Coastguard Worker (remote_admin >= 0 || remote_any >= 0)) ||
990*5e7646d2SAndroid Build Coastguard Worker (in_root_location && share_printers >= 0)) &&
991*5e7646d2SAndroid Build Coastguard Worker (!_cups_strcasecmp(line, "Allow") || !_cups_strcasecmp(line, "Deny") ||
992*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(line, "Order")))
993*5e7646d2SAndroid Build Coastguard Worker continue;
994*5e7646d2SAndroid Build Coastguard Worker else if (in_cancel_job == 2)
995*5e7646d2SAndroid Build Coastguard Worker continue;
996*5e7646d2SAndroid Build Coastguard Worker else if (line[0] == '<')
997*5e7646d2SAndroid Build Coastguard Worker {
998*5e7646d2SAndroid Build Coastguard Worker if (value)
999*5e7646d2SAndroid Build Coastguard Worker {
1000*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value);
1001*5e7646d2SAndroid Build Coastguard Worker indent += 2;
1002*5e7646d2SAndroid Build Coastguard Worker }
1003*5e7646d2SAndroid Build Coastguard Worker else
1004*5e7646d2SAndroid Build Coastguard Worker {
1005*5e7646d2SAndroid Build Coastguard Worker if (line[1] == '/')
1006*5e7646d2SAndroid Build Coastguard Worker indent -= 2;
1007*5e7646d2SAndroid Build Coastguard Worker
1008*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%*s%s\n", indent, "", line);
1009*5e7646d2SAndroid Build Coastguard Worker }
1010*5e7646d2SAndroid Build Coastguard Worker }
1011*5e7646d2SAndroid Build Coastguard Worker else if (!in_policy && !in_location &&
1012*5e7646d2SAndroid Build Coastguard Worker (val = cupsGetOption(line, num_settings, settings)) != NULL)
1013*5e7646d2SAndroid Build Coastguard Worker {
1014*5e7646d2SAndroid Build Coastguard Worker /*
1015*5e7646d2SAndroid Build Coastguard Worker * Replace this directive's value with the new one...
1016*5e7646d2SAndroid Build Coastguard Worker */
1017*5e7646d2SAndroid Build Coastguard Worker
1018*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(line, val, cupsd_num_settings,
1019*5e7646d2SAndroid Build Coastguard Worker &cupsd_settings);
1020*5e7646d2SAndroid Build Coastguard Worker
1021*5e7646d2SAndroid Build Coastguard Worker /*
1022*5e7646d2SAndroid Build Coastguard Worker * Write the new value in its place, without indentation since we
1023*5e7646d2SAndroid Build Coastguard Worker * only support setting root directives, not in sections...
1024*5e7646d2SAndroid Build Coastguard Worker */
1025*5e7646d2SAndroid Build Coastguard Worker
1026*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%s %s\n", line, val);
1027*5e7646d2SAndroid Build Coastguard Worker }
1028*5e7646d2SAndroid Build Coastguard Worker else if (value)
1029*5e7646d2SAndroid Build Coastguard Worker {
1030*5e7646d2SAndroid Build Coastguard Worker if (!in_policy && !in_location)
1031*5e7646d2SAndroid Build Coastguard Worker {
1032*5e7646d2SAndroid Build Coastguard Worker /*
1033*5e7646d2SAndroid Build Coastguard Worker * Record the non-policy, non-location directives that we find
1034*5e7646d2SAndroid Build Coastguard Worker * in the server settings, since we cache this info and record it
1035*5e7646d2SAndroid Build Coastguard Worker * in cupsAdminGetServerSettings()...
1036*5e7646d2SAndroid Build Coastguard Worker */
1037*5e7646d2SAndroid Build Coastguard Worker
1038*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(line, value, cupsd_num_settings,
1039*5e7646d2SAndroid Build Coastguard Worker &cupsd_settings);
1040*5e7646d2SAndroid Build Coastguard Worker }
1041*5e7646d2SAndroid Build Coastguard Worker
1042*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%*s%s %s\n", indent, "", line, value);
1043*5e7646d2SAndroid Build Coastguard Worker }
1044*5e7646d2SAndroid Build Coastguard Worker else
1045*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%*s%s\n", indent, "", line);
1046*5e7646d2SAndroid Build Coastguard Worker }
1047*5e7646d2SAndroid Build Coastguard Worker
1048*5e7646d2SAndroid Build Coastguard Worker /*
1049*5e7646d2SAndroid Build Coastguard Worker * Write any missing info...
1050*5e7646d2SAndroid Build Coastguard Worker */
1051*5e7646d2SAndroid Build Coastguard Worker
1052*5e7646d2SAndroid Build Coastguard Worker if (!wrote_browsing && share_printers >= 0)
1053*5e7646d2SAndroid Build Coastguard Worker {
1054*5e7646d2SAndroid Build Coastguard Worker if (share_printers > 0)
1055*5e7646d2SAndroid Build Coastguard Worker {
1056*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Share local printers on the local network.\n");
1057*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "Browsing On\n");
1058*5e7646d2SAndroid Build Coastguard Worker }
1059*5e7646d2SAndroid Build Coastguard Worker else
1060*5e7646d2SAndroid Build Coastguard Worker {
1061*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Disable printer sharing and shared printers.\n");
1062*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "Browsing Off\n");
1063*5e7646d2SAndroid Build Coastguard Worker }
1064*5e7646d2SAndroid Build Coastguard Worker }
1065*5e7646d2SAndroid Build Coastguard Worker
1066*5e7646d2SAndroid Build Coastguard Worker if (!wrote_loglevel && debug_logging >= 0)
1067*5e7646d2SAndroid Build Coastguard Worker {
1068*5e7646d2SAndroid Build Coastguard Worker if (debug_logging)
1069*5e7646d2SAndroid Build Coastguard Worker {
1070*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Show troubleshooting information in error_log.\n");
1071*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "LogLevel debug\n");
1072*5e7646d2SAndroid Build Coastguard Worker }
1073*5e7646d2SAndroid Build Coastguard Worker else
1074*5e7646d2SAndroid Build Coastguard Worker {
1075*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Show general information in error_log.\n");
1076*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n");
1077*5e7646d2SAndroid Build Coastguard Worker }
1078*5e7646d2SAndroid Build Coastguard Worker }
1079*5e7646d2SAndroid Build Coastguard Worker
1080*5e7646d2SAndroid Build Coastguard Worker if (!wrote_port_listen &&
1081*5e7646d2SAndroid Build Coastguard Worker (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0))
1082*5e7646d2SAndroid Build Coastguard Worker {
1083*5e7646d2SAndroid Build Coastguard Worker if (remote_admin > 0 || remote_any > 0 || share_printers > 0)
1084*5e7646d2SAndroid Build Coastguard Worker {
1085*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Allow remote access\n");
1086*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "Port %d\n", ippPort());
1087*5e7646d2SAndroid Build Coastguard Worker }
1088*5e7646d2SAndroid Build Coastguard Worker else
1089*5e7646d2SAndroid Build Coastguard Worker {
1090*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp,
1091*5e7646d2SAndroid Build Coastguard Worker "# Only listen for connections from the local machine.\n");
1092*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "Listen localhost:%d\n", ippPort());
1093*5e7646d2SAndroid Build Coastguard Worker }
1094*5e7646d2SAndroid Build Coastguard Worker
1095*5e7646d2SAndroid Build Coastguard Worker #ifdef CUPS_DEFAULT_DOMAINSOCKET
1096*5e7646d2SAndroid Build Coastguard Worker if (!access(CUPS_DEFAULT_DOMAINSOCKET, 0))
1097*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "Listen " CUPS_DEFAULT_DOMAINSOCKET "\n");
1098*5e7646d2SAndroid Build Coastguard Worker #endif /* CUPS_DEFAULT_DOMAINSOCKET */
1099*5e7646d2SAndroid Build Coastguard Worker }
1100*5e7646d2SAndroid Build Coastguard Worker
1101*5e7646d2SAndroid Build Coastguard Worker if (!wrote_root_location &&
1102*5e7646d2SAndroid Build Coastguard Worker (remote_admin >= 0 || remote_any >= 0 || share_printers >= 0))
1103*5e7646d2SAndroid Build Coastguard Worker {
1104*5e7646d2SAndroid Build Coastguard Worker if (remote_admin > 0 && share_printers > 0)
1105*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp,
1106*5e7646d2SAndroid Build Coastguard Worker "# Allow shared printing and remote administration...\n");
1107*5e7646d2SAndroid Build Coastguard Worker else if (remote_admin > 0)
1108*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Allow remote administration...\n");
1109*5e7646d2SAndroid Build Coastguard Worker else if (share_printers > 0)
1110*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Allow shared printing...\n");
1111*5e7646d2SAndroid Build Coastguard Worker else if (remote_any > 0)
1112*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Allow remote access...\n");
1113*5e7646d2SAndroid Build Coastguard Worker else
1114*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Restrict access to the server...\n");
1115*5e7646d2SAndroid Build Coastguard Worker
1116*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "<Location />\n"
1117*5e7646d2SAndroid Build Coastguard Worker " Order allow,deny\n");
1118*5e7646d2SAndroid Build Coastguard Worker
1119*5e7646d2SAndroid Build Coastguard Worker if (remote_admin > 0 || remote_any > 0 || share_printers > 0)
1120*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
1121*5e7646d2SAndroid Build Coastguard Worker
1122*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "</Location>\n");
1123*5e7646d2SAndroid Build Coastguard Worker }
1124*5e7646d2SAndroid Build Coastguard Worker
1125*5e7646d2SAndroid Build Coastguard Worker if (!wrote_admin_location && remote_admin >= 0)
1126*5e7646d2SAndroid Build Coastguard Worker {
1127*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
1128*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Allow remote administration...\n");
1129*5e7646d2SAndroid Build Coastguard Worker else
1130*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Restrict access to the admin pages...\n");
1131*5e7646d2SAndroid Build Coastguard Worker
1132*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "<Location /admin>\n"
1133*5e7646d2SAndroid Build Coastguard Worker " Order allow,deny\n");
1134*5e7646d2SAndroid Build Coastguard Worker
1135*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
1136*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
1137*5e7646d2SAndroid Build Coastguard Worker
1138*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "</Location>\n");
1139*5e7646d2SAndroid Build Coastguard Worker }
1140*5e7646d2SAndroid Build Coastguard Worker
1141*5e7646d2SAndroid Build Coastguard Worker if (!wrote_conf_location && remote_admin >= 0)
1142*5e7646d2SAndroid Build Coastguard Worker {
1143*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
1144*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp,
1145*5e7646d2SAndroid Build Coastguard Worker "# Allow remote access to the configuration files...\n");
1146*5e7646d2SAndroid Build Coastguard Worker else
1147*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Restrict access to the configuration files...\n");
1148*5e7646d2SAndroid Build Coastguard Worker
1149*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "<Location /admin/conf>\n"
1150*5e7646d2SAndroid Build Coastguard Worker " AuthType Default\n"
1151*5e7646d2SAndroid Build Coastguard Worker " Require user @SYSTEM\n"
1152*5e7646d2SAndroid Build Coastguard Worker " Order allow,deny\n");
1153*5e7646d2SAndroid Build Coastguard Worker
1154*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
1155*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
1156*5e7646d2SAndroid Build Coastguard Worker
1157*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "</Location>\n");
1158*5e7646d2SAndroid Build Coastguard Worker }
1159*5e7646d2SAndroid Build Coastguard Worker
1160*5e7646d2SAndroid Build Coastguard Worker if (!wrote_log_location && remote_admin >= 0)
1161*5e7646d2SAndroid Build Coastguard Worker {
1162*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
1163*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp,
1164*5e7646d2SAndroid Build Coastguard Worker "# Allow remote access to the log files...\n");
1165*5e7646d2SAndroid Build Coastguard Worker else
1166*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "# Restrict access to the log files...\n");
1167*5e7646d2SAndroid Build Coastguard Worker
1168*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "<Location /admin/log>\n"
1169*5e7646d2SAndroid Build Coastguard Worker " AuthType Default\n"
1170*5e7646d2SAndroid Build Coastguard Worker " Require user @SYSTEM\n"
1171*5e7646d2SAndroid Build Coastguard Worker " Order allow,deny\n");
1172*5e7646d2SAndroid Build Coastguard Worker
1173*5e7646d2SAndroid Build Coastguard Worker if (remote_admin)
1174*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL");
1175*5e7646d2SAndroid Build Coastguard Worker
1176*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "</Location>\n");
1177*5e7646d2SAndroid Build Coastguard Worker }
1178*5e7646d2SAndroid Build Coastguard Worker
1179*5e7646d2SAndroid Build Coastguard Worker if (!wrote_policy && user_cancel_any >= 0)
1180*5e7646d2SAndroid Build Coastguard Worker {
1181*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, "<Policy default>\n"
1182*5e7646d2SAndroid Build Coastguard Worker " # Job-related operations must be done by the owner "
1183*5e7646d2SAndroid Build Coastguard Worker "or an administrator...\n"
1184*5e7646d2SAndroid Build Coastguard Worker " <Limit Send-Document Send-URI Hold-Job Release-Job "
1185*5e7646d2SAndroid Build Coastguard Worker "Restart-Job Purge-Jobs Set-Job-Attributes "
1186*5e7646d2SAndroid Build Coastguard Worker "Create-Job-Subscription Renew-Subscription "
1187*5e7646d2SAndroid Build Coastguard Worker "Cancel-Subscription Get-Notifications Reprocess-Job "
1188*5e7646d2SAndroid Build Coastguard Worker "Cancel-Current-Job Suspend-Current-Job Resume-Job "
1189*5e7646d2SAndroid Build Coastguard Worker "CUPS-Move-Job>\n"
1190*5e7646d2SAndroid Build Coastguard Worker " Require user @OWNER @SYSTEM\n"
1191*5e7646d2SAndroid Build Coastguard Worker " Order deny,allow\n"
1192*5e7646d2SAndroid Build Coastguard Worker " </Limit>\n"
1193*5e7646d2SAndroid Build Coastguard Worker " # All administration operations require an "
1194*5e7646d2SAndroid Build Coastguard Worker "administrator to authenticate...\n"
1195*5e7646d2SAndroid Build Coastguard Worker " <Limit Pause-Printer Resume-Printer "
1196*5e7646d2SAndroid Build Coastguard Worker "Set-Printer-Attributes Enable-Printer "
1197*5e7646d2SAndroid Build Coastguard Worker "Disable-Printer Pause-Printer-After-Current-Job "
1198*5e7646d2SAndroid Build Coastguard Worker "Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer "
1199*5e7646d2SAndroid Build Coastguard Worker "Activate-Printer Restart-Printer Shutdown-Printer "
1200*5e7646d2SAndroid Build Coastguard Worker "Startup-Printer Promote-Job Schedule-Job-After "
1201*5e7646d2SAndroid Build Coastguard Worker "CUPS-Add-Printer CUPS-Delete-Printer "
1202*5e7646d2SAndroid Build Coastguard Worker "CUPS-Add-Class CUPS-Delete-Class "
1203*5e7646d2SAndroid Build Coastguard Worker "CUPS-Accept-Jobs CUPS-Reject-Jobs "
1204*5e7646d2SAndroid Build Coastguard Worker "CUPS-Set-Default CUPS-Add-Device CUPS-Delete-Device>\n"
1205*5e7646d2SAndroid Build Coastguard Worker " AuthType Default\n"
1206*5e7646d2SAndroid Build Coastguard Worker " Require user @SYSTEM\n"
1207*5e7646d2SAndroid Build Coastguard Worker " Order deny,allow\n"
1208*5e7646d2SAndroid Build Coastguard Worker "</Limit>\n");
1209*5e7646d2SAndroid Build Coastguard Worker
1210*5e7646d2SAndroid Build Coastguard Worker if (!user_cancel_any)
1211*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " # Only the owner or an administrator can cancel "
1212*5e7646d2SAndroid Build Coastguard Worker "a job...\n"
1213*5e7646d2SAndroid Build Coastguard Worker " <Limit Cancel-Job>\n"
1214*5e7646d2SAndroid Build Coastguard Worker " Order deny,allow\n"
1215*5e7646d2SAndroid Build Coastguard Worker " Require user @OWNER "
1216*5e7646d2SAndroid Build Coastguard Worker CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n"
1217*5e7646d2SAndroid Build Coastguard Worker " </Limit>\n");
1218*5e7646d2SAndroid Build Coastguard Worker
1219*5e7646d2SAndroid Build Coastguard Worker cupsFilePuts(temp, " <Limit All>\n"
1220*5e7646d2SAndroid Build Coastguard Worker " Order deny,allow\n"
1221*5e7646d2SAndroid Build Coastguard Worker " </Limit>\n"
1222*5e7646d2SAndroid Build Coastguard Worker "</Policy>\n");
1223*5e7646d2SAndroid Build Coastguard Worker }
1224*5e7646d2SAndroid Build Coastguard Worker
1225*5e7646d2SAndroid Build Coastguard Worker for (i = num_settings, setting = settings; i > 0; i --, setting ++)
1226*5e7646d2SAndroid Build Coastguard Worker if (setting->name[0] != '_' &&
1227*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(setting->name, "Listen") &&
1228*5e7646d2SAndroid Build Coastguard Worker _cups_strcasecmp(setting->name, "Port") &&
1229*5e7646d2SAndroid Build Coastguard Worker !cupsGetOption(setting->name, cupsd_num_settings, cupsd_settings))
1230*5e7646d2SAndroid Build Coastguard Worker {
1231*5e7646d2SAndroid Build Coastguard Worker /*
1232*5e7646d2SAndroid Build Coastguard Worker * Add this directive to the list of directives we have written...
1233*5e7646d2SAndroid Build Coastguard Worker */
1234*5e7646d2SAndroid Build Coastguard Worker
1235*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(setting->name, setting->value,
1236*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1237*5e7646d2SAndroid Build Coastguard Worker
1238*5e7646d2SAndroid Build Coastguard Worker /*
1239*5e7646d2SAndroid Build Coastguard Worker * Write the new value, without indentation since we only support
1240*5e7646d2SAndroid Build Coastguard Worker * setting root directives, not in sections...
1241*5e7646d2SAndroid Build Coastguard Worker */
1242*5e7646d2SAndroid Build Coastguard Worker
1243*5e7646d2SAndroid Build Coastguard Worker cupsFilePrintf(temp, "%s %s\n", setting->name, setting->value);
1244*5e7646d2SAndroid Build Coastguard Worker }
1245*5e7646d2SAndroid Build Coastguard Worker
1246*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(cupsd);
1247*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(temp);
1248*5e7646d2SAndroid Build Coastguard Worker
1249*5e7646d2SAndroid Build Coastguard Worker /*
1250*5e7646d2SAndroid Build Coastguard Worker * Upload the configuration file to the server...
1251*5e7646d2SAndroid Build Coastguard Worker */
1252*5e7646d2SAndroid Build Coastguard Worker
1253*5e7646d2SAndroid Build Coastguard Worker status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile);
1254*5e7646d2SAndroid Build Coastguard Worker
1255*5e7646d2SAndroid Build Coastguard Worker if (status == HTTP_STATUS_CREATED)
1256*5e7646d2SAndroid Build Coastguard Worker {
1257*5e7646d2SAndroid Build Coastguard Worker /*
1258*5e7646d2SAndroid Build Coastguard Worker * Updated OK, add the basic settings...
1259*5e7646d2SAndroid Build Coastguard Worker */
1260*5e7646d2SAndroid Build Coastguard Worker
1261*5e7646d2SAndroid Build Coastguard Worker if (debug_logging >= 0)
1262*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING,
1263*5e7646d2SAndroid Build Coastguard Worker debug_logging ? "1" : "0",
1264*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1265*5e7646d2SAndroid Build Coastguard Worker else
1266*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING,
1267*5e7646d2SAndroid Build Coastguard Worker old_debug_logging ? "1" : "0",
1268*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1269*5e7646d2SAndroid Build Coastguard Worker
1270*5e7646d2SAndroid Build Coastguard Worker if (remote_admin >= 0)
1271*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN,
1272*5e7646d2SAndroid Build Coastguard Worker remote_admin ? "1" : "0",
1273*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1274*5e7646d2SAndroid Build Coastguard Worker else
1275*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN,
1276*5e7646d2SAndroid Build Coastguard Worker old_remote_admin ? "1" : "0",
1277*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1278*5e7646d2SAndroid Build Coastguard Worker
1279*5e7646d2SAndroid Build Coastguard Worker if (remote_any >= 0)
1280*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY,
1281*5e7646d2SAndroid Build Coastguard Worker remote_any ? "1" : "0",
1282*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1283*5e7646d2SAndroid Build Coastguard Worker else
1284*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY,
1285*5e7646d2SAndroid Build Coastguard Worker old_remote_any ? "1" : "0",
1286*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1287*5e7646d2SAndroid Build Coastguard Worker
1288*5e7646d2SAndroid Build Coastguard Worker if (share_printers >= 0)
1289*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS,
1290*5e7646d2SAndroid Build Coastguard Worker share_printers ? "1" : "0",
1291*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1292*5e7646d2SAndroid Build Coastguard Worker else
1293*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS,
1294*5e7646d2SAndroid Build Coastguard Worker old_share_printers ? "1" : "0",
1295*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1296*5e7646d2SAndroid Build Coastguard Worker
1297*5e7646d2SAndroid Build Coastguard Worker if (user_cancel_any >= 0)
1298*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY,
1299*5e7646d2SAndroid Build Coastguard Worker user_cancel_any ? "1" : "0",
1300*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1301*5e7646d2SAndroid Build Coastguard Worker else
1302*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY,
1303*5e7646d2SAndroid Build Coastguard Worker old_user_cancel_any ? "1" : "0",
1304*5e7646d2SAndroid Build Coastguard Worker cupsd_num_settings, &cupsd_settings);
1305*5e7646d2SAndroid Build Coastguard Worker
1306*5e7646d2SAndroid Build Coastguard Worker /*
1307*5e7646d2SAndroid Build Coastguard Worker * Save the new values...
1308*5e7646d2SAndroid Build Coastguard Worker */
1309*5e7646d2SAndroid Build Coastguard Worker
1310*5e7646d2SAndroid Build Coastguard Worker invalidate_cupsd_cache(cg);
1311*5e7646d2SAndroid Build Coastguard Worker
1312*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = cupsd_num_settings;
1313*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_settings = cupsd_settings;
1314*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_update = time(NULL);
1315*5e7646d2SAndroid Build Coastguard Worker
1316*5e7646d2SAndroid Build Coastguard Worker httpGetHostname(http, cg->cupsd_hostname, sizeof(cg->cupsd_hostname));
1317*5e7646d2SAndroid Build Coastguard Worker }
1318*5e7646d2SAndroid Build Coastguard Worker else
1319*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(cupsd_num_settings, cupsd_settings);
1320*5e7646d2SAndroid Build Coastguard Worker
1321*5e7646d2SAndroid Build Coastguard Worker /*
1322*5e7646d2SAndroid Build Coastguard Worker * Remote our temp files and return...
1323*5e7646d2SAndroid Build Coastguard Worker */
1324*5e7646d2SAndroid Build Coastguard Worker
1325*5e7646d2SAndroid Build Coastguard Worker if (remote)
1326*5e7646d2SAndroid Build Coastguard Worker unlink(cupsdconf);
1327*5e7646d2SAndroid Build Coastguard Worker
1328*5e7646d2SAndroid Build Coastguard Worker unlink(tempfile);
1329*5e7646d2SAndroid Build Coastguard Worker
1330*5e7646d2SAndroid Build Coastguard Worker return (status == HTTP_STATUS_CREATED);
1331*5e7646d2SAndroid Build Coastguard Worker }
1332*5e7646d2SAndroid Build Coastguard Worker
1333*5e7646d2SAndroid Build Coastguard Worker
1334*5e7646d2SAndroid Build Coastguard Worker /*
1335*5e7646d2SAndroid Build Coastguard Worker * 'get_cupsd_conf()' - Get the current cupsd.conf file.
1336*5e7646d2SAndroid Build Coastguard Worker */
1337*5e7646d2SAndroid Build Coastguard Worker
1338*5e7646d2SAndroid Build Coastguard Worker static http_status_t /* O - Status of request */
get_cupsd_conf(http_t * http,_cups_globals_t * cg,time_t last_update,char * name,size_t namesize,int * remote)1339*5e7646d2SAndroid Build Coastguard Worker get_cupsd_conf(
1340*5e7646d2SAndroid Build Coastguard Worker http_t *http, /* I - Connection to server */
1341*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg, /* I - Global data */
1342*5e7646d2SAndroid Build Coastguard Worker time_t last_update, /* I - Last update time for file */
1343*5e7646d2SAndroid Build Coastguard Worker char *name, /* I - Filename buffer */
1344*5e7646d2SAndroid Build Coastguard Worker size_t namesize, /* I - Size of filename buffer */
1345*5e7646d2SAndroid Build Coastguard Worker int *remote) /* O - Remote file? */
1346*5e7646d2SAndroid Build Coastguard Worker {
1347*5e7646d2SAndroid Build Coastguard Worker int fd; /* Temporary file descriptor */
1348*5e7646d2SAndroid Build Coastguard Worker #ifndef _WIN32
1349*5e7646d2SAndroid Build Coastguard Worker struct stat info; /* cupsd.conf file information */
1350*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
1351*5e7646d2SAndroid Build Coastguard Worker http_status_t status; /* Status of getting cupsd.conf */
1352*5e7646d2SAndroid Build Coastguard Worker char host[HTTP_MAX_HOST]; /* Hostname for connection */
1353*5e7646d2SAndroid Build Coastguard Worker
1354*5e7646d2SAndroid Build Coastguard Worker
1355*5e7646d2SAndroid Build Coastguard Worker /*
1356*5e7646d2SAndroid Build Coastguard Worker * See if we already have the data we need...
1357*5e7646d2SAndroid Build Coastguard Worker */
1358*5e7646d2SAndroid Build Coastguard Worker
1359*5e7646d2SAndroid Build Coastguard Worker httpGetHostname(http, host, sizeof(host));
1360*5e7646d2SAndroid Build Coastguard Worker
1361*5e7646d2SAndroid Build Coastguard Worker if (_cups_strcasecmp(cg->cupsd_hostname, host))
1362*5e7646d2SAndroid Build Coastguard Worker invalidate_cupsd_cache(cg);
1363*5e7646d2SAndroid Build Coastguard Worker
1364*5e7646d2SAndroid Build Coastguard Worker snprintf(name, namesize, "%s/cupsd.conf", cg->cups_serverroot);
1365*5e7646d2SAndroid Build Coastguard Worker *remote = 0;
1366*5e7646d2SAndroid Build Coastguard Worker
1367*5e7646d2SAndroid Build Coastguard Worker #ifndef _WIN32
1368*5e7646d2SAndroid Build Coastguard Worker if (!_cups_strcasecmp(host, "localhost") && !access(name, R_OK))
1369*5e7646d2SAndroid Build Coastguard Worker {
1370*5e7646d2SAndroid Build Coastguard Worker /*
1371*5e7646d2SAndroid Build Coastguard Worker * Read the local file rather than using HTTP...
1372*5e7646d2SAndroid Build Coastguard Worker */
1373*5e7646d2SAndroid Build Coastguard Worker
1374*5e7646d2SAndroid Build Coastguard Worker if (stat(name, &info))
1375*5e7646d2SAndroid Build Coastguard Worker {
1376*5e7646d2SAndroid Build Coastguard Worker char message[1024]; /* Message string */
1377*5e7646d2SAndroid Build Coastguard Worker
1378*5e7646d2SAndroid Build Coastguard Worker
1379*5e7646d2SAndroid Build Coastguard Worker snprintf(message, sizeof(message),
1380*5e7646d2SAndroid Build Coastguard Worker _cupsLangString(cupsLangDefault(), _("stat of %s failed: %s")),
1381*5e7646d2SAndroid Build Coastguard Worker name, strerror(errno));
1382*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, message, 0);
1383*5e7646d2SAndroid Build Coastguard Worker
1384*5e7646d2SAndroid Build Coastguard Worker *name = '\0';
1385*5e7646d2SAndroid Build Coastguard Worker
1386*5e7646d2SAndroid Build Coastguard Worker return (HTTP_STATUS_SERVER_ERROR);
1387*5e7646d2SAndroid Build Coastguard Worker }
1388*5e7646d2SAndroid Build Coastguard Worker else if (last_update && info.st_mtime <= last_update)
1389*5e7646d2SAndroid Build Coastguard Worker status = HTTP_STATUS_NOT_MODIFIED;
1390*5e7646d2SAndroid Build Coastguard Worker else
1391*5e7646d2SAndroid Build Coastguard Worker status = HTTP_STATUS_OK;
1392*5e7646d2SAndroid Build Coastguard Worker }
1393*5e7646d2SAndroid Build Coastguard Worker else
1394*5e7646d2SAndroid Build Coastguard Worker #endif /* !_WIN32 */
1395*5e7646d2SAndroid Build Coastguard Worker {
1396*5e7646d2SAndroid Build Coastguard Worker /*
1397*5e7646d2SAndroid Build Coastguard Worker * Read cupsd.conf via a HTTP GET request...
1398*5e7646d2SAndroid Build Coastguard Worker */
1399*5e7646d2SAndroid Build Coastguard Worker
1400*5e7646d2SAndroid Build Coastguard Worker if ((fd = cupsTempFd(name, (int)namesize)) < 0)
1401*5e7646d2SAndroid Build Coastguard Worker {
1402*5e7646d2SAndroid Build Coastguard Worker *name = '\0';
1403*5e7646d2SAndroid Build Coastguard Worker
1404*5e7646d2SAndroid Build Coastguard Worker _cupsSetError(IPP_STATUS_ERROR_INTERNAL, NULL, 0);
1405*5e7646d2SAndroid Build Coastguard Worker
1406*5e7646d2SAndroid Build Coastguard Worker invalidate_cupsd_cache(cg);
1407*5e7646d2SAndroid Build Coastguard Worker
1408*5e7646d2SAndroid Build Coastguard Worker return (HTTP_STATUS_SERVER_ERROR);
1409*5e7646d2SAndroid Build Coastguard Worker }
1410*5e7646d2SAndroid Build Coastguard Worker
1411*5e7646d2SAndroid Build Coastguard Worker *remote = 1;
1412*5e7646d2SAndroid Build Coastguard Worker
1413*5e7646d2SAndroid Build Coastguard Worker httpClearFields(http);
1414*5e7646d2SAndroid Build Coastguard Worker
1415*5e7646d2SAndroid Build Coastguard Worker if (last_update)
1416*5e7646d2SAndroid Build Coastguard Worker httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE,
1417*5e7646d2SAndroid Build Coastguard Worker httpGetDateString(last_update));
1418*5e7646d2SAndroid Build Coastguard Worker
1419*5e7646d2SAndroid Build Coastguard Worker status = cupsGetFd(http, "/admin/conf/cupsd.conf", fd);
1420*5e7646d2SAndroid Build Coastguard Worker
1421*5e7646d2SAndroid Build Coastguard Worker close(fd);
1422*5e7646d2SAndroid Build Coastguard Worker
1423*5e7646d2SAndroid Build Coastguard Worker if (status != HTTP_STATUS_OK)
1424*5e7646d2SAndroid Build Coastguard Worker {
1425*5e7646d2SAndroid Build Coastguard Worker unlink(name);
1426*5e7646d2SAndroid Build Coastguard Worker *name = '\0';
1427*5e7646d2SAndroid Build Coastguard Worker }
1428*5e7646d2SAndroid Build Coastguard Worker }
1429*5e7646d2SAndroid Build Coastguard Worker
1430*5e7646d2SAndroid Build Coastguard Worker return (status);
1431*5e7646d2SAndroid Build Coastguard Worker }
1432*5e7646d2SAndroid Build Coastguard Worker
1433*5e7646d2SAndroid Build Coastguard Worker
1434*5e7646d2SAndroid Build Coastguard Worker /*
1435*5e7646d2SAndroid Build Coastguard Worker * 'invalidate_cupsd_cache()' - Invalidate the cached cupsd.conf settings.
1436*5e7646d2SAndroid Build Coastguard Worker */
1437*5e7646d2SAndroid Build Coastguard Worker
1438*5e7646d2SAndroid Build Coastguard Worker static void
invalidate_cupsd_cache(_cups_globals_t * cg)1439*5e7646d2SAndroid Build Coastguard Worker invalidate_cupsd_cache(
1440*5e7646d2SAndroid Build Coastguard Worker _cups_globals_t *cg) /* I - Global data */
1441*5e7646d2SAndroid Build Coastguard Worker {
1442*5e7646d2SAndroid Build Coastguard Worker cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings);
1443*5e7646d2SAndroid Build Coastguard Worker
1444*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_hostname[0] = '\0';
1445*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_update = 0;
1446*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_num_settings = 0;
1447*5e7646d2SAndroid Build Coastguard Worker cg->cupsd_settings = NULL;
1448*5e7646d2SAndroid Build Coastguard Worker }
1449