xref: /aosp_15_r20/external/libcups/scheduler/conf.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Configuration routines for the CUPS scheduler.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 2007-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
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 "cupsd.h"
16*5e7646d2SAndroid Build Coastguard Worker #include <stdarg.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <grp.h>
18*5e7646d2SAndroid Build Coastguard Worker #include <sys/utsname.h>
19*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ASL_H
20*5e7646d2SAndroid Build Coastguard Worker #  include <asl.h>
21*5e7646d2SAndroid Build Coastguard Worker #elif defined(HAVE_SYSTEMD_SD_JOURNAL_H)
22*5e7646d2SAndroid Build Coastguard Worker #  define SD_JOURNAL_SUPPRESS_LOCATION
23*5e7646d2SAndroid Build Coastguard Worker #  include <systemd/sd-journal.h>
24*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ASL_H */
25*5e7646d2SAndroid Build Coastguard Worker #include <syslog.h>
26*5e7646d2SAndroid Build Coastguard Worker 
27*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_LIBPAPER
28*5e7646d2SAndroid Build Coastguard Worker #  include <paper.h>
29*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_LIBPAPER */
30*5e7646d2SAndroid Build Coastguard Worker 
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker /*
33*5e7646d2SAndroid Build Coastguard Worker  * Possibly missing network definitions...
34*5e7646d2SAndroid Build Coastguard Worker  */
35*5e7646d2SAndroid Build Coastguard Worker 
36*5e7646d2SAndroid Build Coastguard Worker #ifndef INADDR_NONE
37*5e7646d2SAndroid Build Coastguard Worker #  define INADDR_NONE	0xffffffff
38*5e7646d2SAndroid Build Coastguard Worker #endif /* !INADDR_NONE */
39*5e7646d2SAndroid Build Coastguard Worker 
40*5e7646d2SAndroid Build Coastguard Worker 
41*5e7646d2SAndroid Build Coastguard Worker /*
42*5e7646d2SAndroid Build Coastguard Worker  * Configuration variable structure...
43*5e7646d2SAndroid Build Coastguard Worker  */
44*5e7646d2SAndroid Build Coastguard Worker 
45*5e7646d2SAndroid Build Coastguard Worker typedef enum
46*5e7646d2SAndroid Build Coastguard Worker {
47*5e7646d2SAndroid Build Coastguard Worker   CUPSD_VARTYPE_INTEGER,		/* Integer option */
48*5e7646d2SAndroid Build Coastguard Worker   CUPSD_VARTYPE_TIME,			/* Time interval option */
49*5e7646d2SAndroid Build Coastguard Worker   CUPSD_VARTYPE_STRING,			/* String option */
50*5e7646d2SAndroid Build Coastguard Worker   CUPSD_VARTYPE_BOOLEAN,		/* Boolean option */
51*5e7646d2SAndroid Build Coastguard Worker   CUPSD_VARTYPE_PATHNAME,		/* File/directory name option */
52*5e7646d2SAndroid Build Coastguard Worker   CUPSD_VARTYPE_PERM			/* File/directory permissions */
53*5e7646d2SAndroid Build Coastguard Worker } cupsd_vartype_t;
54*5e7646d2SAndroid Build Coastguard Worker 
55*5e7646d2SAndroid Build Coastguard Worker typedef struct
56*5e7646d2SAndroid Build Coastguard Worker {
57*5e7646d2SAndroid Build Coastguard Worker   const char		*name;		/* Name of variable */
58*5e7646d2SAndroid Build Coastguard Worker   void			*ptr;		/* Pointer to variable */
59*5e7646d2SAndroid Build Coastguard Worker   cupsd_vartype_t	type;		/* Type (int, string, address) */
60*5e7646d2SAndroid Build Coastguard Worker } cupsd_var_t;
61*5e7646d2SAndroid Build Coastguard Worker 
62*5e7646d2SAndroid Build Coastguard Worker 
63*5e7646d2SAndroid Build Coastguard Worker /*
64*5e7646d2SAndroid Build Coastguard Worker  * Local globals...
65*5e7646d2SAndroid Build Coastguard Worker  */
66*5e7646d2SAndroid Build Coastguard Worker 
67*5e7646d2SAndroid Build Coastguard Worker static const cupsd_var_t	cupsd_vars[] =
68*5e7646d2SAndroid Build Coastguard Worker {
69*5e7646d2SAndroid Build Coastguard Worker   { "AutoPurgeJobs", 		&JobAutoPurge,		CUPSD_VARTYPE_BOOLEAN },
70*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
71*5e7646d2SAndroid Build Coastguard Worker   { "BrowseDNSSDSubTypes",	&DNSSDSubTypes,		CUPSD_VARTYPE_STRING },
72*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_DNSSD || HAVE_AVAHI */
73*5e7646d2SAndroid Build Coastguard Worker   { "BrowseWebIF",		&BrowseWebIF,		CUPSD_VARTYPE_BOOLEAN },
74*5e7646d2SAndroid Build Coastguard Worker   { "Browsing",			&Browsing,		CUPSD_VARTYPE_BOOLEAN },
75*5e7646d2SAndroid Build Coastguard Worker   { "Classification",		&Classification,	CUPSD_VARTYPE_STRING },
76*5e7646d2SAndroid Build Coastguard Worker   { "ClassifyOverride",		&ClassifyOverride,	CUPSD_VARTYPE_BOOLEAN },
77*5e7646d2SAndroid Build Coastguard Worker   { "DefaultLanguage",		&DefaultLanguage,	CUPSD_VARTYPE_STRING },
78*5e7646d2SAndroid Build Coastguard Worker   { "DefaultLeaseDuration",	&DefaultLeaseDuration,	CUPSD_VARTYPE_TIME },
79*5e7646d2SAndroid Build Coastguard Worker   { "DefaultPaperSize",		&DefaultPaperSize,	CUPSD_VARTYPE_STRING },
80*5e7646d2SAndroid Build Coastguard Worker   { "DefaultPolicy",		&DefaultPolicy,		CUPSD_VARTYPE_STRING },
81*5e7646d2SAndroid Build Coastguard Worker   { "DefaultShared",		&DefaultShared,		CUPSD_VARTYPE_BOOLEAN },
82*5e7646d2SAndroid Build Coastguard Worker   { "DirtyCleanInterval",	&DirtyCleanInterval,	CUPSD_VARTYPE_TIME },
83*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
84*5e7646d2SAndroid Build Coastguard Worker   { "DNSSDHostName",		&DNSSDHostName,		CUPSD_VARTYPE_STRING },
85*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_DNSSD || HAVE_AVAHI */
86*5e7646d2SAndroid Build Coastguard Worker   { "ErrorPolicy",		&ErrorPolicy,		CUPSD_VARTYPE_STRING },
87*5e7646d2SAndroid Build Coastguard Worker   { "FilterLimit",		&FilterLimit,		CUPSD_VARTYPE_INTEGER },
88*5e7646d2SAndroid Build Coastguard Worker   { "FilterNice",		&FilterNice,		CUPSD_VARTYPE_INTEGER },
89*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
90*5e7646d2SAndroid Build Coastguard Worker   { "GSSServiceName",		&GSSServiceName,	CUPSD_VARTYPE_STRING },
91*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
92*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ONDEMAND
93*5e7646d2SAndroid Build Coastguard Worker   { "IdleExitTimeout",		&IdleExitTimeout,	CUPSD_VARTYPE_TIME },
94*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ONDEMAND */
95*5e7646d2SAndroid Build Coastguard Worker   { "JobKillDelay",		&JobKillDelay,		CUPSD_VARTYPE_TIME },
96*5e7646d2SAndroid Build Coastguard Worker   { "JobRetryLimit",		&JobRetryLimit,		CUPSD_VARTYPE_INTEGER },
97*5e7646d2SAndroid Build Coastguard Worker   { "JobRetryInterval",		&JobRetryInterval,	CUPSD_VARTYPE_TIME },
98*5e7646d2SAndroid Build Coastguard Worker   { "KeepAlive",		&KeepAlive,		CUPSD_VARTYPE_BOOLEAN },
99*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_LAUNCHD
100*5e7646d2SAndroid Build Coastguard Worker   { "LaunchdTimeout",		&IdleExitTimeout,	CUPSD_VARTYPE_TIME },
101*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_LAUNCHD */
102*5e7646d2SAndroid Build Coastguard Worker   { "LimitRequestBody",		&MaxRequestSize,	CUPSD_VARTYPE_INTEGER },
103*5e7646d2SAndroid Build Coastguard Worker   { "ListenBackLog",		&ListenBackLog,		CUPSD_VARTYPE_INTEGER },
104*5e7646d2SAndroid Build Coastguard Worker   { "LogDebugHistory",		&LogDebugHistory,	CUPSD_VARTYPE_INTEGER },
105*5e7646d2SAndroid Build Coastguard Worker   { "MaxActiveJobs",		&MaxActiveJobs,		CUPSD_VARTYPE_INTEGER },
106*5e7646d2SAndroid Build Coastguard Worker   { "MaxClients",		&MaxClients,		CUPSD_VARTYPE_INTEGER },
107*5e7646d2SAndroid Build Coastguard Worker   { "MaxClientsPerHost",	&MaxClientsPerHost,	CUPSD_VARTYPE_INTEGER },
108*5e7646d2SAndroid Build Coastguard Worker   { "MaxCopies",		&MaxCopies,		CUPSD_VARTYPE_INTEGER },
109*5e7646d2SAndroid Build Coastguard Worker   { "MaxEvents",		&MaxEvents,		CUPSD_VARTYPE_INTEGER },
110*5e7646d2SAndroid Build Coastguard Worker   { "MaxHoldTime",		&MaxHoldTime,		CUPSD_VARTYPE_TIME },
111*5e7646d2SAndroid Build Coastguard Worker   { "MaxJobs",			&MaxJobs,		CUPSD_VARTYPE_INTEGER },
112*5e7646d2SAndroid Build Coastguard Worker   { "MaxJobsPerPrinter",	&MaxJobsPerPrinter,	CUPSD_VARTYPE_INTEGER },
113*5e7646d2SAndroid Build Coastguard Worker   { "MaxJobsPerUser",		&MaxJobsPerUser,	CUPSD_VARTYPE_INTEGER },
114*5e7646d2SAndroid Build Coastguard Worker   { "MaxJobTime",		&MaxJobTime,		CUPSD_VARTYPE_TIME },
115*5e7646d2SAndroid Build Coastguard Worker   { "MaxLeaseDuration",		&MaxLeaseDuration,	CUPSD_VARTYPE_TIME },
116*5e7646d2SAndroid Build Coastguard Worker   { "MaxLogSize",		&MaxLogSize,		CUPSD_VARTYPE_INTEGER },
117*5e7646d2SAndroid Build Coastguard Worker   { "MaxRequestSize",		&MaxRequestSize,	CUPSD_VARTYPE_INTEGER },
118*5e7646d2SAndroid Build Coastguard Worker   { "MaxSubscriptions",		&MaxSubscriptions,	CUPSD_VARTYPE_INTEGER },
119*5e7646d2SAndroid Build Coastguard Worker   { "MaxSubscriptionsPerJob",	&MaxSubscriptionsPerJob,	CUPSD_VARTYPE_INTEGER },
120*5e7646d2SAndroid Build Coastguard Worker   { "MaxSubscriptionsPerPrinter",&MaxSubscriptionsPerPrinter,	CUPSD_VARTYPE_INTEGER },
121*5e7646d2SAndroid Build Coastguard Worker   { "MaxSubscriptionsPerUser",	&MaxSubscriptionsPerUser,	CUPSD_VARTYPE_INTEGER },
122*5e7646d2SAndroid Build Coastguard Worker   { "MultipleOperationTimeout",	&MultipleOperationTimeout,	CUPSD_VARTYPE_TIME },
123*5e7646d2SAndroid Build Coastguard Worker   { "PageLogFormat",		&PageLogFormat,		CUPSD_VARTYPE_STRING },
124*5e7646d2SAndroid Build Coastguard Worker   { "PreserveJobFiles",		&JobFiles,		CUPSD_VARTYPE_TIME },
125*5e7646d2SAndroid Build Coastguard Worker   { "PreserveJobHistory",	&JobHistory,		CUPSD_VARTYPE_TIME },
126*5e7646d2SAndroid Build Coastguard Worker   { "ReloadTimeout",		&ReloadTimeout,		CUPSD_VARTYPE_TIME },
127*5e7646d2SAndroid Build Coastguard Worker   { "RIPCache",			&RIPCache,		CUPSD_VARTYPE_STRING },
128*5e7646d2SAndroid Build Coastguard Worker   { "RootCertDuration",		&RootCertDuration,	CUPSD_VARTYPE_TIME },
129*5e7646d2SAndroid Build Coastguard Worker   { "ServerAdmin",		&ServerAdmin,		CUPSD_VARTYPE_STRING },
130*5e7646d2SAndroid Build Coastguard Worker   { "ServerName",		&ServerName,		CUPSD_VARTYPE_STRING },
131*5e7646d2SAndroid Build Coastguard Worker   { "StrictConformance",	&StrictConformance,	CUPSD_VARTYPE_BOOLEAN },
132*5e7646d2SAndroid Build Coastguard Worker   { "Timeout",			&Timeout,		CUPSD_VARTYPE_TIME },
133*5e7646d2SAndroid Build Coastguard Worker   { "WebInterface",		&WebInterface,		CUPSD_VARTYPE_BOOLEAN }
134*5e7646d2SAndroid Build Coastguard Worker };
135*5e7646d2SAndroid Build Coastguard Worker static const cupsd_var_t	cupsfiles_vars[] =
136*5e7646d2SAndroid Build Coastguard Worker {
137*5e7646d2SAndroid Build Coastguard Worker   { "AccessLog",		&AccessLog,		CUPSD_VARTYPE_STRING },
138*5e7646d2SAndroid Build Coastguard Worker   { "CacheDir",			&CacheDir,		CUPSD_VARTYPE_STRING },
139*5e7646d2SAndroid Build Coastguard Worker   { "ConfigFilePerm",		&ConfigFilePerm,	CUPSD_VARTYPE_PERM },
140*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
141*5e7646d2SAndroid Build Coastguard Worker   { "CreateSelfSignedCerts",	&CreateSelfSignedCerts,	CUPSD_VARTYPE_BOOLEAN },
142*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
143*5e7646d2SAndroid Build Coastguard Worker   { "DataDir",			&DataDir,		CUPSD_VARTYPE_STRING },
144*5e7646d2SAndroid Build Coastguard Worker   { "DocumentRoot",		&DocumentRoot,		CUPSD_VARTYPE_STRING },
145*5e7646d2SAndroid Build Coastguard Worker   { "ErrorLog",			&ErrorLog,		CUPSD_VARTYPE_STRING },
146*5e7646d2SAndroid Build Coastguard Worker   { "FileDevice",		&FileDevice,		CUPSD_VARTYPE_BOOLEAN },
147*5e7646d2SAndroid Build Coastguard Worker   { "FontPath",			&FontPath,		CUPSD_VARTYPE_STRING },
148*5e7646d2SAndroid Build Coastguard Worker   { "LogFilePerm",		&LogFilePerm,		CUPSD_VARTYPE_PERM },
149*5e7646d2SAndroid Build Coastguard Worker   { "LPDConfigFile",		&LPDConfigFile,		CUPSD_VARTYPE_STRING },
150*5e7646d2SAndroid Build Coastguard Worker   { "PageLog",			&PageLog,		CUPSD_VARTYPE_STRING },
151*5e7646d2SAndroid Build Coastguard Worker   { "Printcap",			&Printcap,		CUPSD_VARTYPE_STRING },
152*5e7646d2SAndroid Build Coastguard Worker   { "RemoteRoot",		&RemoteRoot,		CUPSD_VARTYPE_STRING },
153*5e7646d2SAndroid Build Coastguard Worker   { "RequestRoot",		&RequestRoot,		CUPSD_VARTYPE_STRING },
154*5e7646d2SAndroid Build Coastguard Worker   { "ServerBin",		&ServerBin,		CUPSD_VARTYPE_PATHNAME },
155*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
156*5e7646d2SAndroid Build Coastguard Worker   { "ServerKeychain",		&ServerKeychain,	CUPSD_VARTYPE_PATHNAME },
157*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
158*5e7646d2SAndroid Build Coastguard Worker   { "ServerRoot",		&ServerRoot,		CUPSD_VARTYPE_PATHNAME },
159*5e7646d2SAndroid Build Coastguard Worker   { "SMBConfigFile",		&SMBConfigFile,		CUPSD_VARTYPE_STRING },
160*5e7646d2SAndroid Build Coastguard Worker   { "StateDir",			&StateDir,		CUPSD_VARTYPE_STRING },
161*5e7646d2SAndroid Build Coastguard Worker   { "SyncOnClose",		&SyncOnClose,		CUPSD_VARTYPE_BOOLEAN },
162*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_AUTHORIZATION_H
163*5e7646d2SAndroid Build Coastguard Worker   { "SystemGroupAuthKey",	&SystemGroupAuthKey,	CUPSD_VARTYPE_STRING },
164*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_AUTHORIZATION_H */
165*5e7646d2SAndroid Build Coastguard Worker   { "TempDir",			&TempDir,		CUPSD_VARTYPE_PATHNAME }
166*5e7646d2SAndroid Build Coastguard Worker };
167*5e7646d2SAndroid Build Coastguard Worker 
168*5e7646d2SAndroid Build Coastguard Worker static int		default_auth_type = CUPSD_AUTH_AUTO;
169*5e7646d2SAndroid Build Coastguard Worker 					/* Default AuthType, if not specified */
170*5e7646d2SAndroid Build Coastguard Worker 
171*5e7646d2SAndroid Build Coastguard Worker static const unsigned	ones[4] =
172*5e7646d2SAndroid Build Coastguard Worker 			{
173*5e7646d2SAndroid Build Coastguard Worker 			  0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
174*5e7646d2SAndroid Build Coastguard Worker 			};
175*5e7646d2SAndroid Build Coastguard Worker static const unsigned	zeros[4] =
176*5e7646d2SAndroid Build Coastguard Worker 			{
177*5e7646d2SAndroid Build Coastguard Worker 			  0x00000000, 0x00000000, 0x00000000, 0x00000000
178*5e7646d2SAndroid Build Coastguard Worker 			};
179*5e7646d2SAndroid Build Coastguard Worker 
180*5e7646d2SAndroid Build Coastguard Worker 
181*5e7646d2SAndroid Build Coastguard Worker /*
182*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
183*5e7646d2SAndroid Build Coastguard Worker  */
184*5e7646d2SAndroid Build Coastguard Worker 
185*5e7646d2SAndroid Build Coastguard Worker static http_addrlist_t	*get_address(const char *value, int defport);
186*5e7646d2SAndroid Build Coastguard Worker static int		get_addr_and_mask(const char *value, unsigned *ip,
187*5e7646d2SAndroid Build Coastguard Worker 			                  unsigned *mask);
188*5e7646d2SAndroid Build Coastguard Worker static void		mime_error_cb(void *ctx, const char *message);
189*5e7646d2SAndroid Build Coastguard Worker static int		parse_aaa(cupsd_location_t *loc, char *line,
190*5e7646d2SAndroid Build Coastguard Worker 			          char *value, int linenum);
191*5e7646d2SAndroid Build Coastguard Worker static int		parse_fatal_errors(const char *s);
192*5e7646d2SAndroid Build Coastguard Worker static int		parse_groups(const char *s, int linenum);
193*5e7646d2SAndroid Build Coastguard Worker static int		parse_protocols(const char *s);
194*5e7646d2SAndroid Build Coastguard Worker static int		parse_variable(const char *filename, int linenum,
195*5e7646d2SAndroid Build Coastguard Worker 			               const char *line, const char *value,
196*5e7646d2SAndroid Build Coastguard Worker 			               size_t num_vars,
197*5e7646d2SAndroid Build Coastguard Worker 			               const cupsd_var_t *vars);
198*5e7646d2SAndroid Build Coastguard Worker static int		read_cupsd_conf(cups_file_t *fp);
199*5e7646d2SAndroid Build Coastguard Worker static int		read_cups_files_conf(cups_file_t *fp);
200*5e7646d2SAndroid Build Coastguard Worker static int		read_location(cups_file_t *fp, char *name, int linenum);
201*5e7646d2SAndroid Build Coastguard Worker static int		read_policy(cups_file_t *fp, char *name, int linenum);
202*5e7646d2SAndroid Build Coastguard Worker static void		set_policy_defaults(cupsd_policy_t *pol);
203*5e7646d2SAndroid Build Coastguard Worker 
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker /*
206*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdAddAlias()' - Add a host alias.
207*5e7646d2SAndroid Build Coastguard Worker  */
208*5e7646d2SAndroid Build Coastguard Worker 
209*5e7646d2SAndroid Build Coastguard Worker void
cupsdAddAlias(cups_array_t * aliases,const char * name)210*5e7646d2SAndroid Build Coastguard Worker cupsdAddAlias(cups_array_t *aliases,	/* I - Array of aliases */
211*5e7646d2SAndroid Build Coastguard Worker               const char   *name)	/* I - Name to add */
212*5e7646d2SAndroid Build Coastguard Worker {
213*5e7646d2SAndroid Build Coastguard Worker   cupsd_alias_t	*a;			/*  New alias */
214*5e7646d2SAndroid Build Coastguard Worker   size_t	namelen;		/* Length of name */
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker 
217*5e7646d2SAndroid Build Coastguard Worker   namelen = strlen(name);
218*5e7646d2SAndroid Build Coastguard Worker 
219*5e7646d2SAndroid Build Coastguard Worker   if ((a = (cupsd_alias_t *)malloc(sizeof(cupsd_alias_t) + namelen)) == NULL)
220*5e7646d2SAndroid Build Coastguard Worker     return;
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker   a->namelen = namelen;
223*5e7646d2SAndroid Build Coastguard Worker   memcpy(a->name, name, namelen + 1);	/* OK since a->name is allocated */
224*5e7646d2SAndroid Build Coastguard Worker 
225*5e7646d2SAndroid Build Coastguard Worker   cupsArrayAdd(aliases, a);
226*5e7646d2SAndroid Build Coastguard Worker }
227*5e7646d2SAndroid Build Coastguard Worker 
228*5e7646d2SAndroid Build Coastguard Worker 
229*5e7646d2SAndroid Build Coastguard Worker /*
230*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdCheckPermissions()' - Fix the mode and ownership of a file or directory.
231*5e7646d2SAndroid Build Coastguard Worker  */
232*5e7646d2SAndroid Build Coastguard Worker 
233*5e7646d2SAndroid Build Coastguard Worker int					/* O - 0 on success, -1 on error, 1 on warning */
cupsdCheckPermissions(const char * filename,const char * suffix,mode_t mode,uid_t user,gid_t group,int is_dir,int create_dir)234*5e7646d2SAndroid Build Coastguard Worker cupsdCheckPermissions(
235*5e7646d2SAndroid Build Coastguard Worker     const char *filename,		/* I - File/directory name */
236*5e7646d2SAndroid Build Coastguard Worker     const char *suffix,			/* I - Additional file/directory name */
237*5e7646d2SAndroid Build Coastguard Worker     mode_t     mode,			/* I - Permissions */
238*5e7646d2SAndroid Build Coastguard Worker     uid_t      user,			/* I - Owner */
239*5e7646d2SAndroid Build Coastguard Worker     gid_t      group,			/* I - Group */
240*5e7646d2SAndroid Build Coastguard Worker     int        is_dir,			/* I - 1 = directory, 0 = file */
241*5e7646d2SAndroid Build Coastguard Worker     int        create_dir)		/* I - 1 = create directory, -1 = create w/o logging, 0 = not */
242*5e7646d2SAndroid Build Coastguard Worker {
243*5e7646d2SAndroid Build Coastguard Worker   int		dir_created = 0;	/* Did we create a directory? */
244*5e7646d2SAndroid Build Coastguard Worker   char		pathname[1024];		/* File name with prefix */
245*5e7646d2SAndroid Build Coastguard Worker   struct stat	fileinfo;		/* Stat buffer */
246*5e7646d2SAndroid Build Coastguard Worker   int		is_symlink;		/* Is "filename" a symlink? */
247*5e7646d2SAndroid Build Coastguard Worker 
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker  /*
250*5e7646d2SAndroid Build Coastguard Worker   * Prepend the given root to the filename before testing it...
251*5e7646d2SAndroid Build Coastguard Worker   */
252*5e7646d2SAndroid Build Coastguard Worker 
253*5e7646d2SAndroid Build Coastguard Worker   if (suffix)
254*5e7646d2SAndroid Build Coastguard Worker   {
255*5e7646d2SAndroid Build Coastguard Worker     snprintf(pathname, sizeof(pathname), "%s/%s", filename, suffix);
256*5e7646d2SAndroid Build Coastguard Worker     filename = pathname;
257*5e7646d2SAndroid Build Coastguard Worker   }
258*5e7646d2SAndroid Build Coastguard Worker 
259*5e7646d2SAndroid Build Coastguard Worker  /*
260*5e7646d2SAndroid Build Coastguard Worker   * See if we can stat the file/directory...
261*5e7646d2SAndroid Build Coastguard Worker   */
262*5e7646d2SAndroid Build Coastguard Worker 
263*5e7646d2SAndroid Build Coastguard Worker   if (lstat(filename, &fileinfo))
264*5e7646d2SAndroid Build Coastguard Worker   {
265*5e7646d2SAndroid Build Coastguard Worker     if (errno == ENOENT && create_dir)
266*5e7646d2SAndroid Build Coastguard Worker     {
267*5e7646d2SAndroid Build Coastguard Worker       if (create_dir > 0)
268*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_DEBUG, "Creating missing directory \"%s\"",
269*5e7646d2SAndroid Build Coastguard Worker 			filename);
270*5e7646d2SAndroid Build Coastguard Worker 
271*5e7646d2SAndroid Build Coastguard Worker       if (mkdir(filename, mode))
272*5e7646d2SAndroid Build Coastguard Worker       {
273*5e7646d2SAndroid Build Coastguard Worker         if (create_dir > 0)
274*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
275*5e7646d2SAndroid Build Coastguard Worker 			  "Unable to create directory \"%s\" - %s", filename,
276*5e7646d2SAndroid Build Coastguard Worker 			  strerror(errno));
277*5e7646d2SAndroid Build Coastguard Worker         else
278*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
279*5e7646d2SAndroid Build Coastguard Worker 	  sd_journal_print(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
280*5e7646d2SAndroid Build Coastguard Worker #else
281*5e7646d2SAndroid Build Coastguard Worker 	  syslog(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, strerror(errno));
282*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
283*5e7646d2SAndroid Build Coastguard Worker 
284*5e7646d2SAndroid Build Coastguard Worker         return (-1);
285*5e7646d2SAndroid Build Coastguard Worker       }
286*5e7646d2SAndroid Build Coastguard Worker 
287*5e7646d2SAndroid Build Coastguard Worker       dir_created      = 1;
288*5e7646d2SAndroid Build Coastguard Worker       fileinfo.st_mode = mode | S_IFDIR;
289*5e7646d2SAndroid Build Coastguard Worker     }
290*5e7646d2SAndroid Build Coastguard Worker     else
291*5e7646d2SAndroid Build Coastguard Worker       return (create_dir ? -1 : 1);
292*5e7646d2SAndroid Build Coastguard Worker   }
293*5e7646d2SAndroid Build Coastguard Worker 
294*5e7646d2SAndroid Build Coastguard Worker   if ((is_symlink = S_ISLNK(fileinfo.st_mode)) != 0)
295*5e7646d2SAndroid Build Coastguard Worker   {
296*5e7646d2SAndroid Build Coastguard Worker     if (stat(filename, &fileinfo))
297*5e7646d2SAndroid Build Coastguard Worker     {
298*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is a bad symlink - %s",
299*5e7646d2SAndroid Build Coastguard Worker                       filename, strerror(errno));
300*5e7646d2SAndroid Build Coastguard Worker       return (-1);
301*5e7646d2SAndroid Build Coastguard Worker     }
302*5e7646d2SAndroid Build Coastguard Worker   }
303*5e7646d2SAndroid Build Coastguard Worker 
304*5e7646d2SAndroid Build Coastguard Worker  /*
305*5e7646d2SAndroid Build Coastguard Worker   * Make sure it's a regular file or a directory as needed...
306*5e7646d2SAndroid Build Coastguard Worker   */
307*5e7646d2SAndroid Build Coastguard Worker 
308*5e7646d2SAndroid Build Coastguard Worker   if (!dir_created && !is_dir && !S_ISREG(fileinfo.st_mode))
309*5e7646d2SAndroid Build Coastguard Worker   {
310*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a regular file.", filename);
311*5e7646d2SAndroid Build Coastguard Worker     return (-1);
312*5e7646d2SAndroid Build Coastguard Worker   }
313*5e7646d2SAndroid Build Coastguard Worker 
314*5e7646d2SAndroid Build Coastguard Worker   if (!dir_created && is_dir && !S_ISDIR(fileinfo.st_mode))
315*5e7646d2SAndroid Build Coastguard Worker   {
316*5e7646d2SAndroid Build Coastguard Worker     if (create_dir >= 0)
317*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a directory.", filename);
318*5e7646d2SAndroid Build Coastguard Worker     else
319*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
320*5e7646d2SAndroid Build Coastguard Worker       sd_journal_print(LOG_ERR, "\"%s\" is not a directory.", filename);
321*5e7646d2SAndroid Build Coastguard Worker #else
322*5e7646d2SAndroid Build Coastguard Worker       syslog(LOG_ERR, "\"%s\" is not a directory.", filename);
323*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
324*5e7646d2SAndroid Build Coastguard Worker 
325*5e7646d2SAndroid Build Coastguard Worker     return (-1);
326*5e7646d2SAndroid Build Coastguard Worker   }
327*5e7646d2SAndroid Build Coastguard Worker 
328*5e7646d2SAndroid Build Coastguard Worker  /*
329*5e7646d2SAndroid Build Coastguard Worker   * If the filename is a symlink, do not change permissions (STR #2937)...
330*5e7646d2SAndroid Build Coastguard Worker   */
331*5e7646d2SAndroid Build Coastguard Worker 
332*5e7646d2SAndroid Build Coastguard Worker   if (is_symlink)
333*5e7646d2SAndroid Build Coastguard Worker     return (0);
334*5e7646d2SAndroid Build Coastguard Worker 
335*5e7646d2SAndroid Build Coastguard Worker  /*
336*5e7646d2SAndroid Build Coastguard Worker   * Fix owner, group, and mode as needed...
337*5e7646d2SAndroid Build Coastguard Worker   */
338*5e7646d2SAndroid Build Coastguard Worker 
339*5e7646d2SAndroid Build Coastguard Worker   if (dir_created || fileinfo.st_uid != user || fileinfo.st_gid != group)
340*5e7646d2SAndroid Build Coastguard Worker   {
341*5e7646d2SAndroid Build Coastguard Worker     if (create_dir >= 0)
342*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_DEBUG, "Repairing ownership of \"%s\"",
343*5e7646d2SAndroid Build Coastguard Worker                       filename);
344*5e7646d2SAndroid Build Coastguard Worker 
345*5e7646d2SAndroid Build Coastguard Worker     if (chown(filename, user, group) && !getuid())
346*5e7646d2SAndroid Build Coastguard Worker     {
347*5e7646d2SAndroid Build Coastguard Worker       if (create_dir >= 0)
348*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_ERROR,
349*5e7646d2SAndroid Build Coastguard Worker 			"Unable to change ownership of \"%s\" - %s", filename,
350*5e7646d2SAndroid Build Coastguard Worker 			strerror(errno));
351*5e7646d2SAndroid Build Coastguard Worker       else
352*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
353*5e7646d2SAndroid Build Coastguard Worker 	sd_journal_print(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
354*5e7646d2SAndroid Build Coastguard Worker #else
355*5e7646d2SAndroid Build Coastguard Worker 	syslog(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, strerror(errno));
356*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
357*5e7646d2SAndroid Build Coastguard Worker 
358*5e7646d2SAndroid Build Coastguard Worker       return (1);
359*5e7646d2SAndroid Build Coastguard Worker     }
360*5e7646d2SAndroid Build Coastguard Worker   }
361*5e7646d2SAndroid Build Coastguard Worker 
362*5e7646d2SAndroid Build Coastguard Worker   if (dir_created || (fileinfo.st_mode & 07777) != mode)
363*5e7646d2SAndroid Build Coastguard Worker   {
364*5e7646d2SAndroid Build Coastguard Worker     if (create_dir >= 0)
365*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_DEBUG, "Repairing access permissions of \"%s\"",
366*5e7646d2SAndroid Build Coastguard Worker 		      filename);
367*5e7646d2SAndroid Build Coastguard Worker 
368*5e7646d2SAndroid Build Coastguard Worker     if (chmod(filename, mode))
369*5e7646d2SAndroid Build Coastguard Worker     {
370*5e7646d2SAndroid Build Coastguard Worker       if (create_dir >= 0)
371*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_ERROR,
372*5e7646d2SAndroid Build Coastguard Worker 			"Unable to change permissions of \"%s\" - %s", filename,
373*5e7646d2SAndroid Build Coastguard Worker 			strerror(errno));
374*5e7646d2SAndroid Build Coastguard Worker       else
375*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
376*5e7646d2SAndroid Build Coastguard Worker 	sd_journal_print(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
377*5e7646d2SAndroid Build Coastguard Worker #else
378*5e7646d2SAndroid Build Coastguard Worker 	syslog(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, strerror(errno));
379*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
380*5e7646d2SAndroid Build Coastguard Worker 
381*5e7646d2SAndroid Build Coastguard Worker       return (1);
382*5e7646d2SAndroid Build Coastguard Worker     }
383*5e7646d2SAndroid Build Coastguard Worker   }
384*5e7646d2SAndroid Build Coastguard Worker 
385*5e7646d2SAndroid Build Coastguard Worker  /*
386*5e7646d2SAndroid Build Coastguard Worker   * Everything is OK...
387*5e7646d2SAndroid Build Coastguard Worker   */
388*5e7646d2SAndroid Build Coastguard Worker 
389*5e7646d2SAndroid Build Coastguard Worker   return (0);
390*5e7646d2SAndroid Build Coastguard Worker }
391*5e7646d2SAndroid Build Coastguard Worker 
392*5e7646d2SAndroid Build Coastguard Worker 
393*5e7646d2SAndroid Build Coastguard Worker /*
394*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdDefaultAuthType()' - Get the default AuthType.
395*5e7646d2SAndroid Build Coastguard Worker  *
396*5e7646d2SAndroid Build Coastguard Worker  * When the default_auth_type is "auto", this function tries to get the GSS
397*5e7646d2SAndroid Build Coastguard Worker  * credentials for the server.  If that succeeds we use Kerberos authentication,
398*5e7646d2SAndroid Build Coastguard Worker  * otherwise we do a fallback to Basic authentication against the local user
399*5e7646d2SAndroid Build Coastguard Worker  * accounts.
400*5e7646d2SAndroid Build Coastguard Worker  */
401*5e7646d2SAndroid Build Coastguard Worker 
402*5e7646d2SAndroid Build Coastguard Worker int					/* O - Default AuthType value */
cupsdDefaultAuthType(void)403*5e7646d2SAndroid Build Coastguard Worker cupsdDefaultAuthType(void)
404*5e7646d2SAndroid Build Coastguard Worker {
405*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
406*5e7646d2SAndroid Build Coastguard Worker   OM_uint32	major_status,		/* Major status code */
407*5e7646d2SAndroid Build Coastguard Worker 		minor_status;		/* Minor status code */
408*5e7646d2SAndroid Build Coastguard Worker   gss_name_t	server_name;		/* Server name */
409*5e7646d2SAndroid Build Coastguard Worker   gss_buffer_desc token = GSS_C_EMPTY_BUFFER;
410*5e7646d2SAndroid Build Coastguard Worker 					/* Service name token */
411*5e7646d2SAndroid Build Coastguard Worker   char		buf[1024];		/* Service name buffer */
412*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
413*5e7646d2SAndroid Build Coastguard Worker 
414*5e7646d2SAndroid Build Coastguard Worker 
415*5e7646d2SAndroid Build Coastguard Worker  /*
416*5e7646d2SAndroid Build Coastguard Worker   * If we have already determined the correct default AuthType, use it...
417*5e7646d2SAndroid Build Coastguard Worker   */
418*5e7646d2SAndroid Build Coastguard Worker 
419*5e7646d2SAndroid Build Coastguard Worker   if (default_auth_type != CUPSD_AUTH_AUTO)
420*5e7646d2SAndroid Build Coastguard Worker     return (default_auth_type);
421*5e7646d2SAndroid Build Coastguard Worker 
422*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
423*5e7646d2SAndroid Build Coastguard Worker #  ifdef __APPLE__
424*5e7646d2SAndroid Build Coastguard Worker  /*
425*5e7646d2SAndroid Build Coastguard Worker   * If the weak-linked GSSAPI/Kerberos library is not present, don't try
426*5e7646d2SAndroid Build Coastguard Worker   * to use it...
427*5e7646d2SAndroid Build Coastguard Worker   */
428*5e7646d2SAndroid Build Coastguard Worker 
429*5e7646d2SAndroid Build Coastguard Worker   if (&gss_init_sec_context == NULL)
430*5e7646d2SAndroid Build Coastguard Worker     return (default_auth_type = CUPSD_AUTH_BASIC);
431*5e7646d2SAndroid Build Coastguard Worker #  endif /* __APPLE__ */
432*5e7646d2SAndroid Build Coastguard Worker 
433*5e7646d2SAndroid Build Coastguard Worker  /*
434*5e7646d2SAndroid Build Coastguard Worker   * Try to obtain the server's GSS credentials (GSSServiceName@servername).  If
435*5e7646d2SAndroid Build Coastguard Worker   * that fails we must use Basic...
436*5e7646d2SAndroid Build Coastguard Worker   */
437*5e7646d2SAndroid Build Coastguard Worker 
438*5e7646d2SAndroid Build Coastguard Worker   snprintf(buf, sizeof(buf), "%s@%s", GSSServiceName, ServerName);
439*5e7646d2SAndroid Build Coastguard Worker 
440*5e7646d2SAndroid Build Coastguard Worker   token.value  = buf;
441*5e7646d2SAndroid Build Coastguard Worker   token.length = strlen(buf);
442*5e7646d2SAndroid Build Coastguard Worker   server_name  = GSS_C_NO_NAME;
443*5e7646d2SAndroid Build Coastguard Worker   major_status = gss_import_name(&minor_status, &token,
444*5e7646d2SAndroid Build Coastguard Worker 	 			 GSS_C_NT_HOSTBASED_SERVICE,
445*5e7646d2SAndroid Build Coastguard Worker 				 &server_name);
446*5e7646d2SAndroid Build Coastguard Worker 
447*5e7646d2SAndroid Build Coastguard Worker   memset(&token, 0, sizeof(token));
448*5e7646d2SAndroid Build Coastguard Worker 
449*5e7646d2SAndroid Build Coastguard Worker   if (GSS_ERROR(major_status))
450*5e7646d2SAndroid Build Coastguard Worker   {
451*5e7646d2SAndroid Build Coastguard Worker     cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
452*5e7646d2SAndroid Build Coastguard Worker 		       "cupsdDefaultAuthType: gss_import_name(%s) failed", buf);
453*5e7646d2SAndroid Build Coastguard Worker     return (default_auth_type = CUPSD_AUTH_BASIC);
454*5e7646d2SAndroid Build Coastguard Worker   }
455*5e7646d2SAndroid Build Coastguard Worker 
456*5e7646d2SAndroid Build Coastguard Worker   major_status = gss_display_name(&minor_status, server_name, &token, NULL);
457*5e7646d2SAndroid Build Coastguard Worker 
458*5e7646d2SAndroid Build Coastguard Worker   if (GSS_ERROR(major_status))
459*5e7646d2SAndroid Build Coastguard Worker   {
460*5e7646d2SAndroid Build Coastguard Worker     cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
461*5e7646d2SAndroid Build Coastguard Worker                        "cupsdDefaultAuthType: gss_display_name(%s) failed",
462*5e7646d2SAndroid Build Coastguard Worker                        buf);
463*5e7646d2SAndroid Build Coastguard Worker     return (default_auth_type = CUPSD_AUTH_BASIC);
464*5e7646d2SAndroid Build Coastguard Worker   }
465*5e7646d2SAndroid Build Coastguard Worker 
466*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_DEBUG,
467*5e7646d2SAndroid Build Coastguard Worker                   "cupsdDefaultAuthType: Attempting to acquire Kerberos "
468*5e7646d2SAndroid Build Coastguard Worker                   "credentials for %s...", (char *)token.value);
469*5e7646d2SAndroid Build Coastguard Worker 
470*5e7646d2SAndroid Build Coastguard Worker   ServerCreds  = GSS_C_NO_CREDENTIAL;
471*5e7646d2SAndroid Build Coastguard Worker   major_status = gss_acquire_cred(&minor_status, server_name, GSS_C_INDEFINITE,
472*5e7646d2SAndroid Build Coastguard Worker 				  GSS_C_NO_OID_SET, GSS_C_ACCEPT,
473*5e7646d2SAndroid Build Coastguard Worker 				  &ServerCreds, NULL, NULL);
474*5e7646d2SAndroid Build Coastguard Worker   if (GSS_ERROR(major_status))
475*5e7646d2SAndroid Build Coastguard Worker   {
476*5e7646d2SAndroid Build Coastguard Worker     cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status,
477*5e7646d2SAndroid Build Coastguard Worker                        "cupsdDefaultAuthType: gss_acquire_cred(%s) failed",
478*5e7646d2SAndroid Build Coastguard Worker                        (char *)token.value);
479*5e7646d2SAndroid Build Coastguard Worker     gss_release_name(&minor_status, &server_name);
480*5e7646d2SAndroid Build Coastguard Worker     gss_release_buffer(&minor_status, &token);
481*5e7646d2SAndroid Build Coastguard Worker     return (default_auth_type = CUPSD_AUTH_BASIC);
482*5e7646d2SAndroid Build Coastguard Worker   }
483*5e7646d2SAndroid Build Coastguard Worker 
484*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_DEBUG,
485*5e7646d2SAndroid Build Coastguard Worker                   "cupsdDefaultAuthType: Kerberos credentials acquired "
486*5e7646d2SAndroid Build Coastguard Worker                   "successfully for %s.", (char *)token.value);
487*5e7646d2SAndroid Build Coastguard Worker 
488*5e7646d2SAndroid Build Coastguard Worker   gss_release_name(&minor_status, &server_name);
489*5e7646d2SAndroid Build Coastguard Worker   gss_release_buffer(&minor_status, &token);
490*5e7646d2SAndroid Build Coastguard Worker 
491*5e7646d2SAndroid Build Coastguard Worker   HaveServerCreds = 1;
492*5e7646d2SAndroid Build Coastguard Worker 
493*5e7646d2SAndroid Build Coastguard Worker   return (default_auth_type = CUPSD_AUTH_NEGOTIATE);
494*5e7646d2SAndroid Build Coastguard Worker 
495*5e7646d2SAndroid Build Coastguard Worker #else
496*5e7646d2SAndroid Build Coastguard Worker  /*
497*5e7646d2SAndroid Build Coastguard Worker   * No Kerberos support compiled in so just use Basic all the time...
498*5e7646d2SAndroid Build Coastguard Worker   */
499*5e7646d2SAndroid Build Coastguard Worker 
500*5e7646d2SAndroid Build Coastguard Worker   return (default_auth_type = CUPSD_AUTH_BASIC);
501*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
502*5e7646d2SAndroid Build Coastguard Worker }
503*5e7646d2SAndroid Build Coastguard Worker 
504*5e7646d2SAndroid Build Coastguard Worker 
505*5e7646d2SAndroid Build Coastguard Worker /*
506*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdFreeAliases()' - Free all of the alias entries.
507*5e7646d2SAndroid Build Coastguard Worker  */
508*5e7646d2SAndroid Build Coastguard Worker 
509*5e7646d2SAndroid Build Coastguard Worker void
cupsdFreeAliases(cups_array_t * aliases)510*5e7646d2SAndroid Build Coastguard Worker cupsdFreeAliases(cups_array_t *aliases)	/* I - Array of aliases */
511*5e7646d2SAndroid Build Coastguard Worker {
512*5e7646d2SAndroid Build Coastguard Worker   cupsd_alias_t	*a;			/* Current alias */
513*5e7646d2SAndroid Build Coastguard Worker 
514*5e7646d2SAndroid Build Coastguard Worker 
515*5e7646d2SAndroid Build Coastguard Worker   for (a = (cupsd_alias_t *)cupsArrayFirst(aliases);
516*5e7646d2SAndroid Build Coastguard Worker        a;
517*5e7646d2SAndroid Build Coastguard Worker        a = (cupsd_alias_t *)cupsArrayNext(aliases))
518*5e7646d2SAndroid Build Coastguard Worker     free(a);
519*5e7646d2SAndroid Build Coastguard Worker 
520*5e7646d2SAndroid Build Coastguard Worker   cupsArrayDelete(aliases);
521*5e7646d2SAndroid Build Coastguard Worker }
522*5e7646d2SAndroid Build Coastguard Worker 
523*5e7646d2SAndroid Build Coastguard Worker 
524*5e7646d2SAndroid Build Coastguard Worker /*
525*5e7646d2SAndroid Build Coastguard Worker  * 'cupsdReadConfiguration()' - Read the cupsd.conf file.
526*5e7646d2SAndroid Build Coastguard Worker  */
527*5e7646d2SAndroid Build Coastguard Worker 
528*5e7646d2SAndroid Build Coastguard Worker int					/* O - 1 on success, 0 otherwise */
cupsdReadConfiguration(void)529*5e7646d2SAndroid Build Coastguard Worker cupsdReadConfiguration(void)
530*5e7646d2SAndroid Build Coastguard Worker {
531*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
532*5e7646d2SAndroid Build Coastguard Worker   cups_file_t	*fp;			/* Configuration file */
533*5e7646d2SAndroid Build Coastguard Worker   int		status;			/* Return status */
534*5e7646d2SAndroid Build Coastguard Worker   char		temp[1024],		/* Temporary buffer */
535*5e7646d2SAndroid Build Coastguard Worker 		mimedir[1024],		/* MIME directory */
536*5e7646d2SAndroid Build Coastguard Worker 		*slash;			/* Directory separator */
537*5e7646d2SAndroid Build Coastguard Worker   cups_lang_t	*language;		/* Language */
538*5e7646d2SAndroid Build Coastguard Worker   struct passwd	*user;			/* Default user */
539*5e7646d2SAndroid Build Coastguard Worker   struct group	*group;			/* Default group */
540*5e7646d2SAndroid Build Coastguard Worker   char		*old_serverroot,	/* Old ServerRoot */
541*5e7646d2SAndroid Build Coastguard Worker 		*old_requestroot;	/* Old RequestRoot */
542*5e7646d2SAndroid Build Coastguard Worker   int		old_remote_port;	/* Old RemotePort */
543*5e7646d2SAndroid Build Coastguard Worker   const char	*tmpdir;		/* TMPDIR environment variable */
544*5e7646d2SAndroid Build Coastguard Worker   struct stat	tmpinfo;		/* Temporary directory info */
545*5e7646d2SAndroid Build Coastguard Worker   cupsd_policy_t *p;			/* Policy */
546*5e7646d2SAndroid Build Coastguard Worker 
547*5e7646d2SAndroid Build Coastguard Worker 
548*5e7646d2SAndroid Build Coastguard Worker  /*
549*5e7646d2SAndroid Build Coastguard Worker   * Save the old root paths...
550*5e7646d2SAndroid Build Coastguard Worker   */
551*5e7646d2SAndroid Build Coastguard Worker 
552*5e7646d2SAndroid Build Coastguard Worker   old_serverroot = NULL;
553*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&old_serverroot, ServerRoot);
554*5e7646d2SAndroid Build Coastguard Worker   old_requestroot = NULL;
555*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&old_requestroot, RequestRoot);
556*5e7646d2SAndroid Build Coastguard Worker 
557*5e7646d2SAndroid Build Coastguard Worker  /*
558*5e7646d2SAndroid Build Coastguard Worker   * Reset the server configuration data...
559*5e7646d2SAndroid Build Coastguard Worker   */
560*5e7646d2SAndroid Build Coastguard Worker 
561*5e7646d2SAndroid Build Coastguard Worker   cupsdDeleteAllLocations();
562*5e7646d2SAndroid Build Coastguard Worker 
563*5e7646d2SAndroid Build Coastguard Worker   cupsdDeleteAllListeners();
564*5e7646d2SAndroid Build Coastguard Worker 
565*5e7646d2SAndroid Build Coastguard Worker   old_remote_port = RemotePort;
566*5e7646d2SAndroid Build Coastguard Worker   RemotePort      = 0;
567*5e7646d2SAndroid Build Coastguard Worker 
568*5e7646d2SAndroid Build Coastguard Worker  /*
569*5e7646d2SAndroid Build Coastguard Worker   * String options...
570*5e7646d2SAndroid Build Coastguard Worker   */
571*5e7646d2SAndroid Build Coastguard Worker 
572*5e7646d2SAndroid Build Coastguard Worker   cupsdFreeAliases(ServerAlias);
573*5e7646d2SAndroid Build Coastguard Worker   ServerAlias = NULL;
574*5e7646d2SAndroid Build Coastguard Worker 
575*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&ServerName);
576*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&ServerAdmin);
577*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&ServerBin, CUPS_SERVERBIN);
578*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&RequestRoot, CUPS_REQUESTS);
579*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&CacheDir, CUPS_CACHEDIR);
580*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&DataDir, CUPS_DATADIR);
581*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&DocumentRoot, CUPS_DOCROOT);
582*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&AccessLog, CUPS_LOGDIR "/access_log");
583*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&ErrorLog);
584*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&PageLog, CUPS_LOGDIR "/page_log");
585*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&PageLogFormat,
586*5e7646d2SAndroid Build Coastguard Worker                  "%p %u %j %T %P %C %{job-billing} "
587*5e7646d2SAndroid Build Coastguard Worker 		 "%{job-originating-host-name} %{job-name} %{media} %{sides}");
588*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&Printcap, CUPS_DEFAULT_PRINTCAP);
589*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&FontPath, CUPS_FONTPATH);
590*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&RemoteRoot, "remroot");
591*5e7646d2SAndroid Build Coastguard Worker   cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
592*5e7646d2SAndroid Build Coastguard Worker                   CUPS_VERSION_MINOR);
593*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&StateDir, CUPS_STATEDIR);
594*5e7646d2SAndroid Build Coastguard Worker 
595*5e7646d2SAndroid Build Coastguard Worker   if (!strcmp(CUPS_DEFAULT_PRINTCAP, "/etc/printers.conf"))
596*5e7646d2SAndroid Build Coastguard Worker     PrintcapFormat = PRINTCAP_SOLARIS;
597*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(CUPS_DEFAULT_PRINTCAP,
598*5e7646d2SAndroid Build Coastguard Worker                    "/Library/Preferences/org.cups.printers.plist"))
599*5e7646d2SAndroid Build Coastguard Worker     PrintcapFormat = PRINTCAP_PLIST;
600*5e7646d2SAndroid Build Coastguard Worker   else
601*5e7646d2SAndroid Build Coastguard Worker     PrintcapFormat = PRINTCAP_BSD;
602*5e7646d2SAndroid Build Coastguard Worker 
603*5e7646d2SAndroid Build Coastguard Worker   strlcpy(temp, ConfigurationFile, sizeof(temp));
604*5e7646d2SAndroid Build Coastguard Worker   if ((slash = strrchr(temp, '/')) != NULL)
605*5e7646d2SAndroid Build Coastguard Worker     *slash = '\0';
606*5e7646d2SAndroid Build Coastguard Worker 
607*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&ServerRoot, temp);
608*5e7646d2SAndroid Build Coastguard Worker 
609*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&Classification);
610*5e7646d2SAndroid Build Coastguard Worker   ClassifyOverride  = 0;
611*5e7646d2SAndroid Build Coastguard Worker 
612*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
613*5e7646d2SAndroid Build Coastguard Worker #  ifdef HAVE_GNUTLS
614*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&ServerKeychain, "ssl");
615*5e7646d2SAndroid Build Coastguard Worker #  else
616*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&ServerKeychain, "/Library/Keychains/System.keychain");
617*5e7646d2SAndroid Build Coastguard Worker #  endif /* HAVE_GNUTLS */
618*5e7646d2SAndroid Build Coastguard Worker 
619*5e7646d2SAndroid Build Coastguard Worker   _httpTLSSetOptions(_HTTP_TLS_NONE, _HTTP_TLS_1_0, _HTTP_TLS_MAX);
620*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
621*5e7646d2SAndroid Build Coastguard Worker 
622*5e7646d2SAndroid Build Coastguard Worker   language = cupsLangDefault();
623*5e7646d2SAndroid Build Coastguard Worker 
624*5e7646d2SAndroid Build Coastguard Worker   if (!strcmp(language->language, "C") || !strcmp(language->language, "POSIX"))
625*5e7646d2SAndroid Build Coastguard Worker     cupsdSetString(&DefaultLanguage, "en");
626*5e7646d2SAndroid Build Coastguard Worker   else
627*5e7646d2SAndroid Build Coastguard Worker     cupsdSetString(&DefaultLanguage, language->language);
628*5e7646d2SAndroid Build Coastguard Worker 
629*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&DefaultPaperSize);
630*5e7646d2SAndroid Build Coastguard Worker 
631*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&RIPCache, "128m");
632*5e7646d2SAndroid Build Coastguard Worker 
633*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&TempDir, NULL);
634*5e7646d2SAndroid Build Coastguard Worker 
635*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
636*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&GSSServiceName, CUPS_DEFAULT_GSSSERVICENAME);
637*5e7646d2SAndroid Build Coastguard Worker 
638*5e7646d2SAndroid Build Coastguard Worker   if (HaveServerCreds)
639*5e7646d2SAndroid Build Coastguard Worker   {
640*5e7646d2SAndroid Build Coastguard Worker     OM_uint32	minor_status;		/* Minor status code */
641*5e7646d2SAndroid Build Coastguard Worker 
642*5e7646d2SAndroid Build Coastguard Worker     gss_release_cred(&minor_status, &ServerCreds);
643*5e7646d2SAndroid Build Coastguard Worker 
644*5e7646d2SAndroid Build Coastguard Worker     HaveServerCreds = 0;
645*5e7646d2SAndroid Build Coastguard Worker   }
646*5e7646d2SAndroid Build Coastguard Worker 
647*5e7646d2SAndroid Build Coastguard Worker   ServerCreds = GSS_C_NO_CREDENTIAL;
648*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_GSSAPI */
649*5e7646d2SAndroid Build Coastguard Worker 
650*5e7646d2SAndroid Build Coastguard Worker  /*
651*5e7646d2SAndroid Build Coastguard Worker   * Find the default user...
652*5e7646d2SAndroid Build Coastguard Worker   */
653*5e7646d2SAndroid Build Coastguard Worker 
654*5e7646d2SAndroid Build Coastguard Worker   if ((user = getpwnam(CUPS_DEFAULT_USER)) != NULL)
655*5e7646d2SAndroid Build Coastguard Worker     User = user->pw_uid;
656*5e7646d2SAndroid Build Coastguard Worker   else
657*5e7646d2SAndroid Build Coastguard Worker   {
658*5e7646d2SAndroid Build Coastguard Worker    /*
659*5e7646d2SAndroid Build Coastguard Worker     * Use the (historical) NFS nobody user ID (-2 as a 16-bit twos-
660*5e7646d2SAndroid Build Coastguard Worker     * complement number...)
661*5e7646d2SAndroid Build Coastguard Worker     */
662*5e7646d2SAndroid Build Coastguard Worker 
663*5e7646d2SAndroid Build Coastguard Worker     User = 65534;
664*5e7646d2SAndroid Build Coastguard Worker   }
665*5e7646d2SAndroid Build Coastguard Worker 
666*5e7646d2SAndroid Build Coastguard Worker   endpwent();
667*5e7646d2SAndroid Build Coastguard Worker 
668*5e7646d2SAndroid Build Coastguard Worker  /*
669*5e7646d2SAndroid Build Coastguard Worker   * Find the default group...
670*5e7646d2SAndroid Build Coastguard Worker   */
671*5e7646d2SAndroid Build Coastguard Worker 
672*5e7646d2SAndroid Build Coastguard Worker   group = getgrnam(CUPS_DEFAULT_GROUP);
673*5e7646d2SAndroid Build Coastguard Worker   endgrent();
674*5e7646d2SAndroid Build Coastguard Worker 
675*5e7646d2SAndroid Build Coastguard Worker   if (group)
676*5e7646d2SAndroid Build Coastguard Worker     Group = group->gr_gid;
677*5e7646d2SAndroid Build Coastguard Worker   else
678*5e7646d2SAndroid Build Coastguard Worker   {
679*5e7646d2SAndroid Build Coastguard Worker    /*
680*5e7646d2SAndroid Build Coastguard Worker     * Fallback to group "nobody"...
681*5e7646d2SAndroid Build Coastguard Worker     */
682*5e7646d2SAndroid Build Coastguard Worker 
683*5e7646d2SAndroid Build Coastguard Worker     group = getgrnam("nobody");
684*5e7646d2SAndroid Build Coastguard Worker     endgrent();
685*5e7646d2SAndroid Build Coastguard Worker 
686*5e7646d2SAndroid Build Coastguard Worker     if (group)
687*5e7646d2SAndroid Build Coastguard Worker       Group = group->gr_gid;
688*5e7646d2SAndroid Build Coastguard Worker     else
689*5e7646d2SAndroid Build Coastguard Worker     {
690*5e7646d2SAndroid Build Coastguard Worker      /*
691*5e7646d2SAndroid Build Coastguard Worker       * Use the (historical) NFS nobody group ID (-2 as a 16-bit twos-
692*5e7646d2SAndroid Build Coastguard Worker       * complement number...)
693*5e7646d2SAndroid Build Coastguard Worker       */
694*5e7646d2SAndroid Build Coastguard Worker 
695*5e7646d2SAndroid Build Coastguard Worker       Group = 65534;
696*5e7646d2SAndroid Build Coastguard Worker     }
697*5e7646d2SAndroid Build Coastguard Worker   }
698*5e7646d2SAndroid Build Coastguard Worker 
699*5e7646d2SAndroid Build Coastguard Worker  /*
700*5e7646d2SAndroid Build Coastguard Worker   * Numeric options...
701*5e7646d2SAndroid Build Coastguard Worker   */
702*5e7646d2SAndroid Build Coastguard Worker 
703*5e7646d2SAndroid Build Coastguard Worker   AccessLogLevel           = CUPSD_ACCESSLOG_ACTIONS;
704*5e7646d2SAndroid Build Coastguard Worker   ConfigFilePerm           = CUPS_DEFAULT_CONFIG_FILE_PERM;
705*5e7646d2SAndroid Build Coastguard Worker   FatalErrors              = parse_fatal_errors(CUPS_DEFAULT_FATAL_ERRORS);
706*5e7646d2SAndroid Build Coastguard Worker   default_auth_type        = CUPSD_AUTH_BASIC;
707*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
708*5e7646d2SAndroid Build Coastguard Worker   CreateSelfSignedCerts    = TRUE;
709*5e7646d2SAndroid Build Coastguard Worker   DefaultEncryption        = HTTP_ENCRYPT_REQUIRED;
710*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
711*5e7646d2SAndroid Build Coastguard Worker   DirtyCleanInterval       = DEFAULT_KEEPALIVE;
712*5e7646d2SAndroid Build Coastguard Worker   JobKillDelay             = DEFAULT_TIMEOUT;
713*5e7646d2SAndroid Build Coastguard Worker   JobRetryLimit            = 5;
714*5e7646d2SAndroid Build Coastguard Worker   JobRetryInterval         = 300;
715*5e7646d2SAndroid Build Coastguard Worker   FileDevice               = FALSE;
716*5e7646d2SAndroid Build Coastguard Worker   FilterLevel              = 0;
717*5e7646d2SAndroid Build Coastguard Worker   FilterLimit              = 0;
718*5e7646d2SAndroid Build Coastguard Worker   FilterNice               = 0;
719*5e7646d2SAndroid Build Coastguard Worker   HostNameLookups          = FALSE;
720*5e7646d2SAndroid Build Coastguard Worker   KeepAlive                = TRUE;
721*5e7646d2SAndroid Build Coastguard Worker   ListenBackLog            = SOMAXCONN;
722*5e7646d2SAndroid Build Coastguard Worker   LogDebugHistory          = 200;
723*5e7646d2SAndroid Build Coastguard Worker   LogFilePerm              = CUPS_DEFAULT_LOG_FILE_PERM;
724*5e7646d2SAndroid Build Coastguard Worker   LogLevel                 = CUPSD_LOG_WARN;
725*5e7646d2SAndroid Build Coastguard Worker   LogTimeFormat            = CUPSD_TIME_STANDARD;
726*5e7646d2SAndroid Build Coastguard Worker   MaxClients               = 100;
727*5e7646d2SAndroid Build Coastguard Worker   MaxClientsPerHost        = 0;
728*5e7646d2SAndroid Build Coastguard Worker   MaxLogSize               = 1024 * 1024;
729*5e7646d2SAndroid Build Coastguard Worker   MaxRequestSize           = 0;
730*5e7646d2SAndroid Build Coastguard Worker   MultipleOperationTimeout = 900;
731*5e7646d2SAndroid Build Coastguard Worker   NumSystemGroups          = 0;
732*5e7646d2SAndroid Build Coastguard Worker   ReloadTimeout	           = DEFAULT_KEEPALIVE;
733*5e7646d2SAndroid Build Coastguard Worker   RootCertDuration         = 300;
734*5e7646d2SAndroid Build Coastguard Worker   Sandboxing               = CUPSD_SANDBOXING_STRICT;
735*5e7646d2SAndroid Build Coastguard Worker   StrictConformance        = FALSE;
736*5e7646d2SAndroid Build Coastguard Worker   SyncOnClose              = FALSE;
737*5e7646d2SAndroid Build Coastguard Worker   Timeout                  = 900;
738*5e7646d2SAndroid Build Coastguard Worker   WebInterface             = CUPS_DEFAULT_WEBIF;
739*5e7646d2SAndroid Build Coastguard Worker 
740*5e7646d2SAndroid Build Coastguard Worker   BrowseLocalProtocols     = parse_protocols(CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS);
741*5e7646d2SAndroid Build Coastguard Worker   BrowseWebIF              = FALSE;
742*5e7646d2SAndroid Build Coastguard Worker   Browsing                 = CUPS_DEFAULT_BROWSING;
743*5e7646d2SAndroid Build Coastguard Worker   DefaultShared            = CUPS_DEFAULT_DEFAULT_SHARED;
744*5e7646d2SAndroid Build Coastguard Worker 
745*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
746*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&DNSSDSubTypes, "_cups,_print");
747*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&DNSSDHostName);
748*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_DNSSD || HAVE_AVAHI */
749*5e7646d2SAndroid Build Coastguard Worker 
750*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&LPDConfigFile, CUPS_DEFAULT_LPD_CONFIG_FILE);
751*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&SMBConfigFile, CUPS_DEFAULT_SMB_CONFIG_FILE);
752*5e7646d2SAndroid Build Coastguard Worker 
753*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&ErrorPolicy, "stop-printer");
754*5e7646d2SAndroid Build Coastguard Worker 
755*5e7646d2SAndroid Build Coastguard Worker   JobHistory          = DEFAULT_HISTORY;
756*5e7646d2SAndroid Build Coastguard Worker   JobFiles            = DEFAULT_FILES;
757*5e7646d2SAndroid Build Coastguard Worker   JobAutoPurge        = 0;
758*5e7646d2SAndroid Build Coastguard Worker   MaxHoldTime         = 0;
759*5e7646d2SAndroid Build Coastguard Worker   MaxJobs             = 500;
760*5e7646d2SAndroid Build Coastguard Worker   MaxActiveJobs       = 0;
761*5e7646d2SAndroid Build Coastguard Worker   MaxJobsPerUser      = 0;
762*5e7646d2SAndroid Build Coastguard Worker   MaxJobsPerPrinter   = 0;
763*5e7646d2SAndroid Build Coastguard Worker   MaxJobTime          = 3 * 60 * 60;	/* 3 hours */
764*5e7646d2SAndroid Build Coastguard Worker   MaxCopies           = CUPS_DEFAULT_MAX_COPIES;
765*5e7646d2SAndroid Build Coastguard Worker 
766*5e7646d2SAndroid Build Coastguard Worker   cupsdDeleteAllPolicies();
767*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&DefaultPolicy);
768*5e7646d2SAndroid Build Coastguard Worker 
769*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_AUTHORIZATION_H
770*5e7646d2SAndroid Build Coastguard Worker   cupsdSetString(&SystemGroupAuthKey, CUPS_DEFAULT_SYSTEM_AUTHKEY);
771*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_AUTHORIZATION_H */
772*5e7646d2SAndroid Build Coastguard Worker 
773*5e7646d2SAndroid Build Coastguard Worker   MaxSubscriptions           = 100;
774*5e7646d2SAndroid Build Coastguard Worker   MaxSubscriptionsPerJob     = 0;
775*5e7646d2SAndroid Build Coastguard Worker   MaxSubscriptionsPerPrinter = 0;
776*5e7646d2SAndroid Build Coastguard Worker   MaxSubscriptionsPerUser    = 0;
777*5e7646d2SAndroid Build Coastguard Worker   DefaultLeaseDuration       = 86400;
778*5e7646d2SAndroid Build Coastguard Worker   MaxLeaseDuration           = 0;
779*5e7646d2SAndroid Build Coastguard Worker 
780*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ONDEMAND
781*5e7646d2SAndroid Build Coastguard Worker   IdleExitTimeout = 60;
782*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ONDEMAND */
783*5e7646d2SAndroid Build Coastguard Worker 
784*5e7646d2SAndroid Build Coastguard Worker  /*
785*5e7646d2SAndroid Build Coastguard Worker   * Setup environment variables...
786*5e7646d2SAndroid Build Coastguard Worker   */
787*5e7646d2SAndroid Build Coastguard Worker 
788*5e7646d2SAndroid Build Coastguard Worker   cupsdInitEnv();
789*5e7646d2SAndroid Build Coastguard Worker 
790*5e7646d2SAndroid Build Coastguard Worker  /*
791*5e7646d2SAndroid Build Coastguard Worker   * Read the cups-files.conf file...
792*5e7646d2SAndroid Build Coastguard Worker   */
793*5e7646d2SAndroid Build Coastguard Worker 
794*5e7646d2SAndroid Build Coastguard Worker   if ((fp = cupsFileOpen(CupsFilesFile, "r")) != NULL)
795*5e7646d2SAndroid Build Coastguard Worker   {
796*5e7646d2SAndroid Build Coastguard Worker     status = read_cups_files_conf(fp);
797*5e7646d2SAndroid Build Coastguard Worker 
798*5e7646d2SAndroid Build Coastguard Worker     cupsFileClose(fp);
799*5e7646d2SAndroid Build Coastguard Worker 
800*5e7646d2SAndroid Build Coastguard Worker     if (!status)
801*5e7646d2SAndroid Build Coastguard Worker     {
802*5e7646d2SAndroid Build Coastguard Worker       if (TestConfigFile)
803*5e7646d2SAndroid Build Coastguard Worker         printf("\"%s\" contains errors.\n", CupsFilesFile);
804*5e7646d2SAndroid Build Coastguard Worker       else
805*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
806*5e7646d2SAndroid Build Coastguard Worker 	sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
807*5e7646d2SAndroid Build Coastguard Worker #else
808*5e7646d2SAndroid Build Coastguard Worker         syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", CupsFilesFile);
809*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
810*5e7646d2SAndroid Build Coastguard Worker 
811*5e7646d2SAndroid Build Coastguard Worker       return (0);
812*5e7646d2SAndroid Build Coastguard Worker     }
813*5e7646d2SAndroid Build Coastguard Worker   }
814*5e7646d2SAndroid Build Coastguard Worker   else if (errno == ENOENT)
815*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_INFO, "No %s, using defaults.", CupsFilesFile);
816*5e7646d2SAndroid Build Coastguard Worker   else
817*5e7646d2SAndroid Build Coastguard Worker   {
818*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
819*5e7646d2SAndroid Build Coastguard Worker     sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
820*5e7646d2SAndroid Build Coastguard Worker #else
821*5e7646d2SAndroid Build Coastguard Worker     syslog(LOG_LPR, "Unable to open \"%s\" - %s", CupsFilesFile, strerror(errno));
822*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
823*5e7646d2SAndroid Build Coastguard Worker 
824*5e7646d2SAndroid Build Coastguard Worker     return (0);
825*5e7646d2SAndroid Build Coastguard Worker   }
826*5e7646d2SAndroid Build Coastguard Worker 
827*5e7646d2SAndroid Build Coastguard Worker   if (!ErrorLog)
828*5e7646d2SAndroid Build Coastguard Worker     cupsdSetString(&ErrorLog, CUPS_LOGDIR "/error_log");
829*5e7646d2SAndroid Build Coastguard Worker 
830*5e7646d2SAndroid Build Coastguard Worker  /*
831*5e7646d2SAndroid Build Coastguard Worker   * Read the cupsd.conf file...
832*5e7646d2SAndroid Build Coastguard Worker   */
833*5e7646d2SAndroid Build Coastguard Worker 
834*5e7646d2SAndroid Build Coastguard Worker   if ((fp = cupsFileOpen(ConfigurationFile, "r")) == NULL)
835*5e7646d2SAndroid Build Coastguard Worker   {
836*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
837*5e7646d2SAndroid Build Coastguard Worker     sd_journal_print(LOG_ERR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
838*5e7646d2SAndroid Build Coastguard Worker #else
839*5e7646d2SAndroid Build Coastguard Worker     syslog(LOG_LPR, "Unable to open \"%s\" - %s", ConfigurationFile, strerror(errno));
840*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
841*5e7646d2SAndroid Build Coastguard Worker 
842*5e7646d2SAndroid Build Coastguard Worker     return (0);
843*5e7646d2SAndroid Build Coastguard Worker   }
844*5e7646d2SAndroid Build Coastguard Worker 
845*5e7646d2SAndroid Build Coastguard Worker   status = read_cupsd_conf(fp);
846*5e7646d2SAndroid Build Coastguard Worker 
847*5e7646d2SAndroid Build Coastguard Worker   cupsFileClose(fp);
848*5e7646d2SAndroid Build Coastguard Worker 
849*5e7646d2SAndroid Build Coastguard Worker   if (!status)
850*5e7646d2SAndroid Build Coastguard Worker   {
851*5e7646d2SAndroid Build Coastguard Worker     if (TestConfigFile)
852*5e7646d2SAndroid Build Coastguard Worker       printf("\"%s\" contains errors.\n", ConfigurationFile);
853*5e7646d2SAndroid Build Coastguard Worker     else
854*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SYSTEMD_SD_JOURNAL_H
855*5e7646d2SAndroid Build Coastguard Worker       sd_journal_print(LOG_ERR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
856*5e7646d2SAndroid Build Coastguard Worker #else
857*5e7646d2SAndroid Build Coastguard Worker       syslog(LOG_LPR, "Unable to read \"%s\" due to errors.", ConfigurationFile);
858*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SYSTEMD_SD_JOURNAL_H */
859*5e7646d2SAndroid Build Coastguard Worker 
860*5e7646d2SAndroid Build Coastguard Worker     return (0);
861*5e7646d2SAndroid Build Coastguard Worker   }
862*5e7646d2SAndroid Build Coastguard Worker 
863*5e7646d2SAndroid Build Coastguard Worker   RunUser = getuid();
864*5e7646d2SAndroid Build Coastguard Worker 
865*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.",
866*5e7646d2SAndroid Build Coastguard Worker                   RemotePort ? "enabled" : "disabled");
867*5e7646d2SAndroid Build Coastguard Worker 
868*5e7646d2SAndroid Build Coastguard Worker   if (!RemotePort)
869*5e7646d2SAndroid Build Coastguard Worker     BrowseLocalProtocols = 0;		/* Disable sharing - no remote access */
870*5e7646d2SAndroid Build Coastguard Worker 
871*5e7646d2SAndroid Build Coastguard Worker  /*
872*5e7646d2SAndroid Build Coastguard Worker   * See if the ServerName is an IP address...
873*5e7646d2SAndroid Build Coastguard Worker   */
874*5e7646d2SAndroid Build Coastguard Worker 
875*5e7646d2SAndroid Build Coastguard Worker   if (ServerName)
876*5e7646d2SAndroid Build Coastguard Worker   {
877*5e7646d2SAndroid Build Coastguard Worker     if (!ServerAlias)
878*5e7646d2SAndroid Build Coastguard Worker       ServerAlias = cupsArrayNew(NULL, NULL);
879*5e7646d2SAndroid Build Coastguard Worker 
880*5e7646d2SAndroid Build Coastguard Worker     cupsdAddAlias(ServerAlias, ServerName);
881*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", ServerName);
882*5e7646d2SAndroid Build Coastguard Worker   }
883*5e7646d2SAndroid Build Coastguard Worker   else
884*5e7646d2SAndroid Build Coastguard Worker   {
885*5e7646d2SAndroid Build Coastguard Worker     if (gethostname(temp, sizeof(temp)))
886*5e7646d2SAndroid Build Coastguard Worker     {
887*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get hostname: %s",
888*5e7646d2SAndroid Build Coastguard Worker                       strerror(errno));
889*5e7646d2SAndroid Build Coastguard Worker       strlcpy(temp, "localhost", sizeof(temp));
890*5e7646d2SAndroid Build Coastguard Worker     }
891*5e7646d2SAndroid Build Coastguard Worker 
892*5e7646d2SAndroid Build Coastguard Worker     cupsdSetString(&ServerName, temp);
893*5e7646d2SAndroid Build Coastguard Worker 
894*5e7646d2SAndroid Build Coastguard Worker     if (!ServerAlias)
895*5e7646d2SAndroid Build Coastguard Worker       ServerAlias = cupsArrayNew(NULL, NULL);
896*5e7646d2SAndroid Build Coastguard Worker 
897*5e7646d2SAndroid Build Coastguard Worker     cupsdAddAlias(ServerAlias, temp);
898*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp);
899*5e7646d2SAndroid Build Coastguard Worker 
900*5e7646d2SAndroid Build Coastguard Worker     if (HostNameLookups || RemotePort)
901*5e7646d2SAndroid Build Coastguard Worker     {
902*5e7646d2SAndroid Build Coastguard Worker       struct hostent	*host;		/* Host entry to get FQDN */
903*5e7646d2SAndroid Build Coastguard Worker 
904*5e7646d2SAndroid Build Coastguard Worker       if ((host = gethostbyname(temp)) != NULL)
905*5e7646d2SAndroid Build Coastguard Worker       {
906*5e7646d2SAndroid Build Coastguard Worker         if (_cups_strcasecmp(temp, host->h_name))
907*5e7646d2SAndroid Build Coastguard Worker         {
908*5e7646d2SAndroid Build Coastguard Worker 	  cupsdSetString(&ServerName, host->h_name);
909*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddAlias(ServerAlias, host->h_name);
910*5e7646d2SAndroid Build Coastguard Worker           cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s",
911*5e7646d2SAndroid Build Coastguard Worker 	                  host->h_name);
912*5e7646d2SAndroid Build Coastguard Worker 	}
913*5e7646d2SAndroid Build Coastguard Worker 
914*5e7646d2SAndroid Build Coastguard Worker         if (host->h_aliases)
915*5e7646d2SAndroid Build Coastguard Worker 	{
916*5e7646d2SAndroid Build Coastguard Worker           for (i = 0; host->h_aliases[i]; i ++)
917*5e7646d2SAndroid Build Coastguard Worker 	    if (_cups_strcasecmp(temp, host->h_aliases[i]))
918*5e7646d2SAndroid Build Coastguard Worker 	    {
919*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddAlias(ServerAlias, host->h_aliases[i]);
920*5e7646d2SAndroid Build Coastguard Worker 	      cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s",
921*5e7646d2SAndroid Build Coastguard Worker 	                      host->h_aliases[i]);
922*5e7646d2SAndroid Build Coastguard Worker 	    }
923*5e7646d2SAndroid Build Coastguard Worker 	}
924*5e7646d2SAndroid Build Coastguard Worker       }
925*5e7646d2SAndroid Build Coastguard Worker     }
926*5e7646d2SAndroid Build Coastguard Worker 
927*5e7646d2SAndroid Build Coastguard Worker    /*
928*5e7646d2SAndroid Build Coastguard Worker     * Make sure we have the base hostname added as an alias, too!
929*5e7646d2SAndroid Build Coastguard Worker     */
930*5e7646d2SAndroid Build Coastguard Worker 
931*5e7646d2SAndroid Build Coastguard Worker     if ((slash = strchr(temp, '.')) != NULL)
932*5e7646d2SAndroid Build Coastguard Worker     {
933*5e7646d2SAndroid Build Coastguard Worker       *slash = '\0';
934*5e7646d2SAndroid Build Coastguard Worker       cupsdAddAlias(ServerAlias, temp);
935*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp);
936*5e7646d2SAndroid Build Coastguard Worker     }
937*5e7646d2SAndroid Build Coastguard Worker   }
938*5e7646d2SAndroid Build Coastguard Worker 
939*5e7646d2SAndroid Build Coastguard Worker   for (slash = ServerName; isdigit(*slash & 255) || *slash == '.'; slash ++);
940*5e7646d2SAndroid Build Coastguard Worker 
941*5e7646d2SAndroid Build Coastguard Worker   ServerNameIsIP = !*slash;
942*5e7646d2SAndroid Build Coastguard Worker 
943*5e7646d2SAndroid Build Coastguard Worker  /*
944*5e7646d2SAndroid Build Coastguard Worker   * Make sure ServerAdmin is initialized...
945*5e7646d2SAndroid Build Coastguard Worker   */
946*5e7646d2SAndroid Build Coastguard Worker 
947*5e7646d2SAndroid Build Coastguard Worker   if (!ServerAdmin)
948*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&ServerAdmin, "root@%s", ServerName);
949*5e7646d2SAndroid Build Coastguard Worker 
950*5e7646d2SAndroid Build Coastguard Worker  /*
951*5e7646d2SAndroid Build Coastguard Worker   * Use the default system group if none was supplied in cupsd.conf...
952*5e7646d2SAndroid Build Coastguard Worker   */
953*5e7646d2SAndroid Build Coastguard Worker 
954*5e7646d2SAndroid Build Coastguard Worker   if (NumSystemGroups == 0)
955*5e7646d2SAndroid Build Coastguard Worker   {
956*5e7646d2SAndroid Build Coastguard Worker     if (!parse_groups(CUPS_DEFAULT_SYSTEM_GROUPS, 0))
957*5e7646d2SAndroid Build Coastguard Worker     {
958*5e7646d2SAndroid Build Coastguard Worker      /*
959*5e7646d2SAndroid Build Coastguard Worker       * Find the group associated with GID 0...
960*5e7646d2SAndroid Build Coastguard Worker       */
961*5e7646d2SAndroid Build Coastguard Worker 
962*5e7646d2SAndroid Build Coastguard Worker       group = getgrgid(0);
963*5e7646d2SAndroid Build Coastguard Worker       endgrent();
964*5e7646d2SAndroid Build Coastguard Worker 
965*5e7646d2SAndroid Build Coastguard Worker       if (group != NULL)
966*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetString(&SystemGroups[0], group->gr_name);
967*5e7646d2SAndroid Build Coastguard Worker       else
968*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetString(&SystemGroups[0], "unknown");
969*5e7646d2SAndroid Build Coastguard Worker 
970*5e7646d2SAndroid Build Coastguard Worker       SystemGroupIDs[0] = 0;
971*5e7646d2SAndroid Build Coastguard Worker       NumSystemGroups   = 1;
972*5e7646d2SAndroid Build Coastguard Worker     }
973*5e7646d2SAndroid Build Coastguard Worker   }
974*5e7646d2SAndroid Build Coastguard Worker 
975*5e7646d2SAndroid Build Coastguard Worker  /*
976*5e7646d2SAndroid Build Coastguard Worker   * Make sure ConfigFilePerm and LogFilePerm have sane values...
977*5e7646d2SAndroid Build Coastguard Worker   */
978*5e7646d2SAndroid Build Coastguard Worker 
979*5e7646d2SAndroid Build Coastguard Worker   ConfigFilePerm &= 0664;
980*5e7646d2SAndroid Build Coastguard Worker   LogFilePerm    &= 0664;
981*5e7646d2SAndroid Build Coastguard Worker 
982*5e7646d2SAndroid Build Coastguard Worker  /*
983*5e7646d2SAndroid Build Coastguard Worker   * Open the system log for cupsd if necessary...
984*5e7646d2SAndroid Build Coastguard Worker   */
985*5e7646d2SAndroid Build Coastguard Worker 
986*5e7646d2SAndroid Build Coastguard Worker   if (!LogStderr)
987*5e7646d2SAndroid Build Coastguard Worker   {
988*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(AccessLog, "stderr"))
989*5e7646d2SAndroid Build Coastguard Worker       cupsdSetString(&AccessLog, "syslog");
990*5e7646d2SAndroid Build Coastguard Worker 
991*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(ErrorLog, "stderr"))
992*5e7646d2SAndroid Build Coastguard Worker       cupsdSetString(&ErrorLog, "syslog");
993*5e7646d2SAndroid Build Coastguard Worker 
994*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(PageLog, "stderr"))
995*5e7646d2SAndroid Build Coastguard Worker       cupsdSetString(&PageLog, "syslog");
996*5e7646d2SAndroid Build Coastguard Worker   }
997*5e7646d2SAndroid Build Coastguard Worker 
998*5e7646d2SAndroid Build Coastguard Worker #if defined(HAVE_VSYSLOG) && !defined(HAVE_ASL_H) && !defined(HAVE_SYSTEMD_SD_JOURNAL_H)
999*5e7646d2SAndroid Build Coastguard Worker   if (!strcmp(AccessLog, "syslog") ||
1000*5e7646d2SAndroid Build Coastguard Worker       !strcmp(ErrorLog, "syslog") ||
1001*5e7646d2SAndroid Build Coastguard Worker       !strcmp(PageLog, "syslog"))
1002*5e7646d2SAndroid Build Coastguard Worker     openlog("cupsd", LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_LPR);
1003*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_VSYSLOG && !HAVE_ASL_H && !HAVE_SYSTEMD_SD_JOURNAL_H */
1004*5e7646d2SAndroid Build Coastguard Worker 
1005*5e7646d2SAndroid Build Coastguard Worker  /*
1006*5e7646d2SAndroid Build Coastguard Worker   * Log the configuration file that was used...
1007*5e7646d2SAndroid Build Coastguard Worker   */
1008*5e7646d2SAndroid Build Coastguard Worker 
1009*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_INFO, "Loaded configuration file \"%s\"",
1010*5e7646d2SAndroid Build Coastguard Worker                   ConfigurationFile);
1011*5e7646d2SAndroid Build Coastguard Worker 
1012*5e7646d2SAndroid Build Coastguard Worker  /*
1013*5e7646d2SAndroid Build Coastguard Worker   * Validate the Group and SystemGroup settings - they cannot be the same,
1014*5e7646d2SAndroid Build Coastguard Worker   * otherwise the CGI programs will be able to authenticate as root without
1015*5e7646d2SAndroid Build Coastguard Worker   * a password!
1016*5e7646d2SAndroid Build Coastguard Worker   */
1017*5e7646d2SAndroid Build Coastguard Worker 
1018*5e7646d2SAndroid Build Coastguard Worker   if (!RunUser)
1019*5e7646d2SAndroid Build Coastguard Worker   {
1020*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < NumSystemGroups; i ++)
1021*5e7646d2SAndroid Build Coastguard Worker       if (Group == SystemGroupIDs[i])
1022*5e7646d2SAndroid Build Coastguard Worker         break;
1023*5e7646d2SAndroid Build Coastguard Worker 
1024*5e7646d2SAndroid Build Coastguard Worker     if (i < NumSystemGroups)
1025*5e7646d2SAndroid Build Coastguard Worker     {
1026*5e7646d2SAndroid Build Coastguard Worker      /*
1027*5e7646d2SAndroid Build Coastguard Worker       * Log the error and reset the group to a safe value...
1028*5e7646d2SAndroid Build Coastguard Worker       */
1029*5e7646d2SAndroid Build Coastguard Worker 
1030*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
1031*5e7646d2SAndroid Build Coastguard Worker                       "Group and SystemGroup cannot use the same groups.");
1032*5e7646d2SAndroid Build Coastguard Worker       if (FatalErrors & (CUPSD_FATAL_CONFIG | CUPSD_FATAL_PERMISSIONS))
1033*5e7646d2SAndroid Build Coastguard Worker         return (0);
1034*5e7646d2SAndroid Build Coastguard Worker 
1035*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "Resetting Group to \"nobody\"...");
1036*5e7646d2SAndroid Build Coastguard Worker 
1037*5e7646d2SAndroid Build Coastguard Worker       group = getgrnam("nobody");
1038*5e7646d2SAndroid Build Coastguard Worker       endgrent();
1039*5e7646d2SAndroid Build Coastguard Worker 
1040*5e7646d2SAndroid Build Coastguard Worker       if (group != NULL)
1041*5e7646d2SAndroid Build Coastguard Worker 	Group = group->gr_gid;
1042*5e7646d2SAndroid Build Coastguard Worker       else
1043*5e7646d2SAndroid Build Coastguard Worker       {
1044*5e7646d2SAndroid Build Coastguard Worker        /*
1045*5e7646d2SAndroid Build Coastguard Worker 	* Use the (historical) NFS nobody group ID (-2 as a 16-bit twos-
1046*5e7646d2SAndroid Build Coastguard Worker 	* complement number...)
1047*5e7646d2SAndroid Build Coastguard Worker 	*/
1048*5e7646d2SAndroid Build Coastguard Worker 
1049*5e7646d2SAndroid Build Coastguard Worker 	Group = 65534;
1050*5e7646d2SAndroid Build Coastguard Worker       }
1051*5e7646d2SAndroid Build Coastguard Worker     }
1052*5e7646d2SAndroid Build Coastguard Worker   }
1053*5e7646d2SAndroid Build Coastguard Worker 
1054*5e7646d2SAndroid Build Coastguard Worker  /*
1055*5e7646d2SAndroid Build Coastguard Worker   * Check that we have at least one listen/port line; if not, report this
1056*5e7646d2SAndroid Build Coastguard Worker   * as an error and exit!
1057*5e7646d2SAndroid Build Coastguard Worker   */
1058*5e7646d2SAndroid Build Coastguard Worker 
1059*5e7646d2SAndroid Build Coastguard Worker   if (cupsArrayCount(Listeners) == 0)
1060*5e7646d2SAndroid Build Coastguard Worker   {
1061*5e7646d2SAndroid Build Coastguard Worker    /*
1062*5e7646d2SAndroid Build Coastguard Worker     * No listeners!
1063*5e7646d2SAndroid Build Coastguard Worker     */
1064*5e7646d2SAndroid Build Coastguard Worker 
1065*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_EMERG,
1066*5e7646d2SAndroid Build Coastguard Worker                     "No valid Listen or Port lines were found in the "
1067*5e7646d2SAndroid Build Coastguard Worker 		    "configuration file.");
1068*5e7646d2SAndroid Build Coastguard Worker 
1069*5e7646d2SAndroid Build Coastguard Worker    /*
1070*5e7646d2SAndroid Build Coastguard Worker     * Commit suicide...
1071*5e7646d2SAndroid Build Coastguard Worker     */
1072*5e7646d2SAndroid Build Coastguard Worker 
1073*5e7646d2SAndroid Build Coastguard Worker     cupsdEndProcess(getpid(), 0);
1074*5e7646d2SAndroid Build Coastguard Worker   }
1075*5e7646d2SAndroid Build Coastguard Worker 
1076*5e7646d2SAndroid Build Coastguard Worker  /*
1077*5e7646d2SAndroid Build Coastguard Worker   * Set the default locale using the language and charset...
1078*5e7646d2SAndroid Build Coastguard Worker   */
1079*5e7646d2SAndroid Build Coastguard Worker 
1080*5e7646d2SAndroid Build Coastguard Worker   cupsdSetStringf(&DefaultLocale, "%s.UTF-8", DefaultLanguage);
1081*5e7646d2SAndroid Build Coastguard Worker 
1082*5e7646d2SAndroid Build Coastguard Worker  /*
1083*5e7646d2SAndroid Build Coastguard Worker   * Update all relative filenames to include the full path from ServerRoot...
1084*5e7646d2SAndroid Build Coastguard Worker   */
1085*5e7646d2SAndroid Build Coastguard Worker 
1086*5e7646d2SAndroid Build Coastguard Worker   if (DocumentRoot[0] != '/')
1087*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&DocumentRoot, "%s/%s", ServerRoot, DocumentRoot);
1088*5e7646d2SAndroid Build Coastguard Worker 
1089*5e7646d2SAndroid Build Coastguard Worker   if (RequestRoot[0] != '/')
1090*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&RequestRoot, "%s/%s", ServerRoot, RequestRoot);
1091*5e7646d2SAndroid Build Coastguard Worker 
1092*5e7646d2SAndroid Build Coastguard Worker   if (ServerBin[0] != '/')
1093*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&ServerBin, "%s/%s", ServerRoot, ServerBin);
1094*5e7646d2SAndroid Build Coastguard Worker 
1095*5e7646d2SAndroid Build Coastguard Worker   if (StateDir[0] != '/')
1096*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&StateDir, "%s/%s", ServerRoot, StateDir);
1097*5e7646d2SAndroid Build Coastguard Worker 
1098*5e7646d2SAndroid Build Coastguard Worker   if (CacheDir[0] != '/')
1099*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&CacheDir, "%s/%s", ServerRoot, CacheDir);
1100*5e7646d2SAndroid Build Coastguard Worker 
1101*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
1102*5e7646d2SAndroid Build Coastguard Worker   if (!_cups_strcasecmp(ServerKeychain, "internal"))
1103*5e7646d2SAndroid Build Coastguard Worker     cupsdClearString(&ServerKeychain);
1104*5e7646d2SAndroid Build Coastguard Worker   else if (ServerKeychain[0] != '/')
1105*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&ServerKeychain, "%s/%s", ServerRoot, ServerKeychain);
1106*5e7646d2SAndroid Build Coastguard Worker 
1107*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_DEBUG, "Using keychain \"%s\" for server name \"%s\".", ServerKeychain ? ServerKeychain : "internal", ServerName);
1108*5e7646d2SAndroid Build Coastguard Worker   if (!CreateSelfSignedCerts)
1109*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_DEBUG, "Self-signed TLS certificate generation is disabled.");
1110*5e7646d2SAndroid Build Coastguard Worker   cupsSetServerCredentials(ServerKeychain, ServerName, CreateSelfSignedCerts);
1111*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
1112*5e7646d2SAndroid Build Coastguard Worker 
1113*5e7646d2SAndroid Build Coastguard Worker  /*
1114*5e7646d2SAndroid Build Coastguard Worker   * Make sure that directories and config files are owned and
1115*5e7646d2SAndroid Build Coastguard Worker   * writable by the user and group in the cupsd.conf file...
1116*5e7646d2SAndroid Build Coastguard Worker   */
1117*5e7646d2SAndroid Build Coastguard Worker 
1118*5e7646d2SAndroid Build Coastguard Worker   snprintf(temp, sizeof(temp), "%s/rss", CacheDir);
1119*5e7646d2SAndroid Build Coastguard Worker 
1120*5e7646d2SAndroid Build Coastguard Worker   if ((cupsdCheckPermissions(RequestRoot, NULL, 0710, RunUser,
1121*5e7646d2SAndroid Build Coastguard Worker 			     Group, 1, 1) < 0 ||
1122*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(CacheDir, NULL, 0770, RunUser,
1123*5e7646d2SAndroid Build Coastguard Worker 			     Group, 1, 1) < 0 ||
1124*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(temp, NULL, 0775, RunUser,
1125*5e7646d2SAndroid Build Coastguard Worker 			     Group, 1, 1) < 0 ||
1126*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(StateDir, NULL, 0755, RunUser,
1127*5e7646d2SAndroid Build Coastguard Worker 			     Group, 1, 1) < 0 ||
1128*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(StateDir, "certs", RunUser ? 0711 : 0511, User,
1129*5e7646d2SAndroid Build Coastguard Worker 			     SystemGroupIDs[0], 1, 1) < 0 ||
1130*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(ServerRoot, NULL, 0755, RunUser,
1131*5e7646d2SAndroid Build Coastguard Worker 			     Group, 1, 0) < 0 ||
1132*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(ServerRoot, "ppd", 0755, RunUser,
1133*5e7646d2SAndroid Build Coastguard Worker 			     Group, 1, 1) < 0 ||
1134*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(ServerRoot, "ssl", 0700, RunUser,
1135*5e7646d2SAndroid Build Coastguard Worker 			     Group, 1, 0) < 0 ||
1136*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(ConfigurationFile, NULL, ConfigFilePerm, RunUser,
1137*5e7646d2SAndroid Build Coastguard Worker 			     Group, 0, 0) < 0 ||
1138*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(CupsFilesFile, NULL, ConfigFilePerm, RunUser,
1139*5e7646d2SAndroid Build Coastguard Worker 			     Group, 0, 0) < 0 ||
1140*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(ServerRoot, "classes.conf", 0600, RunUser,
1141*5e7646d2SAndroid Build Coastguard Worker 			     Group, 0, 0) < 0 ||
1142*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(ServerRoot, "printers.conf", 0600, RunUser,
1143*5e7646d2SAndroid Build Coastguard Worker 			     Group, 0, 0) < 0 ||
1144*5e7646d2SAndroid Build Coastguard Worker        cupsdCheckPermissions(ServerRoot, "passwd.md5", 0600, User,
1145*5e7646d2SAndroid Build Coastguard Worker 			     Group, 0, 0) < 0) &&
1146*5e7646d2SAndroid Build Coastguard Worker       (FatalErrors & CUPSD_FATAL_PERMISSIONS))
1147*5e7646d2SAndroid Build Coastguard Worker     return (0);
1148*5e7646d2SAndroid Build Coastguard Worker 
1149*5e7646d2SAndroid Build Coastguard Worker  /*
1150*5e7646d2SAndroid Build Coastguard Worker   * Update TempDir to the default if it hasn't been set already...
1151*5e7646d2SAndroid Build Coastguard Worker   */
1152*5e7646d2SAndroid Build Coastguard Worker 
1153*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
1154*5e7646d2SAndroid Build Coastguard Worker   if (TempDir && !RunUser &&
1155*5e7646d2SAndroid Build Coastguard Worker       (!strncmp(TempDir, "/private/tmp", 12) || !strncmp(TempDir, "/tmp", 4)))
1156*5e7646d2SAndroid Build Coastguard Worker   {
1157*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot use %s for TempDir.", TempDir);
1158*5e7646d2SAndroid Build Coastguard Worker     cupsdClearString(&TempDir);
1159*5e7646d2SAndroid Build Coastguard Worker   }
1160*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
1161*5e7646d2SAndroid Build Coastguard Worker 
1162*5e7646d2SAndroid Build Coastguard Worker   if (!TempDir)
1163*5e7646d2SAndroid Build Coastguard Worker   {
1164*5e7646d2SAndroid Build Coastguard Worker #ifdef __APPLE__
1165*5e7646d2SAndroid Build Coastguard Worker     if ((tmpdir = getenv("TMPDIR")) != NULL &&
1166*5e7646d2SAndroid Build Coastguard Worker         strncmp(tmpdir, "/private/tmp", 12) && strncmp(tmpdir, "/tmp", 4))
1167*5e7646d2SAndroid Build Coastguard Worker #else
1168*5e7646d2SAndroid Build Coastguard Worker     if ((tmpdir = getenv("TMPDIR")) != NULL)
1169*5e7646d2SAndroid Build Coastguard Worker #endif /* __APPLE__ */
1170*5e7646d2SAndroid Build Coastguard Worker     {
1171*5e7646d2SAndroid Build Coastguard Worker      /*
1172*5e7646d2SAndroid Build Coastguard Worker       * TMPDIR is defined, see if it is OK for us to use...
1173*5e7646d2SAndroid Build Coastguard Worker       */
1174*5e7646d2SAndroid Build Coastguard Worker 
1175*5e7646d2SAndroid Build Coastguard Worker       if (stat(tmpdir, &tmpinfo))
1176*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to access TMPDIR (%s): %s",
1177*5e7646d2SAndroid Build Coastguard Worker 	                tmpdir, strerror(errno));
1178*5e7646d2SAndroid Build Coastguard Worker       else if (!S_ISDIR(tmpinfo.st_mode))
1179*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR, "TMPDIR (%s) is not a directory.",
1180*5e7646d2SAndroid Build Coastguard Worker 	                tmpdir);
1181*5e7646d2SAndroid Build Coastguard Worker       else if ((tmpinfo.st_uid != User || !(tmpinfo.st_mode & S_IWUSR)) &&
1182*5e7646d2SAndroid Build Coastguard Worker                (tmpinfo.st_gid != Group || !(tmpinfo.st_mode & S_IWGRP)) &&
1183*5e7646d2SAndroid Build Coastguard Worker 	       !(tmpinfo.st_mode & S_IWOTH))
1184*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR,
1185*5e7646d2SAndroid Build Coastguard Worker 	                "TMPDIR (%s) has the wrong permissions.", tmpdir);
1186*5e7646d2SAndroid Build Coastguard Worker       else
1187*5e7646d2SAndroid Build Coastguard Worker         cupsdSetString(&TempDir, tmpdir);
1188*5e7646d2SAndroid Build Coastguard Worker     }
1189*5e7646d2SAndroid Build Coastguard Worker   }
1190*5e7646d2SAndroid Build Coastguard Worker 
1191*5e7646d2SAndroid Build Coastguard Worker   if (!TempDir)
1192*5e7646d2SAndroid Build Coastguard Worker   {
1193*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_INFO, "Using default TempDir of %s/tmp...",
1194*5e7646d2SAndroid Build Coastguard Worker 		    RequestRoot);
1195*5e7646d2SAndroid Build Coastguard Worker     cupsdSetStringf(&TempDir, "%s/tmp", RequestRoot);
1196*5e7646d2SAndroid Build Coastguard Worker   }
1197*5e7646d2SAndroid Build Coastguard Worker 
1198*5e7646d2SAndroid Build Coastguard Worker   setenv("TMPDIR", TempDir, 1);
1199*5e7646d2SAndroid Build Coastguard Worker 
1200*5e7646d2SAndroid Build Coastguard Worker  /*
1201*5e7646d2SAndroid Build Coastguard Worker   * Make sure the temporary directory has the right permissions...
1202*5e7646d2SAndroid Build Coastguard Worker   */
1203*5e7646d2SAndroid Build Coastguard Worker 
1204*5e7646d2SAndroid Build Coastguard Worker   if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot)) ||
1205*5e7646d2SAndroid Build Coastguard Worker       access(TempDir, 0))
1206*5e7646d2SAndroid Build Coastguard Worker   {
1207*5e7646d2SAndroid Build Coastguard Worker    /*
1208*5e7646d2SAndroid Build Coastguard Worker     * Update ownership and permissions if the CUPS temp directory
1209*5e7646d2SAndroid Build Coastguard Worker     * is under the spool directory or does not exist...
1210*5e7646d2SAndroid Build Coastguard Worker     */
1211*5e7646d2SAndroid Build Coastguard Worker 
1212*5e7646d2SAndroid Build Coastguard Worker     if (cupsdCheckPermissions(TempDir, NULL, 01770, RunUser, Group, 1, 1) < 0 &&
1213*5e7646d2SAndroid Build Coastguard Worker 	(FatalErrors & CUPSD_FATAL_PERMISSIONS))
1214*5e7646d2SAndroid Build Coastguard Worker       return (0);
1215*5e7646d2SAndroid Build Coastguard Worker   }
1216*5e7646d2SAndroid Build Coastguard Worker 
1217*5e7646d2SAndroid Build Coastguard Worker  /*
1218*5e7646d2SAndroid Build Coastguard Worker   * Update environment variables...
1219*5e7646d2SAndroid Build Coastguard Worker   */
1220*5e7646d2SAndroid Build Coastguard Worker 
1221*5e7646d2SAndroid Build Coastguard Worker   cupsdUpdateEnv();
1222*5e7646d2SAndroid Build Coastguard Worker 
1223*5e7646d2SAndroid Build Coastguard Worker   /*
1224*5e7646d2SAndroid Build Coastguard Worker    * Validate the default error policy...
1225*5e7646d2SAndroid Build Coastguard Worker    */
1226*5e7646d2SAndroid Build Coastguard Worker 
1227*5e7646d2SAndroid Build Coastguard Worker   if (strcmp(ErrorPolicy, "retry-current-job") &&
1228*5e7646d2SAndroid Build Coastguard Worker       strcmp(ErrorPolicy, "abort-job") &&
1229*5e7646d2SAndroid Build Coastguard Worker       strcmp(ErrorPolicy, "retry-job") &&
1230*5e7646d2SAndroid Build Coastguard Worker       strcmp(ErrorPolicy, "stop-printer"))
1231*5e7646d2SAndroid Build Coastguard Worker   {
1232*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid ErrorPolicy \"%s\", resetting to \"stop-printer\".", ErrorPolicy);
1233*5e7646d2SAndroid Build Coastguard Worker     cupsdSetString(&ErrorPolicy, "stop-printer");
1234*5e7646d2SAndroid Build Coastguard Worker   }
1235*5e7646d2SAndroid Build Coastguard Worker 
1236*5e7646d2SAndroid Build Coastguard Worker  /*
1237*5e7646d2SAndroid Build Coastguard Worker   * Update default paper size setting as needed...
1238*5e7646d2SAndroid Build Coastguard Worker   */
1239*5e7646d2SAndroid Build Coastguard Worker 
1240*5e7646d2SAndroid Build Coastguard Worker   if (!DefaultPaperSize)
1241*5e7646d2SAndroid Build Coastguard Worker   {
1242*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_LIBPAPER
1243*5e7646d2SAndroid Build Coastguard Worker     char	*paper_result;		/* Paper size name from libpaper */
1244*5e7646d2SAndroid Build Coastguard Worker 
1245*5e7646d2SAndroid Build Coastguard Worker     if ((paper_result = systempapername()) != NULL)
1246*5e7646d2SAndroid Build Coastguard Worker       cupsdSetString(&DefaultPaperSize, paper_result);
1247*5e7646d2SAndroid Build Coastguard Worker     else
1248*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_LIBPAPER */
1249*5e7646d2SAndroid Build Coastguard Worker     if (!DefaultLanguage ||
1250*5e7646d2SAndroid Build Coastguard Worker         !_cups_strcasecmp(DefaultLanguage, "C") ||
1251*5e7646d2SAndroid Build Coastguard Worker         !_cups_strcasecmp(DefaultLanguage, "POSIX") ||
1252*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strcasecmp(DefaultLanguage, "en") ||
1253*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strncasecmp(DefaultLanguage, "en.", 3) ||
1254*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strncasecmp(DefaultLanguage, "en_US", 5) ||
1255*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strncasecmp(DefaultLanguage, "en_CA", 5) ||
1256*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strncasecmp(DefaultLanguage, "fr_CA", 5))
1257*5e7646d2SAndroid Build Coastguard Worker     {
1258*5e7646d2SAndroid Build Coastguard Worker      /*
1259*5e7646d2SAndroid Build Coastguard Worker       * These are the only locales that will default to "letter" size...
1260*5e7646d2SAndroid Build Coastguard Worker       */
1261*5e7646d2SAndroid Build Coastguard Worker 
1262*5e7646d2SAndroid Build Coastguard Worker       cupsdSetString(&DefaultPaperSize, "Letter");
1263*5e7646d2SAndroid Build Coastguard Worker     }
1264*5e7646d2SAndroid Build Coastguard Worker     else
1265*5e7646d2SAndroid Build Coastguard Worker       cupsdSetString(&DefaultPaperSize, "A4");
1266*5e7646d2SAndroid Build Coastguard Worker   }
1267*5e7646d2SAndroid Build Coastguard Worker 
1268*5e7646d2SAndroid Build Coastguard Worker  /*
1269*5e7646d2SAndroid Build Coastguard Worker   * Update classification setting as needed...
1270*5e7646d2SAndroid Build Coastguard Worker   */
1271*5e7646d2SAndroid Build Coastguard Worker 
1272*5e7646d2SAndroid Build Coastguard Worker   if (Classification && !_cups_strcasecmp(Classification, "none"))
1273*5e7646d2SAndroid Build Coastguard Worker     cupsdClearString(&Classification);
1274*5e7646d2SAndroid Build Coastguard Worker 
1275*5e7646d2SAndroid Build Coastguard Worker   if (Classification)
1276*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_INFO, "Security set to \"%s\"", Classification);
1277*5e7646d2SAndroid Build Coastguard Worker 
1278*5e7646d2SAndroid Build Coastguard Worker  /*
1279*5e7646d2SAndroid Build Coastguard Worker   * Check the MaxClients setting, and then allocate memory for it...
1280*5e7646d2SAndroid Build Coastguard Worker   */
1281*5e7646d2SAndroid Build Coastguard Worker 
1282*5e7646d2SAndroid Build Coastguard Worker   if (MaxClients > (MaxFDs / 3) || MaxClients <= 0)
1283*5e7646d2SAndroid Build Coastguard Worker   {
1284*5e7646d2SAndroid Build Coastguard Worker     if (MaxClients > 0)
1285*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
1286*5e7646d2SAndroid Build Coastguard Worker                       "MaxClients limited to 1/3 (%d) of the file descriptor "
1287*5e7646d2SAndroid Build Coastguard Worker 		      "limit (%d)...",
1288*5e7646d2SAndroid Build Coastguard Worker                       MaxFDs / 3, MaxFDs);
1289*5e7646d2SAndroid Build Coastguard Worker 
1290*5e7646d2SAndroid Build Coastguard Worker     MaxClients = MaxFDs / 3;
1291*5e7646d2SAndroid Build Coastguard Worker   }
1292*5e7646d2SAndroid Build Coastguard Worker 
1293*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_INFO, "Configured for up to %d clients.",
1294*5e7646d2SAndroid Build Coastguard Worker                   MaxClients);
1295*5e7646d2SAndroid Build Coastguard Worker 
1296*5e7646d2SAndroid Build Coastguard Worker  /*
1297*5e7646d2SAndroid Build Coastguard Worker   * Check the MaxActiveJobs setting; limit to 1/3 the available
1298*5e7646d2SAndroid Build Coastguard Worker   * file descriptors, since we need a pipe for each job...
1299*5e7646d2SAndroid Build Coastguard Worker   */
1300*5e7646d2SAndroid Build Coastguard Worker 
1301*5e7646d2SAndroid Build Coastguard Worker   if (MaxActiveJobs > (MaxFDs / 3))
1302*5e7646d2SAndroid Build Coastguard Worker     MaxActiveJobs = MaxFDs / 3;
1303*5e7646d2SAndroid Build Coastguard Worker 
1304*5e7646d2SAndroid Build Coastguard Worker  /*
1305*5e7646d2SAndroid Build Coastguard Worker   * Update the MaxClientsPerHost value, as needed...
1306*5e7646d2SAndroid Build Coastguard Worker   */
1307*5e7646d2SAndroid Build Coastguard Worker 
1308*5e7646d2SAndroid Build Coastguard Worker   if (MaxClientsPerHost <= 0)
1309*5e7646d2SAndroid Build Coastguard Worker     MaxClientsPerHost = MaxClients;
1310*5e7646d2SAndroid Build Coastguard Worker 
1311*5e7646d2SAndroid Build Coastguard Worker   if (MaxClientsPerHost > MaxClients)
1312*5e7646d2SAndroid Build Coastguard Worker     MaxClientsPerHost = MaxClients;
1313*5e7646d2SAndroid Build Coastguard Worker 
1314*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_INFO,
1315*5e7646d2SAndroid Build Coastguard Worker                   "Allowing up to %d client connections per host.",
1316*5e7646d2SAndroid Build Coastguard Worker                   MaxClientsPerHost);
1317*5e7646d2SAndroid Build Coastguard Worker 
1318*5e7646d2SAndroid Build Coastguard Worker  /*
1319*5e7646d2SAndroid Build Coastguard Worker   * Update the default policy, as needed...
1320*5e7646d2SAndroid Build Coastguard Worker   */
1321*5e7646d2SAndroid Build Coastguard Worker 
1322*5e7646d2SAndroid Build Coastguard Worker   if (DefaultPolicy)
1323*5e7646d2SAndroid Build Coastguard Worker     DefaultPolicyPtr = cupsdFindPolicy(DefaultPolicy);
1324*5e7646d2SAndroid Build Coastguard Worker   else
1325*5e7646d2SAndroid Build Coastguard Worker     DefaultPolicyPtr = NULL;
1326*5e7646d2SAndroid Build Coastguard Worker 
1327*5e7646d2SAndroid Build Coastguard Worker   if (!DefaultPolicyPtr)
1328*5e7646d2SAndroid Build Coastguard Worker   {
1329*5e7646d2SAndroid Build Coastguard Worker     cupsd_location_t	*po;		/* New policy operation */
1330*5e7646d2SAndroid Build Coastguard Worker 
1331*5e7646d2SAndroid Build Coastguard Worker 
1332*5e7646d2SAndroid Build Coastguard Worker     if (DefaultPolicy)
1333*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "Default policy \"%s\" not found.",
1334*5e7646d2SAndroid Build Coastguard Worker                       DefaultPolicy);
1335*5e7646d2SAndroid Build Coastguard Worker 
1336*5e7646d2SAndroid Build Coastguard Worker     cupsdSetString(&DefaultPolicy, "default");
1337*5e7646d2SAndroid Build Coastguard Worker 
1338*5e7646d2SAndroid Build Coastguard Worker     if ((DefaultPolicyPtr = cupsdFindPolicy("default")) != NULL)
1339*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
1340*5e7646d2SAndroid Build Coastguard Worker                       "Using policy \"default\" as the default.");
1341*5e7646d2SAndroid Build Coastguard Worker     else
1342*5e7646d2SAndroid Build Coastguard Worker     {
1343*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
1344*5e7646d2SAndroid Build Coastguard Worker                       "Creating CUPS default administrative policy:");
1345*5e7646d2SAndroid Build Coastguard Worker 
1346*5e7646d2SAndroid Build Coastguard Worker       DefaultPolicyPtr = p = cupsdAddPolicy("default");
1347*5e7646d2SAndroid Build Coastguard Worker 
1348*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "<Policy default>");
1349*5e7646d2SAndroid Build Coastguard Worker 
1350*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "JobPrivateAccess default");
1351*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_access), "@OWNER");
1352*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_access), "@SYSTEM");
1353*5e7646d2SAndroid Build Coastguard Worker 
1354*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "JobPrivateValues default");
1355*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "job-name");
1356*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "job-originating-host-name");
1357*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "job-originating-user-name");
1358*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "phone");
1359*5e7646d2SAndroid Build Coastguard Worker 
1360*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateAccess default");
1361*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->sub_access), "@OWNER");
1362*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->sub_access), "@SYSTEM");
1363*5e7646d2SAndroid Build Coastguard Worker 
1364*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateValues default");
1365*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "notify-events");
1366*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "notify-pull-method");
1367*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "notify-recipient-uri");
1368*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "notify-subscriber-user-name");
1369*5e7646d2SAndroid Build Coastguard Worker       cupsdAddString(&(p->job_attrs), "notify-user-data");
1370*5e7646d2SAndroid Build Coastguard Worker 
1371*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
1372*5e7646d2SAndroid Build Coastguard Worker                       "<Limit Create-Job Print-Job Print-URI Validate-Job>");
1373*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1374*5e7646d2SAndroid Build Coastguard Worker 
1375*5e7646d2SAndroid Build Coastguard Worker       po = cupsdAddPolicyOp(p, NULL, IPP_CREATE_JOB);
1376*5e7646d2SAndroid Build Coastguard Worker       po->order_type = CUPSD_AUTH_ALLOW;
1377*5e7646d2SAndroid Build Coastguard Worker 
1378*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_PRINT_JOB);
1379*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_PRINT_URI);
1380*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_VALIDATE_JOB);
1381*5e7646d2SAndroid Build Coastguard Worker 
1382*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1383*5e7646d2SAndroid Build Coastguard Worker 
1384*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
1385*5e7646d2SAndroid Build Coastguard Worker                       "<Limit Send-Document Send-URI Cancel-Job Hold-Job "
1386*5e7646d2SAndroid Build Coastguard Worker                       "Release-Job Restart-Job Purge-Jobs "
1387*5e7646d2SAndroid Build Coastguard Worker 		      "Set-Job-Attributes Create-Job-Subscription "
1388*5e7646d2SAndroid Build Coastguard Worker 		      "Renew-Subscription Cancel-Subscription "
1389*5e7646d2SAndroid Build Coastguard Worker 		      "Get-Notifications Reprocess-Job Cancel-Current-Job "
1390*5e7646d2SAndroid Build Coastguard Worker 		      "Suspend-Current-Job Resume-Job "
1391*5e7646d2SAndroid Build Coastguard Worker 		      "Cancel-My-Jobs Close-Job CUPS-Move-Job "
1392*5e7646d2SAndroid Build Coastguard Worker 		      "CUPS-Authenticate-Job CUPS-Get-Document>");
1393*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1394*5e7646d2SAndroid Build Coastguard Worker 
1395*5e7646d2SAndroid Build Coastguard Worker       po = cupsdAddPolicyOp(p, NULL, IPP_SEND_DOCUMENT);
1396*5e7646d2SAndroid Build Coastguard Worker       po->order_type = CUPSD_AUTH_ALLOW;
1397*5e7646d2SAndroid Build Coastguard Worker       po->level      = CUPSD_AUTH_USER;
1398*5e7646d2SAndroid Build Coastguard Worker 
1399*5e7646d2SAndroid Build Coastguard Worker       cupsdAddName(po, "@OWNER");
1400*5e7646d2SAndroid Build Coastguard Worker       cupsdAddName(po, "@SYSTEM");
1401*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "Require user @OWNER @SYSTEM");
1402*5e7646d2SAndroid Build Coastguard Worker 
1403*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_SEND_URI);
1404*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_CANCEL_JOB);
1405*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_HOLD_JOB);
1406*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_RELEASE_JOB);
1407*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_RESTART_JOB);
1408*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_PURGE_JOBS);
1409*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_SET_JOB_ATTRIBUTES);
1410*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_CREATE_JOB_SUBSCRIPTION);
1411*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_RENEW_SUBSCRIPTION);
1412*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_CANCEL_SUBSCRIPTION);
1413*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_GET_NOTIFICATIONS);
1414*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_REPROCESS_JOB);
1415*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_CANCEL_CURRENT_JOB);
1416*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_SUSPEND_CURRENT_JOB);
1417*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_RESUME_JOB);
1418*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_CANCEL_MY_JOBS);
1419*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_CLOSE_JOB);
1420*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_MOVE_JOB);
1421*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_AUTHENTICATE_JOB);
1422*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_GET_DOCUMENT);
1423*5e7646d2SAndroid Build Coastguard Worker 
1424*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1425*5e7646d2SAndroid Build Coastguard Worker 
1426*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
1427*5e7646d2SAndroid Build Coastguard Worker                       "<Limit Pause-Printer Resume-Printer "
1428*5e7646d2SAndroid Build Coastguard Worker                       "Set-Printer-Attributes Enable-Printer "
1429*5e7646d2SAndroid Build Coastguard Worker 		      "Disable-Printer Pause-Printer-After-Current-Job "
1430*5e7646d2SAndroid Build Coastguard Worker 		      "Hold-New-Jobs Release-Held-New-Jobs "
1431*5e7646d2SAndroid Build Coastguard Worker 		      "Deactivate-Printer Activate-Printer Restart-Printer "
1432*5e7646d2SAndroid Build Coastguard Worker 		      "Shutdown-Printer Startup-Printer Promote-Job "
1433*5e7646d2SAndroid Build Coastguard Worker 		      "Schedule-Job-After Cancel-Jobs CUPS-Add-Printer "
1434*5e7646d2SAndroid Build Coastguard Worker 		      "CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class "
1435*5e7646d2SAndroid Build Coastguard Worker 		      "CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>");
1436*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1437*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "AuthType Default");
1438*5e7646d2SAndroid Build Coastguard Worker 
1439*5e7646d2SAndroid Build Coastguard Worker       po = cupsdAddPolicyOp(p, NULL, IPP_PAUSE_PRINTER);
1440*5e7646d2SAndroid Build Coastguard Worker       po->order_type = CUPSD_AUTH_ALLOW;
1441*5e7646d2SAndroid Build Coastguard Worker       po->type       = CUPSD_AUTH_DEFAULT;
1442*5e7646d2SAndroid Build Coastguard Worker       po->level      = CUPSD_AUTH_USER;
1443*5e7646d2SAndroid Build Coastguard Worker 
1444*5e7646d2SAndroid Build Coastguard Worker       cupsdAddName(po, "@SYSTEM");
1445*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "Require user @SYSTEM");
1446*5e7646d2SAndroid Build Coastguard Worker 
1447*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_RESUME_PRINTER);
1448*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_SET_PRINTER_ATTRIBUTES);
1449*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_ENABLE_PRINTER);
1450*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_DISABLE_PRINTER);
1451*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB);
1452*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_HOLD_NEW_JOBS);
1453*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_RELEASE_HELD_NEW_JOBS);
1454*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_DEACTIVATE_PRINTER);
1455*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_ACTIVATE_PRINTER);
1456*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_RESTART_PRINTER);
1457*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_SHUTDOWN_PRINTER);
1458*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_STARTUP_PRINTER);
1459*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_PROMOTE_JOB);
1460*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_SCHEDULE_JOB_AFTER);
1461*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, IPP_CANCEL_JOBS);
1462*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_ADD_PRINTER);
1463*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_DELETE_PRINTER);
1464*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_ADD_CLASS);
1465*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_DELETE_CLASS);
1466*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_ACCEPT_JOBS);
1467*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_REJECT_JOBS);
1468*5e7646d2SAndroid Build Coastguard Worker       cupsdAddPolicyOp(p, po, CUPS_SET_DEFAULT);
1469*5e7646d2SAndroid Build Coastguard Worker 
1470*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1471*5e7646d2SAndroid Build Coastguard Worker 
1472*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "<Limit All>");
1473*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow");
1474*5e7646d2SAndroid Build Coastguard Worker 
1475*5e7646d2SAndroid Build Coastguard Worker       po = cupsdAddPolicyOp(p, NULL, IPP_ANY_OPERATION);
1476*5e7646d2SAndroid Build Coastguard Worker       po->order_type = CUPSD_AUTH_ALLOW;
1477*5e7646d2SAndroid Build Coastguard Worker 
1478*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "</Limit>");
1479*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO, "</Policy>");
1480*5e7646d2SAndroid Build Coastguard Worker     }
1481*5e7646d2SAndroid Build Coastguard Worker   }
1482*5e7646d2SAndroid Build Coastguard Worker 
1483*5e7646d2SAndroid Build Coastguard Worker   if (LogLevel >= CUPSD_LOG_DEBUG2)
1484*5e7646d2SAndroid Build Coastguard Worker   {
1485*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: NumPolicies=%d",
1486*5e7646d2SAndroid Build Coastguard Worker 		    cupsArrayCount(Policies));
1487*5e7646d2SAndroid Build Coastguard Worker     for (i = 0, p = (cupsd_policy_t *)cupsArrayFirst(Policies);
1488*5e7646d2SAndroid Build Coastguard Worker 	 p;
1489*5e7646d2SAndroid Build Coastguard Worker 	 i ++, p = (cupsd_policy_t *)cupsArrayNext(Policies))
1490*5e7646d2SAndroid Build Coastguard Worker     {
1491*5e7646d2SAndroid Build Coastguard Worker       int		j;		/* Looping var */
1492*5e7646d2SAndroid Build Coastguard Worker       cupsd_location_t	*loc;		/* Current location */
1493*5e7646d2SAndroid Build Coastguard Worker 
1494*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: Policies[%d]=\"%s\"", i, p->name);
1495*5e7646d2SAndroid Build Coastguard Worker 
1496*5e7646d2SAndroid Build Coastguard Worker       for (j = 0, loc = (cupsd_location_t *)cupsArrayFirst(p->ops); loc; j ++, loc = (cupsd_location_t *)cupsArrayNext(p->ops))
1497*5e7646d2SAndroid Build Coastguard Worker       {
1498*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration:     ops[%d]=%s", j, ippOpString(loc->op));
1499*5e7646d2SAndroid Build Coastguard Worker       }
1500*5e7646d2SAndroid Build Coastguard Worker     }
1501*5e7646d2SAndroid Build Coastguard Worker   }
1502*5e7646d2SAndroid Build Coastguard Worker 
1503*5e7646d2SAndroid Build Coastguard Worker  /*
1504*5e7646d2SAndroid Build Coastguard Worker   * If we are doing a full reload or the server root has changed, flush
1505*5e7646d2SAndroid Build Coastguard Worker   * the jobs, printers, etc. and start from scratch...
1506*5e7646d2SAndroid Build Coastguard Worker   */
1507*5e7646d2SAndroid Build Coastguard Worker 
1508*5e7646d2SAndroid Build Coastguard Worker   if (NeedReload == RELOAD_ALL ||
1509*5e7646d2SAndroid Build Coastguard Worker       old_remote_port != RemotePort ||
1510*5e7646d2SAndroid Build Coastguard Worker       !old_serverroot || !ServerRoot || strcmp(old_serverroot, ServerRoot) ||
1511*5e7646d2SAndroid Build Coastguard Worker       !old_requestroot || !RequestRoot || strcmp(old_requestroot, RequestRoot))
1512*5e7646d2SAndroid Build Coastguard Worker   {
1513*5e7646d2SAndroid Build Coastguard Worker     mime_type_t	*type;			/* Current type */
1514*5e7646d2SAndroid Build Coastguard Worker     char	mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE];
1515*5e7646d2SAndroid Build Coastguard Worker 					/* MIME type name */
1516*5e7646d2SAndroid Build Coastguard Worker 
1517*5e7646d2SAndroid Build Coastguard Worker 
1518*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_INFO, "Full reload is required.");
1519*5e7646d2SAndroid Build Coastguard Worker 
1520*5e7646d2SAndroid Build Coastguard Worker    /*
1521*5e7646d2SAndroid Build Coastguard Worker     * Free all memory...
1522*5e7646d2SAndroid Build Coastguard Worker     */
1523*5e7646d2SAndroid Build Coastguard Worker 
1524*5e7646d2SAndroid Build Coastguard Worker     cupsdDeleteAllSubscriptions();
1525*5e7646d2SAndroid Build Coastguard Worker     cupsdFreeAllJobs();
1526*5e7646d2SAndroid Build Coastguard Worker     cupsdDeleteAllPrinters();
1527*5e7646d2SAndroid Build Coastguard Worker 
1528*5e7646d2SAndroid Build Coastguard Worker     DefaultPrinter = NULL;
1529*5e7646d2SAndroid Build Coastguard Worker 
1530*5e7646d2SAndroid Build Coastguard Worker     if (MimeDatabase != NULL)
1531*5e7646d2SAndroid Build Coastguard Worker       mimeDelete(MimeDatabase);
1532*5e7646d2SAndroid Build Coastguard Worker 
1533*5e7646d2SAndroid Build Coastguard Worker     if (NumMimeTypes)
1534*5e7646d2SAndroid Build Coastguard Worker     {
1535*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < NumMimeTypes; i ++)
1536*5e7646d2SAndroid Build Coastguard Worker 	_cupsStrFree(MimeTypes[i]);
1537*5e7646d2SAndroid Build Coastguard Worker 
1538*5e7646d2SAndroid Build Coastguard Worker       free(MimeTypes);
1539*5e7646d2SAndroid Build Coastguard Worker     }
1540*5e7646d2SAndroid Build Coastguard Worker 
1541*5e7646d2SAndroid Build Coastguard Worker    /*
1542*5e7646d2SAndroid Build Coastguard Worker     * Read the MIME type and conversion database...
1543*5e7646d2SAndroid Build Coastguard Worker     */
1544*5e7646d2SAndroid Build Coastguard Worker 
1545*5e7646d2SAndroid Build Coastguard Worker     snprintf(temp, sizeof(temp), "%s/filter", ServerBin);
1546*5e7646d2SAndroid Build Coastguard Worker     snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir);
1547*5e7646d2SAndroid Build Coastguard Worker 
1548*5e7646d2SAndroid Build Coastguard Worker     MimeDatabase = mimeNew();
1549*5e7646d2SAndroid Build Coastguard Worker     mimeSetErrorCallback(MimeDatabase, mime_error_cb, NULL);
1550*5e7646d2SAndroid Build Coastguard Worker 
1551*5e7646d2SAndroid Build Coastguard Worker     MimeDatabase = mimeLoadTypes(MimeDatabase, mimedir);
1552*5e7646d2SAndroid Build Coastguard Worker     MimeDatabase = mimeLoadTypes(MimeDatabase, ServerRoot);
1553*5e7646d2SAndroid Build Coastguard Worker     MimeDatabase = mimeLoadFilters(MimeDatabase, mimedir, temp);
1554*5e7646d2SAndroid Build Coastguard Worker     MimeDatabase = mimeLoadFilters(MimeDatabase, ServerRoot, temp);
1555*5e7646d2SAndroid Build Coastguard Worker 
1556*5e7646d2SAndroid Build Coastguard Worker     if (!MimeDatabase)
1557*5e7646d2SAndroid Build Coastguard Worker     {
1558*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_EMERG,
1559*5e7646d2SAndroid Build Coastguard Worker                       "Unable to load MIME database from \"%s\" or \"%s\".",
1560*5e7646d2SAndroid Build Coastguard Worker 		      mimedir, ServerRoot);
1561*5e7646d2SAndroid Build Coastguard Worker       if (FatalErrors & CUPSD_FATAL_CONFIG)
1562*5e7646d2SAndroid Build Coastguard Worker         return (0);
1563*5e7646d2SAndroid Build Coastguard Worker     }
1564*5e7646d2SAndroid Build Coastguard Worker 
1565*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_INFO,
1566*5e7646d2SAndroid Build Coastguard Worker                     "Loaded MIME database from \"%s\" and \"%s\": %d types, "
1567*5e7646d2SAndroid Build Coastguard Worker 		    "%d filters...", mimedir, ServerRoot,
1568*5e7646d2SAndroid Build Coastguard Worker 		    mimeNumTypes(MimeDatabase), mimeNumFilters(MimeDatabase));
1569*5e7646d2SAndroid Build Coastguard Worker 
1570*5e7646d2SAndroid Build Coastguard Worker    /*
1571*5e7646d2SAndroid Build Coastguard Worker     * Create a list of MIME types for the document-format-supported
1572*5e7646d2SAndroid Build Coastguard Worker     * attribute...
1573*5e7646d2SAndroid Build Coastguard Worker     */
1574*5e7646d2SAndroid Build Coastguard Worker 
1575*5e7646d2SAndroid Build Coastguard Worker     NumMimeTypes = mimeNumTypes(MimeDatabase);
1576*5e7646d2SAndroid Build Coastguard Worker     if (!mimeType(MimeDatabase, "application", "octet-stream"))
1577*5e7646d2SAndroid Build Coastguard Worker       NumMimeTypes ++;
1578*5e7646d2SAndroid Build Coastguard Worker 
1579*5e7646d2SAndroid Build Coastguard Worker     if ((MimeTypes = calloc((size_t)NumMimeTypes, sizeof(const char *))) == NULL)
1580*5e7646d2SAndroid Build Coastguard Worker     {
1581*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
1582*5e7646d2SAndroid Build Coastguard Worker                       "Unable to allocate memory for %d MIME types.",
1583*5e7646d2SAndroid Build Coastguard Worker 		      NumMimeTypes);
1584*5e7646d2SAndroid Build Coastguard Worker       NumMimeTypes = 0;
1585*5e7646d2SAndroid Build Coastguard Worker     }
1586*5e7646d2SAndroid Build Coastguard Worker     else
1587*5e7646d2SAndroid Build Coastguard Worker     {
1588*5e7646d2SAndroid Build Coastguard Worker       for (i = 0, type = mimeFirstType(MimeDatabase);
1589*5e7646d2SAndroid Build Coastguard Worker 	   type;
1590*5e7646d2SAndroid Build Coastguard Worker 	   i ++, type = mimeNextType(MimeDatabase))
1591*5e7646d2SAndroid Build Coastguard Worker       {
1592*5e7646d2SAndroid Build Coastguard Worker 	snprintf(mimetype, sizeof(mimetype), "%s/%s", type->super, type->type);
1593*5e7646d2SAndroid Build Coastguard Worker 
1594*5e7646d2SAndroid Build Coastguard Worker 	MimeTypes[i] = _cupsStrAlloc(mimetype);
1595*5e7646d2SAndroid Build Coastguard Worker       }
1596*5e7646d2SAndroid Build Coastguard Worker 
1597*5e7646d2SAndroid Build Coastguard Worker       if (i < NumMimeTypes)
1598*5e7646d2SAndroid Build Coastguard Worker 	MimeTypes[i] = _cupsStrAlloc("application/octet-stream");
1599*5e7646d2SAndroid Build Coastguard Worker     }
1600*5e7646d2SAndroid Build Coastguard Worker 
1601*5e7646d2SAndroid Build Coastguard Worker     if (LogLevel == CUPSD_LOG_DEBUG2)
1602*5e7646d2SAndroid Build Coastguard Worker     {
1603*5e7646d2SAndroid Build Coastguard Worker       mime_filter_t	*filter;	/* Current filter */
1604*5e7646d2SAndroid Build Coastguard Worker 
1605*5e7646d2SAndroid Build Coastguard Worker 
1606*5e7646d2SAndroid Build Coastguard Worker       for (type = mimeFirstType(MimeDatabase);
1607*5e7646d2SAndroid Build Coastguard Worker            type;
1608*5e7646d2SAndroid Build Coastguard Worker 	   type = mimeNextType(MimeDatabase))
1609*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: type %s/%s",
1610*5e7646d2SAndroid Build Coastguard Worker 		        type->super, type->type);
1611*5e7646d2SAndroid Build Coastguard Worker 
1612*5e7646d2SAndroid Build Coastguard Worker       for (filter = mimeFirstFilter(MimeDatabase);
1613*5e7646d2SAndroid Build Coastguard Worker            filter;
1614*5e7646d2SAndroid Build Coastguard Worker 	   filter = mimeNextFilter(MimeDatabase))
1615*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_DEBUG2,
1616*5e7646d2SAndroid Build Coastguard Worker 	                "cupsdReadConfiguration: filter %s/%s to %s/%s %d %s",
1617*5e7646d2SAndroid Build Coastguard Worker 		        filter->src->super, filter->src->type,
1618*5e7646d2SAndroid Build Coastguard Worker 		        filter->dst->super, filter->dst->type,
1619*5e7646d2SAndroid Build Coastguard Worker 		        filter->cost, filter->filter);
1620*5e7646d2SAndroid Build Coastguard Worker     }
1621*5e7646d2SAndroid Build Coastguard Worker 
1622*5e7646d2SAndroid Build Coastguard Worker    /*
1623*5e7646d2SAndroid Build Coastguard Worker     * Load banners...
1624*5e7646d2SAndroid Build Coastguard Worker     */
1625*5e7646d2SAndroid Build Coastguard Worker 
1626*5e7646d2SAndroid Build Coastguard Worker     snprintf(temp, sizeof(temp), "%s/banners", DataDir);
1627*5e7646d2SAndroid Build Coastguard Worker     cupsdLoadBanners(temp);
1628*5e7646d2SAndroid Build Coastguard Worker 
1629*5e7646d2SAndroid Build Coastguard Worker    /*
1630*5e7646d2SAndroid Build Coastguard Worker     * Load printers and classes...
1631*5e7646d2SAndroid Build Coastguard Worker     */
1632*5e7646d2SAndroid Build Coastguard Worker 
1633*5e7646d2SAndroid Build Coastguard Worker     cupsdLoadAllPrinters();
1634*5e7646d2SAndroid Build Coastguard Worker     cupsdLoadAllClasses();
1635*5e7646d2SAndroid Build Coastguard Worker 
1636*5e7646d2SAndroid Build Coastguard Worker     cupsdCreateCommonData();
1637*5e7646d2SAndroid Build Coastguard Worker 
1638*5e7646d2SAndroid Build Coastguard Worker    /*
1639*5e7646d2SAndroid Build Coastguard Worker     * Update the printcap file as needed...
1640*5e7646d2SAndroid Build Coastguard Worker     */
1641*5e7646d2SAndroid Build Coastguard Worker 
1642*5e7646d2SAndroid Build Coastguard Worker     if (Printcap && *Printcap && access(Printcap, 0))
1643*5e7646d2SAndroid Build Coastguard Worker       cupsdWritePrintcap();
1644*5e7646d2SAndroid Build Coastguard Worker 
1645*5e7646d2SAndroid Build Coastguard Worker    /*
1646*5e7646d2SAndroid Build Coastguard Worker     * Load queued jobs...
1647*5e7646d2SAndroid Build Coastguard Worker     */
1648*5e7646d2SAndroid Build Coastguard Worker 
1649*5e7646d2SAndroid Build Coastguard Worker     cupsdLoadAllJobs();
1650*5e7646d2SAndroid Build Coastguard Worker 
1651*5e7646d2SAndroid Build Coastguard Worker    /*
1652*5e7646d2SAndroid Build Coastguard Worker     * Load subscriptions...
1653*5e7646d2SAndroid Build Coastguard Worker     */
1654*5e7646d2SAndroid Build Coastguard Worker 
1655*5e7646d2SAndroid Build Coastguard Worker     cupsdLoadAllSubscriptions();
1656*5e7646d2SAndroid Build Coastguard Worker 
1657*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_INFO, "Full reload complete.");
1658*5e7646d2SAndroid Build Coastguard Worker   }
1659*5e7646d2SAndroid Build Coastguard Worker   else
1660*5e7646d2SAndroid Build Coastguard Worker   {
1661*5e7646d2SAndroid Build Coastguard Worker    /*
1662*5e7646d2SAndroid Build Coastguard Worker     * Not a full reload, so recreate the common printer attributes...
1663*5e7646d2SAndroid Build Coastguard Worker     */
1664*5e7646d2SAndroid Build Coastguard Worker 
1665*5e7646d2SAndroid Build Coastguard Worker     cupsdCreateCommonData();
1666*5e7646d2SAndroid Build Coastguard Worker 
1667*5e7646d2SAndroid Build Coastguard Worker    /*
1668*5e7646d2SAndroid Build Coastguard Worker     * Update all jobs as needed...
1669*5e7646d2SAndroid Build Coastguard Worker     */
1670*5e7646d2SAndroid Build Coastguard Worker 
1671*5e7646d2SAndroid Build Coastguard Worker     cupsdUpdateJobs();
1672*5e7646d2SAndroid Build Coastguard Worker 
1673*5e7646d2SAndroid Build Coastguard Worker    /*
1674*5e7646d2SAndroid Build Coastguard Worker     * Update all printers as needed...
1675*5e7646d2SAndroid Build Coastguard Worker     */
1676*5e7646d2SAndroid Build Coastguard Worker 
1677*5e7646d2SAndroid Build Coastguard Worker     cupsdUpdatePrinters();
1678*5e7646d2SAndroid Build Coastguard Worker     cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP);
1679*5e7646d2SAndroid Build Coastguard Worker 
1680*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_INFO, "Partial reload complete.");
1681*5e7646d2SAndroid Build Coastguard Worker   }
1682*5e7646d2SAndroid Build Coastguard Worker 
1683*5e7646d2SAndroid Build Coastguard Worker  /*
1684*5e7646d2SAndroid Build Coastguard Worker   * Reset the reload state...
1685*5e7646d2SAndroid Build Coastguard Worker   */
1686*5e7646d2SAndroid Build Coastguard Worker 
1687*5e7646d2SAndroid Build Coastguard Worker   NeedReload = RELOAD_NONE;
1688*5e7646d2SAndroid Build Coastguard Worker 
1689*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&old_serverroot);
1690*5e7646d2SAndroid Build Coastguard Worker   cupsdClearString(&old_requestroot);
1691*5e7646d2SAndroid Build Coastguard Worker 
1692*5e7646d2SAndroid Build Coastguard Worker   return (1);
1693*5e7646d2SAndroid Build Coastguard Worker }
1694*5e7646d2SAndroid Build Coastguard Worker 
1695*5e7646d2SAndroid Build Coastguard Worker 
1696*5e7646d2SAndroid Build Coastguard Worker /*
1697*5e7646d2SAndroid Build Coastguard Worker  * 'get_address()' - Get an address + port number from a line.
1698*5e7646d2SAndroid Build Coastguard Worker  */
1699*5e7646d2SAndroid Build Coastguard Worker 
1700*5e7646d2SAndroid Build Coastguard Worker static http_addrlist_t *		/* O - Pointer to list if address good, NULL if bad */
get_address(const char * value,int defport)1701*5e7646d2SAndroid Build Coastguard Worker get_address(const char  *value,		/* I - Value string */
1702*5e7646d2SAndroid Build Coastguard Worker 	    int         defport)	/* I - Default port */
1703*5e7646d2SAndroid Build Coastguard Worker {
1704*5e7646d2SAndroid Build Coastguard Worker   char			buffer[1024],	/* Hostname + port number buffer */
1705*5e7646d2SAndroid Build Coastguard Worker 			defpname[255],	/* Default port name */
1706*5e7646d2SAndroid Build Coastguard Worker 			*hostname,	/* Hostname or IP */
1707*5e7646d2SAndroid Build Coastguard Worker 			*portname;	/* Port number or name */
1708*5e7646d2SAndroid Build Coastguard Worker   http_addrlist_t	*addrlist;	/* Address list */
1709*5e7646d2SAndroid Build Coastguard Worker 
1710*5e7646d2SAndroid Build Coastguard Worker 
1711*5e7646d2SAndroid Build Coastguard Worker  /*
1712*5e7646d2SAndroid Build Coastguard Worker   * Check for an empty value...
1713*5e7646d2SAndroid Build Coastguard Worker   */
1714*5e7646d2SAndroid Build Coastguard Worker 
1715*5e7646d2SAndroid Build Coastguard Worker   if (!*value)
1716*5e7646d2SAndroid Build Coastguard Worker   {
1717*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_ERROR, "Bad (empty) address.");
1718*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
1719*5e7646d2SAndroid Build Coastguard Worker   }
1720*5e7646d2SAndroid Build Coastguard Worker 
1721*5e7646d2SAndroid Build Coastguard Worker  /*
1722*5e7646d2SAndroid Build Coastguard Worker   * Grab a hostname and port number; if there is no colon and the port name
1723*5e7646d2SAndroid Build Coastguard Worker   * is only digits, then we have a port number by itself...
1724*5e7646d2SAndroid Build Coastguard Worker   */
1725*5e7646d2SAndroid Build Coastguard Worker 
1726*5e7646d2SAndroid Build Coastguard Worker   strlcpy(buffer, value, sizeof(buffer));
1727*5e7646d2SAndroid Build Coastguard Worker 
1728*5e7646d2SAndroid Build Coastguard Worker   if ((portname = strrchr(buffer, ':')) != NULL && !strchr(portname, ']'))
1729*5e7646d2SAndroid Build Coastguard Worker   {
1730*5e7646d2SAndroid Build Coastguard Worker     *portname++ = '\0';
1731*5e7646d2SAndroid Build Coastguard Worker     hostname = buffer;
1732*5e7646d2SAndroid Build Coastguard Worker   }
1733*5e7646d2SAndroid Build Coastguard Worker   else
1734*5e7646d2SAndroid Build Coastguard Worker   {
1735*5e7646d2SAndroid Build Coastguard Worker     for (portname = buffer; isdigit(*portname & 255); portname ++);
1736*5e7646d2SAndroid Build Coastguard Worker 
1737*5e7646d2SAndroid Build Coastguard Worker     if (*portname)
1738*5e7646d2SAndroid Build Coastguard Worker     {
1739*5e7646d2SAndroid Build Coastguard Worker      /*
1740*5e7646d2SAndroid Build Coastguard Worker       * Use the default port...
1741*5e7646d2SAndroid Build Coastguard Worker       */
1742*5e7646d2SAndroid Build Coastguard Worker 
1743*5e7646d2SAndroid Build Coastguard Worker       sprintf(defpname, "%d", defport);
1744*5e7646d2SAndroid Build Coastguard Worker       portname = defpname;
1745*5e7646d2SAndroid Build Coastguard Worker       hostname = buffer;
1746*5e7646d2SAndroid Build Coastguard Worker     }
1747*5e7646d2SAndroid Build Coastguard Worker     else
1748*5e7646d2SAndroid Build Coastguard Worker     {
1749*5e7646d2SAndroid Build Coastguard Worker      /*
1750*5e7646d2SAndroid Build Coastguard Worker       * The buffer contains just a port number...
1751*5e7646d2SAndroid Build Coastguard Worker       */
1752*5e7646d2SAndroid Build Coastguard Worker 
1753*5e7646d2SAndroid Build Coastguard Worker       portname = buffer;
1754*5e7646d2SAndroid Build Coastguard Worker       hostname = NULL;
1755*5e7646d2SAndroid Build Coastguard Worker     }
1756*5e7646d2SAndroid Build Coastguard Worker   }
1757*5e7646d2SAndroid Build Coastguard Worker 
1758*5e7646d2SAndroid Build Coastguard Worker   if (hostname && !strcmp(hostname, "*"))
1759*5e7646d2SAndroid Build Coastguard Worker     hostname = NULL;
1760*5e7646d2SAndroid Build Coastguard Worker 
1761*5e7646d2SAndroid Build Coastguard Worker  /*
1762*5e7646d2SAndroid Build Coastguard Worker   * Now lookup the address using httpAddrGetList()...
1763*5e7646d2SAndroid Build Coastguard Worker   */
1764*5e7646d2SAndroid Build Coastguard Worker 
1765*5e7646d2SAndroid Build Coastguard Worker   if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL)
1766*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_ERROR, "Hostname lookup for \"%s\" failed.",
1767*5e7646d2SAndroid Build Coastguard Worker                     hostname ? hostname : "(nil)");
1768*5e7646d2SAndroid Build Coastguard Worker 
1769*5e7646d2SAndroid Build Coastguard Worker   return (addrlist);
1770*5e7646d2SAndroid Build Coastguard Worker }
1771*5e7646d2SAndroid Build Coastguard Worker 
1772*5e7646d2SAndroid Build Coastguard Worker 
1773*5e7646d2SAndroid Build Coastguard Worker /*
1774*5e7646d2SAndroid Build Coastguard Worker  * 'get_addr_and_mask()' - Get an IP address and netmask.
1775*5e7646d2SAndroid Build Coastguard Worker  */
1776*5e7646d2SAndroid Build Coastguard Worker 
1777*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 on success, 0 on failure */
get_addr_and_mask(const char * value,unsigned * ip,unsigned * mask)1778*5e7646d2SAndroid Build Coastguard Worker get_addr_and_mask(const char *value,	/* I - String from config file */
1779*5e7646d2SAndroid Build Coastguard Worker                   unsigned   *ip,	/* O - Address value */
1780*5e7646d2SAndroid Build Coastguard Worker 		  unsigned   *mask)	/* O - Mask value */
1781*5e7646d2SAndroid Build Coastguard Worker {
1782*5e7646d2SAndroid Build Coastguard Worker   int		i, j,			/* Looping vars */
1783*5e7646d2SAndroid Build Coastguard Worker 		family,			/* Address family */
1784*5e7646d2SAndroid Build Coastguard Worker 		ipcount;		/* Count of fields in address */
1785*5e7646d2SAndroid Build Coastguard Worker   unsigned	ipval;			/* Value */
1786*5e7646d2SAndroid Build Coastguard Worker   const char	*maskval,		/* Pointer to start of mask value */
1787*5e7646d2SAndroid Build Coastguard Worker 		*ptr,			/* Pointer into value */
1788*5e7646d2SAndroid Build Coastguard Worker 		*ptr2;			/* ... */
1789*5e7646d2SAndroid Build Coastguard Worker 
1790*5e7646d2SAndroid Build Coastguard Worker 
1791*5e7646d2SAndroid Build Coastguard Worker  /*
1792*5e7646d2SAndroid Build Coastguard Worker   * Get the address...
1793*5e7646d2SAndroid Build Coastguard Worker   */
1794*5e7646d2SAndroid Build Coastguard Worker 
1795*5e7646d2SAndroid Build Coastguard Worker   ip[0]   = ip[1]   = ip[2]   = ip[3]   = 0x00000000;
1796*5e7646d2SAndroid Build Coastguard Worker   mask[0] = mask[1] = mask[2] = mask[3] = 0xffffffff;
1797*5e7646d2SAndroid Build Coastguard Worker 
1798*5e7646d2SAndroid Build Coastguard Worker   if ((maskval = strchr(value, '/')) != NULL)
1799*5e7646d2SAndroid Build Coastguard Worker     maskval ++;
1800*5e7646d2SAndroid Build Coastguard Worker   else
1801*5e7646d2SAndroid Build Coastguard Worker     maskval = value + strlen(value);
1802*5e7646d2SAndroid Build Coastguard Worker 
1803*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
1804*5e7646d2SAndroid Build Coastguard Worker  /*
1805*5e7646d2SAndroid Build Coastguard Worker   * Check for an IPv6 address...
1806*5e7646d2SAndroid Build Coastguard Worker   */
1807*5e7646d2SAndroid Build Coastguard Worker 
1808*5e7646d2SAndroid Build Coastguard Worker   if (*value == '[')
1809*5e7646d2SAndroid Build Coastguard Worker   {
1810*5e7646d2SAndroid Build Coastguard Worker    /*
1811*5e7646d2SAndroid Build Coastguard Worker     * Parse hexadecimal IPv6/IPv4 address...
1812*5e7646d2SAndroid Build Coastguard Worker     */
1813*5e7646d2SAndroid Build Coastguard Worker 
1814*5e7646d2SAndroid Build Coastguard Worker     family  = AF_INET6;
1815*5e7646d2SAndroid Build Coastguard Worker 
1816*5e7646d2SAndroid Build Coastguard Worker     for (i = 0, ptr = value + 1; *ptr && i < 8; i ++)
1817*5e7646d2SAndroid Build Coastguard Worker     {
1818*5e7646d2SAndroid Build Coastguard Worker       if (*ptr == ']')
1819*5e7646d2SAndroid Build Coastguard Worker         break;
1820*5e7646d2SAndroid Build Coastguard Worker       else if (!strncmp(ptr, "::", 2))
1821*5e7646d2SAndroid Build Coastguard Worker       {
1822*5e7646d2SAndroid Build Coastguard Worker         for (ptr2 = strchr(ptr + 2, ':'), j = 0;
1823*5e7646d2SAndroid Build Coastguard Worker 	     ptr2;
1824*5e7646d2SAndroid Build Coastguard Worker 	     ptr2 = strchr(ptr2 + 1, ':'), j ++);
1825*5e7646d2SAndroid Build Coastguard Worker 
1826*5e7646d2SAndroid Build Coastguard Worker         i = 6 - j;
1827*5e7646d2SAndroid Build Coastguard Worker 	ptr += 2;
1828*5e7646d2SAndroid Build Coastguard Worker       }
1829*5e7646d2SAndroid Build Coastguard Worker       else if (isdigit(*ptr & 255) && strchr(ptr + 1, '.') && i >= 6)
1830*5e7646d2SAndroid Build Coastguard Worker       {
1831*5e7646d2SAndroid Build Coastguard Worker        /*
1832*5e7646d2SAndroid Build Coastguard Worker         * Read IPv4 dotted quad...
1833*5e7646d2SAndroid Build Coastguard Worker         */
1834*5e7646d2SAndroid Build Coastguard Worker 
1835*5e7646d2SAndroid Build Coastguard Worker 	unsigned val[4] = { 0, 0, 0, 0 };
1836*5e7646d2SAndroid Build Coastguard Worker 					/* IPv4 address values */
1837*5e7646d2SAndroid Build Coastguard Worker 
1838*5e7646d2SAndroid Build Coastguard Worker 	ipcount = sscanf(ptr, "%u.%u.%u.%u", val + 0, val + 1, val + 2,
1839*5e7646d2SAndroid Build Coastguard Worker 	                 val + 3);
1840*5e7646d2SAndroid Build Coastguard Worker 
1841*5e7646d2SAndroid Build Coastguard Worker        /*
1842*5e7646d2SAndroid Build Coastguard Worker 	* Range check the IP numbers...
1843*5e7646d2SAndroid Build Coastguard Worker 	*/
1844*5e7646d2SAndroid Build Coastguard Worker 
1845*5e7646d2SAndroid Build Coastguard Worker 	for (i = 0; i < ipcount; i ++)
1846*5e7646d2SAndroid Build Coastguard Worker 	  if (val[i] > 255)
1847*5e7646d2SAndroid Build Coastguard Worker 	    return (0);
1848*5e7646d2SAndroid Build Coastguard Worker 
1849*5e7646d2SAndroid Build Coastguard Worker        /*
1850*5e7646d2SAndroid Build Coastguard Worker 	* Merge everything into a 32-bit IPv4 address in ip[3]...
1851*5e7646d2SAndroid Build Coastguard Worker 	*/
1852*5e7646d2SAndroid Build Coastguard Worker 
1853*5e7646d2SAndroid Build Coastguard Worker 	ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
1854*5e7646d2SAndroid Build Coastguard Worker 	         (unsigned)val[2]) << 8) | (unsigned)val[3];
1855*5e7646d2SAndroid Build Coastguard Worker 
1856*5e7646d2SAndroid Build Coastguard Worker 	if (ipcount < 4)
1857*5e7646d2SAndroid Build Coastguard Worker 	  mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
1858*5e7646d2SAndroid Build Coastguard Worker 
1859*5e7646d2SAndroid Build Coastguard Worker        /*
1860*5e7646d2SAndroid Build Coastguard Worker         * If the leading words are all 0's then this is an IPv4 address...
1861*5e7646d2SAndroid Build Coastguard Worker         */
1862*5e7646d2SAndroid Build Coastguard Worker 
1863*5e7646d2SAndroid Build Coastguard Worker         if (!val[0] && !val[1] && !val[2])
1864*5e7646d2SAndroid Build Coastguard Worker 	  family  = AF_INET;
1865*5e7646d2SAndroid Build Coastguard Worker 
1866*5e7646d2SAndroid Build Coastguard Worker         while (isdigit(*ptr & 255) || *ptr == '.')
1867*5e7646d2SAndroid Build Coastguard Worker           ptr ++;
1868*5e7646d2SAndroid Build Coastguard Worker 	break;
1869*5e7646d2SAndroid Build Coastguard Worker       }
1870*5e7646d2SAndroid Build Coastguard Worker       else if (isxdigit(*ptr & 255))
1871*5e7646d2SAndroid Build Coastguard Worker       {
1872*5e7646d2SAndroid Build Coastguard Worker         ipval = strtoul(ptr, (char **)&ptr, 16);
1873*5e7646d2SAndroid Build Coastguard Worker 
1874*5e7646d2SAndroid Build Coastguard Worker 	if (*ptr == ':' && ptr[1] != ':')
1875*5e7646d2SAndroid Build Coastguard Worker 	  ptr ++;
1876*5e7646d2SAndroid Build Coastguard Worker 
1877*5e7646d2SAndroid Build Coastguard Worker 	if (ipval > 0xffff)
1878*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
1879*5e7646d2SAndroid Build Coastguard Worker 
1880*5e7646d2SAndroid Build Coastguard Worker         if (i & 1)
1881*5e7646d2SAndroid Build Coastguard Worker           ip[i / 2] |= ipval;
1882*5e7646d2SAndroid Build Coastguard Worker 	else
1883*5e7646d2SAndroid Build Coastguard Worker           ip[i / 2] |= ipval << 16;
1884*5e7646d2SAndroid Build Coastguard Worker       }
1885*5e7646d2SAndroid Build Coastguard Worker       else
1886*5e7646d2SAndroid Build Coastguard Worker         return (0);
1887*5e7646d2SAndroid Build Coastguard Worker     }
1888*5e7646d2SAndroid Build Coastguard Worker 
1889*5e7646d2SAndroid Build Coastguard Worker     if (*ptr != ']')
1890*5e7646d2SAndroid Build Coastguard Worker       return (0);
1891*5e7646d2SAndroid Build Coastguard Worker 
1892*5e7646d2SAndroid Build Coastguard Worker     ptr ++;
1893*5e7646d2SAndroid Build Coastguard Worker 
1894*5e7646d2SAndroid Build Coastguard Worker     if (*ptr && *ptr != '/')
1895*5e7646d2SAndroid Build Coastguard Worker       return (0);
1896*5e7646d2SAndroid Build Coastguard Worker   }
1897*5e7646d2SAndroid Build Coastguard Worker   else
1898*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
1899*5e7646d2SAndroid Build Coastguard Worker   {
1900*5e7646d2SAndroid Build Coastguard Worker    /*
1901*5e7646d2SAndroid Build Coastguard Worker     * Parse dotted-decimal IPv4 address...
1902*5e7646d2SAndroid Build Coastguard Worker     */
1903*5e7646d2SAndroid Build Coastguard Worker 
1904*5e7646d2SAndroid Build Coastguard Worker     unsigned val[4] = { 0, 0, 0, 0 };	/* IPv4 address values */
1905*5e7646d2SAndroid Build Coastguard Worker 
1906*5e7646d2SAndroid Build Coastguard Worker 
1907*5e7646d2SAndroid Build Coastguard Worker     family  = AF_INET;
1908*5e7646d2SAndroid Build Coastguard Worker     ipcount = sscanf(value, "%u.%u.%u.%u", val + 0, val + 1, val + 2, val + 3);
1909*5e7646d2SAndroid Build Coastguard Worker 
1910*5e7646d2SAndroid Build Coastguard Worker    /*
1911*5e7646d2SAndroid Build Coastguard Worker     * Range check the IP numbers...
1912*5e7646d2SAndroid Build Coastguard Worker     */
1913*5e7646d2SAndroid Build Coastguard Worker 
1914*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < ipcount; i ++)
1915*5e7646d2SAndroid Build Coastguard Worker       if (val[i] > 255)
1916*5e7646d2SAndroid Build Coastguard Worker         return (0);
1917*5e7646d2SAndroid Build Coastguard Worker 
1918*5e7646d2SAndroid Build Coastguard Worker    /*
1919*5e7646d2SAndroid Build Coastguard Worker     * Merge everything into a 32-bit IPv4 address in ip[3]...
1920*5e7646d2SAndroid Build Coastguard Worker     */
1921*5e7646d2SAndroid Build Coastguard Worker 
1922*5e7646d2SAndroid Build Coastguard Worker     ip[3] = ((((((unsigned)val[0] << 8) | (unsigned)val[1]) << 8) |
1923*5e7646d2SAndroid Build Coastguard Worker              (unsigned)val[2]) << 8) | (unsigned)val[3];
1924*5e7646d2SAndroid Build Coastguard Worker 
1925*5e7646d2SAndroid Build Coastguard Worker     if (ipcount < 4)
1926*5e7646d2SAndroid Build Coastguard Worker       mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff;
1927*5e7646d2SAndroid Build Coastguard Worker   }
1928*5e7646d2SAndroid Build Coastguard Worker 
1929*5e7646d2SAndroid Build Coastguard Worker   if (*maskval)
1930*5e7646d2SAndroid Build Coastguard Worker   {
1931*5e7646d2SAndroid Build Coastguard Worker    /*
1932*5e7646d2SAndroid Build Coastguard Worker     * Get the netmask value(s)...
1933*5e7646d2SAndroid Build Coastguard Worker     */
1934*5e7646d2SAndroid Build Coastguard Worker 
1935*5e7646d2SAndroid Build Coastguard Worker     memset(mask, 0, sizeof(unsigned) * 4);
1936*5e7646d2SAndroid Build Coastguard Worker 
1937*5e7646d2SAndroid Build Coastguard Worker     if (strchr(maskval, '.'))
1938*5e7646d2SAndroid Build Coastguard Worker     {
1939*5e7646d2SAndroid Build Coastguard Worker      /*
1940*5e7646d2SAndroid Build Coastguard Worker       * Get dotted-decimal mask...
1941*5e7646d2SAndroid Build Coastguard Worker       */
1942*5e7646d2SAndroid Build Coastguard Worker 
1943*5e7646d2SAndroid Build Coastguard Worker       if (family != AF_INET)
1944*5e7646d2SAndroid Build Coastguard Worker         return (0);
1945*5e7646d2SAndroid Build Coastguard Worker 
1946*5e7646d2SAndroid Build Coastguard Worker       if (sscanf(maskval, "%u.%u.%u.%u", mask + 0, mask + 1, mask + 2,
1947*5e7646d2SAndroid Build Coastguard Worker                  mask + 3) != 4)
1948*5e7646d2SAndroid Build Coastguard Worker         return (0);
1949*5e7646d2SAndroid Build Coastguard Worker 
1950*5e7646d2SAndroid Build Coastguard Worker       mask[3] |= (((((unsigned)mask[0] << 8) | (unsigned)mask[1]) << 8) |
1951*5e7646d2SAndroid Build Coastguard Worker                   (unsigned)mask[2]) << 8;
1952*5e7646d2SAndroid Build Coastguard Worker       mask[0] = mask[1] = mask[2] = 0;
1953*5e7646d2SAndroid Build Coastguard Worker     }
1954*5e7646d2SAndroid Build Coastguard Worker     else
1955*5e7646d2SAndroid Build Coastguard Worker     {
1956*5e7646d2SAndroid Build Coastguard Worker      /*
1957*5e7646d2SAndroid Build Coastguard Worker       * Get address/bits format...
1958*5e7646d2SAndroid Build Coastguard Worker       */
1959*5e7646d2SAndroid Build Coastguard Worker 
1960*5e7646d2SAndroid Build Coastguard Worker       i = atoi(maskval);
1961*5e7646d2SAndroid Build Coastguard Worker 
1962*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
1963*5e7646d2SAndroid Build Coastguard Worker       if (family == AF_INET6)
1964*5e7646d2SAndroid Build Coastguard Worker       {
1965*5e7646d2SAndroid Build Coastguard Worker         if (i > 128)
1966*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
1967*5e7646d2SAndroid Build Coastguard Worker 
1968*5e7646d2SAndroid Build Coastguard Worker         i = 128 - i;
1969*5e7646d2SAndroid Build Coastguard Worker 
1970*5e7646d2SAndroid Build Coastguard Worker 	if (i <= 96)
1971*5e7646d2SAndroid Build Coastguard Worker 	  mask[0] = 0xffffffff;
1972*5e7646d2SAndroid Build Coastguard Worker 	else
1973*5e7646d2SAndroid Build Coastguard Worker 	  mask[0] = (0xffffffff << (i - 96)) & 0xffffffff;
1974*5e7646d2SAndroid Build Coastguard Worker 
1975*5e7646d2SAndroid Build Coastguard Worker 	if (i <= 64)
1976*5e7646d2SAndroid Build Coastguard Worker 	  mask[1] = 0xffffffff;
1977*5e7646d2SAndroid Build Coastguard Worker 	else if (i >= 96)
1978*5e7646d2SAndroid Build Coastguard Worker 	  mask[1] = 0;
1979*5e7646d2SAndroid Build Coastguard Worker 	else
1980*5e7646d2SAndroid Build Coastguard Worker 	  mask[1] = (0xffffffff << (i - 64)) & 0xffffffff;
1981*5e7646d2SAndroid Build Coastguard Worker 
1982*5e7646d2SAndroid Build Coastguard Worker 	if (i <= 32)
1983*5e7646d2SAndroid Build Coastguard Worker 	  mask[2] = 0xffffffff;
1984*5e7646d2SAndroid Build Coastguard Worker 	else if (i >= 64)
1985*5e7646d2SAndroid Build Coastguard Worker 	  mask[2] = 0;
1986*5e7646d2SAndroid Build Coastguard Worker 	else
1987*5e7646d2SAndroid Build Coastguard Worker 	  mask[2] = (0xffffffff << (i - 32)) & 0xffffffff;
1988*5e7646d2SAndroid Build Coastguard Worker 
1989*5e7646d2SAndroid Build Coastguard Worker 	if (i == 0)
1990*5e7646d2SAndroid Build Coastguard Worker 	  mask[3] = 0xffffffff;
1991*5e7646d2SAndroid Build Coastguard Worker 	else if (i >= 32)
1992*5e7646d2SAndroid Build Coastguard Worker 	  mask[3] = 0;
1993*5e7646d2SAndroid Build Coastguard Worker 	else
1994*5e7646d2SAndroid Build Coastguard Worker 	  mask[3] = (0xffffffff << i) & 0xffffffff;
1995*5e7646d2SAndroid Build Coastguard Worker       }
1996*5e7646d2SAndroid Build Coastguard Worker       else
1997*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
1998*5e7646d2SAndroid Build Coastguard Worker       {
1999*5e7646d2SAndroid Build Coastguard Worker         if (i > 32)
2000*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
2001*5e7646d2SAndroid Build Coastguard Worker 
2002*5e7646d2SAndroid Build Coastguard Worker         mask[0] = 0xffffffff;
2003*5e7646d2SAndroid Build Coastguard Worker         mask[1] = 0xffffffff;
2004*5e7646d2SAndroid Build Coastguard Worker         mask[2] = 0xffffffff;
2005*5e7646d2SAndroid Build Coastguard Worker 
2006*5e7646d2SAndroid Build Coastguard Worker 	if (i < 32)
2007*5e7646d2SAndroid Build Coastguard Worker           mask[3] = (0xffffffff << (32 - i)) & 0xffffffff;
2008*5e7646d2SAndroid Build Coastguard Worker 	else
2009*5e7646d2SAndroid Build Coastguard Worker 	  mask[3] = 0xffffffff;
2010*5e7646d2SAndroid Build Coastguard Worker       }
2011*5e7646d2SAndroid Build Coastguard Worker     }
2012*5e7646d2SAndroid Build Coastguard Worker   }
2013*5e7646d2SAndroid Build Coastguard Worker 
2014*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_DEBUG2,
2015*5e7646d2SAndroid Build Coastguard Worker                   "get_addr_and_mask(value=\"%s\", "
2016*5e7646d2SAndroid Build Coastguard Worker                   "ip=[%08x:%08x:%08x:%08x], mask=[%08x:%08x:%08x:%08x])",
2017*5e7646d2SAndroid Build Coastguard Worker              value, ip[0], ip[1], ip[2], ip[3], mask[0], mask[1], mask[2],
2018*5e7646d2SAndroid Build Coastguard Worker 	     mask[3]);
2019*5e7646d2SAndroid Build Coastguard Worker 
2020*5e7646d2SAndroid Build Coastguard Worker  /*
2021*5e7646d2SAndroid Build Coastguard Worker   * Check for a valid netmask; no fallback like in CUPS 1.1.x!
2022*5e7646d2SAndroid Build Coastguard Worker   */
2023*5e7646d2SAndroid Build Coastguard Worker 
2024*5e7646d2SAndroid Build Coastguard Worker   if ((ip[0] & ~mask[0]) != 0 ||
2025*5e7646d2SAndroid Build Coastguard Worker       (ip[1] & ~mask[1]) != 0 ||
2026*5e7646d2SAndroid Build Coastguard Worker       (ip[2] & ~mask[2]) != 0 ||
2027*5e7646d2SAndroid Build Coastguard Worker       (ip[3] & ~mask[3]) != 0)
2028*5e7646d2SAndroid Build Coastguard Worker     return (0);
2029*5e7646d2SAndroid Build Coastguard Worker 
2030*5e7646d2SAndroid Build Coastguard Worker   return (1);
2031*5e7646d2SAndroid Build Coastguard Worker }
2032*5e7646d2SAndroid Build Coastguard Worker 
2033*5e7646d2SAndroid Build Coastguard Worker 
2034*5e7646d2SAndroid Build Coastguard Worker /*
2035*5e7646d2SAndroid Build Coastguard Worker  * 'mime_error_cb()' - Log a MIME error.
2036*5e7646d2SAndroid Build Coastguard Worker  */
2037*5e7646d2SAndroid Build Coastguard Worker 
2038*5e7646d2SAndroid Build Coastguard Worker static void
mime_error_cb(void * ctx,const char * message)2039*5e7646d2SAndroid Build Coastguard Worker mime_error_cb(void       *ctx,		/* I - Context pointer (unused) */
2040*5e7646d2SAndroid Build Coastguard Worker               const char *message)	/* I - Message */
2041*5e7646d2SAndroid Build Coastguard Worker {
2042*5e7646d2SAndroid Build Coastguard Worker   (void)ctx;
2043*5e7646d2SAndroid Build Coastguard Worker 
2044*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_ERROR, "%s", message);
2045*5e7646d2SAndroid Build Coastguard Worker }
2046*5e7646d2SAndroid Build Coastguard Worker 
2047*5e7646d2SAndroid Build Coastguard Worker 
2048*5e7646d2SAndroid Build Coastguard Worker /*
2049*5e7646d2SAndroid Build Coastguard Worker  * 'parse_aaa()' - Parse authentication, authorization, and access control lines.
2050*5e7646d2SAndroid Build Coastguard Worker  */
2051*5e7646d2SAndroid Build Coastguard Worker 
2052*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 on success, 0 on failure */
parse_aaa(cupsd_location_t * loc,char * line,char * value,int linenum)2053*5e7646d2SAndroid Build Coastguard Worker parse_aaa(cupsd_location_t *loc,	/* I - Location */
2054*5e7646d2SAndroid Build Coastguard Worker           char             *line,	/* I - Line from file */
2055*5e7646d2SAndroid Build Coastguard Worker 	  char             *value,	/* I - Start of value data */
2056*5e7646d2SAndroid Build Coastguard Worker 	  int              linenum)	/* I - Current line number */
2057*5e7646d2SAndroid Build Coastguard Worker {
2058*5e7646d2SAndroid Build Coastguard Worker   char		*valptr;		/* Pointer into value */
2059*5e7646d2SAndroid Build Coastguard Worker   unsigned	ip[4],			/* IP address components */
2060*5e7646d2SAndroid Build Coastguard Worker  		mask[4];		/* IP netmask components */
2061*5e7646d2SAndroid Build Coastguard Worker 
2062*5e7646d2SAndroid Build Coastguard Worker 
2063*5e7646d2SAndroid Build Coastguard Worker   if (!_cups_strcasecmp(line, "Encryption"))
2064*5e7646d2SAndroid Build Coastguard Worker   {
2065*5e7646d2SAndroid Build Coastguard Worker    /*
2066*5e7646d2SAndroid Build Coastguard Worker     * "Encryption xxx" - set required encryption level...
2067*5e7646d2SAndroid Build Coastguard Worker     */
2068*5e7646d2SAndroid Build Coastguard Worker 
2069*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(value, "never"))
2070*5e7646d2SAndroid Build Coastguard Worker       loc->encryption = HTTP_ENCRYPT_NEVER;
2071*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "always"))
2072*5e7646d2SAndroid Build Coastguard Worker     {
2073*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
2074*5e7646d2SAndroid Build Coastguard Worker                       "Encryption value \"%s\" on line %d of %s is invalid in this "
2075*5e7646d2SAndroid Build Coastguard Worker 		      "context. Using \"required\" instead.", value, linenum, ConfigurationFile);
2076*5e7646d2SAndroid Build Coastguard Worker 
2077*5e7646d2SAndroid Build Coastguard Worker       loc->encryption = HTTP_ENCRYPT_REQUIRED;
2078*5e7646d2SAndroid Build Coastguard Worker     }
2079*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "required"))
2080*5e7646d2SAndroid Build Coastguard Worker       loc->encryption = HTTP_ENCRYPT_REQUIRED;
2081*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "ifrequested"))
2082*5e7646d2SAndroid Build Coastguard Worker       loc->encryption = HTTP_ENCRYPT_IF_REQUESTED;
2083*5e7646d2SAndroid Build Coastguard Worker     else
2084*5e7646d2SAndroid Build Coastguard Worker     {
2085*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
2086*5e7646d2SAndroid Build Coastguard Worker                       "Unknown Encryption value %s on line %d of %s.", value, linenum, ConfigurationFile);
2087*5e7646d2SAndroid Build Coastguard Worker       return (0);
2088*5e7646d2SAndroid Build Coastguard Worker     }
2089*5e7646d2SAndroid Build Coastguard Worker   }
2090*5e7646d2SAndroid Build Coastguard Worker   else if (!_cups_strcasecmp(line, "Order"))
2091*5e7646d2SAndroid Build Coastguard Worker   {
2092*5e7646d2SAndroid Build Coastguard Worker    /*
2093*5e7646d2SAndroid Build Coastguard Worker     * "Order Deny,Allow" or "Order Allow,Deny"...
2094*5e7646d2SAndroid Build Coastguard Worker     */
2095*5e7646d2SAndroid Build Coastguard Worker 
2096*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strncasecmp(value, "deny", 4))
2097*5e7646d2SAndroid Build Coastguard Worker       loc->order_type = CUPSD_AUTH_ALLOW;
2098*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strncasecmp(value, "allow", 5))
2099*5e7646d2SAndroid Build Coastguard Worker       loc->order_type = CUPSD_AUTH_DENY;
2100*5e7646d2SAndroid Build Coastguard Worker     else
2101*5e7646d2SAndroid Build Coastguard Worker     {
2102*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d of %s.",
2103*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum, ConfigurationFile);
2104*5e7646d2SAndroid Build Coastguard Worker       return (0);
2105*5e7646d2SAndroid Build Coastguard Worker     }
2106*5e7646d2SAndroid Build Coastguard Worker   }
2107*5e7646d2SAndroid Build Coastguard Worker   else if (!_cups_strcasecmp(line, "Allow") || !_cups_strcasecmp(line, "Deny"))
2108*5e7646d2SAndroid Build Coastguard Worker   {
2109*5e7646d2SAndroid Build Coastguard Worker    /*
2110*5e7646d2SAndroid Build Coastguard Worker     * Allow [From] host/ip...
2111*5e7646d2SAndroid Build Coastguard Worker     * Deny [From] host/ip...
2112*5e7646d2SAndroid Build Coastguard Worker     */
2113*5e7646d2SAndroid Build Coastguard Worker 
2114*5e7646d2SAndroid Build Coastguard Worker     while (*value)
2115*5e7646d2SAndroid Build Coastguard Worker     {
2116*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strncasecmp(value, "from", 4))
2117*5e7646d2SAndroid Build Coastguard Worker       {
2118*5e7646d2SAndroid Build Coastguard Worker        /*
2119*5e7646d2SAndroid Build Coastguard Worker 	* Strip leading "from"...
2120*5e7646d2SAndroid Build Coastguard Worker 	*/
2121*5e7646d2SAndroid Build Coastguard Worker 
2122*5e7646d2SAndroid Build Coastguard Worker 	value += 4;
2123*5e7646d2SAndroid Build Coastguard Worker 
2124*5e7646d2SAndroid Build Coastguard Worker 	while (_cups_isspace(*value))
2125*5e7646d2SAndroid Build Coastguard Worker 	  value ++;
2126*5e7646d2SAndroid Build Coastguard Worker 
2127*5e7646d2SAndroid Build Coastguard Worker         if (!*value)
2128*5e7646d2SAndroid Build Coastguard Worker 	  break;
2129*5e7646d2SAndroid Build Coastguard Worker       }
2130*5e7646d2SAndroid Build Coastguard Worker 
2131*5e7646d2SAndroid Build Coastguard Worker      /*
2132*5e7646d2SAndroid Build Coastguard Worker       * Find the end of the value...
2133*5e7646d2SAndroid Build Coastguard Worker       */
2134*5e7646d2SAndroid Build Coastguard Worker 
2135*5e7646d2SAndroid Build Coastguard Worker       for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++);
2136*5e7646d2SAndroid Build Coastguard Worker 
2137*5e7646d2SAndroid Build Coastguard Worker       while (_cups_isspace(*valptr))
2138*5e7646d2SAndroid Build Coastguard Worker         *valptr++ = '\0';
2139*5e7646d2SAndroid Build Coastguard Worker 
2140*5e7646d2SAndroid Build Coastguard Worker      /*
2141*5e7646d2SAndroid Build Coastguard Worker       * Figure out what form the allow/deny address takes:
2142*5e7646d2SAndroid Build Coastguard Worker       *
2143*5e7646d2SAndroid Build Coastguard Worker       *    All
2144*5e7646d2SAndroid Build Coastguard Worker       *    None
2145*5e7646d2SAndroid Build Coastguard Worker       *    *.domain.com
2146*5e7646d2SAndroid Build Coastguard Worker       *    .domain.com
2147*5e7646d2SAndroid Build Coastguard Worker       *    host.domain.com
2148*5e7646d2SAndroid Build Coastguard Worker       *    nnn.*
2149*5e7646d2SAndroid Build Coastguard Worker       *    nnn.nnn.*
2150*5e7646d2SAndroid Build Coastguard Worker       *    nnn.nnn.nnn.*
2151*5e7646d2SAndroid Build Coastguard Worker       *    nnn.nnn.nnn.nnn
2152*5e7646d2SAndroid Build Coastguard Worker       *    nnn.nnn.nnn.nnn/mm
2153*5e7646d2SAndroid Build Coastguard Worker       *    nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
2154*5e7646d2SAndroid Build Coastguard Worker       */
2155*5e7646d2SAndroid Build Coastguard Worker 
2156*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "all"))
2157*5e7646d2SAndroid Build Coastguard Worker       {
2158*5e7646d2SAndroid Build Coastguard Worker        /*
2159*5e7646d2SAndroid Build Coastguard Worker 	* All hosts...
2160*5e7646d2SAndroid Build Coastguard Worker 	*/
2161*5e7646d2SAndroid Build Coastguard Worker 
2162*5e7646d2SAndroid Build Coastguard Worker 	if (!_cups_strcasecmp(line, "Allow"))
2163*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddIPMask(&(loc->allow), zeros, zeros);
2164*5e7646d2SAndroid Build Coastguard Worker 	else
2165*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddIPMask(&(loc->deny), zeros, zeros);
2166*5e7646d2SAndroid Build Coastguard Worker       }
2167*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "none"))
2168*5e7646d2SAndroid Build Coastguard Worker       {
2169*5e7646d2SAndroid Build Coastguard Worker        /*
2170*5e7646d2SAndroid Build Coastguard Worker 	* No hosts...
2171*5e7646d2SAndroid Build Coastguard Worker 	*/
2172*5e7646d2SAndroid Build Coastguard Worker 
2173*5e7646d2SAndroid Build Coastguard Worker 	if (!_cups_strcasecmp(line, "Allow"))
2174*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddIPMask(&(loc->allow), ones, zeros);
2175*5e7646d2SAndroid Build Coastguard Worker 	else
2176*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddIPMask(&(loc->deny), ones, zeros);
2177*5e7646d2SAndroid Build Coastguard Worker       }
2178*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_INET6
2179*5e7646d2SAndroid Build Coastguard Worker       else if (value[0] == '*' || value[0] == '.' ||
2180*5e7646d2SAndroid Build Coastguard Worker 	       (!isdigit(value[0] & 255) && value[0] != '['))
2181*5e7646d2SAndroid Build Coastguard Worker #else
2182*5e7646d2SAndroid Build Coastguard Worker       else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255))
2183*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_INET6 */
2184*5e7646d2SAndroid Build Coastguard Worker       {
2185*5e7646d2SAndroid Build Coastguard Worker        /*
2186*5e7646d2SAndroid Build Coastguard Worker 	* Host or domain name...
2187*5e7646d2SAndroid Build Coastguard Worker 	*/
2188*5e7646d2SAndroid Build Coastguard Worker 
2189*5e7646d2SAndroid Build Coastguard Worker 	if (value[0] == '*')
2190*5e7646d2SAndroid Build Coastguard Worker 	  value ++;
2191*5e7646d2SAndroid Build Coastguard Worker 
2192*5e7646d2SAndroid Build Coastguard Worker 	if (!_cups_strcasecmp(line, "Allow"))
2193*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddNameMask(&(loc->allow), value);
2194*5e7646d2SAndroid Build Coastguard Worker 	else
2195*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddNameMask(&(loc->deny), value);
2196*5e7646d2SAndroid Build Coastguard Worker       }
2197*5e7646d2SAndroid Build Coastguard Worker       else
2198*5e7646d2SAndroid Build Coastguard Worker       {
2199*5e7646d2SAndroid Build Coastguard Worker        /*
2200*5e7646d2SAndroid Build Coastguard Worker 	* One of many IP address forms...
2201*5e7646d2SAndroid Build Coastguard Worker 	*/
2202*5e7646d2SAndroid Build Coastguard Worker 
2203*5e7646d2SAndroid Build Coastguard Worker 	if (!get_addr_and_mask(value, ip, mask))
2204*5e7646d2SAndroid Build Coastguard Worker 	{
2205*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d of %s.",
2206*5e7646d2SAndroid Build Coastguard Worker 			  value, linenum, ConfigurationFile);
2207*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
2208*5e7646d2SAndroid Build Coastguard Worker 	}
2209*5e7646d2SAndroid Build Coastguard Worker 
2210*5e7646d2SAndroid Build Coastguard Worker 	if (!_cups_strcasecmp(line, "Allow"))
2211*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddIPMask(&(loc->allow), ip, mask);
2212*5e7646d2SAndroid Build Coastguard Worker 	else
2213*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddIPMask(&(loc->deny), ip, mask);
2214*5e7646d2SAndroid Build Coastguard Worker       }
2215*5e7646d2SAndroid Build Coastguard Worker 
2216*5e7646d2SAndroid Build Coastguard Worker      /*
2217*5e7646d2SAndroid Build Coastguard Worker       * Advance to next value...
2218*5e7646d2SAndroid Build Coastguard Worker       */
2219*5e7646d2SAndroid Build Coastguard Worker 
2220*5e7646d2SAndroid Build Coastguard Worker       value = valptr;
2221*5e7646d2SAndroid Build Coastguard Worker     }
2222*5e7646d2SAndroid Build Coastguard Worker   }
2223*5e7646d2SAndroid Build Coastguard Worker   else if (!_cups_strcasecmp(line, "AuthType"))
2224*5e7646d2SAndroid Build Coastguard Worker   {
2225*5e7646d2SAndroid Build Coastguard Worker    /*
2226*5e7646d2SAndroid Build Coastguard Worker     * AuthType {none,basic,digest,basicdigest,negotiate,default}
2227*5e7646d2SAndroid Build Coastguard Worker     */
2228*5e7646d2SAndroid Build Coastguard Worker 
2229*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(value, "none"))
2230*5e7646d2SAndroid Build Coastguard Worker     {
2231*5e7646d2SAndroid Build Coastguard Worker       loc->type  = CUPSD_AUTH_NONE;
2232*5e7646d2SAndroid Build Coastguard Worker       loc->level = CUPSD_AUTH_ANON;
2233*5e7646d2SAndroid Build Coastguard Worker     }
2234*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "basic"))
2235*5e7646d2SAndroid Build Coastguard Worker     {
2236*5e7646d2SAndroid Build Coastguard Worker       loc->type = CUPSD_AUTH_BASIC;
2237*5e7646d2SAndroid Build Coastguard Worker 
2238*5e7646d2SAndroid Build Coastguard Worker       if (loc->level == CUPSD_AUTH_ANON)
2239*5e7646d2SAndroid Build Coastguard Worker 	loc->level = CUPSD_AUTH_USER;
2240*5e7646d2SAndroid Build Coastguard Worker     }
2241*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "default"))
2242*5e7646d2SAndroid Build Coastguard Worker     {
2243*5e7646d2SAndroid Build Coastguard Worker       loc->type = CUPSD_AUTH_DEFAULT;
2244*5e7646d2SAndroid Build Coastguard Worker 
2245*5e7646d2SAndroid Build Coastguard Worker       if (loc->level == CUPSD_AUTH_ANON)
2246*5e7646d2SAndroid Build Coastguard Worker 	loc->level = CUPSD_AUTH_USER;
2247*5e7646d2SAndroid Build Coastguard Worker     }
2248*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "negotiate"))
2249*5e7646d2SAndroid Build Coastguard Worker     {
2250*5e7646d2SAndroid Build Coastguard Worker       loc->type = CUPSD_AUTH_NEGOTIATE;
2251*5e7646d2SAndroid Build Coastguard Worker 
2252*5e7646d2SAndroid Build Coastguard Worker       if (loc->level == CUPSD_AUTH_ANON)
2253*5e7646d2SAndroid Build Coastguard Worker 	loc->level = CUPSD_AUTH_USER;
2254*5e7646d2SAndroid Build Coastguard Worker     }
2255*5e7646d2SAndroid Build Coastguard Worker     else
2256*5e7646d2SAndroid Build Coastguard Worker     {
2257*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2258*5e7646d2SAndroid Build Coastguard Worker                       "Unknown authorization type %s on line %d of %s.",
2259*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum, ConfigurationFile);
2260*5e7646d2SAndroid Build Coastguard Worker       return (0);
2261*5e7646d2SAndroid Build Coastguard Worker     }
2262*5e7646d2SAndroid Build Coastguard Worker   }
2263*5e7646d2SAndroid Build Coastguard Worker   else if (!_cups_strcasecmp(line, "AuthClass"))
2264*5e7646d2SAndroid Build Coastguard Worker   {
2265*5e7646d2SAndroid Build Coastguard Worker    /*
2266*5e7646d2SAndroid Build Coastguard Worker     * AuthClass anonymous, user, system, group
2267*5e7646d2SAndroid Build Coastguard Worker     */
2268*5e7646d2SAndroid Build Coastguard Worker 
2269*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(value, "anonymous"))
2270*5e7646d2SAndroid Build Coastguard Worker     {
2271*5e7646d2SAndroid Build Coastguard Worker       loc->type  = CUPSD_AUTH_NONE;
2272*5e7646d2SAndroid Build Coastguard Worker       loc->level = CUPSD_AUTH_ANON;
2273*5e7646d2SAndroid Build Coastguard Worker 
2274*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2275*5e7646d2SAndroid Build Coastguard Worker                       "\"AuthClass %s\" is deprecated; consider removing "
2276*5e7646d2SAndroid Build Coastguard Worker 		      "it from line %d.",
2277*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum);
2278*5e7646d2SAndroid Build Coastguard Worker     }
2279*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "user"))
2280*5e7646d2SAndroid Build Coastguard Worker     {
2281*5e7646d2SAndroid Build Coastguard Worker       loc->level = CUPSD_AUTH_USER;
2282*5e7646d2SAndroid Build Coastguard Worker 
2283*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2284*5e7646d2SAndroid Build Coastguard Worker                       "\"AuthClass %s\" is deprecated; consider using "
2285*5e7646d2SAndroid Build Coastguard Worker 		      "\"Require valid-user\" on line %d of %s.",
2286*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum, ConfigurationFile);
2287*5e7646d2SAndroid Build Coastguard Worker     }
2288*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "group"))
2289*5e7646d2SAndroid Build Coastguard Worker     {
2290*5e7646d2SAndroid Build Coastguard Worker       loc->level = CUPSD_AUTH_GROUP;
2291*5e7646d2SAndroid Build Coastguard Worker 
2292*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2293*5e7646d2SAndroid Build Coastguard Worker                       "\"AuthClass %s\" is deprecated; consider using "
2294*5e7646d2SAndroid Build Coastguard Worker 		      "\"Require user @groupname\" on line %d of %s.",
2295*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum, ConfigurationFile);
2296*5e7646d2SAndroid Build Coastguard Worker     }
2297*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "system"))
2298*5e7646d2SAndroid Build Coastguard Worker     {
2299*5e7646d2SAndroid Build Coastguard Worker       loc->level = CUPSD_AUTH_GROUP;
2300*5e7646d2SAndroid Build Coastguard Worker 
2301*5e7646d2SAndroid Build Coastguard Worker       cupsdAddName(loc, "@SYSTEM");
2302*5e7646d2SAndroid Build Coastguard Worker 
2303*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2304*5e7646d2SAndroid Build Coastguard Worker                       "\"AuthClass %s\" is deprecated; consider using "
2305*5e7646d2SAndroid Build Coastguard Worker 		      "\"Require user @SYSTEM\" on line %d of %s.",
2306*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum, ConfigurationFile);
2307*5e7646d2SAndroid Build Coastguard Worker     }
2308*5e7646d2SAndroid Build Coastguard Worker     else
2309*5e7646d2SAndroid Build Coastguard Worker     {
2310*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2311*5e7646d2SAndroid Build Coastguard Worker                       "Unknown authorization class %s on line %d of %s.",
2312*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum, ConfigurationFile);
2313*5e7646d2SAndroid Build Coastguard Worker       return (0);
2314*5e7646d2SAndroid Build Coastguard Worker     }
2315*5e7646d2SAndroid Build Coastguard Worker   }
2316*5e7646d2SAndroid Build Coastguard Worker   else if (!_cups_strcasecmp(line, "AuthGroupName"))
2317*5e7646d2SAndroid Build Coastguard Worker   {
2318*5e7646d2SAndroid Build Coastguard Worker     cupsdAddName(loc, value);
2319*5e7646d2SAndroid Build Coastguard Worker 
2320*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_WARN,
2321*5e7646d2SAndroid Build Coastguard Worker                     "\"AuthGroupName %s\" directive is deprecated; consider "
2322*5e7646d2SAndroid Build Coastguard Worker 		    "using \"Require user @%s\" on line %d of %s.",
2323*5e7646d2SAndroid Build Coastguard Worker 		    value, value, linenum, ConfigurationFile);
2324*5e7646d2SAndroid Build Coastguard Worker   }
2325*5e7646d2SAndroid Build Coastguard Worker   else if (!_cups_strcasecmp(line, "Require"))
2326*5e7646d2SAndroid Build Coastguard Worker   {
2327*5e7646d2SAndroid Build Coastguard Worker    /*
2328*5e7646d2SAndroid Build Coastguard Worker     * Apache synonym for AuthClass and AuthGroupName...
2329*5e7646d2SAndroid Build Coastguard Worker     *
2330*5e7646d2SAndroid Build Coastguard Worker     * Get initial word:
2331*5e7646d2SAndroid Build Coastguard Worker     *
2332*5e7646d2SAndroid Build Coastguard Worker     *     Require valid-user
2333*5e7646d2SAndroid Build Coastguard Worker     *     Require group names
2334*5e7646d2SAndroid Build Coastguard Worker     *     Require user names
2335*5e7646d2SAndroid Build Coastguard Worker     */
2336*5e7646d2SAndroid Build Coastguard Worker 
2337*5e7646d2SAndroid Build Coastguard Worker     for (valptr = value; !_cups_isspace(*valptr) && *valptr; valptr ++);
2338*5e7646d2SAndroid Build Coastguard Worker 
2339*5e7646d2SAndroid Build Coastguard Worker     if (*valptr)
2340*5e7646d2SAndroid Build Coastguard Worker       *valptr++ = '\0';
2341*5e7646d2SAndroid Build Coastguard Worker 
2342*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(value, "valid-user") ||
2343*5e7646d2SAndroid Build Coastguard Worker         !_cups_strcasecmp(value, "user"))
2344*5e7646d2SAndroid Build Coastguard Worker       loc->level = CUPSD_AUTH_USER;
2345*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "group"))
2346*5e7646d2SAndroid Build Coastguard Worker       loc->level = CUPSD_AUTH_GROUP;
2347*5e7646d2SAndroid Build Coastguard Worker     else
2348*5e7646d2SAndroid Build Coastguard Worker     {
2349*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d of %s.",
2350*5e7646d2SAndroid Build Coastguard Worker 	              value, linenum, ConfigurationFile);
2351*5e7646d2SAndroid Build Coastguard Worker       return (0);
2352*5e7646d2SAndroid Build Coastguard Worker     }
2353*5e7646d2SAndroid Build Coastguard Worker 
2354*5e7646d2SAndroid Build Coastguard Worker    /*
2355*5e7646d2SAndroid Build Coastguard Worker     * Get the list of names from the line...
2356*5e7646d2SAndroid Build Coastguard Worker     */
2357*5e7646d2SAndroid Build Coastguard Worker 
2358*5e7646d2SAndroid Build Coastguard Worker     for (value = valptr; *value;)
2359*5e7646d2SAndroid Build Coastguard Worker     {
2360*5e7646d2SAndroid Build Coastguard Worker       while (_cups_isspace(*value))
2361*5e7646d2SAndroid Build Coastguard Worker 	value ++;
2362*5e7646d2SAndroid Build Coastguard Worker 
2363*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_AUTHORIZATION_H
2364*5e7646d2SAndroid Build Coastguard Worker       if (!strncmp(value, "@AUTHKEY(", 9))
2365*5e7646d2SAndroid Build Coastguard Worker       {
2366*5e7646d2SAndroid Build Coastguard Worker        /*
2367*5e7646d2SAndroid Build Coastguard Worker 	* Grab "@AUTHKEY(name)" value...
2368*5e7646d2SAndroid Build Coastguard Worker 	*/
2369*5e7646d2SAndroid Build Coastguard Worker 
2370*5e7646d2SAndroid Build Coastguard Worker         for (valptr = value + 9; *valptr != ')' && *valptr; valptr ++);
2371*5e7646d2SAndroid Build Coastguard Worker 
2372*5e7646d2SAndroid Build Coastguard Worker 	if (*valptr)
2373*5e7646d2SAndroid Build Coastguard Worker 	  *valptr++ = '\0';
2374*5e7646d2SAndroid Build Coastguard Worker       }
2375*5e7646d2SAndroid Build Coastguard Worker       else
2376*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_AUTHORIZATION_H */
2377*5e7646d2SAndroid Build Coastguard Worker       if (*value == '\"' || *value == '\'')
2378*5e7646d2SAndroid Build Coastguard Worker       {
2379*5e7646d2SAndroid Build Coastguard Worker        /*
2380*5e7646d2SAndroid Build Coastguard Worker 	* Grab quoted name...
2381*5e7646d2SAndroid Build Coastguard Worker 	*/
2382*5e7646d2SAndroid Build Coastguard Worker 
2383*5e7646d2SAndroid Build Coastguard Worker         for (valptr = value + 1; *valptr != *value && *valptr; valptr ++);
2384*5e7646d2SAndroid Build Coastguard Worker 
2385*5e7646d2SAndroid Build Coastguard Worker 	value ++;
2386*5e7646d2SAndroid Build Coastguard Worker       }
2387*5e7646d2SAndroid Build Coastguard Worker       else
2388*5e7646d2SAndroid Build Coastguard Worker       {
2389*5e7646d2SAndroid Build Coastguard Worker        /*
2390*5e7646d2SAndroid Build Coastguard Worker 	* Grab literal name.
2391*5e7646d2SAndroid Build Coastguard Worker 	*/
2392*5e7646d2SAndroid Build Coastguard Worker 
2393*5e7646d2SAndroid Build Coastguard Worker         for (valptr = value; !_cups_isspace(*valptr) && *valptr; valptr ++);
2394*5e7646d2SAndroid Build Coastguard Worker       }
2395*5e7646d2SAndroid Build Coastguard Worker 
2396*5e7646d2SAndroid Build Coastguard Worker       if (*valptr)
2397*5e7646d2SAndroid Build Coastguard Worker 	*valptr++ = '\0';
2398*5e7646d2SAndroid Build Coastguard Worker 
2399*5e7646d2SAndroid Build Coastguard Worker       cupsdAddName(loc, value);
2400*5e7646d2SAndroid Build Coastguard Worker 
2401*5e7646d2SAndroid Build Coastguard Worker       for (value = valptr; _cups_isspace(*value); value ++);
2402*5e7646d2SAndroid Build Coastguard Worker     }
2403*5e7646d2SAndroid Build Coastguard Worker   }
2404*5e7646d2SAndroid Build Coastguard Worker   else if (!_cups_strcasecmp(line, "Satisfy"))
2405*5e7646d2SAndroid Build Coastguard Worker   {
2406*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(value, "all"))
2407*5e7646d2SAndroid Build Coastguard Worker       loc->satisfy = CUPSD_AUTH_SATISFY_ALL;
2408*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(value, "any"))
2409*5e7646d2SAndroid Build Coastguard Worker       loc->satisfy = CUPSD_AUTH_SATISFY_ANY;
2410*5e7646d2SAndroid Build Coastguard Worker     else
2411*5e7646d2SAndroid Build Coastguard Worker     {
2412*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d of %s.",
2413*5e7646d2SAndroid Build Coastguard Worker                       value, linenum, ConfigurationFile);
2414*5e7646d2SAndroid Build Coastguard Worker       return (0);
2415*5e7646d2SAndroid Build Coastguard Worker     }
2416*5e7646d2SAndroid Build Coastguard Worker   }
2417*5e7646d2SAndroid Build Coastguard Worker   else
2418*5e7646d2SAndroid Build Coastguard Worker     return (0);
2419*5e7646d2SAndroid Build Coastguard Worker 
2420*5e7646d2SAndroid Build Coastguard Worker   return (1);
2421*5e7646d2SAndroid Build Coastguard Worker }
2422*5e7646d2SAndroid Build Coastguard Worker 
2423*5e7646d2SAndroid Build Coastguard Worker 
2424*5e7646d2SAndroid Build Coastguard Worker /*
2425*5e7646d2SAndroid Build Coastguard Worker  * 'parse_fatal_errors()' - Parse FatalErrors values in a string.
2426*5e7646d2SAndroid Build Coastguard Worker  */
2427*5e7646d2SAndroid Build Coastguard Worker 
2428*5e7646d2SAndroid Build Coastguard Worker static int				/* O - FatalErrors bits */
parse_fatal_errors(const char * s)2429*5e7646d2SAndroid Build Coastguard Worker parse_fatal_errors(const char *s)	/* I - FatalErrors string */
2430*5e7646d2SAndroid Build Coastguard Worker {
2431*5e7646d2SAndroid Build Coastguard Worker   int	fatal;				/* FatalErrors bits */
2432*5e7646d2SAndroid Build Coastguard Worker   char	value[1024],			/* Value string */
2433*5e7646d2SAndroid Build Coastguard Worker 	*valstart,			/* Pointer into value */
2434*5e7646d2SAndroid Build Coastguard Worker 	*valend;			/* End of value */
2435*5e7646d2SAndroid Build Coastguard Worker 
2436*5e7646d2SAndroid Build Coastguard Worker 
2437*5e7646d2SAndroid Build Coastguard Worker  /*
2438*5e7646d2SAndroid Build Coastguard Worker   * Empty FatalErrors line yields NULL pointer...
2439*5e7646d2SAndroid Build Coastguard Worker   */
2440*5e7646d2SAndroid Build Coastguard Worker 
2441*5e7646d2SAndroid Build Coastguard Worker   if (!s)
2442*5e7646d2SAndroid Build Coastguard Worker     return (CUPSD_FATAL_NONE);
2443*5e7646d2SAndroid Build Coastguard Worker 
2444*5e7646d2SAndroid Build Coastguard Worker  /*
2445*5e7646d2SAndroid Build Coastguard Worker   * Loop through the value string,...
2446*5e7646d2SAndroid Build Coastguard Worker   */
2447*5e7646d2SAndroid Build Coastguard Worker 
2448*5e7646d2SAndroid Build Coastguard Worker   strlcpy(value, s, sizeof(value));
2449*5e7646d2SAndroid Build Coastguard Worker 
2450*5e7646d2SAndroid Build Coastguard Worker   fatal = CUPSD_FATAL_NONE;
2451*5e7646d2SAndroid Build Coastguard Worker 
2452*5e7646d2SAndroid Build Coastguard Worker   for (valstart = value; *valstart;)
2453*5e7646d2SAndroid Build Coastguard Worker   {
2454*5e7646d2SAndroid Build Coastguard Worker    /*
2455*5e7646d2SAndroid Build Coastguard Worker     * Get the current space/comma-delimited kind name...
2456*5e7646d2SAndroid Build Coastguard Worker     */
2457*5e7646d2SAndroid Build Coastguard Worker 
2458*5e7646d2SAndroid Build Coastguard Worker     for (valend = valstart; *valend; valend ++)
2459*5e7646d2SAndroid Build Coastguard Worker       if (_cups_isspace(*valend) || *valend == ',')
2460*5e7646d2SAndroid Build Coastguard Worker 	break;
2461*5e7646d2SAndroid Build Coastguard Worker 
2462*5e7646d2SAndroid Build Coastguard Worker     if (*valend)
2463*5e7646d2SAndroid Build Coastguard Worker       *valend++ = '\0';
2464*5e7646d2SAndroid Build Coastguard Worker 
2465*5e7646d2SAndroid Build Coastguard Worker    /*
2466*5e7646d2SAndroid Build Coastguard Worker     * Add the error to the bitmask...
2467*5e7646d2SAndroid Build Coastguard Worker     */
2468*5e7646d2SAndroid Build Coastguard Worker 
2469*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(valstart, "all"))
2470*5e7646d2SAndroid Build Coastguard Worker       fatal = CUPSD_FATAL_ALL;
2471*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "browse"))
2472*5e7646d2SAndroid Build Coastguard Worker       fatal |= CUPSD_FATAL_BROWSE;
2473*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "-browse"))
2474*5e7646d2SAndroid Build Coastguard Worker       fatal &= ~CUPSD_FATAL_BROWSE;
2475*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "config"))
2476*5e7646d2SAndroid Build Coastguard Worker       fatal |= CUPSD_FATAL_CONFIG;
2477*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "-config"))
2478*5e7646d2SAndroid Build Coastguard Worker       fatal &= ~CUPSD_FATAL_CONFIG;
2479*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "listen"))
2480*5e7646d2SAndroid Build Coastguard Worker       fatal |= CUPSD_FATAL_LISTEN;
2481*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "-listen"))
2482*5e7646d2SAndroid Build Coastguard Worker       fatal &= ~CUPSD_FATAL_LISTEN;
2483*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "log"))
2484*5e7646d2SAndroid Build Coastguard Worker       fatal |= CUPSD_FATAL_LOG;
2485*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "-log"))
2486*5e7646d2SAndroid Build Coastguard Worker       fatal &= ~CUPSD_FATAL_LOG;
2487*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "permissions"))
2488*5e7646d2SAndroid Build Coastguard Worker       fatal |= CUPSD_FATAL_PERMISSIONS;
2489*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "-permissions"))
2490*5e7646d2SAndroid Build Coastguard Worker       fatal &= ~CUPSD_FATAL_PERMISSIONS;
2491*5e7646d2SAndroid Build Coastguard Worker     else if (_cups_strcasecmp(valstart, "none"))
2492*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
2493*5e7646d2SAndroid Build Coastguard Worker                       "Unknown FatalErrors kind \"%s\" ignored.", valstart);
2494*5e7646d2SAndroid Build Coastguard Worker 
2495*5e7646d2SAndroid Build Coastguard Worker     for (valstart = valend; *valstart; valstart ++)
2496*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_isspace(*valstart) || *valstart != ',')
2497*5e7646d2SAndroid Build Coastguard Worker 	break;
2498*5e7646d2SAndroid Build Coastguard Worker   }
2499*5e7646d2SAndroid Build Coastguard Worker 
2500*5e7646d2SAndroid Build Coastguard Worker   return (fatal);
2501*5e7646d2SAndroid Build Coastguard Worker }
2502*5e7646d2SAndroid Build Coastguard Worker 
2503*5e7646d2SAndroid Build Coastguard Worker 
2504*5e7646d2SAndroid Build Coastguard Worker /*
2505*5e7646d2SAndroid Build Coastguard Worker  * 'parse_groups()' - Parse system group names in a string.
2506*5e7646d2SAndroid Build Coastguard Worker  */
2507*5e7646d2SAndroid Build Coastguard Worker 
2508*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 on success, 0 on failure */
parse_groups(const char * s,int linenum)2509*5e7646d2SAndroid Build Coastguard Worker parse_groups(const char *s,		/* I - Space-delimited groups */
2510*5e7646d2SAndroid Build Coastguard Worker              int        linenum)        /* I - Line number in cups-files.conf */
2511*5e7646d2SAndroid Build Coastguard Worker {
2512*5e7646d2SAndroid Build Coastguard Worker   int		status;			/* Return status */
2513*5e7646d2SAndroid Build Coastguard Worker   char		value[1024],		/* Value string */
2514*5e7646d2SAndroid Build Coastguard Worker 		*valstart,		/* Pointer into value */
2515*5e7646d2SAndroid Build Coastguard Worker 		*valend,		/* End of value */
2516*5e7646d2SAndroid Build Coastguard Worker 		quote;			/* Quote character */
2517*5e7646d2SAndroid Build Coastguard Worker   struct group	*group;			/* Group */
2518*5e7646d2SAndroid Build Coastguard Worker 
2519*5e7646d2SAndroid Build Coastguard Worker 
2520*5e7646d2SAndroid Build Coastguard Worker  /*
2521*5e7646d2SAndroid Build Coastguard Worker   * Make a copy of the string and parse out the groups...
2522*5e7646d2SAndroid Build Coastguard Worker   */
2523*5e7646d2SAndroid Build Coastguard Worker 
2524*5e7646d2SAndroid Build Coastguard Worker   strlcpy(value, s, sizeof(value));
2525*5e7646d2SAndroid Build Coastguard Worker 
2526*5e7646d2SAndroid Build Coastguard Worker   status   = 1;
2527*5e7646d2SAndroid Build Coastguard Worker   valstart = value;
2528*5e7646d2SAndroid Build Coastguard Worker 
2529*5e7646d2SAndroid Build Coastguard Worker   while (*valstart && NumSystemGroups < MAX_SYSTEM_GROUPS)
2530*5e7646d2SAndroid Build Coastguard Worker   {
2531*5e7646d2SAndroid Build Coastguard Worker     if (*valstart == '\'' || *valstart == '\"')
2532*5e7646d2SAndroid Build Coastguard Worker     {
2533*5e7646d2SAndroid Build Coastguard Worker      /*
2534*5e7646d2SAndroid Build Coastguard Worker       * Scan quoted name...
2535*5e7646d2SAndroid Build Coastguard Worker       */
2536*5e7646d2SAndroid Build Coastguard Worker 
2537*5e7646d2SAndroid Build Coastguard Worker       quote = *valstart++;
2538*5e7646d2SAndroid Build Coastguard Worker 
2539*5e7646d2SAndroid Build Coastguard Worker       for (valend = valstart; *valend; valend ++)
2540*5e7646d2SAndroid Build Coastguard Worker 	if (*valend == quote)
2541*5e7646d2SAndroid Build Coastguard Worker 	  break;
2542*5e7646d2SAndroid Build Coastguard Worker     }
2543*5e7646d2SAndroid Build Coastguard Worker     else
2544*5e7646d2SAndroid Build Coastguard Worker     {
2545*5e7646d2SAndroid Build Coastguard Worker      /*
2546*5e7646d2SAndroid Build Coastguard Worker       * Scan space or comma-delimited name...
2547*5e7646d2SAndroid Build Coastguard Worker       */
2548*5e7646d2SAndroid Build Coastguard Worker 
2549*5e7646d2SAndroid Build Coastguard Worker       for (valend = valstart; *valend; valend ++)
2550*5e7646d2SAndroid Build Coastguard Worker 	if (_cups_isspace(*valend) || *valend == ',')
2551*5e7646d2SAndroid Build Coastguard Worker 	  break;
2552*5e7646d2SAndroid Build Coastguard Worker     }
2553*5e7646d2SAndroid Build Coastguard Worker 
2554*5e7646d2SAndroid Build Coastguard Worker     if (*valend)
2555*5e7646d2SAndroid Build Coastguard Worker       *valend++ = '\0';
2556*5e7646d2SAndroid Build Coastguard Worker 
2557*5e7646d2SAndroid Build Coastguard Worker     group = getgrnam(valstart);
2558*5e7646d2SAndroid Build Coastguard Worker     if (group)
2559*5e7646d2SAndroid Build Coastguard Worker     {
2560*5e7646d2SAndroid Build Coastguard Worker       cupsdSetString(SystemGroups + NumSystemGroups, valstart);
2561*5e7646d2SAndroid Build Coastguard Worker       SystemGroupIDs[NumSystemGroups] = group->gr_gid;
2562*5e7646d2SAndroid Build Coastguard Worker 
2563*5e7646d2SAndroid Build Coastguard Worker       NumSystemGroups ++;
2564*5e7646d2SAndroid Build Coastguard Worker     }
2565*5e7646d2SAndroid Build Coastguard Worker     else
2566*5e7646d2SAndroid Build Coastguard Worker     {
2567*5e7646d2SAndroid Build Coastguard Worker       if (linenum)
2568*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown SystemGroup \"%s\" on line %d of %s.", valstart, linenum, CupsFilesFile);
2569*5e7646d2SAndroid Build Coastguard Worker       else
2570*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown default SystemGroup \"%s\".", valstart);
2571*5e7646d2SAndroid Build Coastguard Worker 
2572*5e7646d2SAndroid Build Coastguard Worker       status = 0;
2573*5e7646d2SAndroid Build Coastguard Worker     }
2574*5e7646d2SAndroid Build Coastguard Worker 
2575*5e7646d2SAndroid Build Coastguard Worker     endgrent();
2576*5e7646d2SAndroid Build Coastguard Worker 
2577*5e7646d2SAndroid Build Coastguard Worker     valstart = valend;
2578*5e7646d2SAndroid Build Coastguard Worker 
2579*5e7646d2SAndroid Build Coastguard Worker     while (*valstart == ',' || _cups_isspace(*valstart))
2580*5e7646d2SAndroid Build Coastguard Worker       valstart ++;
2581*5e7646d2SAndroid Build Coastguard Worker   }
2582*5e7646d2SAndroid Build Coastguard Worker 
2583*5e7646d2SAndroid Build Coastguard Worker   return (status);
2584*5e7646d2SAndroid Build Coastguard Worker }
2585*5e7646d2SAndroid Build Coastguard Worker 
2586*5e7646d2SAndroid Build Coastguard Worker 
2587*5e7646d2SAndroid Build Coastguard Worker /*
2588*5e7646d2SAndroid Build Coastguard Worker  * 'parse_protocols()' - Parse browse protocols in a string.
2589*5e7646d2SAndroid Build Coastguard Worker  */
2590*5e7646d2SAndroid Build Coastguard Worker 
2591*5e7646d2SAndroid Build Coastguard Worker static int				/* O - Browse protocol bits */
parse_protocols(const char * s)2592*5e7646d2SAndroid Build Coastguard Worker parse_protocols(const char *s)		/* I - Space-delimited protocols */
2593*5e7646d2SAndroid Build Coastguard Worker {
2594*5e7646d2SAndroid Build Coastguard Worker   int	protocols;			/* Browse protocol bits */
2595*5e7646d2SAndroid Build Coastguard Worker   char	value[1024],			/* Value string */
2596*5e7646d2SAndroid Build Coastguard Worker 	*valstart,			/* Pointer into value */
2597*5e7646d2SAndroid Build Coastguard Worker 	*valend;			/* End of value */
2598*5e7646d2SAndroid Build Coastguard Worker 
2599*5e7646d2SAndroid Build Coastguard Worker 
2600*5e7646d2SAndroid Build Coastguard Worker  /*
2601*5e7646d2SAndroid Build Coastguard Worker   * Empty protocol line yields NULL pointer...
2602*5e7646d2SAndroid Build Coastguard Worker   */
2603*5e7646d2SAndroid Build Coastguard Worker 
2604*5e7646d2SAndroid Build Coastguard Worker   if (!s)
2605*5e7646d2SAndroid Build Coastguard Worker     return (0);
2606*5e7646d2SAndroid Build Coastguard Worker 
2607*5e7646d2SAndroid Build Coastguard Worker  /*
2608*5e7646d2SAndroid Build Coastguard Worker   * Loop through the value string,...
2609*5e7646d2SAndroid Build Coastguard Worker   */
2610*5e7646d2SAndroid Build Coastguard Worker 
2611*5e7646d2SAndroid Build Coastguard Worker   strlcpy(value, s, sizeof(value));
2612*5e7646d2SAndroid Build Coastguard Worker 
2613*5e7646d2SAndroid Build Coastguard Worker   protocols = 0;
2614*5e7646d2SAndroid Build Coastguard Worker 
2615*5e7646d2SAndroid Build Coastguard Worker   for (valstart = value; *valstart;)
2616*5e7646d2SAndroid Build Coastguard Worker   {
2617*5e7646d2SAndroid Build Coastguard Worker    /*
2618*5e7646d2SAndroid Build Coastguard Worker     * Get the current space/comma-delimited protocol name...
2619*5e7646d2SAndroid Build Coastguard Worker     */
2620*5e7646d2SAndroid Build Coastguard Worker 
2621*5e7646d2SAndroid Build Coastguard Worker     for (valend = valstart; *valend; valend ++)
2622*5e7646d2SAndroid Build Coastguard Worker       if (_cups_isspace(*valend) || *valend == ',')
2623*5e7646d2SAndroid Build Coastguard Worker 	break;
2624*5e7646d2SAndroid Build Coastguard Worker 
2625*5e7646d2SAndroid Build Coastguard Worker     if (*valend)
2626*5e7646d2SAndroid Build Coastguard Worker       *valend++ = '\0';
2627*5e7646d2SAndroid Build Coastguard Worker 
2628*5e7646d2SAndroid Build Coastguard Worker    /*
2629*5e7646d2SAndroid Build Coastguard Worker     * Add the protocol to the bitmask...
2630*5e7646d2SAndroid Build Coastguard Worker     */
2631*5e7646d2SAndroid Build Coastguard Worker 
2632*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(valstart, "dnssd") ||
2633*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strcasecmp(valstart, "dns-sd") ||
2634*5e7646d2SAndroid Build Coastguard Worker 	!_cups_strcasecmp(valstart, "bonjour"))
2635*5e7646d2SAndroid Build Coastguard Worker       protocols |= BROWSE_DNSSD;
2636*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(valstart, "all"))
2637*5e7646d2SAndroid Build Coastguard Worker       protocols |= BROWSE_ALL;
2638*5e7646d2SAndroid Build Coastguard Worker     else if (_cups_strcasecmp(valstart, "none"))
2639*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
2640*5e7646d2SAndroid Build Coastguard Worker                       "Unknown browse protocol \"%s\" ignored.", valstart);
2641*5e7646d2SAndroid Build Coastguard Worker 
2642*5e7646d2SAndroid Build Coastguard Worker     for (valstart = valend; *valstart; valstart ++)
2643*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_isspace(*valstart) || *valstart != ',')
2644*5e7646d2SAndroid Build Coastguard Worker 	break;
2645*5e7646d2SAndroid Build Coastguard Worker   }
2646*5e7646d2SAndroid Build Coastguard Worker 
2647*5e7646d2SAndroid Build Coastguard Worker   return (protocols);
2648*5e7646d2SAndroid Build Coastguard Worker }
2649*5e7646d2SAndroid Build Coastguard Worker 
2650*5e7646d2SAndroid Build Coastguard Worker 
2651*5e7646d2SAndroid Build Coastguard Worker /*
2652*5e7646d2SAndroid Build Coastguard Worker  * 'parse_variable()' - Parse a variable line.
2653*5e7646d2SAndroid Build Coastguard Worker  */
2654*5e7646d2SAndroid Build Coastguard Worker 
2655*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 on success, 0 on failure */
parse_variable(const char * filename,int linenum,const char * line,const char * value,size_t num_vars,const cupsd_var_t * vars)2656*5e7646d2SAndroid Build Coastguard Worker parse_variable(
2657*5e7646d2SAndroid Build Coastguard Worker     const char        *filename,	/* I - Name of configuration file */
2658*5e7646d2SAndroid Build Coastguard Worker     int               linenum,		/* I - Line in configuration file */
2659*5e7646d2SAndroid Build Coastguard Worker     const char        *line,		/* I - Line from configuration file */
2660*5e7646d2SAndroid Build Coastguard Worker     const char        *value,		/* I - Value from configuration file */
2661*5e7646d2SAndroid Build Coastguard Worker     size_t            num_vars,		/* I - Number of variables */
2662*5e7646d2SAndroid Build Coastguard Worker     const cupsd_var_t *vars)		/* I - Variables */
2663*5e7646d2SAndroid Build Coastguard Worker {
2664*5e7646d2SAndroid Build Coastguard Worker   size_t		i;		/* Looping var */
2665*5e7646d2SAndroid Build Coastguard Worker   const cupsd_var_t	*var;		/* Variables */
2666*5e7646d2SAndroid Build Coastguard Worker   char			temp[1024];	/* Temporary string */
2667*5e7646d2SAndroid Build Coastguard Worker 
2668*5e7646d2SAndroid Build Coastguard Worker 
2669*5e7646d2SAndroid Build Coastguard Worker   for (i = num_vars, var = vars; i > 0; i --, var ++)
2670*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(line, var->name))
2671*5e7646d2SAndroid Build Coastguard Worker       break;
2672*5e7646d2SAndroid Build Coastguard Worker 
2673*5e7646d2SAndroid Build Coastguard Worker   if (i == 0)
2674*5e7646d2SAndroid Build Coastguard Worker   {
2675*5e7646d2SAndroid Build Coastguard Worker    /*
2676*5e7646d2SAndroid Build Coastguard Worker     * Unknown directive!  Output an error message and continue...
2677*5e7646d2SAndroid Build Coastguard Worker     */
2678*5e7646d2SAndroid Build Coastguard Worker 
2679*5e7646d2SAndroid Build Coastguard Worker     if (!value)
2680*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value for %s on line %d of %s.",
2681*5e7646d2SAndroid Build Coastguard Worker 		      line, linenum, filename);
2682*5e7646d2SAndroid Build Coastguard Worker     else
2683*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown directive %s on line %d of %s.",
2684*5e7646d2SAndroid Build Coastguard Worker 		      line, linenum, filename);
2685*5e7646d2SAndroid Build Coastguard Worker 
2686*5e7646d2SAndroid Build Coastguard Worker     return (0);
2687*5e7646d2SAndroid Build Coastguard Worker   }
2688*5e7646d2SAndroid Build Coastguard Worker 
2689*5e7646d2SAndroid Build Coastguard Worker   switch (var->type)
2690*5e7646d2SAndroid Build Coastguard Worker   {
2691*5e7646d2SAndroid Build Coastguard Worker     case CUPSD_VARTYPE_INTEGER :
2692*5e7646d2SAndroid Build Coastguard Worker 	if (!value)
2693*5e7646d2SAndroid Build Coastguard Worker 	{
2694*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2695*5e7646d2SAndroid Build Coastguard Worker 			  "Missing integer value for %s on line %d of %s.",
2696*5e7646d2SAndroid Build Coastguard Worker 			  line, linenum, filename);
2697*5e7646d2SAndroid Build Coastguard Worker           return (0);
2698*5e7646d2SAndroid Build Coastguard Worker 	}
2699*5e7646d2SAndroid Build Coastguard Worker 	else if (!isdigit(*value & 255))
2700*5e7646d2SAndroid Build Coastguard Worker 	{
2701*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2702*5e7646d2SAndroid Build Coastguard Worker 			  "Bad integer value for %s on line %d of %s.",
2703*5e7646d2SAndroid Build Coastguard Worker 			  line, linenum, filename);
2704*5e7646d2SAndroid Build Coastguard Worker           return (0);
2705*5e7646d2SAndroid Build Coastguard Worker 	}
2706*5e7646d2SAndroid Build Coastguard Worker 	else
2707*5e7646d2SAndroid Build Coastguard Worker 	{
2708*5e7646d2SAndroid Build Coastguard Worker 	  int	n;		/* Number */
2709*5e7646d2SAndroid Build Coastguard Worker 	  char	*units;		/* Units */
2710*5e7646d2SAndroid Build Coastguard Worker 
2711*5e7646d2SAndroid Build Coastguard Worker 	  n = strtol(value, &units, 0);
2712*5e7646d2SAndroid Build Coastguard Worker 
2713*5e7646d2SAndroid Build Coastguard Worker 	  if (units && *units)
2714*5e7646d2SAndroid Build Coastguard Worker 	  {
2715*5e7646d2SAndroid Build Coastguard Worker 	    if (tolower(units[0] & 255) == 'g')
2716*5e7646d2SAndroid Build Coastguard Worker 	      n *= 1024 * 1024 * 1024;
2717*5e7646d2SAndroid Build Coastguard Worker 	    else if (tolower(units[0] & 255) == 'm')
2718*5e7646d2SAndroid Build Coastguard Worker 	      n *= 1024 * 1024;
2719*5e7646d2SAndroid Build Coastguard Worker 	    else if (tolower(units[0] & 255) == 'k')
2720*5e7646d2SAndroid Build Coastguard Worker 	      n *= 1024;
2721*5e7646d2SAndroid Build Coastguard Worker 	    else if (tolower(units[0] & 255) == 't')
2722*5e7646d2SAndroid Build Coastguard Worker 	      n *= 262144;
2723*5e7646d2SAndroid Build Coastguard Worker 	    else
2724*5e7646d2SAndroid Build Coastguard Worker 	    {
2725*5e7646d2SAndroid Build Coastguard Worker 	      cupsdLogMessage(CUPSD_LOG_ERROR,
2726*5e7646d2SAndroid Build Coastguard Worker 			      "Unknown integer value for %s on line %d of %s.",
2727*5e7646d2SAndroid Build Coastguard Worker 			      line, linenum, filename);
2728*5e7646d2SAndroid Build Coastguard Worker 	      return (0);
2729*5e7646d2SAndroid Build Coastguard Worker 	    }
2730*5e7646d2SAndroid Build Coastguard Worker 	  }
2731*5e7646d2SAndroid Build Coastguard Worker 
2732*5e7646d2SAndroid Build Coastguard Worker 	  if (n < 0)
2733*5e7646d2SAndroid Build Coastguard Worker 	  {
2734*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_ERROR,
2735*5e7646d2SAndroid Build Coastguard Worker 			    "Bad negative integer value for %s on line %d of "
2736*5e7646d2SAndroid Build Coastguard Worker 			    "%s.", line, linenum, filename);
2737*5e7646d2SAndroid Build Coastguard Worker 	    return (0);
2738*5e7646d2SAndroid Build Coastguard Worker 	  }
2739*5e7646d2SAndroid Build Coastguard Worker 	  else
2740*5e7646d2SAndroid Build Coastguard Worker 	  {
2741*5e7646d2SAndroid Build Coastguard Worker 	    *((int *)var->ptr) = n;
2742*5e7646d2SAndroid Build Coastguard Worker 	  }
2743*5e7646d2SAndroid Build Coastguard Worker 	}
2744*5e7646d2SAndroid Build Coastguard Worker 	break;
2745*5e7646d2SAndroid Build Coastguard Worker 
2746*5e7646d2SAndroid Build Coastguard Worker     case CUPSD_VARTYPE_PERM :
2747*5e7646d2SAndroid Build Coastguard Worker 	if (!value)
2748*5e7646d2SAndroid Build Coastguard Worker 	{
2749*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2750*5e7646d2SAndroid Build Coastguard Worker 			  "Missing permissions value for %s on line %d of %s.",
2751*5e7646d2SAndroid Build Coastguard Worker 			  line, linenum, filename);
2752*5e7646d2SAndroid Build Coastguard Worker           return (0);
2753*5e7646d2SAndroid Build Coastguard Worker 	}
2754*5e7646d2SAndroid Build Coastguard Worker 	else if (!isdigit(*value & 255))
2755*5e7646d2SAndroid Build Coastguard Worker 	{
2756*5e7646d2SAndroid Build Coastguard Worker 	 /* TODO: Add chmod UGO syntax support */
2757*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2758*5e7646d2SAndroid Build Coastguard Worker 			  "Bad permissions value for %s on line %d of %s.",
2759*5e7646d2SAndroid Build Coastguard Worker 			  line, linenum, filename);
2760*5e7646d2SAndroid Build Coastguard Worker           return (0);
2761*5e7646d2SAndroid Build Coastguard Worker 	}
2762*5e7646d2SAndroid Build Coastguard Worker 	else
2763*5e7646d2SAndroid Build Coastguard Worker 	{
2764*5e7646d2SAndroid Build Coastguard Worker 	  int n = strtol(value, NULL, 8);
2765*5e7646d2SAndroid Build Coastguard Worker 					/* Permissions value */
2766*5e7646d2SAndroid Build Coastguard Worker 
2767*5e7646d2SAndroid Build Coastguard Worker 	  if (n < 0)
2768*5e7646d2SAndroid Build Coastguard Worker 	  {
2769*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_ERROR,
2770*5e7646d2SAndroid Build Coastguard Worker 			    "Bad negative permissions value for %s on line %d of "
2771*5e7646d2SAndroid Build Coastguard Worker 			    "%s.", line, linenum, filename);
2772*5e7646d2SAndroid Build Coastguard Worker 	    return (0);
2773*5e7646d2SAndroid Build Coastguard Worker 	  }
2774*5e7646d2SAndroid Build Coastguard Worker 	  else
2775*5e7646d2SAndroid Build Coastguard Worker 	  {
2776*5e7646d2SAndroid Build Coastguard Worker 	    *((mode_t *)var->ptr) = (mode_t)n;
2777*5e7646d2SAndroid Build Coastguard Worker 	  }
2778*5e7646d2SAndroid Build Coastguard Worker 	}
2779*5e7646d2SAndroid Build Coastguard Worker 	break;
2780*5e7646d2SAndroid Build Coastguard Worker 
2781*5e7646d2SAndroid Build Coastguard Worker     case CUPSD_VARTYPE_TIME :
2782*5e7646d2SAndroid Build Coastguard Worker 	if (!value)
2783*5e7646d2SAndroid Build Coastguard Worker 	{
2784*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2785*5e7646d2SAndroid Build Coastguard Worker 			  "Missing time interval value for %s on line %d of "
2786*5e7646d2SAndroid Build Coastguard Worker 			  "%s.", line, linenum, filename);
2787*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
2788*5e7646d2SAndroid Build Coastguard Worker 	}
2789*5e7646d2SAndroid Build Coastguard Worker 	else if (!_cups_strncasecmp(line, "PreserveJob", 11) &&
2790*5e7646d2SAndroid Build Coastguard Worker 		 (!_cups_strcasecmp(value, "true") ||
2791*5e7646d2SAndroid Build Coastguard Worker 		  !_cups_strcasecmp(value, "on") ||
2792*5e7646d2SAndroid Build Coastguard Worker 		  !_cups_strcasecmp(value, "enabled") ||
2793*5e7646d2SAndroid Build Coastguard Worker 		  !_cups_strcasecmp(value, "yes")))
2794*5e7646d2SAndroid Build Coastguard Worker 	{
2795*5e7646d2SAndroid Build Coastguard Worker 	  *((int *)var->ptr) = INT_MAX;
2796*5e7646d2SAndroid Build Coastguard Worker 	}
2797*5e7646d2SAndroid Build Coastguard Worker 	else if (!_cups_strcasecmp(value, "false") ||
2798*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "off") ||
2799*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "disabled") ||
2800*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "no"))
2801*5e7646d2SAndroid Build Coastguard Worker 	{
2802*5e7646d2SAndroid Build Coastguard Worker 	  *((int *)var->ptr) = 0;
2803*5e7646d2SAndroid Build Coastguard Worker 	}
2804*5e7646d2SAndroid Build Coastguard Worker 	else if (!isdigit(*value & 255))
2805*5e7646d2SAndroid Build Coastguard Worker 	{
2806*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2807*5e7646d2SAndroid Build Coastguard Worker 			  "Unknown time interval value for %s on line %d of "
2808*5e7646d2SAndroid Build Coastguard Worker 			  "%s.", line, linenum, filename);
2809*5e7646d2SAndroid Build Coastguard Worker           return (0);
2810*5e7646d2SAndroid Build Coastguard Worker 	}
2811*5e7646d2SAndroid Build Coastguard Worker 	else
2812*5e7646d2SAndroid Build Coastguard Worker 	{
2813*5e7646d2SAndroid Build Coastguard Worker 	  double	n;		/* Number */
2814*5e7646d2SAndroid Build Coastguard Worker 	  char		*units;		/* Units */
2815*5e7646d2SAndroid Build Coastguard Worker 
2816*5e7646d2SAndroid Build Coastguard Worker 	  n = strtod(value, &units);
2817*5e7646d2SAndroid Build Coastguard Worker 
2818*5e7646d2SAndroid Build Coastguard Worker 	  if (units && *units)
2819*5e7646d2SAndroid Build Coastguard Worker 	  {
2820*5e7646d2SAndroid Build Coastguard Worker 	    if (tolower(units[0] & 255) == 'w')
2821*5e7646d2SAndroid Build Coastguard Worker 	      n *= 7 * 24 * 60 * 60;
2822*5e7646d2SAndroid Build Coastguard Worker 	    else if (tolower(units[0] & 255) == 'd')
2823*5e7646d2SAndroid Build Coastguard Worker 	      n *= 24 * 60 * 60;
2824*5e7646d2SAndroid Build Coastguard Worker 	    else if (tolower(units[0] & 255) == 'h')
2825*5e7646d2SAndroid Build Coastguard Worker 	      n *= 60 * 60;
2826*5e7646d2SAndroid Build Coastguard Worker 	    else if (tolower(units[0] & 255) == 'm')
2827*5e7646d2SAndroid Build Coastguard Worker 	      n *= 60;
2828*5e7646d2SAndroid Build Coastguard Worker 	    else
2829*5e7646d2SAndroid Build Coastguard Worker 	    {
2830*5e7646d2SAndroid Build Coastguard Worker 	      cupsdLogMessage(CUPSD_LOG_ERROR,
2831*5e7646d2SAndroid Build Coastguard Worker 			      "Unknown time interval value for %s on line "
2832*5e7646d2SAndroid Build Coastguard Worker 			      "%d of %s.", line, linenum, filename);
2833*5e7646d2SAndroid Build Coastguard Worker 	      return (0);
2834*5e7646d2SAndroid Build Coastguard Worker 	    }
2835*5e7646d2SAndroid Build Coastguard Worker 	  }
2836*5e7646d2SAndroid Build Coastguard Worker 
2837*5e7646d2SAndroid Build Coastguard Worker 	  if (n < 0.0 || n > INT_MAX)
2838*5e7646d2SAndroid Build Coastguard Worker 	  {
2839*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_ERROR,
2840*5e7646d2SAndroid Build Coastguard Worker 			    "Bad time value for %s on line %d of %s.",
2841*5e7646d2SAndroid Build Coastguard Worker 			    line, linenum, filename);
2842*5e7646d2SAndroid Build Coastguard Worker 	    return (0);
2843*5e7646d2SAndroid Build Coastguard Worker 	  }
2844*5e7646d2SAndroid Build Coastguard Worker 	  else
2845*5e7646d2SAndroid Build Coastguard Worker 	  {
2846*5e7646d2SAndroid Build Coastguard Worker 	    *((int *)var->ptr) = (int)n;
2847*5e7646d2SAndroid Build Coastguard Worker 	  }
2848*5e7646d2SAndroid Build Coastguard Worker 	}
2849*5e7646d2SAndroid Build Coastguard Worker 	break;
2850*5e7646d2SAndroid Build Coastguard Worker 
2851*5e7646d2SAndroid Build Coastguard Worker     case CUPSD_VARTYPE_BOOLEAN :
2852*5e7646d2SAndroid Build Coastguard Worker 	if (!value)
2853*5e7646d2SAndroid Build Coastguard Worker 	{
2854*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2855*5e7646d2SAndroid Build Coastguard Worker 			  "Missing boolean value for %s on line %d of %s.",
2856*5e7646d2SAndroid Build Coastguard Worker 			  line, linenum, filename);
2857*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
2858*5e7646d2SAndroid Build Coastguard Worker 	}
2859*5e7646d2SAndroid Build Coastguard Worker 	else if (!_cups_strcasecmp(value, "true") ||
2860*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "on") ||
2861*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "enabled") ||
2862*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "yes") ||
2863*5e7646d2SAndroid Build Coastguard Worker 		 atoi(value) != 0)
2864*5e7646d2SAndroid Build Coastguard Worker 	{
2865*5e7646d2SAndroid Build Coastguard Worker 	  *((int *)var->ptr) = TRUE;
2866*5e7646d2SAndroid Build Coastguard Worker 	}
2867*5e7646d2SAndroid Build Coastguard Worker 	else if (!_cups_strcasecmp(value, "false") ||
2868*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "off") ||
2869*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "disabled") ||
2870*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "no") ||
2871*5e7646d2SAndroid Build Coastguard Worker 		 !_cups_strcasecmp(value, "0"))
2872*5e7646d2SAndroid Build Coastguard Worker 	{
2873*5e7646d2SAndroid Build Coastguard Worker 	  *((int *)var->ptr) = FALSE;
2874*5e7646d2SAndroid Build Coastguard Worker 	}
2875*5e7646d2SAndroid Build Coastguard Worker 	else
2876*5e7646d2SAndroid Build Coastguard Worker 	{
2877*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2878*5e7646d2SAndroid Build Coastguard Worker 			  "Unknown boolean value %s on line %d of %s.",
2879*5e7646d2SAndroid Build Coastguard Worker 			  value, linenum, filename);
2880*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
2881*5e7646d2SAndroid Build Coastguard Worker 	}
2882*5e7646d2SAndroid Build Coastguard Worker 	break;
2883*5e7646d2SAndroid Build Coastguard Worker 
2884*5e7646d2SAndroid Build Coastguard Worker     case CUPSD_VARTYPE_PATHNAME :
2885*5e7646d2SAndroid Build Coastguard Worker 	if (!value)
2886*5e7646d2SAndroid Build Coastguard Worker 	{
2887*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2888*5e7646d2SAndroid Build Coastguard Worker 			  "Missing pathname value for %s on line %d of %s.",
2889*5e7646d2SAndroid Build Coastguard Worker 			  line, linenum, filename);
2890*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
2891*5e7646d2SAndroid Build Coastguard Worker 	}
2892*5e7646d2SAndroid Build Coastguard Worker 
2893*5e7646d2SAndroid Build Coastguard Worker 	if (value[0] == '/')
2894*5e7646d2SAndroid Build Coastguard Worker 	  strlcpy(temp, value, sizeof(temp));
2895*5e7646d2SAndroid Build Coastguard Worker 	else
2896*5e7646d2SAndroid Build Coastguard Worker 	  snprintf(temp, sizeof(temp), "%s/%s", ServerRoot, value);
2897*5e7646d2SAndroid Build Coastguard Worker 
2898*5e7646d2SAndroid Build Coastguard Worker 	if (access(temp, 0) && _cups_strcasecmp(value, "internal") && _cups_strcasecmp(line, "ServerKeychain"))
2899*5e7646d2SAndroid Build Coastguard Worker 	{
2900*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
2901*5e7646d2SAndroid Build Coastguard Worker 			  "File or directory for \"%s %s\" on line %d of %s "
2902*5e7646d2SAndroid Build Coastguard Worker 			  "does not exist.", line, value, linenum, filename);
2903*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
2904*5e7646d2SAndroid Build Coastguard Worker 	}
2905*5e7646d2SAndroid Build Coastguard Worker 
2906*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetString((char **)var->ptr, temp);
2907*5e7646d2SAndroid Build Coastguard Worker 	break;
2908*5e7646d2SAndroid Build Coastguard Worker 
2909*5e7646d2SAndroid Build Coastguard Worker     case CUPSD_VARTYPE_STRING :
2910*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetString((char **)var->ptr, value);
2911*5e7646d2SAndroid Build Coastguard Worker 	break;
2912*5e7646d2SAndroid Build Coastguard Worker   }
2913*5e7646d2SAndroid Build Coastguard Worker 
2914*5e7646d2SAndroid Build Coastguard Worker   return (1);
2915*5e7646d2SAndroid Build Coastguard Worker }
2916*5e7646d2SAndroid Build Coastguard Worker 
2917*5e7646d2SAndroid Build Coastguard Worker 
2918*5e7646d2SAndroid Build Coastguard Worker /*
2919*5e7646d2SAndroid Build Coastguard Worker  * 'read_cupsd_conf()' - Read the cupsd.conf configuration file.
2920*5e7646d2SAndroid Build Coastguard Worker  */
2921*5e7646d2SAndroid Build Coastguard Worker 
2922*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 on success, 0 on failure */
read_cupsd_conf(cups_file_t * fp)2923*5e7646d2SAndroid Build Coastguard Worker read_cupsd_conf(cups_file_t *fp)	/* I - File to read from */
2924*5e7646d2SAndroid Build Coastguard Worker {
2925*5e7646d2SAndroid Build Coastguard Worker   int			linenum;	/* Current line number */
2926*5e7646d2SAndroid Build Coastguard Worker   char			line[HTTP_MAX_BUFFER],
2927*5e7646d2SAndroid Build Coastguard Worker 					/* Line from file */
2928*5e7646d2SAndroid Build Coastguard Worker 			temp[HTTP_MAX_BUFFER],
2929*5e7646d2SAndroid Build Coastguard Worker 					/* Temporary buffer for value */
2930*5e7646d2SAndroid Build Coastguard Worker 			*value;		/* Pointer to value */
2931*5e7646d2SAndroid Build Coastguard Worker   int			valuelen;	/* Length of value */
2932*5e7646d2SAndroid Build Coastguard Worker   http_addrlist_t	*addrlist,	/* Address list */
2933*5e7646d2SAndroid Build Coastguard Worker 			*addr;		/* Current address */
2934*5e7646d2SAndroid Build Coastguard Worker 
2935*5e7646d2SAndroid Build Coastguard Worker 
2936*5e7646d2SAndroid Build Coastguard Worker  /*
2937*5e7646d2SAndroid Build Coastguard Worker   * Loop through each line in the file...
2938*5e7646d2SAndroid Build Coastguard Worker   */
2939*5e7646d2SAndroid Build Coastguard Worker 
2940*5e7646d2SAndroid Build Coastguard Worker   linenum = 0;
2941*5e7646d2SAndroid Build Coastguard Worker 
2942*5e7646d2SAndroid Build Coastguard Worker   while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
2943*5e7646d2SAndroid Build Coastguard Worker   {
2944*5e7646d2SAndroid Build Coastguard Worker    /*
2945*5e7646d2SAndroid Build Coastguard Worker     * Decode the directive...
2946*5e7646d2SAndroid Build Coastguard Worker     */
2947*5e7646d2SAndroid Build Coastguard Worker 
2948*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(line, "<Location") && value)
2949*5e7646d2SAndroid Build Coastguard Worker     {
2950*5e7646d2SAndroid Build Coastguard Worker      /*
2951*5e7646d2SAndroid Build Coastguard Worker       * <Location path>
2952*5e7646d2SAndroid Build Coastguard Worker       */
2953*5e7646d2SAndroid Build Coastguard Worker 
2954*5e7646d2SAndroid Build Coastguard Worker       linenum = read_location(fp, value, linenum);
2955*5e7646d2SAndroid Build Coastguard Worker       if (linenum == 0)
2956*5e7646d2SAndroid Build Coastguard Worker 	return (0);
2957*5e7646d2SAndroid Build Coastguard Worker     }
2958*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "<Policy") && value)
2959*5e7646d2SAndroid Build Coastguard Worker     {
2960*5e7646d2SAndroid Build Coastguard Worker      /*
2961*5e7646d2SAndroid Build Coastguard Worker       * <Policy name>
2962*5e7646d2SAndroid Build Coastguard Worker       */
2963*5e7646d2SAndroid Build Coastguard Worker 
2964*5e7646d2SAndroid Build Coastguard Worker       linenum = read_policy(fp, value, linenum);
2965*5e7646d2SAndroid Build Coastguard Worker       if (linenum == 0)
2966*5e7646d2SAndroid Build Coastguard Worker 	return (0);
2967*5e7646d2SAndroid Build Coastguard Worker     }
2968*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "FaxRetryInterval") && value)
2969*5e7646d2SAndroid Build Coastguard Worker     {
2970*5e7646d2SAndroid Build Coastguard Worker       JobRetryInterval = atoi(value);
2971*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2972*5e7646d2SAndroid Build Coastguard Worker 		      "FaxRetryInterval is deprecated; use "
2973*5e7646d2SAndroid Build Coastguard Worker 		      "JobRetryInterval on line %d of %s.", linenum, ConfigurationFile);
2974*5e7646d2SAndroid Build Coastguard Worker     }
2975*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "FaxRetryLimit") && value)
2976*5e7646d2SAndroid Build Coastguard Worker     {
2977*5e7646d2SAndroid Build Coastguard Worker       JobRetryLimit = atoi(value);
2978*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_WARN,
2979*5e7646d2SAndroid Build Coastguard Worker 		      "FaxRetryLimit is deprecated; use "
2980*5e7646d2SAndroid Build Coastguard Worker 		      "JobRetryLimit on line %d of %s.", linenum, ConfigurationFile);
2981*5e7646d2SAndroid Build Coastguard Worker     }
2982*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
2983*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "SSLOptions"))
2984*5e7646d2SAndroid Build Coastguard Worker     {
2985*5e7646d2SAndroid Build Coastguard Worker      /*
2986*5e7646d2SAndroid Build Coastguard Worker       * SSLOptions [AllowRC4] [AllowSSL3] [AllowDH] [DenyCBC] [DenyTLS1.0] [None]
2987*5e7646d2SAndroid Build Coastguard Worker       */
2988*5e7646d2SAndroid Build Coastguard Worker 
2989*5e7646d2SAndroid Build Coastguard Worker       int	options = _HTTP_TLS_NONE,/* SSL/TLS options */
2990*5e7646d2SAndroid Build Coastguard Worker 		min_version = _HTTP_TLS_1_0,
2991*5e7646d2SAndroid Build Coastguard Worker 		max_version = _HTTP_TLS_MAX;
2992*5e7646d2SAndroid Build Coastguard Worker 
2993*5e7646d2SAndroid Build Coastguard Worker       if (value)
2994*5e7646d2SAndroid Build Coastguard Worker       {
2995*5e7646d2SAndroid Build Coastguard Worker         char	*start,			/* Start of option */
2996*5e7646d2SAndroid Build Coastguard Worker 		*end;			/* End of option */
2997*5e7646d2SAndroid Build Coastguard Worker 
2998*5e7646d2SAndroid Build Coastguard Worker 	for (start = value; *start; start = end)
2999*5e7646d2SAndroid Build Coastguard Worker 	{
3000*5e7646d2SAndroid Build Coastguard Worker 	 /*
3001*5e7646d2SAndroid Build Coastguard Worker 	  * Find end of keyword...
3002*5e7646d2SAndroid Build Coastguard Worker 	  */
3003*5e7646d2SAndroid Build Coastguard Worker 
3004*5e7646d2SAndroid Build Coastguard Worker 	  end = start;
3005*5e7646d2SAndroid Build Coastguard Worker 	  while (*end && !_cups_isspace(*end))
3006*5e7646d2SAndroid Build Coastguard Worker 	    end ++;
3007*5e7646d2SAndroid Build Coastguard Worker 
3008*5e7646d2SAndroid Build Coastguard Worker 	  if (*end)
3009*5e7646d2SAndroid Build Coastguard Worker 	    *end++ = '\0';
3010*5e7646d2SAndroid Build Coastguard Worker 
3011*5e7646d2SAndroid Build Coastguard Worker          /*
3012*5e7646d2SAndroid Build Coastguard Worker 	  * Compare...
3013*5e7646d2SAndroid Build Coastguard Worker 	  */
3014*5e7646d2SAndroid Build Coastguard Worker 
3015*5e7646d2SAndroid Build Coastguard Worker 	  if (!_cups_strcasecmp(start, "AllowRC4"))
3016*5e7646d2SAndroid Build Coastguard Worker 	    options |= _HTTP_TLS_ALLOW_RC4;
3017*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "AllowSSL3"))
3018*5e7646d2SAndroid Build Coastguard Worker 	    min_version = _HTTP_TLS_SSL3;
3019*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "AllowDH"))
3020*5e7646d2SAndroid Build Coastguard Worker 	    options |= _HTTP_TLS_ALLOW_DH;
3021*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "DenyCBC"))
3022*5e7646d2SAndroid Build Coastguard Worker 	    options |= _HTTP_TLS_DENY_CBC;
3023*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "DenyTLS1.0"))
3024*5e7646d2SAndroid Build Coastguard Worker 	    min_version = _HTTP_TLS_1_1;
3025*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MaxTLS1.0"))
3026*5e7646d2SAndroid Build Coastguard Worker 	    max_version = _HTTP_TLS_1_0;
3027*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MaxTLS1.1"))
3028*5e7646d2SAndroid Build Coastguard Worker 	    max_version = _HTTP_TLS_1_1;
3029*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MaxTLS1.2"))
3030*5e7646d2SAndroid Build Coastguard Worker 	    max_version = _HTTP_TLS_1_2;
3031*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MaxTLS1.3"))
3032*5e7646d2SAndroid Build Coastguard Worker 	    max_version = _HTTP_TLS_1_3;
3033*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MinTLS1.0"))
3034*5e7646d2SAndroid Build Coastguard Worker 	    min_version = _HTTP_TLS_1_0;
3035*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MinTLS1.1"))
3036*5e7646d2SAndroid Build Coastguard Worker 	    min_version = _HTTP_TLS_1_1;
3037*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MinTLS1.2"))
3038*5e7646d2SAndroid Build Coastguard Worker 	    min_version = _HTTP_TLS_1_2;
3039*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "MinTLS1.3"))
3040*5e7646d2SAndroid Build Coastguard Worker 	    min_version = _HTTP_TLS_1_3;
3041*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(start, "None"))
3042*5e7646d2SAndroid Build Coastguard Worker 	    options = _HTTP_TLS_NONE;
3043*5e7646d2SAndroid Build Coastguard Worker 	  else if (_cups_strcasecmp(start, "NoEmptyFragments"))
3044*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_WARN, "Unknown SSL option %s at line %d.", start, linenum);
3045*5e7646d2SAndroid Build Coastguard Worker         }
3046*5e7646d2SAndroid Build Coastguard Worker       }
3047*5e7646d2SAndroid Build Coastguard Worker 
3048*5e7646d2SAndroid Build Coastguard Worker       _httpTLSSetOptions(options, min_version, max_version);
3049*5e7646d2SAndroid Build Coastguard Worker     }
3050*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3051*5e7646d2SAndroid Build Coastguard Worker     else if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")
3052*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
3053*5e7646d2SAndroid Build Coastguard Worker              || !_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen")
3054*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3055*5e7646d2SAndroid Build Coastguard Worker 	     ) && value)
3056*5e7646d2SAndroid Build Coastguard Worker     {
3057*5e7646d2SAndroid Build Coastguard Worker      /*
3058*5e7646d2SAndroid Build Coastguard Worker       * Add listening address(es) to the list...
3059*5e7646d2SAndroid Build Coastguard Worker       */
3060*5e7646d2SAndroid Build Coastguard Worker 
3061*5e7646d2SAndroid Build Coastguard Worker       cupsd_listener_t	*lis;		/* New listeners array */
3062*5e7646d2SAndroid Build Coastguard Worker 
3063*5e7646d2SAndroid Build Coastguard Worker 
3064*5e7646d2SAndroid Build Coastguard Worker      /*
3065*5e7646d2SAndroid Build Coastguard Worker       * Get the address list...
3066*5e7646d2SAndroid Build Coastguard Worker       */
3067*5e7646d2SAndroid Build Coastguard Worker 
3068*5e7646d2SAndroid Build Coastguard Worker       addrlist = get_address(value, IPP_PORT);
3069*5e7646d2SAndroid Build Coastguard Worker 
3070*5e7646d2SAndroid Build Coastguard Worker       if (!addrlist)
3071*5e7646d2SAndroid Build Coastguard Worker       {
3072*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR, "Bad %s address %s at line %d.", line,
3073*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum);
3074*5e7646d2SAndroid Build Coastguard Worker         continue;
3075*5e7646d2SAndroid Build Coastguard Worker       }
3076*5e7646d2SAndroid Build Coastguard Worker 
3077*5e7646d2SAndroid Build Coastguard Worker      /*
3078*5e7646d2SAndroid Build Coastguard Worker       * Add each address...
3079*5e7646d2SAndroid Build Coastguard Worker       */
3080*5e7646d2SAndroid Build Coastguard Worker 
3081*5e7646d2SAndroid Build Coastguard Worker       for (addr = addrlist; addr; addr = addr->next)
3082*5e7646d2SAndroid Build Coastguard Worker       {
3083*5e7646d2SAndroid Build Coastguard Worker        /*
3084*5e7646d2SAndroid Build Coastguard Worker         * See if this address is already present...
3085*5e7646d2SAndroid Build Coastguard Worker 	*/
3086*5e7646d2SAndroid Build Coastguard Worker 
3087*5e7646d2SAndroid Build Coastguard Worker         for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners);
3088*5e7646d2SAndroid Build Coastguard Worker 	     lis;
3089*5e7646d2SAndroid Build Coastguard Worker 	     lis = (cupsd_listener_t *)cupsArrayNext(Listeners))
3090*5e7646d2SAndroid Build Coastguard Worker           if (httpAddrEqual(&(addr->addr), &(lis->address)) &&
3091*5e7646d2SAndroid Build Coastguard Worker 	      httpAddrPort(&(addr->addr)) == httpAddrPort(&(lis->address)))
3092*5e7646d2SAndroid Build Coastguard Worker 	    break;
3093*5e7646d2SAndroid Build Coastguard Worker 
3094*5e7646d2SAndroid Build Coastguard Worker         if (lis)
3095*5e7646d2SAndroid Build Coastguard Worker 	{
3096*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_ONDEMAND
3097*5e7646d2SAndroid Build Coastguard Worker 	  if (!lis->on_demand)
3098*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_ONDEMAND */
3099*5e7646d2SAndroid Build Coastguard Worker 	  {
3100*5e7646d2SAndroid Build Coastguard Worker 	    httpAddrString(&lis->address, temp, sizeof(temp));
3101*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_WARN,
3102*5e7646d2SAndroid Build Coastguard Worker 			    "Duplicate listen address \"%s\" ignored.", temp);
3103*5e7646d2SAndroid Build Coastguard Worker 	  }
3104*5e7646d2SAndroid Build Coastguard Worker 
3105*5e7646d2SAndroid Build Coastguard Worker           continue;
3106*5e7646d2SAndroid Build Coastguard Worker 	}
3107*5e7646d2SAndroid Build Coastguard Worker 
3108*5e7646d2SAndroid Build Coastguard Worker        /*
3109*5e7646d2SAndroid Build Coastguard Worker         * Allocate another listener...
3110*5e7646d2SAndroid Build Coastguard Worker 	*/
3111*5e7646d2SAndroid Build Coastguard Worker 
3112*5e7646d2SAndroid Build Coastguard Worker         if (!Listeners)
3113*5e7646d2SAndroid Build Coastguard Worker 	  Listeners = cupsArrayNew(NULL, NULL);
3114*5e7646d2SAndroid Build Coastguard Worker 
3115*5e7646d2SAndroid Build Coastguard Worker 	if (!Listeners)
3116*5e7646d2SAndroid Build Coastguard Worker 	{
3117*5e7646d2SAndroid Build Coastguard Worker           cupsdLogMessage(CUPSD_LOG_ERROR,
3118*5e7646d2SAndroid Build Coastguard Worker 	                  "Unable to allocate %s at line %d - %s.",
3119*5e7646d2SAndroid Build Coastguard Worker 	                  line, linenum, strerror(errno));
3120*5e7646d2SAndroid Build Coastguard Worker           break;
3121*5e7646d2SAndroid Build Coastguard Worker 	}
3122*5e7646d2SAndroid Build Coastguard Worker 
3123*5e7646d2SAndroid Build Coastguard Worker         if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL)
3124*5e7646d2SAndroid Build Coastguard Worker 	{
3125*5e7646d2SAndroid Build Coastguard Worker           cupsdLogMessage(CUPSD_LOG_ERROR,
3126*5e7646d2SAndroid Build Coastguard Worker 	                  "Unable to allocate %s at line %d - %s.",
3127*5e7646d2SAndroid Build Coastguard Worker 	                  line, linenum, strerror(errno));
3128*5e7646d2SAndroid Build Coastguard Worker           break;
3129*5e7646d2SAndroid Build Coastguard Worker 	}
3130*5e7646d2SAndroid Build Coastguard Worker 
3131*5e7646d2SAndroid Build Coastguard Worker         cupsArrayAdd(Listeners, lis);
3132*5e7646d2SAndroid Build Coastguard Worker 
3133*5e7646d2SAndroid Build Coastguard Worker        /*
3134*5e7646d2SAndroid Build Coastguard Worker         * Copy the current address and log it...
3135*5e7646d2SAndroid Build Coastguard Worker 	*/
3136*5e7646d2SAndroid Build Coastguard Worker 
3137*5e7646d2SAndroid Build Coastguard Worker 	memcpy(&(lis->address), &(addr->addr), sizeof(lis->address));
3138*5e7646d2SAndroid Build Coastguard Worker 	lis->fd = -1;
3139*5e7646d2SAndroid Build Coastguard Worker 
3140*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
3141*5e7646d2SAndroid Build Coastguard Worker         if (!_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen"))
3142*5e7646d2SAndroid Build Coastguard Worker           lis->encryption = HTTP_ENCRYPT_ALWAYS;
3143*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3144*5e7646d2SAndroid Build Coastguard Worker 
3145*5e7646d2SAndroid Build Coastguard Worker 	httpAddrString(&lis->address, temp, sizeof(temp));
3146*5e7646d2SAndroid Build Coastguard Worker 
3147*5e7646d2SAndroid Build Coastguard Worker #ifdef AF_LOCAL
3148*5e7646d2SAndroid Build Coastguard Worker         if (lis->address.addr.sa_family == AF_LOCAL)
3149*5e7646d2SAndroid Build Coastguard Worker           cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s (Domain)", temp);
3150*5e7646d2SAndroid Build Coastguard Worker 	else
3151*5e7646d2SAndroid Build Coastguard Worker #endif /* AF_LOCAL */
3152*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d (IPv%d)", temp,
3153*5e7646d2SAndroid Build Coastguard Worker                         httpAddrPort(&(lis->address)),
3154*5e7646d2SAndroid Build Coastguard Worker 			httpAddrFamily(&(lis->address)) == AF_INET ? 4 : 6);
3155*5e7646d2SAndroid Build Coastguard Worker 
3156*5e7646d2SAndroid Build Coastguard Worker         if (!httpAddrLocalhost(&(lis->address)))
3157*5e7646d2SAndroid Build Coastguard Worker 	  RemotePort = httpAddrPort(&(lis->address));
3158*5e7646d2SAndroid Build Coastguard Worker       }
3159*5e7646d2SAndroid Build Coastguard Worker 
3160*5e7646d2SAndroid Build Coastguard Worker      /*
3161*5e7646d2SAndroid Build Coastguard Worker       * Free the list...
3162*5e7646d2SAndroid Build Coastguard Worker       */
3163*5e7646d2SAndroid Build Coastguard Worker 
3164*5e7646d2SAndroid Build Coastguard Worker       httpAddrFreeList(addrlist);
3165*5e7646d2SAndroid Build Coastguard Worker     }
3166*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "BrowseProtocols") ||
3167*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "BrowseLocalProtocols"))
3168*5e7646d2SAndroid Build Coastguard Worker     {
3169*5e7646d2SAndroid Build Coastguard Worker      /*
3170*5e7646d2SAndroid Build Coastguard Worker       * "BrowseProtocols name [... name]"
3171*5e7646d2SAndroid Build Coastguard Worker       * "BrowseLocalProtocols name [... name]"
3172*5e7646d2SAndroid Build Coastguard Worker       */
3173*5e7646d2SAndroid Build Coastguard Worker 
3174*5e7646d2SAndroid Build Coastguard Worker       int protocols = parse_protocols(value);
3175*5e7646d2SAndroid Build Coastguard Worker 
3176*5e7646d2SAndroid Build Coastguard Worker       if (protocols < 0)
3177*5e7646d2SAndroid Build Coastguard Worker       {
3178*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_ERROR,
3179*5e7646d2SAndroid Build Coastguard Worker 	                "Unknown browse protocol \"%s\" on line %d of %s.",
3180*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, ConfigurationFile);
3181*5e7646d2SAndroid Build Coastguard Worker         break;
3182*5e7646d2SAndroid Build Coastguard Worker       }
3183*5e7646d2SAndroid Build Coastguard Worker 
3184*5e7646d2SAndroid Build Coastguard Worker       BrowseLocalProtocols = protocols;
3185*5e7646d2SAndroid Build Coastguard Worker     }
3186*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "DefaultAuthType") && value)
3187*5e7646d2SAndroid Build Coastguard Worker     {
3188*5e7646d2SAndroid Build Coastguard Worker      /*
3189*5e7646d2SAndroid Build Coastguard Worker       * DefaultAuthType {basic,digest,basicdigest,negotiate}
3190*5e7646d2SAndroid Build Coastguard Worker       */
3191*5e7646d2SAndroid Build Coastguard Worker 
3192*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "none"))
3193*5e7646d2SAndroid Build Coastguard Worker 	default_auth_type = CUPSD_AUTH_NONE;
3194*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "basic"))
3195*5e7646d2SAndroid Build Coastguard Worker 	default_auth_type = CUPSD_AUTH_BASIC;
3196*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "negotiate"))
3197*5e7646d2SAndroid Build Coastguard Worker         default_auth_type = CUPSD_AUTH_NEGOTIATE;
3198*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "auto"))
3199*5e7646d2SAndroid Build Coastguard Worker         default_auth_type = CUPSD_AUTH_AUTO;
3200*5e7646d2SAndroid Build Coastguard Worker       else
3201*5e7646d2SAndroid Build Coastguard Worker       {
3202*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN,
3203*5e7646d2SAndroid Build Coastguard Worker 	                "Unknown default authorization type %s on line %d of %s.",
3204*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, ConfigurationFile);
3205*5e7646d2SAndroid Build Coastguard Worker 	if (FatalErrors & CUPSD_FATAL_CONFIG)
3206*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
3207*5e7646d2SAndroid Build Coastguard Worker       }
3208*5e7646d2SAndroid Build Coastguard Worker     }
3209*5e7646d2SAndroid Build Coastguard Worker #ifdef HAVE_SSL
3210*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "DefaultEncryption"))
3211*5e7646d2SAndroid Build Coastguard Worker     {
3212*5e7646d2SAndroid Build Coastguard Worker      /*
3213*5e7646d2SAndroid Build Coastguard Worker       * DefaultEncryption {Never,IfRequested,Required}
3214*5e7646d2SAndroid Build Coastguard Worker       */
3215*5e7646d2SAndroid Build Coastguard Worker 
3216*5e7646d2SAndroid Build Coastguard Worker       if (!value || !_cups_strcasecmp(value, "never"))
3217*5e7646d2SAndroid Build Coastguard Worker 	DefaultEncryption = HTTP_ENCRYPT_NEVER;
3218*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "required"))
3219*5e7646d2SAndroid Build Coastguard Worker 	DefaultEncryption = HTTP_ENCRYPT_REQUIRED;
3220*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "ifrequested"))
3221*5e7646d2SAndroid Build Coastguard Worker 	DefaultEncryption = HTTP_ENCRYPT_IF_REQUESTED;
3222*5e7646d2SAndroid Build Coastguard Worker       else
3223*5e7646d2SAndroid Build Coastguard Worker       {
3224*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN,
3225*5e7646d2SAndroid Build Coastguard Worker 	                "Unknown default encryption %s on line %d of %s.",
3226*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, ConfigurationFile);
3227*5e7646d2SAndroid Build Coastguard Worker 	if (FatalErrors & CUPSD_FATAL_CONFIG)
3228*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
3229*5e7646d2SAndroid Build Coastguard Worker       }
3230*5e7646d2SAndroid Build Coastguard Worker     }
3231*5e7646d2SAndroid Build Coastguard Worker #endif /* HAVE_SSL */
3232*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "HostNameLookups") && value)
3233*5e7646d2SAndroid Build Coastguard Worker     {
3234*5e7646d2SAndroid Build Coastguard Worker      /*
3235*5e7646d2SAndroid Build Coastguard Worker       * Do hostname lookups?
3236*5e7646d2SAndroid Build Coastguard Worker       */
3237*5e7646d2SAndroid Build Coastguard Worker 
3238*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "off") || !_cups_strcasecmp(value, "no") ||
3239*5e7646d2SAndroid Build Coastguard Worker           !_cups_strcasecmp(value, "false"))
3240*5e7646d2SAndroid Build Coastguard Worker         HostNameLookups = 0;
3241*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "yes") ||
3242*5e7646d2SAndroid Build Coastguard Worker           !_cups_strcasecmp(value, "true"))
3243*5e7646d2SAndroid Build Coastguard Worker         HostNameLookups = 1;
3244*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "double"))
3245*5e7646d2SAndroid Build Coastguard Worker         HostNameLookups = 2;
3246*5e7646d2SAndroid Build Coastguard Worker       else
3247*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "Unknown HostNameLookups %s on line %d of %s.",
3248*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, ConfigurationFile);
3249*5e7646d2SAndroid Build Coastguard Worker     }
3250*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "AccessLogLevel") && value)
3251*5e7646d2SAndroid Build Coastguard Worker     {
3252*5e7646d2SAndroid Build Coastguard Worker      /*
3253*5e7646d2SAndroid Build Coastguard Worker       * Amount of logging to do to access log...
3254*5e7646d2SAndroid Build Coastguard Worker       */
3255*5e7646d2SAndroid Build Coastguard Worker 
3256*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "all"))
3257*5e7646d2SAndroid Build Coastguard Worker         AccessLogLevel = CUPSD_ACCESSLOG_ALL;
3258*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "actions"))
3259*5e7646d2SAndroid Build Coastguard Worker         AccessLogLevel = CUPSD_ACCESSLOG_ACTIONS;
3260*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "config"))
3261*5e7646d2SAndroid Build Coastguard Worker         AccessLogLevel = CUPSD_ACCESSLOG_CONFIG;
3262*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "none"))
3263*5e7646d2SAndroid Build Coastguard Worker         AccessLogLevel = CUPSD_ACCESSLOG_NONE;
3264*5e7646d2SAndroid Build Coastguard Worker       else
3265*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_WARN, "Unknown AccessLogLevel %s on line %d of %s.",
3266*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, ConfigurationFile);
3267*5e7646d2SAndroid Build Coastguard Worker     }
3268*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "LogLevel") && value)
3269*5e7646d2SAndroid Build Coastguard Worker     {
3270*5e7646d2SAndroid Build Coastguard Worker      /*
3271*5e7646d2SAndroid Build Coastguard Worker       * Amount of logging to do to error log...
3272*5e7646d2SAndroid Build Coastguard Worker       */
3273*5e7646d2SAndroid Build Coastguard Worker 
3274*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "debug2"))
3275*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_DEBUG2;
3276*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "debug"))
3277*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_DEBUG;
3278*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "info"))
3279*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_INFO;
3280*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "notice"))
3281*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_NOTICE;
3282*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "warn"))
3283*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_WARN;
3284*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "error"))
3285*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_ERROR;
3286*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "crit"))
3287*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_CRIT;
3288*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "alert"))
3289*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_ALERT;
3290*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "emerg"))
3291*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_EMERG;
3292*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "none"))
3293*5e7646d2SAndroid Build Coastguard Worker         LogLevel = CUPSD_LOG_NONE;
3294*5e7646d2SAndroid Build Coastguard Worker       else
3295*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogLevel %s on line %d of %s.",
3296*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, ConfigurationFile);
3297*5e7646d2SAndroid Build Coastguard Worker     }
3298*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "LogTimeFormat") && value)
3299*5e7646d2SAndroid Build Coastguard Worker     {
3300*5e7646d2SAndroid Build Coastguard Worker      /*
3301*5e7646d2SAndroid Build Coastguard Worker       * Amount of logging to do to error log...
3302*5e7646d2SAndroid Build Coastguard Worker       */
3303*5e7646d2SAndroid Build Coastguard Worker 
3304*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "standard"))
3305*5e7646d2SAndroid Build Coastguard Worker         LogTimeFormat = CUPSD_TIME_STANDARD;
3306*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "usecs"))
3307*5e7646d2SAndroid Build Coastguard Worker         LogTimeFormat = CUPSD_TIME_USECS;
3308*5e7646d2SAndroid Build Coastguard Worker       else
3309*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d of %s.",
3310*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, ConfigurationFile);
3311*5e7646d2SAndroid Build Coastguard Worker     }
3312*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "ServerTokens") && value)
3313*5e7646d2SAndroid Build Coastguard Worker     {
3314*5e7646d2SAndroid Build Coastguard Worker      /*
3315*5e7646d2SAndroid Build Coastguard Worker       * Set the string used for the Server header...
3316*5e7646d2SAndroid Build Coastguard Worker       */
3317*5e7646d2SAndroid Build Coastguard Worker 
3318*5e7646d2SAndroid Build Coastguard Worker       struct utsname plat;		/* Platform info */
3319*5e7646d2SAndroid Build Coastguard Worker 
3320*5e7646d2SAndroid Build Coastguard Worker 
3321*5e7646d2SAndroid Build Coastguard Worker       uname(&plat);
3322*5e7646d2SAndroid Build Coastguard Worker 
3323*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "ProductOnly"))
3324*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetString(&ServerHeader, "CUPS IPP");
3325*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "Major"))
3326*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetStringf(&ServerHeader, "CUPS/%d IPP/2", CUPS_VERSION_MAJOR);
3327*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "Minor"))
3328*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
3329*5e7646d2SAndroid Build Coastguard Worker 	                CUPS_VERSION_MINOR);
3330*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "Minimal"))
3331*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetString(&ServerHeader, CUPS_MINIMAL " IPP/2.1");
3332*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "OS"))
3333*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s %s) IPP/2.1",
3334*5e7646d2SAndroid Build Coastguard Worker 	                plat.sysname, plat.release);
3335*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "Full"))
3336*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s %s; %s) IPP/2.1",
3337*5e7646d2SAndroid Build Coastguard Worker 	                plat.sysname, plat.release, plat.machine);
3338*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "None"))
3339*5e7646d2SAndroid Build Coastguard Worker 	cupsdSetString(&ServerHeader, "");
3340*5e7646d2SAndroid Build Coastguard Worker       else
3341*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "Unknown ServerTokens %s on line %d of %s.",
3342*5e7646d2SAndroid Build Coastguard Worker                         value, linenum, ConfigurationFile);
3343*5e7646d2SAndroid Build Coastguard Worker     }
3344*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "ServerAlias") && value)
3345*5e7646d2SAndroid Build Coastguard Worker     {
3346*5e7646d2SAndroid Build Coastguard Worker      /*
3347*5e7646d2SAndroid Build Coastguard Worker       * ServerAlias name [... name]
3348*5e7646d2SAndroid Build Coastguard Worker       */
3349*5e7646d2SAndroid Build Coastguard Worker 
3350*5e7646d2SAndroid Build Coastguard Worker       if (!ServerAlias)
3351*5e7646d2SAndroid Build Coastguard Worker         ServerAlias = cupsArrayNew(NULL, NULL);
3352*5e7646d2SAndroid Build Coastguard Worker 
3353*5e7646d2SAndroid Build Coastguard Worker       for (; *value;)
3354*5e7646d2SAndroid Build Coastguard Worker       {
3355*5e7646d2SAndroid Build Coastguard Worker         for (valuelen = 0; value[valuelen]; valuelen ++)
3356*5e7646d2SAndroid Build Coastguard Worker 	  if (_cups_isspace(value[valuelen]) || value[valuelen] == ',')
3357*5e7646d2SAndroid Build Coastguard Worker 	    break;
3358*5e7646d2SAndroid Build Coastguard Worker 
3359*5e7646d2SAndroid Build Coastguard Worker         if (value[valuelen])
3360*5e7646d2SAndroid Build Coastguard Worker         {
3361*5e7646d2SAndroid Build Coastguard Worker 	  value[valuelen] = '\0';
3362*5e7646d2SAndroid Build Coastguard Worker 	  valuelen ++;
3363*5e7646d2SAndroid Build Coastguard Worker 	}
3364*5e7646d2SAndroid Build Coastguard Worker 
3365*5e7646d2SAndroid Build Coastguard Worker 	cupsdAddAlias(ServerAlias, value);
3366*5e7646d2SAndroid Build Coastguard Worker 
3367*5e7646d2SAndroid Build Coastguard Worker         for (value += valuelen; *value; value ++)
3368*5e7646d2SAndroid Build Coastguard Worker 	  if (!_cups_isspace(*value) || *value != ',')
3369*5e7646d2SAndroid Build Coastguard Worker 	    break;
3370*5e7646d2SAndroid Build Coastguard Worker       }
3371*5e7646d2SAndroid Build Coastguard Worker     }
3372*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "AccessLog") ||
3373*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "CacheDir") ||
3374*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ConfigFilePerm") ||
3375*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "DataDir") ||
3376*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "DocumentRoot") ||
3377*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ErrorLog") ||
3378*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "FatalErrors") ||
3379*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "FileDevice") ||
3380*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "FontPath") ||
3381*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "Group") ||
3382*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "LogFilePerm") ||
3383*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "LPDConfigFile") ||
3384*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "PageLog") ||
3385*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "PassEnv") ||
3386*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "Printcap") ||
3387*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "PrintcapFormat") ||
3388*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "RemoteRoot") ||
3389*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "RequestRoot") ||
3390*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ServerBin") ||
3391*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ServerCertificate") ||
3392*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ServerKey") ||
3393*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ServerKeychain") ||
3394*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ServerRoot") ||
3395*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "SetEnv") ||
3396*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "SMBConfigFile") ||
3397*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "StateDir") ||
3398*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "SystemGroup") ||
3399*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "SystemGroupAuthKey") ||
3400*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "TempDir") ||
3401*5e7646d2SAndroid Build Coastguard Worker 	     !_cups_strcasecmp(line, "User"))
3402*5e7646d2SAndroid Build Coastguard Worker     {
3403*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
3404*5e7646d2SAndroid Build Coastguard Worker 		      "Please move \"%s%s%s\" on line %d of %s to the %s file; "
3405*5e7646d2SAndroid Build Coastguard Worker 		      "this will become an error in a future release.",
3406*5e7646d2SAndroid Build Coastguard Worker 		      line, value ? " " : "", value ? value : "", linenum,
3407*5e7646d2SAndroid Build Coastguard Worker 		      ConfigurationFile, CupsFilesFile);
3408*5e7646d2SAndroid Build Coastguard Worker     }
3409*5e7646d2SAndroid Build Coastguard Worker     else
3410*5e7646d2SAndroid Build Coastguard Worker       parse_variable(ConfigurationFile, linenum, line, value,
3411*5e7646d2SAndroid Build Coastguard Worker                      sizeof(cupsd_vars) / sizeof(cupsd_vars[0]), cupsd_vars);
3412*5e7646d2SAndroid Build Coastguard Worker   }
3413*5e7646d2SAndroid Build Coastguard Worker 
3414*5e7646d2SAndroid Build Coastguard Worker   return (1);
3415*5e7646d2SAndroid Build Coastguard Worker }
3416*5e7646d2SAndroid Build Coastguard Worker 
3417*5e7646d2SAndroid Build Coastguard Worker 
3418*5e7646d2SAndroid Build Coastguard Worker /*
3419*5e7646d2SAndroid Build Coastguard Worker  * 'read_cups_files_conf()' - Read the cups-files.conf configuration file.
3420*5e7646d2SAndroid Build Coastguard Worker  */
3421*5e7646d2SAndroid Build Coastguard Worker 
3422*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 on success, 0 on failure */
read_cups_files_conf(cups_file_t * fp)3423*5e7646d2SAndroid Build Coastguard Worker read_cups_files_conf(cups_file_t *fp)	/* I - File to read from */
3424*5e7646d2SAndroid Build Coastguard Worker {
3425*5e7646d2SAndroid Build Coastguard Worker   int		i,			/* Looping var */
3426*5e7646d2SAndroid Build Coastguard Worker 		linenum;		/* Current line number */
3427*5e7646d2SAndroid Build Coastguard Worker   char		line[HTTP_MAX_BUFFER],	/* Line from file */
3428*5e7646d2SAndroid Build Coastguard Worker 		*value;			/* Value from line */
3429*5e7646d2SAndroid Build Coastguard Worker   struct group	*group;			/* Group */
3430*5e7646d2SAndroid Build Coastguard Worker   static const char * const prohibited_env[] =
3431*5e7646d2SAndroid Build Coastguard Worker   {					/* Prohibited environment variables */
3432*5e7646d2SAndroid Build Coastguard Worker     "APPLE_LANGUAGE",
3433*5e7646d2SAndroid Build Coastguard Worker     "AUTH_DOMAIN",
3434*5e7646d2SAndroid Build Coastguard Worker     "AUTH_INFO_REQUIRED",
3435*5e7646d2SAndroid Build Coastguard Worker     "AUTH_NEGOTIATE",
3436*5e7646d2SAndroid Build Coastguard Worker     "AUTH_PASSWORD",
3437*5e7646d2SAndroid Build Coastguard Worker     "AUTH_UID",
3438*5e7646d2SAndroid Build Coastguard Worker     "AUTH_USERNAME",
3439*5e7646d2SAndroid Build Coastguard Worker     "CHARSET",
3440*5e7646d2SAndroid Build Coastguard Worker     "CLASS",
3441*5e7646d2SAndroid Build Coastguard Worker     "CLASSIFICATION",
3442*5e7646d2SAndroid Build Coastguard Worker     "CONTENT_TYPE",
3443*5e7646d2SAndroid Build Coastguard Worker     "CUPS_CACHEDIR",
3444*5e7646d2SAndroid Build Coastguard Worker     "CUPS_DATADIR",
3445*5e7646d2SAndroid Build Coastguard Worker     "CUPS_DOCROOT",
3446*5e7646d2SAndroid Build Coastguard Worker     "CUPS_FILETYPE",
3447*5e7646d2SAndroid Build Coastguard Worker     "CUPS_FONTPATH",
3448*5e7646d2SAndroid Build Coastguard Worker     "CUPS_MAX_MESSAGE",
3449*5e7646d2SAndroid Build Coastguard Worker     "CUPS_REQUESTROOT",
3450*5e7646d2SAndroid Build Coastguard Worker     "CUPS_SERVERBIN",
3451*5e7646d2SAndroid Build Coastguard Worker     "CUPS_SERVERROOT",
3452*5e7646d2SAndroid Build Coastguard Worker     "CUPS_STATEDIR",
3453*5e7646d2SAndroid Build Coastguard Worker     "DEVICE_URI",
3454*5e7646d2SAndroid Build Coastguard Worker     "FINAL_CONTENT_TYPE",
3455*5e7646d2SAndroid Build Coastguard Worker     "HOME",
3456*5e7646d2SAndroid Build Coastguard Worker     "LANG",
3457*5e7646d2SAndroid Build Coastguard Worker     "PPD",
3458*5e7646d2SAndroid Build Coastguard Worker     "PRINTER",
3459*5e7646d2SAndroid Build Coastguard Worker     "PRINTER_INFO",
3460*5e7646d2SAndroid Build Coastguard Worker     "PRINTER_LOCATION",
3461*5e7646d2SAndroid Build Coastguard Worker     "PRINTER_STATE_REASONS",
3462*5e7646d2SAndroid Build Coastguard Worker     "RIP_CACHE",
3463*5e7646d2SAndroid Build Coastguard Worker     "SERVER_ADMIN",
3464*5e7646d2SAndroid Build Coastguard Worker     "SOFTWARE",
3465*5e7646d2SAndroid Build Coastguard Worker     "TMPDIR",
3466*5e7646d2SAndroid Build Coastguard Worker     "USER"
3467*5e7646d2SAndroid Build Coastguard Worker   };
3468*5e7646d2SAndroid Build Coastguard Worker 
3469*5e7646d2SAndroid Build Coastguard Worker 
3470*5e7646d2SAndroid Build Coastguard Worker  /*
3471*5e7646d2SAndroid Build Coastguard Worker   * Loop through each line in the file...
3472*5e7646d2SAndroid Build Coastguard Worker   */
3473*5e7646d2SAndroid Build Coastguard Worker 
3474*5e7646d2SAndroid Build Coastguard Worker   linenum = 0;
3475*5e7646d2SAndroid Build Coastguard Worker 
3476*5e7646d2SAndroid Build Coastguard Worker   while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
3477*5e7646d2SAndroid Build Coastguard Worker   {
3478*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(line, "FatalErrors"))
3479*5e7646d2SAndroid Build Coastguard Worker       FatalErrors = parse_fatal_errors(value);
3480*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "Group") && value)
3481*5e7646d2SAndroid Build Coastguard Worker     {
3482*5e7646d2SAndroid Build Coastguard Worker      /*
3483*5e7646d2SAndroid Build Coastguard Worker       * Group ID to run as...
3484*5e7646d2SAndroid Build Coastguard Worker       */
3485*5e7646d2SAndroid Build Coastguard Worker 
3486*5e7646d2SAndroid Build Coastguard Worker       if (isdigit(value[0]))
3487*5e7646d2SAndroid Build Coastguard Worker         Group = (gid_t)atoi(value);
3488*5e7646d2SAndroid Build Coastguard Worker       else
3489*5e7646d2SAndroid Build Coastguard Worker       {
3490*5e7646d2SAndroid Build Coastguard Worker         endgrent();
3491*5e7646d2SAndroid Build Coastguard Worker 	group = getgrnam(value);
3492*5e7646d2SAndroid Build Coastguard Worker 
3493*5e7646d2SAndroid Build Coastguard Worker 	if (group != NULL)
3494*5e7646d2SAndroid Build Coastguard Worker 	  Group = group->gr_gid;
3495*5e7646d2SAndroid Build Coastguard Worker 	else
3496*5e7646d2SAndroid Build Coastguard Worker 	{
3497*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
3498*5e7646d2SAndroid Build Coastguard Worker 	                  "Unknown Group \"%s\" on line %d of %s.", value,
3499*5e7646d2SAndroid Build Coastguard Worker 	                  linenum, CupsFilesFile);
3500*5e7646d2SAndroid Build Coastguard Worker 	  if (FatalErrors & CUPSD_FATAL_CONFIG)
3501*5e7646d2SAndroid Build Coastguard Worker 	    return (0);
3502*5e7646d2SAndroid Build Coastguard Worker 	}
3503*5e7646d2SAndroid Build Coastguard Worker       }
3504*5e7646d2SAndroid Build Coastguard Worker     }
3505*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "PassEnv") && value)
3506*5e7646d2SAndroid Build Coastguard Worker     {
3507*5e7646d2SAndroid Build Coastguard Worker      /*
3508*5e7646d2SAndroid Build Coastguard Worker       * PassEnv variable [... variable]
3509*5e7646d2SAndroid Build Coastguard Worker       */
3510*5e7646d2SAndroid Build Coastguard Worker 
3511*5e7646d2SAndroid Build Coastguard Worker       int valuelen;			/* Length of variable name */
3512*5e7646d2SAndroid Build Coastguard Worker 
3513*5e7646d2SAndroid Build Coastguard Worker       for (; *value;)
3514*5e7646d2SAndroid Build Coastguard Worker       {
3515*5e7646d2SAndroid Build Coastguard Worker         for (valuelen = 0; value[valuelen]; valuelen ++)
3516*5e7646d2SAndroid Build Coastguard Worker 	  if (_cups_isspace(value[valuelen]) || value[valuelen] == ',')
3517*5e7646d2SAndroid Build Coastguard Worker 	    break;
3518*5e7646d2SAndroid Build Coastguard Worker 
3519*5e7646d2SAndroid Build Coastguard Worker         if (value[valuelen])
3520*5e7646d2SAndroid Build Coastguard Worker         {
3521*5e7646d2SAndroid Build Coastguard Worker 	  value[valuelen] = '\0';
3522*5e7646d2SAndroid Build Coastguard Worker 	  valuelen ++;
3523*5e7646d2SAndroid Build Coastguard Worker 	}
3524*5e7646d2SAndroid Build Coastguard Worker 
3525*5e7646d2SAndroid Build Coastguard Worker         for (i = 0; i < (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])); i ++)
3526*5e7646d2SAndroid Build Coastguard Worker         {
3527*5e7646d2SAndroid Build Coastguard Worker           if (!strcmp(value, prohibited_env[i]))
3528*5e7646d2SAndroid Build Coastguard Worker           {
3529*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_ERROR, "Environment variable \"%s\" cannot be passed through on line %d of %s.", value, linenum, CupsFilesFile);
3530*5e7646d2SAndroid Build Coastguard Worker 
3531*5e7646d2SAndroid Build Coastguard Worker 	    if (FatalErrors & CUPSD_FATAL_CONFIG)
3532*5e7646d2SAndroid Build Coastguard Worker 	      return (0);
3533*5e7646d2SAndroid Build Coastguard Worker 	    else
3534*5e7646d2SAndroid Build Coastguard Worker 	      break;
3535*5e7646d2SAndroid Build Coastguard Worker           }
3536*5e7646d2SAndroid Build Coastguard Worker 	}
3537*5e7646d2SAndroid Build Coastguard Worker 
3538*5e7646d2SAndroid Build Coastguard Worker         if (i >= (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])))
3539*5e7646d2SAndroid Build Coastguard Worker           cupsdSetEnv(value, NULL);
3540*5e7646d2SAndroid Build Coastguard Worker 
3541*5e7646d2SAndroid Build Coastguard Worker         for (value += valuelen; *value; value ++)
3542*5e7646d2SAndroid Build Coastguard Worker 	  if (!_cups_isspace(*value) || *value != ',')
3543*5e7646d2SAndroid Build Coastguard Worker 	    break;
3544*5e7646d2SAndroid Build Coastguard Worker       }
3545*5e7646d2SAndroid Build Coastguard Worker     }
3546*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "PrintcapFormat") && value)
3547*5e7646d2SAndroid Build Coastguard Worker     {
3548*5e7646d2SAndroid Build Coastguard Worker      /*
3549*5e7646d2SAndroid Build Coastguard Worker       * Format of printcap file?
3550*5e7646d2SAndroid Build Coastguard Worker       */
3551*5e7646d2SAndroid Build Coastguard Worker 
3552*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "bsd"))
3553*5e7646d2SAndroid Build Coastguard Worker         PrintcapFormat = PRINTCAP_BSD;
3554*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "plist"))
3555*5e7646d2SAndroid Build Coastguard Worker         PrintcapFormat = PRINTCAP_PLIST;
3556*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "solaris"))
3557*5e7646d2SAndroid Build Coastguard Worker         PrintcapFormat = PRINTCAP_SOLARIS;
3558*5e7646d2SAndroid Build Coastguard Worker       else
3559*5e7646d2SAndroid Build Coastguard Worker       {
3560*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_ERROR,
3561*5e7646d2SAndroid Build Coastguard Worker 	                "Unknown PrintcapFormat \"%s\" on line %d of %s.",
3562*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, CupsFilesFile);
3563*5e7646d2SAndroid Build Coastguard Worker         if (FatalErrors & CUPSD_FATAL_CONFIG)
3564*5e7646d2SAndroid Build Coastguard Worker           return (0);
3565*5e7646d2SAndroid Build Coastguard Worker       }
3566*5e7646d2SAndroid Build Coastguard Worker     }
3567*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "Sandboxing") && value)
3568*5e7646d2SAndroid Build Coastguard Worker     {
3569*5e7646d2SAndroid Build Coastguard Worker      /*
3570*5e7646d2SAndroid Build Coastguard Worker       * Level of sandboxing?
3571*5e7646d2SAndroid Build Coastguard Worker       */
3572*5e7646d2SAndroid Build Coastguard Worker 
3573*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(value, "off") && getuid())
3574*5e7646d2SAndroid Build Coastguard Worker         Sandboxing = CUPSD_SANDBOXING_OFF;
3575*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "relaxed"))
3576*5e7646d2SAndroid Build Coastguard Worker         Sandboxing = CUPSD_SANDBOXING_RELAXED;
3577*5e7646d2SAndroid Build Coastguard Worker       else if (!_cups_strcasecmp(value, "strict"))
3578*5e7646d2SAndroid Build Coastguard Worker         Sandboxing = CUPSD_SANDBOXING_STRICT;
3579*5e7646d2SAndroid Build Coastguard Worker       else
3580*5e7646d2SAndroid Build Coastguard Worker       {
3581*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_ERROR,
3582*5e7646d2SAndroid Build Coastguard Worker 	                "Unknown Sandboxing \"%s\" on line %d of %s.",
3583*5e7646d2SAndroid Build Coastguard Worker 	                value, linenum, CupsFilesFile);
3584*5e7646d2SAndroid Build Coastguard Worker         if (FatalErrors & CUPSD_FATAL_CONFIG)
3585*5e7646d2SAndroid Build Coastguard Worker           return (0);
3586*5e7646d2SAndroid Build Coastguard Worker       }
3587*5e7646d2SAndroid Build Coastguard Worker     }
3588*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "SetEnv") && value)
3589*5e7646d2SAndroid Build Coastguard Worker     {
3590*5e7646d2SAndroid Build Coastguard Worker      /*
3591*5e7646d2SAndroid Build Coastguard Worker       * SetEnv variable value
3592*5e7646d2SAndroid Build Coastguard Worker       */
3593*5e7646d2SAndroid Build Coastguard Worker 
3594*5e7646d2SAndroid Build Coastguard Worker       char *valueptr;			/* Pointer to environment variable value */
3595*5e7646d2SAndroid Build Coastguard Worker 
3596*5e7646d2SAndroid Build Coastguard Worker       for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++);
3597*5e7646d2SAndroid Build Coastguard Worker 
3598*5e7646d2SAndroid Build Coastguard Worker       if (*valueptr)
3599*5e7646d2SAndroid Build Coastguard Worker       {
3600*5e7646d2SAndroid Build Coastguard Worker        /*
3601*5e7646d2SAndroid Build Coastguard Worker         * Found a value...
3602*5e7646d2SAndroid Build Coastguard Worker 	*/
3603*5e7646d2SAndroid Build Coastguard Worker 
3604*5e7646d2SAndroid Build Coastguard Worker         while (isspace(*valueptr & 255))
3605*5e7646d2SAndroid Build Coastguard Worker 	  *valueptr++ = '\0';
3606*5e7646d2SAndroid Build Coastguard Worker 
3607*5e7646d2SAndroid Build Coastguard Worker         for (i = 0; i < (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])); i ++)
3608*5e7646d2SAndroid Build Coastguard Worker         {
3609*5e7646d2SAndroid Build Coastguard Worker           if (!strcmp(value, prohibited_env[i]))
3610*5e7646d2SAndroid Build Coastguard Worker           {
3611*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_ERROR, "Environment variable \"%s\" cannot be set  on line %d of %s.", value, linenum, CupsFilesFile);
3612*5e7646d2SAndroid Build Coastguard Worker 
3613*5e7646d2SAndroid Build Coastguard Worker 	    if (FatalErrors & CUPSD_FATAL_CONFIG)
3614*5e7646d2SAndroid Build Coastguard Worker 	      return (0);
3615*5e7646d2SAndroid Build Coastguard Worker 	    else
3616*5e7646d2SAndroid Build Coastguard Worker 	      break;
3617*5e7646d2SAndroid Build Coastguard Worker           }
3618*5e7646d2SAndroid Build Coastguard Worker 	}
3619*5e7646d2SAndroid Build Coastguard Worker 
3620*5e7646d2SAndroid Build Coastguard Worker         if (i >= (int)(sizeof(prohibited_env) / sizeof(prohibited_env[0])))
3621*5e7646d2SAndroid Build Coastguard Worker 	  cupsdSetEnv(value, valueptr);
3622*5e7646d2SAndroid Build Coastguard Worker       }
3623*5e7646d2SAndroid Build Coastguard Worker       else
3624*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR,
3625*5e7646d2SAndroid Build Coastguard Worker 	                "Missing value for SetEnv directive on line %d of %s.",
3626*5e7646d2SAndroid Build Coastguard Worker 	                linenum, ConfigurationFile);
3627*5e7646d2SAndroid Build Coastguard Worker     }
3628*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "SystemGroup") && value)
3629*5e7646d2SAndroid Build Coastguard Worker     {
3630*5e7646d2SAndroid Build Coastguard Worker      /*
3631*5e7646d2SAndroid Build Coastguard Worker       * SystemGroup (admin) group(s)...
3632*5e7646d2SAndroid Build Coastguard Worker       */
3633*5e7646d2SAndroid Build Coastguard Worker 
3634*5e7646d2SAndroid Build Coastguard Worker       if (!parse_groups(value, linenum))
3635*5e7646d2SAndroid Build Coastguard Worker       {
3636*5e7646d2SAndroid Build Coastguard Worker         if (FatalErrors & CUPSD_FATAL_CONFIG)
3637*5e7646d2SAndroid Build Coastguard Worker           return (0);
3638*5e7646d2SAndroid Build Coastguard Worker       }
3639*5e7646d2SAndroid Build Coastguard Worker     }
3640*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "User") && value)
3641*5e7646d2SAndroid Build Coastguard Worker     {
3642*5e7646d2SAndroid Build Coastguard Worker      /*
3643*5e7646d2SAndroid Build Coastguard Worker       * User ID to run as...
3644*5e7646d2SAndroid Build Coastguard Worker       */
3645*5e7646d2SAndroid Build Coastguard Worker 
3646*5e7646d2SAndroid Build Coastguard Worker       if (isdigit(value[0] & 255))
3647*5e7646d2SAndroid Build Coastguard Worker       {
3648*5e7646d2SAndroid Build Coastguard Worker         int uid = atoi(value);
3649*5e7646d2SAndroid Build Coastguard Worker 
3650*5e7646d2SAndroid Build Coastguard Worker 	if (!uid)
3651*5e7646d2SAndroid Build Coastguard Worker 	{
3652*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
3653*5e7646d2SAndroid Build Coastguard Worker 	                  "Will not use User 0 as specified on line %d of %s "
3654*5e7646d2SAndroid Build Coastguard Worker 			  "for security reasons.  You must use a non-"
3655*5e7646d2SAndroid Build Coastguard Worker 			  "privileged account instead.",
3656*5e7646d2SAndroid Build Coastguard Worker 	                  linenum, CupsFilesFile);
3657*5e7646d2SAndroid Build Coastguard Worker           if (FatalErrors & CUPSD_FATAL_CONFIG)
3658*5e7646d2SAndroid Build Coastguard Worker             return (0);
3659*5e7646d2SAndroid Build Coastguard Worker         }
3660*5e7646d2SAndroid Build Coastguard Worker         else
3661*5e7646d2SAndroid Build Coastguard Worker 	  User = (uid_t)atoi(value);
3662*5e7646d2SAndroid Build Coastguard Worker       }
3663*5e7646d2SAndroid Build Coastguard Worker       else
3664*5e7646d2SAndroid Build Coastguard Worker       {
3665*5e7646d2SAndroid Build Coastguard Worker         struct passwd *p;	/* Password information */
3666*5e7646d2SAndroid Build Coastguard Worker 
3667*5e7646d2SAndroid Build Coastguard Worker         endpwent();
3668*5e7646d2SAndroid Build Coastguard Worker 	p = getpwnam(value);
3669*5e7646d2SAndroid Build Coastguard Worker 
3670*5e7646d2SAndroid Build Coastguard Worker 	if (p)
3671*5e7646d2SAndroid Build Coastguard Worker 	{
3672*5e7646d2SAndroid Build Coastguard Worker 	  if (!p->pw_uid)
3673*5e7646d2SAndroid Build Coastguard Worker 	  {
3674*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_ERROR,
3675*5e7646d2SAndroid Build Coastguard Worker 	                    "Will not use User %s (UID=0) as specified on line "
3676*5e7646d2SAndroid Build Coastguard Worker 			    "%d of %s for security reasons.  You must use a "
3677*5e7646d2SAndroid Build Coastguard Worker 			    "non-privileged account instead.",
3678*5e7646d2SAndroid Build Coastguard Worker 	                    value, linenum, CupsFilesFile);
3679*5e7646d2SAndroid Build Coastguard Worker 	    if (FatalErrors & CUPSD_FATAL_CONFIG)
3680*5e7646d2SAndroid Build Coastguard Worker 	      return (0);
3681*5e7646d2SAndroid Build Coastguard Worker 	  }
3682*5e7646d2SAndroid Build Coastguard Worker 	  else
3683*5e7646d2SAndroid Build Coastguard Worker 	    User = p->pw_uid;
3684*5e7646d2SAndroid Build Coastguard Worker 	}
3685*5e7646d2SAndroid Build Coastguard Worker 	else
3686*5e7646d2SAndroid Build Coastguard Worker 	{
3687*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
3688*5e7646d2SAndroid Build Coastguard Worker 	                  "Unknown User \"%s\" on line %d of %s.",
3689*5e7646d2SAndroid Build Coastguard Worker 	                  value, linenum, CupsFilesFile);
3690*5e7646d2SAndroid Build Coastguard Worker           if (FatalErrors & CUPSD_FATAL_CONFIG)
3691*5e7646d2SAndroid Build Coastguard Worker             return (0);
3692*5e7646d2SAndroid Build Coastguard Worker         }
3693*5e7646d2SAndroid Build Coastguard Worker       }
3694*5e7646d2SAndroid Build Coastguard Worker     }
3695*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "ServerCertificate") ||
3696*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "ServerKey"))
3697*5e7646d2SAndroid Build Coastguard Worker     {
3698*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_INFO,
3699*5e7646d2SAndroid Build Coastguard Worker 		      "The \"%s\" directive on line %d of %s is no longer "
3700*5e7646d2SAndroid Build Coastguard Worker 		      "supported; this will become an error in a future "
3701*5e7646d2SAndroid Build Coastguard Worker 		      "release.",
3702*5e7646d2SAndroid Build Coastguard Worker 		      line, linenum, CupsFilesFile);
3703*5e7646d2SAndroid Build Coastguard Worker     }
3704*5e7646d2SAndroid Build Coastguard Worker     else if (!parse_variable(CupsFilesFile, linenum, line, value,
3705*5e7646d2SAndroid Build Coastguard Worker 			     sizeof(cupsfiles_vars) / sizeof(cupsfiles_vars[0]),
3706*5e7646d2SAndroid Build Coastguard Worker 			     cupsfiles_vars) &&
3707*5e7646d2SAndroid Build Coastguard Worker 	     (FatalErrors & CUPSD_FATAL_CONFIG))
3708*5e7646d2SAndroid Build Coastguard Worker       return (0);
3709*5e7646d2SAndroid Build Coastguard Worker   }
3710*5e7646d2SAndroid Build Coastguard Worker 
3711*5e7646d2SAndroid Build Coastguard Worker   return (1);
3712*5e7646d2SAndroid Build Coastguard Worker }
3713*5e7646d2SAndroid Build Coastguard Worker 
3714*5e7646d2SAndroid Build Coastguard Worker 
3715*5e7646d2SAndroid Build Coastguard Worker /*
3716*5e7646d2SAndroid Build Coastguard Worker  * 'read_location()' - Read a <Location path> definition.
3717*5e7646d2SAndroid Build Coastguard Worker  */
3718*5e7646d2SAndroid Build Coastguard Worker 
3719*5e7646d2SAndroid Build Coastguard Worker static int				/* O - New line number or 0 on error */
read_location(cups_file_t * fp,char * location,int linenum)3720*5e7646d2SAndroid Build Coastguard Worker read_location(cups_file_t *fp,		/* I - Configuration file */
3721*5e7646d2SAndroid Build Coastguard Worker               char        *location,	/* I - Location name/path */
3722*5e7646d2SAndroid Build Coastguard Worker 	      int         linenum)	/* I - Current line number */
3723*5e7646d2SAndroid Build Coastguard Worker {
3724*5e7646d2SAndroid Build Coastguard Worker   cupsd_location_t	*loc,		/* New location */
3725*5e7646d2SAndroid Build Coastguard Worker 			*parent;	/* Parent location */
3726*5e7646d2SAndroid Build Coastguard Worker   char			line[HTTP_MAX_BUFFER],
3727*5e7646d2SAndroid Build Coastguard Worker 					/* Line buffer */
3728*5e7646d2SAndroid Build Coastguard Worker 			*value,		/* Value for directive */
3729*5e7646d2SAndroid Build Coastguard Worker 			*valptr;	/* Pointer into value */
3730*5e7646d2SAndroid Build Coastguard Worker 
3731*5e7646d2SAndroid Build Coastguard Worker 
3732*5e7646d2SAndroid Build Coastguard Worker   if ((parent = cupsdFindLocation(location)) != NULL)
3733*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Location %s> on line %d of %s.",
3734*5e7646d2SAndroid Build Coastguard Worker                     location, linenum, ConfigurationFile);
3735*5e7646d2SAndroid Build Coastguard Worker   else if ((parent = cupsdNewLocation(location)) == NULL)
3736*5e7646d2SAndroid Build Coastguard Worker     return (0);
3737*5e7646d2SAndroid Build Coastguard Worker   else
3738*5e7646d2SAndroid Build Coastguard Worker   {
3739*5e7646d2SAndroid Build Coastguard Worker     cupsdAddLocation(parent);
3740*5e7646d2SAndroid Build Coastguard Worker 
3741*5e7646d2SAndroid Build Coastguard Worker     parent->limit = CUPSD_AUTH_LIMIT_ALL;
3742*5e7646d2SAndroid Build Coastguard Worker   }
3743*5e7646d2SAndroid Build Coastguard Worker 
3744*5e7646d2SAndroid Build Coastguard Worker   loc = parent;
3745*5e7646d2SAndroid Build Coastguard Worker 
3746*5e7646d2SAndroid Build Coastguard Worker   while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
3747*5e7646d2SAndroid Build Coastguard Worker   {
3748*5e7646d2SAndroid Build Coastguard Worker    /*
3749*5e7646d2SAndroid Build Coastguard Worker     * Decode the directive...
3750*5e7646d2SAndroid Build Coastguard Worker     */
3751*5e7646d2SAndroid Build Coastguard Worker 
3752*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(line, "</Location>"))
3753*5e7646d2SAndroid Build Coastguard Worker       return (linenum);
3754*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "<Limit") ||
3755*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "<LimitExcept"))
3756*5e7646d2SAndroid Build Coastguard Worker     {
3757*5e7646d2SAndroid Build Coastguard Worker       if (!value)
3758*5e7646d2SAndroid Build Coastguard Worker       {
3759*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
3760*5e7646d2SAndroid Build Coastguard Worker         if (FatalErrors & CUPSD_FATAL_CONFIG)
3761*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
3762*5e7646d2SAndroid Build Coastguard Worker         else
3763*5e7646d2SAndroid Build Coastguard Worker 	  continue;
3764*5e7646d2SAndroid Build Coastguard Worker       }
3765*5e7646d2SAndroid Build Coastguard Worker 
3766*5e7646d2SAndroid Build Coastguard Worker       if ((loc = cupsdCopyLocation(parent)) == NULL)
3767*5e7646d2SAndroid Build Coastguard Worker         return (0);
3768*5e7646d2SAndroid Build Coastguard Worker 
3769*5e7646d2SAndroid Build Coastguard Worker       cupsdAddLocation(loc);
3770*5e7646d2SAndroid Build Coastguard Worker 
3771*5e7646d2SAndroid Build Coastguard Worker       loc->limit = 0;
3772*5e7646d2SAndroid Build Coastguard Worker       while (*value)
3773*5e7646d2SAndroid Build Coastguard Worker       {
3774*5e7646d2SAndroid Build Coastguard Worker         for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
3775*5e7646d2SAndroid Build Coastguard Worker 
3776*5e7646d2SAndroid Build Coastguard Worker 	if (*valptr)
3777*5e7646d2SAndroid Build Coastguard Worker 	  *valptr++ = '\0';
3778*5e7646d2SAndroid Build Coastguard Worker 
3779*5e7646d2SAndroid Build Coastguard Worker         if (!strcmp(value, "ALL"))
3780*5e7646d2SAndroid Build Coastguard Worker 	  loc->limit = CUPSD_AUTH_LIMIT_ALL;
3781*5e7646d2SAndroid Build Coastguard Worker 	else if (!strcmp(value, "GET"))
3782*5e7646d2SAndroid Build Coastguard Worker 	  loc->limit |= CUPSD_AUTH_LIMIT_GET;
3783*5e7646d2SAndroid Build Coastguard Worker 	else if (!strcmp(value, "HEAD"))
3784*5e7646d2SAndroid Build Coastguard Worker 	  loc->limit |= CUPSD_AUTH_LIMIT_HEAD;
3785*5e7646d2SAndroid Build Coastguard Worker 	else if (!strcmp(value, "OPTIONS"))
3786*5e7646d2SAndroid Build Coastguard Worker 	  loc->limit |= CUPSD_AUTH_LIMIT_OPTIONS;
3787*5e7646d2SAndroid Build Coastguard Worker 	else if (!strcmp(value, "POST"))
3788*5e7646d2SAndroid Build Coastguard Worker 	  loc->limit |= CUPSD_AUTH_LIMIT_POST;
3789*5e7646d2SAndroid Build Coastguard Worker 	else if (!strcmp(value, "PUT"))
3790*5e7646d2SAndroid Build Coastguard Worker 	  loc->limit |= CUPSD_AUTH_LIMIT_PUT;
3791*5e7646d2SAndroid Build Coastguard Worker 	else if (!strcmp(value, "TRACE"))
3792*5e7646d2SAndroid Build Coastguard Worker 	  loc->limit |= CUPSD_AUTH_LIMIT_TRACE;
3793*5e7646d2SAndroid Build Coastguard Worker 	else
3794*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d of %s.",
3795*5e7646d2SAndroid Build Coastguard Worker 	                  value, linenum, ConfigurationFile);
3796*5e7646d2SAndroid Build Coastguard Worker 
3797*5e7646d2SAndroid Build Coastguard Worker         for (value = valptr; isspace(*value & 255); value ++);
3798*5e7646d2SAndroid Build Coastguard Worker       }
3799*5e7646d2SAndroid Build Coastguard Worker 
3800*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(line, "<LimitExcept"))
3801*5e7646d2SAndroid Build Coastguard Worker         loc->limit = CUPSD_AUTH_LIMIT_ALL ^ loc->limit;
3802*5e7646d2SAndroid Build Coastguard Worker 
3803*5e7646d2SAndroid Build Coastguard Worker       parent->limit &= ~loc->limit;
3804*5e7646d2SAndroid Build Coastguard Worker     }
3805*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "</Limit>") ||
3806*5e7646d2SAndroid Build Coastguard Worker              !_cups_strcasecmp(line, "</LimitExcept>"))
3807*5e7646d2SAndroid Build Coastguard Worker       loc = parent;
3808*5e7646d2SAndroid Build Coastguard Worker     else if (!value)
3809*5e7646d2SAndroid Build Coastguard Worker     {
3810*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
3811*5e7646d2SAndroid Build Coastguard Worker       if (FatalErrors & CUPSD_FATAL_CONFIG)
3812*5e7646d2SAndroid Build Coastguard Worker 	return (0);
3813*5e7646d2SAndroid Build Coastguard Worker     }
3814*5e7646d2SAndroid Build Coastguard Worker     else if (!parse_aaa(loc, line, value, linenum))
3815*5e7646d2SAndroid Build Coastguard Worker     {
3816*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
3817*5e7646d2SAndroid Build Coastguard Worker                       "Unknown Location directive %s on line %d of %s.",
3818*5e7646d2SAndroid Build Coastguard Worker 	              line, linenum, ConfigurationFile);
3819*5e7646d2SAndroid Build Coastguard Worker       if (FatalErrors & CUPSD_FATAL_CONFIG)
3820*5e7646d2SAndroid Build Coastguard Worker 	return (0);
3821*5e7646d2SAndroid Build Coastguard Worker     }
3822*5e7646d2SAndroid Build Coastguard Worker   }
3823*5e7646d2SAndroid Build Coastguard Worker 
3824*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_ERROR,
3825*5e7646d2SAndroid Build Coastguard Worker                   "Unexpected end-of-file at line %d while reading location.",
3826*5e7646d2SAndroid Build Coastguard Worker                   linenum);
3827*5e7646d2SAndroid Build Coastguard Worker 
3828*5e7646d2SAndroid Build Coastguard Worker   return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum);
3829*5e7646d2SAndroid Build Coastguard Worker }
3830*5e7646d2SAndroid Build Coastguard Worker 
3831*5e7646d2SAndroid Build Coastguard Worker 
3832*5e7646d2SAndroid Build Coastguard Worker /*
3833*5e7646d2SAndroid Build Coastguard Worker  * 'read_policy()' - Read a <Policy name> definition.
3834*5e7646d2SAndroid Build Coastguard Worker  */
3835*5e7646d2SAndroid Build Coastguard Worker 
3836*5e7646d2SAndroid Build Coastguard Worker static int				/* O - New line number or 0 on error */
read_policy(cups_file_t * fp,char * policy,int linenum)3837*5e7646d2SAndroid Build Coastguard Worker read_policy(cups_file_t *fp,		/* I - Configuration file */
3838*5e7646d2SAndroid Build Coastguard Worker             char        *policy,	/* I - Location name/path */
3839*5e7646d2SAndroid Build Coastguard Worker 	    int         linenum)	/* I - Current line number */
3840*5e7646d2SAndroid Build Coastguard Worker {
3841*5e7646d2SAndroid Build Coastguard Worker   int			i;		/* Looping var */
3842*5e7646d2SAndroid Build Coastguard Worker   cupsd_policy_t	*pol;		/* Policy */
3843*5e7646d2SAndroid Build Coastguard Worker   cupsd_location_t	*op;		/* Policy operation */
3844*5e7646d2SAndroid Build Coastguard Worker   int			num_ops;	/* Number of IPP operations */
3845*5e7646d2SAndroid Build Coastguard Worker   ipp_op_t		ops[100];	/* Operations */
3846*5e7646d2SAndroid Build Coastguard Worker   char			line[HTTP_MAX_BUFFER],
3847*5e7646d2SAndroid Build Coastguard Worker 					/* Line buffer */
3848*5e7646d2SAndroid Build Coastguard Worker 			*value,		/* Value for directive */
3849*5e7646d2SAndroid Build Coastguard Worker 			*valptr;	/* Pointer into value */
3850*5e7646d2SAndroid Build Coastguard Worker 
3851*5e7646d2SAndroid Build Coastguard Worker 
3852*5e7646d2SAndroid Build Coastguard Worker  /*
3853*5e7646d2SAndroid Build Coastguard Worker   * Create the policy...
3854*5e7646d2SAndroid Build Coastguard Worker   */
3855*5e7646d2SAndroid Build Coastguard Worker 
3856*5e7646d2SAndroid Build Coastguard Worker   if ((pol = cupsdFindPolicy(policy)) != NULL)
3857*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate <Policy %s> on line %d of %s.",
3858*5e7646d2SAndroid Build Coastguard Worker                     policy, linenum, ConfigurationFile);
3859*5e7646d2SAndroid Build Coastguard Worker   else if ((pol = cupsdAddPolicy(policy)) == NULL)
3860*5e7646d2SAndroid Build Coastguard Worker     return (0);
3861*5e7646d2SAndroid Build Coastguard Worker 
3862*5e7646d2SAndroid Build Coastguard Worker  /*
3863*5e7646d2SAndroid Build Coastguard Worker   * Read from the file...
3864*5e7646d2SAndroid Build Coastguard Worker   */
3865*5e7646d2SAndroid Build Coastguard Worker 
3866*5e7646d2SAndroid Build Coastguard Worker   op      = NULL;
3867*5e7646d2SAndroid Build Coastguard Worker   num_ops = 0;
3868*5e7646d2SAndroid Build Coastguard Worker 
3869*5e7646d2SAndroid Build Coastguard Worker   while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
3870*5e7646d2SAndroid Build Coastguard Worker   {
3871*5e7646d2SAndroid Build Coastguard Worker    /*
3872*5e7646d2SAndroid Build Coastguard Worker     * Decode the directive...
3873*5e7646d2SAndroid Build Coastguard Worker     */
3874*5e7646d2SAndroid Build Coastguard Worker 
3875*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(line, "</Policy>"))
3876*5e7646d2SAndroid Build Coastguard Worker     {
3877*5e7646d2SAndroid Build Coastguard Worker       if (op)
3878*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_WARN,
3879*5e7646d2SAndroid Build Coastguard Worker 	                "Missing </Limit> before </Policy> on line %d of %s.",
3880*5e7646d2SAndroid Build Coastguard Worker 	                linenum, ConfigurationFile);
3881*5e7646d2SAndroid Build Coastguard Worker 
3882*5e7646d2SAndroid Build Coastguard Worker       set_policy_defaults(pol);
3883*5e7646d2SAndroid Build Coastguard Worker 
3884*5e7646d2SAndroid Build Coastguard Worker       return (linenum);
3885*5e7646d2SAndroid Build Coastguard Worker     }
3886*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "<Limit") && !op)
3887*5e7646d2SAndroid Build Coastguard Worker     {
3888*5e7646d2SAndroid Build Coastguard Worker       if (!value)
3889*5e7646d2SAndroid Build Coastguard Worker       {
3890*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR, "Syntax error on line %d of %s.", linenum, ConfigurationFile);
3891*5e7646d2SAndroid Build Coastguard Worker         if (FatalErrors & CUPSD_FATAL_CONFIG)
3892*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
3893*5e7646d2SAndroid Build Coastguard Worker         else
3894*5e7646d2SAndroid Build Coastguard Worker 	  continue;
3895*5e7646d2SAndroid Build Coastguard Worker       }
3896*5e7646d2SAndroid Build Coastguard Worker 
3897*5e7646d2SAndroid Build Coastguard Worker      /*
3898*5e7646d2SAndroid Build Coastguard Worker       * Scan for IPP operation names...
3899*5e7646d2SAndroid Build Coastguard Worker       */
3900*5e7646d2SAndroid Build Coastguard Worker 
3901*5e7646d2SAndroid Build Coastguard Worker       num_ops = 0;
3902*5e7646d2SAndroid Build Coastguard Worker 
3903*5e7646d2SAndroid Build Coastguard Worker       while (*value)
3904*5e7646d2SAndroid Build Coastguard Worker       {
3905*5e7646d2SAndroid Build Coastguard Worker         for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
3906*5e7646d2SAndroid Build Coastguard Worker 
3907*5e7646d2SAndroid Build Coastguard Worker 	if (*valptr)
3908*5e7646d2SAndroid Build Coastguard Worker 	  *valptr++ = '\0';
3909*5e7646d2SAndroid Build Coastguard Worker 
3910*5e7646d2SAndroid Build Coastguard Worker         if (num_ops < (int)(sizeof(ops) / sizeof(ops[0])))
3911*5e7646d2SAndroid Build Coastguard Worker 	{
3912*5e7646d2SAndroid Build Coastguard Worker 	  if (!_cups_strcasecmp(value, "All"))
3913*5e7646d2SAndroid Build Coastguard Worker 	    ops[num_ops ++] = IPP_ANY_OPERATION;
3914*5e7646d2SAndroid Build Coastguard Worker 	  else if ((ops[num_ops] = ippOpValue(value)) == IPP_BAD_OPERATION)
3915*5e7646d2SAndroid Build Coastguard Worker 	    cupsdLogMessage(CUPSD_LOG_ERROR, "Bad IPP operation name \"%s\" on line %d of %s.", value, linenum, ConfigurationFile);
3916*5e7646d2SAndroid Build Coastguard Worker           else
3917*5e7646d2SAndroid Build Coastguard Worker 	    num_ops ++;
3918*5e7646d2SAndroid Build Coastguard Worker 	}
3919*5e7646d2SAndroid Build Coastguard Worker 	else
3920*5e7646d2SAndroid Build Coastguard Worker 	  cupsdLogMessage(CUPSD_LOG_ERROR,
3921*5e7646d2SAndroid Build Coastguard Worker 	                  "Too many operations listed on line %d of %s.",
3922*5e7646d2SAndroid Build Coastguard Worker 	                  linenum, ConfigurationFile);
3923*5e7646d2SAndroid Build Coastguard Worker 
3924*5e7646d2SAndroid Build Coastguard Worker         for (value = valptr; isspace(*value & 255); value ++);
3925*5e7646d2SAndroid Build Coastguard Worker       }
3926*5e7646d2SAndroid Build Coastguard Worker 
3927*5e7646d2SAndroid Build Coastguard Worker      /*
3928*5e7646d2SAndroid Build Coastguard Worker       * If none are specified, apply the policy to all operations...
3929*5e7646d2SAndroid Build Coastguard Worker       */
3930*5e7646d2SAndroid Build Coastguard Worker 
3931*5e7646d2SAndroid Build Coastguard Worker       if (num_ops == 0)
3932*5e7646d2SAndroid Build Coastguard Worker       {
3933*5e7646d2SAndroid Build Coastguard Worker         ops[0]  = IPP_ANY_OPERATION;
3934*5e7646d2SAndroid Build Coastguard Worker 	num_ops = 1;
3935*5e7646d2SAndroid Build Coastguard Worker       }
3936*5e7646d2SAndroid Build Coastguard Worker 
3937*5e7646d2SAndroid Build Coastguard Worker      /*
3938*5e7646d2SAndroid Build Coastguard Worker       * Add a new policy for the first operation...
3939*5e7646d2SAndroid Build Coastguard Worker       */
3940*5e7646d2SAndroid Build Coastguard Worker 
3941*5e7646d2SAndroid Build Coastguard Worker       op = cupsdAddPolicyOp(pol, NULL, ops[0]);
3942*5e7646d2SAndroid Build Coastguard Worker     }
3943*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "</Limit>") && op)
3944*5e7646d2SAndroid Build Coastguard Worker     {
3945*5e7646d2SAndroid Build Coastguard Worker      /*
3946*5e7646d2SAndroid Build Coastguard Worker       * Finish the current operation limit...
3947*5e7646d2SAndroid Build Coastguard Worker       */
3948*5e7646d2SAndroid Build Coastguard Worker 
3949*5e7646d2SAndroid Build Coastguard Worker       if (num_ops > 1)
3950*5e7646d2SAndroid Build Coastguard Worker       {
3951*5e7646d2SAndroid Build Coastguard Worker        /*
3952*5e7646d2SAndroid Build Coastguard Worker         * Copy the policy to the other operations...
3953*5e7646d2SAndroid Build Coastguard Worker 	*/
3954*5e7646d2SAndroid Build Coastguard Worker 
3955*5e7646d2SAndroid Build Coastguard Worker         for (i = 1; i < num_ops; i ++)
3956*5e7646d2SAndroid Build Coastguard Worker 	  cupsdAddPolicyOp(pol, op, ops[i]);
3957*5e7646d2SAndroid Build Coastguard Worker       }
3958*5e7646d2SAndroid Build Coastguard Worker 
3959*5e7646d2SAndroid Build Coastguard Worker       op = NULL;
3960*5e7646d2SAndroid Build Coastguard Worker     }
3961*5e7646d2SAndroid Build Coastguard Worker     else if (!value)
3962*5e7646d2SAndroid Build Coastguard Worker     {
3963*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d of %s.", linenum, ConfigurationFile);
3964*5e7646d2SAndroid Build Coastguard Worker       if (FatalErrors & CUPSD_FATAL_CONFIG)
3965*5e7646d2SAndroid Build Coastguard Worker 	return (0);
3966*5e7646d2SAndroid Build Coastguard Worker     }
3967*5e7646d2SAndroid Build Coastguard Worker     else if (!_cups_strcasecmp(line, "JobPrivateAccess") ||
3968*5e7646d2SAndroid Build Coastguard Worker 	     !_cups_strcasecmp(line, "JobPrivateValues") ||
3969*5e7646d2SAndroid Build Coastguard Worker 	     !_cups_strcasecmp(line, "SubscriptionPrivateAccess") ||
3970*5e7646d2SAndroid Build Coastguard Worker 	     !_cups_strcasecmp(line, "SubscriptionPrivateValues"))
3971*5e7646d2SAndroid Build Coastguard Worker     {
3972*5e7646d2SAndroid Build Coastguard Worker       if (op)
3973*5e7646d2SAndroid Build Coastguard Worker       {
3974*5e7646d2SAndroid Build Coastguard Worker         cupsdLogMessage(CUPSD_LOG_ERROR,
3975*5e7646d2SAndroid Build Coastguard Worker 	                "%s directive must appear outside <Limit>...</Limit> "
3976*5e7646d2SAndroid Build Coastguard Worker 			"on line %d of %s.", line, linenum, ConfigurationFile);
3977*5e7646d2SAndroid Build Coastguard Worker 	if (FatalErrors & CUPSD_FATAL_CONFIG)
3978*5e7646d2SAndroid Build Coastguard Worker 	  return (0);
3979*5e7646d2SAndroid Build Coastguard Worker       }
3980*5e7646d2SAndroid Build Coastguard Worker       else
3981*5e7646d2SAndroid Build Coastguard Worker       {
3982*5e7646d2SAndroid Build Coastguard Worker        /*
3983*5e7646d2SAndroid Build Coastguard Worker         * Pull out whitespace-delimited values...
3984*5e7646d2SAndroid Build Coastguard Worker 	*/
3985*5e7646d2SAndroid Build Coastguard Worker 
3986*5e7646d2SAndroid Build Coastguard Worker 	while (*value)
3987*5e7646d2SAndroid Build Coastguard Worker 	{
3988*5e7646d2SAndroid Build Coastguard Worker 	 /*
3989*5e7646d2SAndroid Build Coastguard Worker 	  * Find the end of the current value...
3990*5e7646d2SAndroid Build Coastguard Worker 	  */
3991*5e7646d2SAndroid Build Coastguard Worker 
3992*5e7646d2SAndroid Build Coastguard Worker 	  for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++);
3993*5e7646d2SAndroid Build Coastguard Worker 
3994*5e7646d2SAndroid Build Coastguard Worker 	  if (*valptr)
3995*5e7646d2SAndroid Build Coastguard Worker 	    *valptr++ = '\0';
3996*5e7646d2SAndroid Build Coastguard Worker 
3997*5e7646d2SAndroid Build Coastguard Worker          /*
3998*5e7646d2SAndroid Build Coastguard Worker 	  * Save it appropriately...
3999*5e7646d2SAndroid Build Coastguard Worker 	  */
4000*5e7646d2SAndroid Build Coastguard Worker 
4001*5e7646d2SAndroid Build Coastguard Worker 	  if (!_cups_strcasecmp(line, "JobPrivateAccess"))
4002*5e7646d2SAndroid Build Coastguard Worker 	  {
4003*5e7646d2SAndroid Build Coastguard Worker 	   /*
4004*5e7646d2SAndroid Build Coastguard Worker 	    * JobPrivateAccess {all|default|user/group list|@@ACL}
4005*5e7646d2SAndroid Build Coastguard Worker 	    */
4006*5e7646d2SAndroid Build Coastguard Worker 
4007*5e7646d2SAndroid Build Coastguard Worker             if (!_cups_strcasecmp(value, "default"))
4008*5e7646d2SAndroid Build Coastguard Worker 	    {
4009*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_access), "@OWNER");
4010*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_access), "@SYSTEM");
4011*5e7646d2SAndroid Build Coastguard Worker 	    }
4012*5e7646d2SAndroid Build Coastguard Worker 	    else
4013*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_access), value);
4014*5e7646d2SAndroid Build Coastguard Worker 	  }
4015*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(line, "JobPrivateValues"))
4016*5e7646d2SAndroid Build Coastguard Worker 	  {
4017*5e7646d2SAndroid Build Coastguard Worker 	   /*
4018*5e7646d2SAndroid Build Coastguard Worker 	    * JobPrivateValues {all|none|default|attribute list}
4019*5e7646d2SAndroid Build Coastguard Worker 	    */
4020*5e7646d2SAndroid Build Coastguard Worker 
4021*5e7646d2SAndroid Build Coastguard Worker 	    if (!_cups_strcasecmp(value, "default"))
4022*5e7646d2SAndroid Build Coastguard Worker 	    {
4023*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_attrs), "job-name");
4024*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_attrs), "job-originating-host-name");
4025*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_attrs), "job-originating-user-name");
4026*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_attrs), "phone");
4027*5e7646d2SAndroid Build Coastguard Worker 	    }
4028*5e7646d2SAndroid Build Coastguard Worker 	    else
4029*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->job_attrs), value);
4030*5e7646d2SAndroid Build Coastguard Worker 	  }
4031*5e7646d2SAndroid Build Coastguard Worker 	  else if (!_cups_strcasecmp(line, "SubscriptionPrivateAccess"))
4032*5e7646d2SAndroid Build Coastguard Worker 	  {
4033*5e7646d2SAndroid Build Coastguard Worker 	   /*
4034*5e7646d2SAndroid Build Coastguard Worker 	    * SubscriptionPrivateAccess {all|default|user/group list|@@ACL}
4035*5e7646d2SAndroid Build Coastguard Worker 	    */
4036*5e7646d2SAndroid Build Coastguard Worker 
4037*5e7646d2SAndroid Build Coastguard Worker             if (!_cups_strcasecmp(value, "default"))
4038*5e7646d2SAndroid Build Coastguard Worker 	    {
4039*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_access), "@OWNER");
4040*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_access), "@SYSTEM");
4041*5e7646d2SAndroid Build Coastguard Worker 	    }
4042*5e7646d2SAndroid Build Coastguard Worker 	    else
4043*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_access), value);
4044*5e7646d2SAndroid Build Coastguard Worker 	  }
4045*5e7646d2SAndroid Build Coastguard Worker 	  else /* if (!_cups_strcasecmp(line, "SubscriptionPrivateValues")) */
4046*5e7646d2SAndroid Build Coastguard Worker 	  {
4047*5e7646d2SAndroid Build Coastguard Worker 	   /*
4048*5e7646d2SAndroid Build Coastguard Worker 	    * SubscriptionPrivateValues {all|none|default|attribute list}
4049*5e7646d2SAndroid Build Coastguard Worker 	    */
4050*5e7646d2SAndroid Build Coastguard Worker 
4051*5e7646d2SAndroid Build Coastguard Worker 	    if (!_cups_strcasecmp(value, "default"))
4052*5e7646d2SAndroid Build Coastguard Worker 	    {
4053*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_attrs), "notify-events");
4054*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_attrs), "notify-pull-method");
4055*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri");
4056*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_attrs), "notify-subscriber-user-name");
4057*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_attrs), "notify-user-data");
4058*5e7646d2SAndroid Build Coastguard Worker 	    }
4059*5e7646d2SAndroid Build Coastguard Worker 	    else
4060*5e7646d2SAndroid Build Coastguard Worker 	      cupsdAddString(&(pol->sub_attrs), value);
4061*5e7646d2SAndroid Build Coastguard Worker 	  }
4062*5e7646d2SAndroid Build Coastguard Worker 
4063*5e7646d2SAndroid Build Coastguard Worker 	 /*
4064*5e7646d2SAndroid Build Coastguard Worker 	  * Find the next string on the line...
4065*5e7646d2SAndroid Build Coastguard Worker 	  */
4066*5e7646d2SAndroid Build Coastguard Worker 
4067*5e7646d2SAndroid Build Coastguard Worker 	  for (value = valptr; isspace(*value & 255); value ++);
4068*5e7646d2SAndroid Build Coastguard Worker 	}
4069*5e7646d2SAndroid Build Coastguard Worker       }
4070*5e7646d2SAndroid Build Coastguard Worker     }
4071*5e7646d2SAndroid Build Coastguard Worker     else if (!op)
4072*5e7646d2SAndroid Build Coastguard Worker     {
4073*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
4074*5e7646d2SAndroid Build Coastguard Worker                       "Missing <Limit ops> directive before %s on line %d of %s.",
4075*5e7646d2SAndroid Build Coastguard Worker                       line, linenum, ConfigurationFile);
4076*5e7646d2SAndroid Build Coastguard Worker       if (FatalErrors & CUPSD_FATAL_CONFIG)
4077*5e7646d2SAndroid Build Coastguard Worker 	return (0);
4078*5e7646d2SAndroid Build Coastguard Worker     }
4079*5e7646d2SAndroid Build Coastguard Worker     else if (!parse_aaa(op, line, value, linenum))
4080*5e7646d2SAndroid Build Coastguard Worker     {
4081*5e7646d2SAndroid Build Coastguard Worker       cupsdLogMessage(CUPSD_LOG_ERROR,
4082*5e7646d2SAndroid Build Coastguard Worker 		      "Unknown Policy Limit directive %s on line %d of %s.",
4083*5e7646d2SAndroid Build Coastguard Worker 		      line, linenum, ConfigurationFile);
4084*5e7646d2SAndroid Build Coastguard Worker 
4085*5e7646d2SAndroid Build Coastguard Worker       if (FatalErrors & CUPSD_FATAL_CONFIG)
4086*5e7646d2SAndroid Build Coastguard Worker 	return (0);
4087*5e7646d2SAndroid Build Coastguard Worker     }
4088*5e7646d2SAndroid Build Coastguard Worker   }
4089*5e7646d2SAndroid Build Coastguard Worker 
4090*5e7646d2SAndroid Build Coastguard Worker   cupsdLogMessage(CUPSD_LOG_ERROR,
4091*5e7646d2SAndroid Build Coastguard Worker                   "Unexpected end-of-file at line %d while reading policy "
4092*5e7646d2SAndroid Build Coastguard Worker                   "\"%s\".", linenum, policy);
4093*5e7646d2SAndroid Build Coastguard Worker 
4094*5e7646d2SAndroid Build Coastguard Worker   return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum);
4095*5e7646d2SAndroid Build Coastguard Worker }
4096*5e7646d2SAndroid Build Coastguard Worker 
4097*5e7646d2SAndroid Build Coastguard Worker 
4098*5e7646d2SAndroid Build Coastguard Worker /*
4099*5e7646d2SAndroid Build Coastguard Worker  * 'set_policy_defaults()' - Set default policy values as needed.
4100*5e7646d2SAndroid Build Coastguard Worker  */
4101*5e7646d2SAndroid Build Coastguard Worker 
4102*5e7646d2SAndroid Build Coastguard Worker static void
set_policy_defaults(cupsd_policy_t * pol)4103*5e7646d2SAndroid Build Coastguard Worker set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
4104*5e7646d2SAndroid Build Coastguard Worker {
4105*5e7646d2SAndroid Build Coastguard Worker   cupsd_location_t	*op;		/* Policy operation */
4106*5e7646d2SAndroid Build Coastguard Worker 
4107*5e7646d2SAndroid Build Coastguard Worker 
4108*5e7646d2SAndroid Build Coastguard Worker  /*
4109*5e7646d2SAndroid Build Coastguard Worker   * Verify that we have an explicit policy for Validate-Job, Cancel-Jobs,
4110*5e7646d2SAndroid Build Coastguard Worker   * Cancel-My-Jobs, Close-Job, and CUPS-Get-Document, which ensures that
4111*5e7646d2SAndroid Build Coastguard Worker   * upgrades do not introduce new security issues...
4112*5e7646d2SAndroid Build Coastguard Worker   *
4113*5e7646d2SAndroid Build Coastguard Worker   * CUPS STR #4659: Allow a lone <Limit All> policy.
4114*5e7646d2SAndroid Build Coastguard Worker   */
4115*5e7646d2SAndroid Build Coastguard Worker 
4116*5e7646d2SAndroid Build Coastguard Worker   if (cupsArrayCount(pol->ops) > 1)
4117*5e7646d2SAndroid Build Coastguard Worker   {
4118*5e7646d2SAndroid Build Coastguard Worker     if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL ||
4119*5e7646d2SAndroid Build Coastguard Worker 	op->op == IPP_ANY_OPERATION)
4120*5e7646d2SAndroid Build Coastguard Worker     {
4121*5e7646d2SAndroid Build Coastguard Worker       if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL &&
4122*5e7646d2SAndroid Build Coastguard Worker 	  op->op != IPP_ANY_OPERATION)
4123*5e7646d2SAndroid Build Coastguard Worker       {
4124*5e7646d2SAndroid Build Coastguard Worker        /*
4125*5e7646d2SAndroid Build Coastguard Worker 	* Add a new limit for Validate-Job using the Print-Job limit as a
4126*5e7646d2SAndroid Build Coastguard Worker 	* template...
4127*5e7646d2SAndroid Build Coastguard Worker 	*/
4128*5e7646d2SAndroid Build Coastguard Worker 
4129*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s - using Print-Job's policy.", pol->name);
4130*5e7646d2SAndroid Build Coastguard Worker 
4131*5e7646d2SAndroid Build Coastguard Worker 	cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB);
4132*5e7646d2SAndroid Build Coastguard Worker       }
4133*5e7646d2SAndroid Build Coastguard Worker       else
4134*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s and no suitable template found.", pol->name);
4135*5e7646d2SAndroid Build Coastguard Worker     }
4136*5e7646d2SAndroid Build Coastguard Worker 
4137*5e7646d2SAndroid Build Coastguard Worker     if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL ||
4138*5e7646d2SAndroid Build Coastguard Worker 	op->op == IPP_ANY_OPERATION)
4139*5e7646d2SAndroid Build Coastguard Worker     {
4140*5e7646d2SAndroid Build Coastguard Worker       if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL &&
4141*5e7646d2SAndroid Build Coastguard Worker 	  op->op != IPP_ANY_OPERATION)
4142*5e7646d2SAndroid Build Coastguard Worker       {
4143*5e7646d2SAndroid Build Coastguard Worker        /*
4144*5e7646d2SAndroid Build Coastguard Worker 	* Add a new limit for Cancel-Jobs using the Pause-Printer limit as a
4145*5e7646d2SAndroid Build Coastguard Worker 	* template...
4146*5e7646d2SAndroid Build Coastguard Worker 	*/
4147*5e7646d2SAndroid Build Coastguard Worker 
4148*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s - using Pause-Printer's policy.", pol->name);
4149*5e7646d2SAndroid Build Coastguard Worker 
4150*5e7646d2SAndroid Build Coastguard Worker 	cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS);
4151*5e7646d2SAndroid Build Coastguard Worker       }
4152*5e7646d2SAndroid Build Coastguard Worker       else
4153*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s and no suitable template found.", pol->name);
4154*5e7646d2SAndroid Build Coastguard Worker     }
4155*5e7646d2SAndroid Build Coastguard Worker 
4156*5e7646d2SAndroid Build Coastguard Worker     if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL ||
4157*5e7646d2SAndroid Build Coastguard Worker 	op->op == IPP_ANY_OPERATION)
4158*5e7646d2SAndroid Build Coastguard Worker     {
4159*5e7646d2SAndroid Build Coastguard Worker       if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
4160*5e7646d2SAndroid Build Coastguard Worker 	  op->op != IPP_ANY_OPERATION)
4161*5e7646d2SAndroid Build Coastguard Worker       {
4162*5e7646d2SAndroid Build Coastguard Worker        /*
4163*5e7646d2SAndroid Build Coastguard Worker 	* Add a new limit for Cancel-My-Jobs using the Send-Document limit as
4164*5e7646d2SAndroid Build Coastguard Worker 	* a template...
4165*5e7646d2SAndroid Build Coastguard Worker 	*/
4166*5e7646d2SAndroid Build Coastguard Worker 
4167*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s - using Send-Document's policy.", pol->name);
4168*5e7646d2SAndroid Build Coastguard Worker 
4169*5e7646d2SAndroid Build Coastguard Worker 	cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS);
4170*5e7646d2SAndroid Build Coastguard Worker       }
4171*5e7646d2SAndroid Build Coastguard Worker       else
4172*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s and no suitable template found.", pol->name);
4173*5e7646d2SAndroid Build Coastguard Worker     }
4174*5e7646d2SAndroid Build Coastguard Worker 
4175*5e7646d2SAndroid Build Coastguard Worker     if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL ||
4176*5e7646d2SAndroid Build Coastguard Worker 	op->op == IPP_ANY_OPERATION)
4177*5e7646d2SAndroid Build Coastguard Worker     {
4178*5e7646d2SAndroid Build Coastguard Worker       if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
4179*5e7646d2SAndroid Build Coastguard Worker 	  op->op != IPP_ANY_OPERATION)
4180*5e7646d2SAndroid Build Coastguard Worker       {
4181*5e7646d2SAndroid Build Coastguard Worker        /*
4182*5e7646d2SAndroid Build Coastguard Worker 	* Add a new limit for Close-Job using the Send-Document limit as a
4183*5e7646d2SAndroid Build Coastguard Worker 	* template...
4184*5e7646d2SAndroid Build Coastguard Worker 	*/
4185*5e7646d2SAndroid Build Coastguard Worker 
4186*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s - using Send-Document's policy.", pol->name);
4187*5e7646d2SAndroid Build Coastguard Worker 
4188*5e7646d2SAndroid Build Coastguard Worker 	cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB);
4189*5e7646d2SAndroid Build Coastguard Worker       }
4190*5e7646d2SAndroid Build Coastguard Worker       else
4191*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s and no suitable template found.", pol->name);
4192*5e7646d2SAndroid Build Coastguard Worker     }
4193*5e7646d2SAndroid Build Coastguard Worker 
4194*5e7646d2SAndroid Build Coastguard Worker     if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL ||
4195*5e7646d2SAndroid Build Coastguard Worker 	op->op == IPP_ANY_OPERATION)
4196*5e7646d2SAndroid Build Coastguard Worker     {
4197*5e7646d2SAndroid Build Coastguard Worker       if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL &&
4198*5e7646d2SAndroid Build Coastguard Worker 	  op->op != IPP_ANY_OPERATION)
4199*5e7646d2SAndroid Build Coastguard Worker       {
4200*5e7646d2SAndroid Build Coastguard Worker        /*
4201*5e7646d2SAndroid Build Coastguard Worker 	* Add a new limit for CUPS-Get-Document using the Send-Document
4202*5e7646d2SAndroid Build Coastguard Worker 	* limit as a template...
4203*5e7646d2SAndroid Build Coastguard Worker 	*/
4204*5e7646d2SAndroid Build Coastguard Worker 
4205*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s - using Send-Document's policy.", pol->name);
4206*5e7646d2SAndroid Build Coastguard Worker 
4207*5e7646d2SAndroid Build Coastguard Worker 	cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT);
4208*5e7646d2SAndroid Build Coastguard Worker       }
4209*5e7646d2SAndroid Build Coastguard Worker       else
4210*5e7646d2SAndroid Build Coastguard Worker 	cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s and no suitable template found.", pol->name);
4211*5e7646d2SAndroid Build Coastguard Worker     }
4212*5e7646d2SAndroid Build Coastguard Worker   }
4213*5e7646d2SAndroid Build Coastguard Worker 
4214*5e7646d2SAndroid Build Coastguard Worker  /*
4215*5e7646d2SAndroid Build Coastguard Worker   * Verify we have JobPrivateAccess, JobPrivateValues,
4216*5e7646d2SAndroid Build Coastguard Worker   * SubscriptionPrivateAccess, and SubscriptionPrivateValues in the policy.
4217*5e7646d2SAndroid Build Coastguard Worker   */
4218*5e7646d2SAndroid Build Coastguard Worker 
4219*5e7646d2SAndroid Build Coastguard Worker   if (!pol->job_access)
4220*5e7646d2SAndroid Build Coastguard Worker   {
4221*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateAccess defined in policy %s - using defaults.", pol->name);
4222*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->job_access), "@OWNER");
4223*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->job_access), "@SYSTEM");
4224*5e7646d2SAndroid Build Coastguard Worker   }
4225*5e7646d2SAndroid Build Coastguard Worker 
4226*5e7646d2SAndroid Build Coastguard Worker   if (!pol->job_attrs)
4227*5e7646d2SAndroid Build Coastguard Worker   {
4228*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_WARN, "No JobPrivateValues defined in policy %s - using defaults.", pol->name);
4229*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->job_attrs), "job-name");
4230*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->job_attrs), "job-originating-host-name");
4231*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->job_attrs), "job-originating-user-name");
4232*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->job_attrs), "phone");
4233*5e7646d2SAndroid Build Coastguard Worker   }
4234*5e7646d2SAndroid Build Coastguard Worker 
4235*5e7646d2SAndroid Build Coastguard Worker   if (!pol->sub_access)
4236*5e7646d2SAndroid Build Coastguard Worker   {
4237*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateAccess defined in policy %s - using defaults.", pol->name);
4238*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->sub_access), "@OWNER");
4239*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->sub_access), "@SYSTEM");
4240*5e7646d2SAndroid Build Coastguard Worker   }
4241*5e7646d2SAndroid Build Coastguard Worker 
4242*5e7646d2SAndroid Build Coastguard Worker   if (!pol->sub_attrs)
4243*5e7646d2SAndroid Build Coastguard Worker   {
4244*5e7646d2SAndroid Build Coastguard Worker     cupsdLogMessage(CUPSD_LOG_WARN, "No SubscriptionPrivateValues defined in policy %s - using defaults.", pol->name);
4245*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->sub_attrs), "notify-events");
4246*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->sub_attrs), "notify-pull-method");
4247*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri");
4248*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->sub_attrs), "notify-subscriber-user-name");
4249*5e7646d2SAndroid Build Coastguard Worker     cupsdAddString(&(pol->sub_attrs), "notify-user-data");
4250*5e7646d2SAndroid Build Coastguard Worker   }
4251*5e7646d2SAndroid Build Coastguard Worker }
4252