xref: /aosp_15_r20/external/libcups/cups/adminutil.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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