/*
 * Configuration file definitions for the CUPS scheduler.
 *
 * Copyright © 2007-2018 by Apple Inc.
 * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
 *
 * Licensed under Apache License v2.0.  See the file "LICENSE" for more
 * information.
 */


/*
 * Log levels...
 */

typedef enum
{
  CUPSD_LOG_PPD = -5,			/* Used internally for PPD keywords */
  CUPSD_LOG_ATTR,			/* Used internally for attributes */
  CUPSD_LOG_STATE,			/* Used internally for printer-state-reasons */
  CUPSD_LOG_JOBSTATE,			/* Used internally for job-state-reasons */
  CUPSD_LOG_PAGE,			/* Used internally for page logging */
  CUPSD_LOG_NONE,
  CUPSD_LOG_EMERG,			/* Emergency issues */
  CUPSD_LOG_ALERT,			/* Something bad happened that needs attention */
  CUPSD_LOG_CRIT,			/* Critical error but server continues */
  CUPSD_LOG_ERROR,			/* Error condition */
  CUPSD_LOG_WARN,			/* Warning */
  CUPSD_LOG_NOTICE,			/* Normal condition that needs logging */
  CUPSD_LOG_INFO,			/* General information */
  CUPSD_LOG_DEBUG,			/* General debugging */
  CUPSD_LOG_DEBUG2			/* Detailed debugging */
} cupsd_loglevel_t;

typedef enum
{
  CUPSD_ACCESSLOG_NONE,			/* Log no requests */
  CUPSD_ACCESSLOG_CONFIG,		/* Log config requests */
  CUPSD_ACCESSLOG_ACTIONS,		/* Log config, print, and job management requests */
  CUPSD_ACCESSLOG_ALL			/* Log everything */
} cupsd_accesslog_t;

typedef enum
{
  CUPSD_TIME_STANDARD,			/* "Standard" Apache/CLF format */
  CUPSD_TIME_USECS			/* Standard format with microseconds */
} cupsd_time_t;

typedef enum
{
  CUPSD_SANDBOXING_OFF,			/* No sandboxing */
  CUPSD_SANDBOXING_RELAXED,		/* Relaxed sandboxing */
  CUPSD_SANDBOXING_STRICT		/* Strict sandboxing */
} cupsd_sandboxing_t;


/*
 * FatalErrors flags...
 */

#define CUPSD_FATAL_NONE	0	/* No errors are fatal */
#define CUPSD_FATAL_BROWSE	1	/* Browse bind errors are fatal */
#define CUPSD_FATAL_CONFIG	2	/* Config file syntax errors are fatal */
#define CUPSD_FATAL_LISTEN	4	/* Listen/Port bind errors are fatal */
#define CUPSD_FATAL_LOG		8	/* Log file errors are fatal */
#define CUPSD_FATAL_PERMISSIONS	16	/* File permission errors are fatal */
#define CUPSD_FATAL_ALL		~0	/* All errors are fatal */


/*
 * Printcap formats...
 */

#define PRINTCAP_BSD		0	/* Berkeley LPD format */
#define PRINTCAP_SOLARIS	1	/* Solaris lpsched format */
#define PRINTCAP_PLIST		2	/* macOS plist format */


/*
 * ServerAlias data...
 */

typedef struct
{
  size_t	namelen;		/* Length of alias name */
  char		name[1];		/* Alias name */
} cupsd_alias_t;


/*
 * Globals...
 */

VAR char		*ConfigurationFile	VALUE(NULL),
					/* cupsd.conf file to use */
			*CupsFilesFile		VALUE(NULL),
					/* cups-files.conf file to use */
			*ServerName		VALUE(NULL),
					/* FQDN for server */
			*ServerAdmin		VALUE(NULL),
					/* Administrator's email */
			*ServerRoot		VALUE(NULL),
					/* Root directory for scheduler */
			*ServerBin		VALUE(NULL),
					/* Root directory for binaries */
			*StateDir		VALUE(NULL),
					/* Root directory for state data */
			*RequestRoot		VALUE(NULL),
					/* Directory for request files */
			*DocumentRoot		VALUE(NULL);
					/* Root directory for documents */
VAR cups_array_t	*ServerAlias		VALUE(NULL);
					/* Alias names for server */
VAR int			ServerNameIsIP		VALUE(0);
					/* Is the ServerName an IP address? */
VAR int			NumSystemGroups		VALUE(0);
					/* Number of system group names */
VAR char		*SystemGroups[MAX_SYSTEM_GROUPS]
						VALUE({0});
					/* System group names */
VAR gid_t		SystemGroupIDs[MAX_SYSTEM_GROUPS]
						VALUE({0});
					/* System group IDs */
VAR char		*AccessLog		VALUE(NULL),
					/* Access log filename */
			*ErrorLog		VALUE(NULL),
					/* Error log filename */
			*PageLog		VALUE(NULL),
					/* Page log filename */
			*CacheDir		VALUE(NULL),
					/* Cache file directory */
			*DataDir		VALUE(NULL),
					/* Data file directory */
			*DefaultLanguage	VALUE(NULL),
					/* Default language encoding */
			*DefaultLocale		VALUE(NULL),
					/* Default locale */
			*DefaultPaperSize	VALUE(NULL),
					/* Default paper size */
			*ErrorPolicy		VALUE(NULL),
					/* Default printer-error-policy */
			*RIPCache		VALUE(NULL),
					/* Amount of memory for RIPs */
			*TempDir		VALUE(NULL),
					/* Temporary directory */
			*Printcap		VALUE(NULL),
					/* Printcap file */
			*FontPath		VALUE(NULL),
					/* Font search path */
			*RemoteRoot		VALUE(NULL),
					/* Remote root user */
			*Classification		VALUE(NULL);
					/* Classification of system */
VAR uid_t		User			VALUE(1),
					/* User ID for server */
			RunUser			VALUE(0);
					/* User to run as, used for files */
VAR gid_t		Group			VALUE(0);
					/* Group ID for server */
VAR cupsd_accesslog_t	AccessLogLevel		VALUE(CUPSD_ACCESSLOG_ACTIONS);
					/* Access log level */
VAR int			ClassifyOverride	VALUE(0),
					/* Allow overrides? */
			LogDebugHistory		VALUE(200),
					/* Amount of automatic debug history */
			FatalErrors		VALUE(CUPSD_FATAL_CONFIG),
					/* Which errors are fatal? */
			StrictConformance	VALUE(FALSE),
					/* Require strict IPP conformance? */
			SyncOnClose		VALUE(FALSE);
					/* Call fsync() when closing files? */
VAR mode_t		ConfigFilePerm		VALUE(0640U),
					/* Permissions for config files */
			LogFilePerm		VALUE(0644U);
					/* Permissions for log files */
VAR cupsd_loglevel_t	LogLevel		VALUE(CUPSD_LOG_WARN);
					/* Error log level */
VAR cupsd_time_t	LogTimeFormat		VALUE(CUPSD_TIME_STANDARD);
					/* Log file time format */
VAR cups_file_t		*LogStderr		VALUE(NULL);
					/* Stderr file, if any */
VAR cupsd_sandboxing_t	Sandboxing		VALUE(CUPSD_SANDBOXING_STRICT);
					/* Sandboxing level */
VAR int			UseSandboxing	VALUE(1);
					/* Use sandboxing for child procs? */
VAR int			MaxClients		VALUE(100),
					/* Maximum number of clients */
			MaxClientsPerHost	VALUE(0),
					/* Maximum number of clients per host */
			MaxCopies		VALUE(CUPS_DEFAULT_MAX_COPIES),
					/* Maximum number of copies per job */
			MaxLogSize		VALUE(1024 * 1024),
					/* Maximum size of log files */
			MaxRequestSize		VALUE(0),
					/* Maximum size of IPP requests */
			HostNameLookups		VALUE(FALSE),
					/* Do we do reverse lookups? */
			Timeout			VALUE(DEFAULT_TIMEOUT),
					/* Timeout during requests */
			KeepAlive		VALUE(TRUE),
					/* Support the Keep-Alive option? */
			FileDevice		VALUE(FALSE),
					/* Allow file: devices? */
			FilterLimit		VALUE(0),
					/* Max filter cost at any time */
			FilterLevel		VALUE(0),
					/* Current filter level */
			FilterNice		VALUE(0),
					/* Nice value for filters */
			ReloadTimeout		VALUE(DEFAULT_KEEPALIVE),
					/* Timeout before reload from SIGHUP */
			RootCertDuration	VALUE(300),
					/* Root certificate update interval */
			PrintcapFormat		VALUE(PRINTCAP_BSD),
					/* Format of printcap file? */
			DefaultShared		VALUE(TRUE),
					/* Share printers by default? */
			MultipleOperationTimeout VALUE(DEFAULT_TIMEOUT),
					/* multiple-operation-time-out value */
			WebInterface		VALUE(CUPS_DEFAULT_WEBIF);
					/* Enable the web interface? */
VAR cups_file_t		*AccessFile		VALUE(NULL),
					/* Access log file */
			*ErrorFile		VALUE(NULL),
					/* Error log file */
			*PageFile		VALUE(NULL);
					/* Page log file */
VAR char		*PageLogFormat		VALUE(NULL);
					/* Page log format */
VAR mime_t		*MimeDatabase		VALUE(NULL);
					/* MIME type database */
VAR int			NumMimeTypes		VALUE(0);
					/* Number of MIME types */
VAR const char		**MimeTypes		VALUE(NULL);
					/* Array of MIME types */

#ifdef HAVE_SSL
VAR int			CreateSelfSignedCerts	VALUE(TRUE);
					/* Automatically create self-signed certs? */
VAR char		*ServerKeychain		VALUE(NULL);
					/* Keychain holding cert + key */
#endif /* HAVE_SSL */

#ifdef HAVE_ONDEMAND
VAR int			IdleExitTimeout		VALUE(60);
					/* Time after which an idle cupsd will exit */
#endif /* HAVE_ONDEMAND */

#ifdef HAVE_AUTHORIZATION_H
VAR char		*SystemGroupAuthKey	VALUE(NULL);
					/* System group auth key */
#endif /* HAVE_AUTHORIZATION_H */

#ifdef HAVE_GSSAPI
VAR char		*GSSServiceName		VALUE(NULL);
					/* GSS service name */
VAR int			HaveServerCreds		VALUE(0);
					/* Do we have server credentials? */
VAR gss_cred_id_t	ServerCreds;	/* Server's GSS credentials */
#endif /* HAVE_GSSAPI */


/*
 * Prototypes...
 */

extern void	cupsdAddAlias(cups_array_t *aliases, const char *name);
extern int	cupsdCheckLogFile(cups_file_t **lf, const char *logname);
extern int	cupsdCheckPermissions(const char *filename,
		                      const char *suffix, mode_t mode,
	 			      uid_t user, gid_t group, int is_dir,
				      int create_dir);
extern int	cupsdCheckProgram(const char *filename, cupsd_printer_t *p);
extern int	cupsdDefaultAuthType(void);
extern void	cupsdFreeAliases(cups_array_t *aliases);
extern char	*cupsdGetDateTime(struct timeval *t, cupsd_time_t format);
extern int	cupsdLogClient(cupsd_client_t *con, int level, const char *message, ...) _CUPS_FORMAT(3, 4);
extern void	cupsdLogFCMessage(void *context, _cups_fc_result_t result, const char *message);
#ifdef HAVE_GSSAPI
extern int	cupsdLogGSSMessage(int level, OM_uint32 major_status, OM_uint32 minor_status, const char *message, ...) _CUPS_FORMAT(4, 5);
#endif /* HAVE_GSSAPI */
extern int	cupsdLogJob(cupsd_job_t *job, int level, const char *message,
		            ...) _CUPS_FORMAT(3, 4);
extern int	cupsdLogMessage(int level, const char *message, ...) _CUPS_FORMAT(2, 3);
extern int	cupsdLogPage(cupsd_job_t *job, const char *page);
extern int	cupsdLogRequest(cupsd_client_t *con, http_status_t code);
extern int	cupsdReadConfiguration(void);
extern int	cupsdWriteErrorLog(int level, const char *message);
