summaryrefslogtreecommitdiff
path: root/scheduler/conf.c
diff options
context:
space:
mode:
Diffstat (limited to 'scheduler/conf.c')
-rw-r--r--scheduler/conf.c860
1 files changed, 538 insertions, 322 deletions
diff --git a/scheduler/conf.c b/scheduler/conf.c
index aaf42734..e319a2ca 100644
--- a/scheduler/conf.c
+++ b/scheduler/conf.c
@@ -1,5 +1,5 @@
/*
- * "$Id: conf.c 10482 2012-05-18 19:51:02Z mike $"
+ * "$Id: conf.c 10824 2013-01-18 19:58:41Z mike $"
*
* Configuration routines for the CUPS scheduler.
*
@@ -14,23 +14,25 @@
*
* Contents:
*
- * cupsdAddAlias() - Add a host alias.
+ * cupsdAddAlias() - Add a host alias.
* cupsdCheckPermissions() - Fix the mode and ownership of a file or
- * directory.
+ * directory.
* cupsdDefaultAuthType() - Get the default AuthType.
* cupsdFreeAliases() - Free all of the alias entries.
* cupsdReadConfiguration() - Read the cupsd.conf file.
- * get_address() - Get an address + port number from a line.
+ * get_address() - Get an address + port number from a line.
* get_addr_and_mask() - Get an IP address and netmask.
- * mime_error_cb() - Log a MIME error.
- * parse_aaa() - Parse authentication, authorization, and access
- * control lines.
+ * mime_error_cb() - Log a MIME error.
+ * parse_aaa() - Parse authentication, authorization, and access
+ * control lines.
* parse_fatal_errors() - Parse FatalErrors values in a string.
- * parse_groups() - Parse system group names in a string.
- * parse_protocols() - Parse browse protocols in a string.
- * read_configuration() - Read a configuration file.
- * read_location() - Read a <Location path> definition.
- * read_policy() - Read a <Policy name> definition.
+ * parse_groups() - Parse system group names in a string.
+ * parse_protocols() - Parse browse protocols in a string.
+ * parse_variable() - Parse a variable line.
+ * read_cupsd_conf() - Read the cupsd.conf configuration file.
+ * read_cups_files_conf() - Read the cups-files.conf configuration file.
+ * read_location() - Read a <Location path> definition.
+ * read_policy() - Read a <Policy name> definition.
* set_policy_defaults() - Set default policy values as needed.
*/
@@ -83,35 +85,25 @@ typedef struct
* Local globals...
*/
-static int default_auth_type = CUPSD_AUTH_AUTO;
- /* Default AuthType, if not specified */
-static const cupsd_var_t variables[] =
+static const cupsd_var_t cupsd_vars[] =
{
- { "AccessLog", &AccessLog, CUPSD_VARTYPE_STRING },
{ "AutoPurgeJobs", &JobAutoPurge, CUPSD_VARTYPE_BOOLEAN },
-#ifdef HAVE_DNSSD
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
{ "BrowseDNSSDSubTypes", &DNSSDSubTypes, CUPSD_VARTYPE_STRING },
-#endif /* HAVE_DNSSD */
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
{ "BrowseWebIF", &BrowseWebIF, CUPSD_VARTYPE_BOOLEAN },
{ "Browsing", &Browsing, CUPSD_VARTYPE_BOOLEAN },
- { "CacheDir", &CacheDir, CUPSD_VARTYPE_STRING },
{ "Classification", &Classification, CUPSD_VARTYPE_STRING },
{ "ClassifyOverride", &ClassifyOverride, CUPSD_VARTYPE_BOOLEAN },
- { "ConfigFilePerm", &ConfigFilePerm, CUPSD_VARTYPE_INTEGER },
- { "DataDir", &DataDir, CUPSD_VARTYPE_STRING },
{ "DefaultLanguage", &DefaultLanguage, CUPSD_VARTYPE_STRING },
{ "DefaultLeaseDuration", &DefaultLeaseDuration, CUPSD_VARTYPE_TIME },
{ "DefaultPaperSize", &DefaultPaperSize, CUPSD_VARTYPE_STRING },
{ "DefaultPolicy", &DefaultPolicy, CUPSD_VARTYPE_STRING },
{ "DefaultShared", &DefaultShared, CUPSD_VARTYPE_BOOLEAN },
{ "DirtyCleanInterval", &DirtyCleanInterval, CUPSD_VARTYPE_TIME },
- { "DocumentRoot", &DocumentRoot, CUPSD_VARTYPE_STRING },
- { "ErrorLog", &ErrorLog, CUPSD_VARTYPE_STRING },
{ "ErrorPolicy", &ErrorPolicy, CUPSD_VARTYPE_STRING },
- { "FileDevice", &FileDevice, CUPSD_VARTYPE_BOOLEAN },
{ "FilterLimit", &FilterLimit, CUPSD_VARTYPE_INTEGER },
{ "FilterNice", &FilterNice, CUPSD_VARTYPE_INTEGER },
- { "FontPath", &FontPath, CUPSD_VARTYPE_STRING },
#ifdef HAVE_GSSAPI
{ "GSSServiceName", &GSSServiceName, CUPSD_VARTYPE_STRING },
#endif /* HAVE_GSSAPI */
@@ -126,8 +118,6 @@ static const cupsd_var_t variables[] =
{ "LimitRequestBody", &MaxRequestSize, CUPSD_VARTYPE_INTEGER },
{ "ListenBackLog", &ListenBackLog, CUPSD_VARTYPE_INTEGER },
{ "LogDebugHistory", &LogDebugHistory, CUPSD_VARTYPE_INTEGER },
- { "LogFilePerm", &LogFilePerm, CUPSD_VARTYPE_INTEGER },
- { "LPDConfigFile", &LPDConfigFile, CUPSD_VARTYPE_STRING },
{ "MaxActiveJobs", &MaxActiveJobs, CUPSD_VARTYPE_INTEGER },
{ "MaxClients", &MaxClients, CUPSD_VARTYPE_INTEGER },
{ "MaxClientsPerHost", &MaxClientsPerHost, CUPSD_VARTYPE_INTEGER },
@@ -146,18 +136,34 @@ static const cupsd_var_t variables[] =
{ "MaxSubscriptionsPerPrinter",&MaxSubscriptionsPerPrinter, CUPSD_VARTYPE_INTEGER },
{ "MaxSubscriptionsPerUser", &MaxSubscriptionsPerUser, CUPSD_VARTYPE_INTEGER },
{ "MultipleOperationTimeout", &MultipleOperationTimeout, CUPSD_VARTYPE_TIME },
- { "PageLog", &PageLog, CUPSD_VARTYPE_STRING },
{ "PageLogFormat", &PageLogFormat, CUPSD_VARTYPE_STRING },
{ "PreserveJobFiles", &JobFiles, CUPSD_VARTYPE_TIME },
{ "PreserveJobHistory", &JobHistory, CUPSD_VARTYPE_TIME },
- { "Printcap", &Printcap, CUPSD_VARTYPE_STRING },
- { "PrintcapGUI", &PrintcapGUI, CUPSD_VARTYPE_STRING },
{ "ReloadTimeout", &ReloadTimeout, CUPSD_VARTYPE_TIME },
- { "RemoteRoot", &RemoteRoot, CUPSD_VARTYPE_STRING },
- { "RequestRoot", &RequestRoot, CUPSD_VARTYPE_STRING },
{ "RIPCache", &RIPCache, CUPSD_VARTYPE_STRING },
{ "RootCertDuration", &RootCertDuration, CUPSD_VARTYPE_TIME },
{ "ServerAdmin", &ServerAdmin, CUPSD_VARTYPE_STRING },
+ { "ServerName", &ServerName, CUPSD_VARTYPE_STRING },
+ { "StrictConformance", &StrictConformance, CUPSD_VARTYPE_BOOLEAN },
+ { "Timeout", &Timeout, CUPSD_VARTYPE_TIME },
+ { "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN }
+};
+static const cupsd_var_t cupsfiles_vars[] =
+{
+ { "AccessLog", &AccessLog, CUPSD_VARTYPE_STRING },
+ { "CacheDir", &CacheDir, CUPSD_VARTYPE_STRING },
+ { "ConfigFilePerm", &ConfigFilePerm, CUPSD_VARTYPE_INTEGER },
+ { "DataDir", &DataDir, CUPSD_VARTYPE_STRING },
+ { "DocumentRoot", &DocumentRoot, CUPSD_VARTYPE_STRING },
+ { "ErrorLog", &ErrorLog, CUPSD_VARTYPE_STRING },
+ { "FileDevice", &FileDevice, CUPSD_VARTYPE_BOOLEAN },
+ { "FontPath", &FontPath, CUPSD_VARTYPE_STRING },
+ { "LogFilePerm", &LogFilePerm, CUPSD_VARTYPE_INTEGER },
+ { "LPDConfigFile", &LPDConfigFile, CUPSD_VARTYPE_STRING },
+ { "PageLog", &PageLog, CUPSD_VARTYPE_STRING },
+ { "Printcap", &Printcap, CUPSD_VARTYPE_STRING },
+ { "RemoteRoot", &RemoteRoot, CUPSD_VARTYPE_STRING },
+ { "RequestRoot", &RequestRoot, CUPSD_VARTYPE_STRING },
{ "ServerBin", &ServerBin, CUPSD_VARTYPE_PATHNAME },
#ifdef HAVE_SSL
{ "ServerCertificate", &ServerCertificate, CUPSD_VARTYPE_PATHNAME },
@@ -165,20 +171,17 @@ static const cupsd_var_t variables[] =
{ "ServerKey", &ServerKey, CUPSD_VARTYPE_PATHNAME },
# endif /* HAVE_LIBSSL || HAVE_GNUTLS */
#endif /* HAVE_SSL */
- { "ServerName", &ServerName, CUPSD_VARTYPE_STRING },
{ "ServerRoot", &ServerRoot, CUPSD_VARTYPE_PATHNAME },
{ "SMBConfigFile", &SMBConfigFile, CUPSD_VARTYPE_STRING },
{ "StateDir", &StateDir, CUPSD_VARTYPE_STRING },
- { "StrictConformance", &StrictConformance, CUPSD_VARTYPE_BOOLEAN },
#ifdef HAVE_AUTHORIZATION_H
{ "SystemGroupAuthKey", &SystemGroupAuthKey, CUPSD_VARTYPE_STRING },
#endif /* HAVE_AUTHORIZATION_H */
- { "TempDir", &TempDir, CUPSD_VARTYPE_PATHNAME },
- { "Timeout", &Timeout, CUPSD_VARTYPE_TIME },
- { "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN }
+ { "TempDir", &TempDir, CUPSD_VARTYPE_PATHNAME }
};
-#define NUM_VARS (sizeof(variables) / sizeof(variables[0]))
+static int default_auth_type = CUPSD_AUTH_AUTO;
+ /* Default AuthType, if not specified */
static const unsigned ones[4] =
{
@@ -203,7 +206,12 @@ static int parse_aaa(cupsd_location_t *loc, char *line,
static int parse_fatal_errors(const char *s);
static int parse_groups(const char *s);
static int parse_protocols(const char *s);
-static int read_configuration(cups_file_t *fp);
+static int parse_variable(const char *filename, int linenum,
+ const char *line, const char *value,
+ size_t num_vars,
+ const cupsd_var_t *vars);
+static int read_cupsd_conf(cups_file_t *fp);
+static int read_cups_files_conf(cups_file_t *fp);
static int read_location(cups_file_t *fp, char *name, int linenum);
static int read_policy(cups_file_t *fp, char *name, int linenum);
static void set_policy_defaults(cupsd_policy_t *pol);
@@ -583,7 +591,7 @@ cupsdReadConfiguration(void)
cupsdSetString(&PrintcapGUI, "/usr/bin/glpoptions");
cupsdSetString(&FontPath, CUPS_FONTPATH);
cupsdSetString(&RemoteRoot, "remroot");
- cupsdSetStringf(&ServerHeader, "CUPS/%d.%d", CUPS_VERSION_MAJOR,
+ cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
CUPS_VERSION_MINOR);
cupsdSetString(&StateDir, CUPS_STATEDIR);
@@ -735,9 +743,9 @@ cupsdReadConfiguration(void)
Browsing = CUPS_DEFAULT_BROWSING;
DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED;
-#ifdef HAVE_DNSSD
+#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
cupsdSetString(&DNSSDSubTypes, "_cups,_print");
-#endif /* HAVE_DNSSD */
+#endif /* HAVE_DNSSD || HAVE_AVAHI */
cupsdSetString(&LPDConfigFile, CUPS_DEFAULT_LPD_CONFIG_FILE);
cupsdSetString(&SMBConfigFile, CUPS_DEFAULT_SMB_CONFIG_FILE);
@@ -780,21 +788,63 @@ cupsdReadConfiguration(void)
cupsdInitEnv();
/*
- * Read the configuration file...
+ * Read the cups-files.conf file...
+ */
+
+ if ((fp = cupsFileOpen(CupsFilesFile, "r")) != NULL)
+ {
+ status = read_cups_files_conf(fp);
+
+ cupsFileClose(fp);
+
+ if (!status)
+ {
+ if (TestConfigFile)
+ printf("\"%s\" contains errors.\n", CupsFilesFile);
+ else
+ syslog(LOG_LPR, "Unable to read \"%s\" due to errors.",
+ CupsFilesFile);
+
+ return (0);
+ }
+ }
+ else if (errno == ENOENT)
+ cupsdLogMessage(CUPSD_LOG_INFO, "No %s, using defaults.", CupsFilesFile);
+ else
+ {
+ syslog(LOG_LPR, "Unable to open \"%s\": %s", CupsFilesFile,
+ strerror(errno));
+ return (0);
+ }
+
+ if (!ErrorLog)
+ cupsdSetString(&ErrorLog, CUPS_LOGDIR "/error_log");
+
+ /*
+ * Read the cupsd.conf file...
*/
if ((fp = cupsFileOpen(ConfigurationFile, "r")) == NULL)
+ {
+ syslog(LOG_LPR, "Unable to open \"%s\": %s", ConfigurationFile,
+ strerror(errno));
return (0);
+ }
- status = read_configuration(fp);
+ status = read_cupsd_conf(fp);
cupsFileClose(fp);
if (!status)
- return (0);
+ {
+ if (TestConfigFile)
+ printf("\"%s\" contains errors.\n", ConfigurationFile);
+ else
+ syslog(LOG_LPR, "Unable to read \"%s\" due to errors.",
+ ConfigurationFile);
- if (!ErrorLog)
- cupsdSetString(&ErrorLog, CUPS_LOGDIR "/error_log");
+ return (0);
+ }
RunUser = getuid();
@@ -908,6 +958,13 @@ cupsdReadConfiguration(void)
}
/*
+ * Make sure ConfigFilePerm and LogFilePerm have sane values...
+ */
+
+ ConfigFilePerm &= 0664;
+ LogFilePerm &= 0664;
+
+ /*
* Open the system log for cupsd if necessary...
*/
@@ -1068,7 +1125,9 @@ cupsdReadConfiguration(void)
Group, 1, 1) < 0 ||
cupsdCheckPermissions(ServerRoot, "ssl", 0700, RunUser,
Group, 1, 0) < 0 ||
- cupsdCheckPermissions(ServerRoot, "cupsd.conf", ConfigFilePerm, RunUser,
+ cupsdCheckPermissions(ConfigurationFile, NULL, ConfigFilePerm, RunUser,
+ Group, 0, 0) < 0 ||
+ cupsdCheckPermissions(CupsFilesFile, NULL, ConfigFilePerm, RunUser,
Group, 0, 0) < 0 ||
cupsdCheckPermissions(ServerRoot, "classes.conf", 0600, RunUser,
Group, 0, 0) < 0 ||
@@ -1083,11 +1142,20 @@ cupsdReadConfiguration(void)
* Update TempDir to the default if it hasn't been set already...
*/
+#ifdef __APPLE__
+ if (TempDir && !RunUser &&
+ (!strncmp(TempDir, "/private/tmp", 12) || !strncmp(TempDir, "/tmp", 4)))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot use %s for TempDir.", TempDir);
+ cupsdClearString(&TempDir);
+ }
+#endif /* __APPLE__ */
+
if (!TempDir)
{
#ifdef __APPLE__
if ((tmpdir = getenv("TMPDIR")) != NULL &&
- strncmp(tmpdir, "/private/tmp", 12))
+ strncmp(tmpdir, "/private/tmp", 12) && strncmp(tmpdir, "/tmp", 4))
#else
if ((tmpdir = getenv("TMPDIR")) != NULL)
#endif /* __APPLE__ */
@@ -1110,13 +1178,13 @@ cupsdReadConfiguration(void)
else
cupsdSetString(&TempDir, tmpdir);
}
+ }
- if (!TempDir)
- {
- cupsdLogMessage(CUPSD_LOG_INFO, "Using default TempDir of %s/tmp...",
- RequestRoot);
- cupsdSetStringf(&TempDir, "%s/tmp", RequestRoot);
- }
+ if (!TempDir)
+ {
+ cupsdLogMessage(CUPSD_LOG_INFO, "Using default TempDir of %s/tmp...",
+ RequestRoot);
+ cupsdSetStringf(&TempDir, "%s/tmp", RequestRoot);
}
/*
@@ -2550,13 +2618,244 @@ parse_protocols(const char *s) /* I - Space-delimited protocols */
/*
- * 'read_configuration()' - Read a configuration file.
+ * 'parse_variable()' - Parse a variable line.
*/
static int /* O - 1 on success, 0 on failure */
-read_configuration(cups_file_t *fp) /* I - File to read from */
+parse_variable(
+ const char *filename, /* I - Name of configuration file */
+ int linenum, /* I - Line in configuration file */
+ const char *line, /* I - Line from configuration file */
+ const char *value, /* I - Value from configuration file */
+ size_t num_vars, /* I - Number of variables */
+ const cupsd_var_t *vars) /* I - Variables */
+{
+ size_t i; /* Looping var */
+ const cupsd_var_t *var; /* Variables */
+ char temp[1024]; /* Temporary string */
+
+
+ for (i = num_vars, var = vars; i > 0; i --, var ++)
+ if (!_cups_strcasecmp(line, var->name))
+ break;
+
+ if (i == 0)
+ {
+ /*
+ * Unknown directive! Output an error message and continue...
+ */
+
+ if (!value)
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value for %s on line %d of %s.",
+ line, linenum, filename);
+ else
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown directive %s on line %d of %s.",
+ line, linenum, filename);
+
+ return (0);
+ }
+
+ switch (var->type)
+ {
+ case CUPSD_VARTYPE_INTEGER :
+ if (!value)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing integer value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+ else if (!isdigit(*value & 255))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad integer value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+ else
+ {
+ int n; /* Number */
+ char *units; /* Units */
+
+ n = strtol(value, &units, 0);
+
+ if (units && *units)
+ {
+ if (tolower(units[0] & 255) == 'g')
+ n *= 1024 * 1024 * 1024;
+ else if (tolower(units[0] & 255) == 'm')
+ n *= 1024 * 1024;
+ else if (tolower(units[0] & 255) == 'k')
+ n *= 1024;
+ else if (tolower(units[0] & 255) == 't')
+ n *= 262144;
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown integer value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+ }
+
+ if (n < 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad negative integer value for %s on line %d of "
+ "%s.", line, linenum, filename);
+ return (0);
+ }
+ else
+ {
+ *((int *)var->ptr) = n;
+ }
+ }
+ break;
+
+ case CUPSD_VARTYPE_TIME :
+ if (!value)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing time interval value for %s on line %d of "
+ "%s.", line, linenum, filename);
+ return (0);
+ }
+ else if (!_cups_strncasecmp(line, "PreserveJob", 11) &&
+ (!_cups_strcasecmp(value, "true") ||
+ !_cups_strcasecmp(value, "on") ||
+ !_cups_strcasecmp(value, "enabled") ||
+ !_cups_strcasecmp(value, "yes")))
+ {
+ *((int *)var->ptr) = INT_MAX;
+ }
+ else if (!_cups_strcasecmp(value, "false") ||
+ !_cups_strcasecmp(value, "off") ||
+ !_cups_strcasecmp(value, "disabled") ||
+ !_cups_strcasecmp(value, "no"))
+ {
+ *((int *)var->ptr) = 0;
+ }
+ else if (!isdigit(*value & 255))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown time interval value for %s on line %d of "
+ "%s.", line, linenum, filename);
+ return (0);
+ }
+ else
+ {
+ double n; /* Number */
+ char *units; /* Units */
+
+ n = strtod(value, &units);
+
+ if (units && *units)
+ {
+ if (tolower(units[0] & 255) == 'w')
+ n *= 7 * 24 * 60 * 60;
+ else if (tolower(units[0] & 255) == 'd')
+ n *= 24 * 60 * 60;
+ else if (tolower(units[0] & 255) == 'h')
+ n *= 60 * 60;
+ else if (tolower(units[0] & 255) == 'm')
+ n *= 60;
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown time interval value for %s on line "
+ "%d of %s.", line, linenum, filename);
+ return (0);
+ }
+ }
+
+ if (n < 0.0 || n > INT_MAX)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Bad time value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+ else
+ {
+ *((int *)var->ptr) = (int)n;
+ }
+ }
+ break;
+
+ case CUPSD_VARTYPE_BOOLEAN :
+ if (!value)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing boolean value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+ else if (!_cups_strcasecmp(value, "true") ||
+ !_cups_strcasecmp(value, "on") ||
+ !_cups_strcasecmp(value, "enabled") ||
+ !_cups_strcasecmp(value, "yes") ||
+ atoi(value) != 0)
+ {
+ *((int *)var->ptr) = TRUE;
+ }
+ else if (!_cups_strcasecmp(value, "false") ||
+ !_cups_strcasecmp(value, "off") ||
+ !_cups_strcasecmp(value, "disabled") ||
+ !_cups_strcasecmp(value, "no") ||
+ !_cups_strcasecmp(value, "0"))
+ {
+ *((int *)var->ptr) = FALSE;
+ }
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown boolean value %s on line %d of %s.",
+ value, linenum, filename);
+ return (0);
+ }
+ break;
+
+ case CUPSD_VARTYPE_PATHNAME :
+ if (!value)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing pathname value for %s on line %d of %s.",
+ line, linenum, filename);
+ return (0);
+ }
+
+ if (value[0] == '/')
+ strlcpy(temp, value, sizeof(temp));
+ else
+ snprintf(temp, sizeof(temp), "%s/%s", ServerRoot, value);
+
+ if (access(temp, 0))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "File or directory for \"%s %s\" on line %d of %s "
+ "does not exist.", line, value, linenum, filename);
+ return (0);
+ }
+
+ cupsdSetString((char **)var->ptr, temp);
+ break;
+
+ case CUPSD_VARTYPE_STRING :
+ cupsdSetString((char **)var->ptr, value);
+ break;
+ }
+
+ return (1);
+}
+
+
+/*
+ * 'read_cupsd_conf()' - Read the cupsd.conf configuration file.
+ */
+
+static int /* O - 1 on success, 0 on failure */
+read_cupsd_conf(cups_file_t *fp) /* I - File to read from */
{
- int i; /* Looping var */
int linenum; /* Current line number */
char line[HTTP_MAX_BUFFER],
/* Line from file */
@@ -2565,12 +2864,10 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
*value, /* Pointer to value */
*valueptr; /* Pointer into value */
int valuelen; /* Length of value */
- cupsd_var_t const *var; /* Current variable */
http_addrlist_t *addrlist, /* Address list */
*addr; /* Current address */
cups_file_t *incfile; /* Include file */
char incname[1024]; /* Include filename */
- struct group *group; /* Group */
/*
@@ -2602,7 +2899,7 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
incname, strerror(errno));
else
{
- read_configuration(incfile);
+ read_cupsd_conf(incfile);
cupsFileClose(incfile);
}
}
@@ -2626,8 +2923,6 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
if (linenum == 0)
return (0);
}
- else if (!_cups_strcasecmp(line, "FatalErrors"))
- FatalErrors = parse_fatal_errors(value);
else if (!_cups_strcasecmp(line, "FaxRetryInterval") && value)
{
JobRetryInterval = atoi(value);
@@ -2771,10 +3066,10 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
BrowseLocalProtocols = protocols;
}
- else if (!_cups_strcasecmp(line, "default_auth_type") && value)
+ else if (!_cups_strcasecmp(line, "DefaultAuthType") && value)
{
/*
- * default_auth_type {basic,digest,basicdigest,negotiate}
+ * DefaultAuthType {basic,digest,basicdigest,negotiate}
*/
if (!_cups_strcasecmp(value, "none"))
@@ -2823,81 +3118,6 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
}
}
#endif /* HAVE_SSL */
- else if (!_cups_strcasecmp(line, "User") && value)
- {
- /*
- * User ID to run as...
- */
-
- if (isdigit(value[0] & 255))
- {
- int uid = atoi(value);
-
- if (!uid)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Will not use User 0 as specified on line %d "
- "for security reasons. You must use a non-"
- "privileged account instead.",
- linenum);
- else
- User = atoi(value);
- }
- else
- {
- struct passwd *p; /* Password information */
-
- endpwent();
- p = getpwnam(value);
-
- if (p)
- {
- if (!p->pw_uid)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Will not use User %s (UID=0) as specified on line "
- "%d for security reasons. You must use a non-"
- "privileged account instead.",
- value, linenum);
- else
- User = p->pw_uid;
- }
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown User \"%s\" on line %d, ignoring.",
- value, linenum);
- }
- }
- else if (!_cups_strcasecmp(line, "Group") && value)
- {
- /*
- * Group ID to run as...
- */
-
- if (isdigit(value[0]))
- Group = atoi(value);
- else
- {
- endgrent();
- group = getgrnam(value);
-
- if (group != NULL)
- Group = group->gr_gid;
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown Group \"%s\" on line %d, ignoring.",
- value, linenum);
- }
- }
- else if (!_cups_strcasecmp(line, "SystemGroup") && value)
- {
- /*
- * SystemGroup (admin) group(s)...
- */
-
- if (!parse_groups(value))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown SystemGroup \"%s\" on line %d, ignoring.",
- value, linenum);
- }
else if (!_cups_strcasecmp(line, "HostNameLookups") && value)
{
/*
@@ -2976,22 +3196,6 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d.",
value, linenum);
}
- else if (!_cups_strcasecmp(line, "PrintcapFormat") && value)
- {
- /*
- * Format of printcap file?
- */
-
- if (!_cups_strcasecmp(value, "bsd"))
- PrintcapFormat = PRINTCAP_BSD;
- else if (!_cups_strcasecmp(value, "plist"))
- PrintcapFormat = PRINTCAP_PLIST;
- else if (!_cups_strcasecmp(value, "solaris"))
- PrintcapFormat = PRINTCAP_SOLARIS;
- else
- cupsdLogMessage(CUPSD_LOG_WARN, "Unknown PrintcapFormat %s on line %d.",
- value, linenum);
- }
else if (!_cups_strcasecmp(line, "ServerTokens") && value)
{
/*
@@ -3004,19 +3208,20 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
uname(&plat);
if (!_cups_strcasecmp(value, "ProductOnly"))
- cupsdSetString(&ServerHeader, "CUPS");
+ cupsdSetString(&ServerHeader, "CUPS IPP");
else if (!_cups_strcasecmp(value, "Major"))
- cupsdSetStringf(&ServerHeader, "CUPS/%d", CUPS_VERSION_MAJOR);
+ cupsdSetStringf(&ServerHeader, "CUPS/%d IPP/2", CUPS_VERSION_MAJOR);
else if (!_cups_strcasecmp(value, "Minor"))
- cupsdSetStringf(&ServerHeader, "CUPS/%d.%d", CUPS_VERSION_MAJOR,
+ cupsdSetStringf(&ServerHeader, "CUPS/%d.%d IPP/2.1", CUPS_VERSION_MAJOR,
CUPS_VERSION_MINOR);
else if (!_cups_strcasecmp(value, "Minimal"))
- cupsdSetString(&ServerHeader, CUPS_MINIMAL);
+ cupsdSetString(&ServerHeader, CUPS_MINIMAL " IPP/2.1");
else if (!_cups_strcasecmp(value, "OS"))
- cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s)", plat.sysname);
+ cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s %s) IPP/2.1",
+ plat.sysname, plat.release);
else if (!_cups_strcasecmp(value, "Full"))
- cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s) IPP/2.1",
- plat.sysname);
+ cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s %s; %s) IPP/2.1",
+ plat.sysname, plat.release, plat.machine);
else if (!_cups_strcasecmp(value, "None"))
cupsdClearString(&ServerHeader);
else
@@ -3117,182 +3322,193 @@ read_configuration(cups_file_t *fp) /* I - File to read from */
"line %d.", value, linenum);
}
#endif /* HAVE_SSL */
+ else if (!_cups_strcasecmp(line, "AccessLog") ||
+ !_cups_strcasecmp(line, "CacheDir") ||
+ !_cups_strcasecmp(line, "ConfigFilePerm") ||
+ !_cups_strcasecmp(line, "DataDir") ||
+ !_cups_strcasecmp(line, "DocumentRoot") ||
+ !_cups_strcasecmp(line, "ErrorLog") ||
+ !_cups_strcasecmp(line, "FatalErrors") ||
+ !_cups_strcasecmp(line, "FileDevice") ||
+ !_cups_strcasecmp(line, "FontPath") ||
+ !_cups_strcasecmp(line, "Group") ||
+ !_cups_strcasecmp(line, "LogFilePerm") ||
+ !_cups_strcasecmp(line, "LPDConfigFile") ||
+ !_cups_strcasecmp(line, "PageLog") ||
+ !_cups_strcasecmp(line, "Printcap") ||
+ !_cups_strcasecmp(line, "PrintcapFormat") ||
+ !_cups_strcasecmp(line, "RemoteRoot") ||
+ !_cups_strcasecmp(line, "RequestRoot") ||
+ !_cups_strcasecmp(line, "ServerBin") ||
+ !_cups_strcasecmp(line, "ServerCertificate") ||
+ !_cups_strcasecmp(line, "ServerKey") ||
+ !_cups_strcasecmp(line, "ServerRoot") ||
+ !_cups_strcasecmp(line, "SMBConfigFile") ||
+ !_cups_strcasecmp(line, "StateDir") ||
+ !_cups_strcasecmp(line, "SystemGroup") ||
+ !_cups_strcasecmp(line, "SystemGroupAuthKey") ||
+ !_cups_strcasecmp(line, "TempDir") ||
+ !_cups_strcasecmp(line, "User"))
+ {
+ cupsdLogMessage(CUPSD_LOG_WARN,
+ "Please move \"%s%s%s\" on line %d of %s to the %s file; "
+ "this will become an error in a future release.",
+ line, value ? " " : "", value ? value : "", linenum,
+ ConfigurationFile, CupsFilesFile);
+ }
else
+ parse_variable(ConfigurationFile, linenum, line, value,
+ sizeof(cupsd_vars) / sizeof(cupsd_vars[0]), cupsd_vars);
+ }
+
+ return (1);
+}
+
+
+/*
+ * 'read_cups_files_conf()' - Read the cups-files.conf configuration file.
+ */
+
+static int /* O - 1 on success, 0 on failure */
+read_cups_files_conf(cups_file_t *fp) /* I - File to read from */
+{
+ int linenum; /* Current line number */
+ char line[HTTP_MAX_BUFFER], /* Line from file */
+ *value; /* Value from line */
+ struct group *group; /* Group */
+
+
+ /*
+ * Loop through each line in the file...
+ */
+
+ linenum = 0;
+
+ while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
+ {
+ if (!_cups_strcasecmp(line, "FatalErrors"))
+ FatalErrors = parse_fatal_errors(value);
+ else if (!_cups_strcasecmp(line, "Group") && value)
{
/*
- * Find a simple variable in the list...
+ * Group ID to run as...
*/
- for (i = NUM_VARS, var = variables; i > 0; i --, var ++)
- if (!_cups_strcasecmp(line, var->name))
- break;
-
- if (i == 0)
+ if (isdigit(value[0]))
+ Group = atoi(value);
+ else
{
- /*
- * Unknown directive! Output an error message and continue...
- */
+ endgrent();
+ group = getgrnam(value);
- if (!value)
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value for %s on line %d.",
- line, linenum);
+ if (group != NULL)
+ Group = group->gr_gid;
else
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown directive %s on line %d.",
- line, linenum);
- continue;
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown Group \"%s\" on line %d of %s.", value,
+ linenum, CupsFilesFile);
+ if (FatalErrors & CUPSD_FATAL_CONFIG)
+ return (0);
+ }
}
+ }
+ else if (!_cups_strcasecmp(line, "PrintcapFormat") && value)
+ {
+ /*
+ * Format of printcap file?
+ */
- switch (var->type)
+ if (!_cups_strcasecmp(value, "bsd"))
+ PrintcapFormat = PRINTCAP_BSD;
+ else if (!_cups_strcasecmp(value, "plist"))
+ PrintcapFormat = PRINTCAP_PLIST;
+ else if (!_cups_strcasecmp(value, "solaris"))
+ PrintcapFormat = PRINTCAP_SOLARIS;
+ else
{
- case CUPSD_VARTYPE_INTEGER :
- if (!value)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing integer value for %s on line %d.",
- line, linenum);
- else if (!isdigit(*value & 255))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Bad integer value for %s on line %d.",
- line, linenum);
- else
- {
- int n; /* Number */
- char *units; /* Units */
-
- n = strtol(value, &units, 0);
-
- if (units && *units)
- {
- if (tolower(units[0] & 255) == 'g')
- n *= 1024 * 1024 * 1024;
- else if (tolower(units[0] & 255) == 'm')
- n *= 1024 * 1024;
- else if (tolower(units[0] & 255) == 'k')
- n *= 1024;
- else if (tolower(units[0] & 255) == 't')
- n *= 262144;
- else
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown integer value for %s on line %d.",
- line, linenum);
- break;
- }
- }
-
- if (n < 0)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Bad negative integer value for %s on line %d.",
- line, linenum);
- else
- *((int *)var->ptr) = n;
- }
- break;
-
- case CUPSD_VARTYPE_TIME :
- if (!value)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing time interval value for %s on line %d.",
- line, linenum);
- else if (!_cups_strncasecmp(line, "PreserveJob", 11) &&
- (!_cups_strcasecmp(value, "true") ||
- !_cups_strcasecmp(value, "on") ||
- !_cups_strcasecmp(value, "enabled") ||
- !_cups_strcasecmp(value, "yes")))
- *((int *)var->ptr) = INT_MAX;
- else if (!_cups_strcasecmp(value, "false") ||
- !_cups_strcasecmp(value, "off") ||
- !_cups_strcasecmp(value, "disabled") ||
- !_cups_strcasecmp(value, "no"))
- *((int *)var->ptr) = 0;
- else if (!isdigit(*value & 255))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown time interval value for %s on line %d.",
- line, linenum);
- else
- {
- double n; /* Number */
- char *units; /* Units */
-
- n = strtod(value, &units);
-
- if (units && *units)
- {
- if (tolower(units[0] & 255) == 'w')
- n *= 7 * 24 * 60 * 60;
- else if (tolower(units[0] & 255) == 'd')
- n *= 24 * 60 * 60;
- else if (tolower(units[0] & 255) == 'h')
- n *= 60 * 60;
- else if (tolower(units[0] & 255) == 'm')
- n *= 60;
- else
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown time interval value for %s on line "
- "%d.", line, linenum);
- break;
- }
- }
-
- if (n < 0.0 || n > INT_MAX)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Bad time value for %s on line %d.",
- line, linenum);
- else
- *((int *)var->ptr) = (int)n;
- }
- break;
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown PrintcapFormat \"%s\" on line %d of %s.",
+ value, linenum, CupsFilesFile);
+ if (FatalErrors & CUPSD_FATAL_CONFIG)
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(line, "SystemGroup") && value)
+ {
+ /*
+ * SystemGroup (admin) group(s)...
+ */
- case CUPSD_VARTYPE_BOOLEAN :
- if (!value)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing boolean value for %s on line %d.",
- line, linenum);
- else if (!_cups_strcasecmp(value, "true") ||
- !_cups_strcasecmp(value, "on") ||
- !_cups_strcasecmp(value, "enabled") ||
- !_cups_strcasecmp(value, "yes") ||
- atoi(value) != 0)
- *((int *)var->ptr) = TRUE;
- else if (!_cups_strcasecmp(value, "false") ||
- !_cups_strcasecmp(value, "off") ||
- !_cups_strcasecmp(value, "disabled") ||
- !_cups_strcasecmp(value, "no") ||
- !_cups_strcasecmp(value, "0"))
- *((int *)var->ptr) = FALSE;
- else
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unknown boolean value %s on line %d.",
- value, linenum);
- break;
+ if (!parse_groups(value))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown SystemGroup \"%s\" on line %d of %s.", value,
+ linenum, CupsFilesFile);
+ if (FatalErrors & CUPSD_FATAL_CONFIG)
+ return (0);
+ }
+ }
+ else if (!_cups_strcasecmp(line, "User") && value)
+ {
+ /*
+ * User ID to run as...
+ */
- case CUPSD_VARTYPE_PATHNAME :
- if (!value)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing pathname value for %s on line %d.",
- line, linenum);
- break;
- }
+ if (isdigit(value[0] & 255))
+ {
+ int uid = atoi(value);
- if (value[0] == '/')
- strlcpy(temp, value, sizeof(temp));
- else
- snprintf(temp, sizeof(temp), "%s/%s", ServerRoot, value);
+ if (!uid)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Will not use User 0 as specified on line %d of %s "
+ "for security reasons. You must use a non-"
+ "privileged account instead.",
+ linenum, CupsFilesFile);
+ if (FatalErrors & CUPSD_FATAL_CONFIG)
+ return (0);
+ }
+ else
+ User = atoi(value);
+ }
+ else
+ {
+ struct passwd *p; /* Password information */
- if (access(temp, 0))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "File or directory for \"%s %s\" on line %d "
- "does not exist.", line, value, linenum);
- break;
- }
+ endpwent();
+ p = getpwnam(value);
- case CUPSD_VARTYPE_STRING :
- cupsdSetString((char **)var->ptr, value);
- break;
+ if (p)
+ {
+ if (!p->pw_uid)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Will not use User %s (UID=0) as specified on line "
+ "%d of %s for security reasons. You must use a "
+ "non-privileged account instead.",
+ value, linenum, CupsFilesFile);
+ if (FatalErrors & CUPSD_FATAL_CONFIG)
+ return (0);
+ }
+ else
+ User = p->pw_uid;
+ }
+ else
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unknown User \"%s\" on line %d of %s.",
+ value, linenum, CupsFilesFile);
+ if (FatalErrors & CUPSD_FATAL_CONFIG)
+ return (0);
+ }
}
}
+ else if (!parse_variable(CupsFilesFile, linenum, line, value,
+ sizeof(cupsfiles_vars) / sizeof(cupsfiles_vars[0]),
+ cupsfiles_vars) &&
+ (FatalErrors & CUPSD_FATAL_CONFIG))
+ return (0);
}
return (1);
@@ -3864,5 +4080,5 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */
/*
- * End of "$Id: conf.c 10482 2012-05-18 19:51:02Z mike $".
+ * End of "$Id: conf.c 10824 2013-01-18 19:58:41Z mike $".
*/