RunAsUser = FALSE;
Timeout = DEFAULT_TIMEOUT;
- BrowseInterval = DEFAULT_INTERVAL;
- BrowsePort = ippPort();
- BrowseProtocols = BROWSE_CUPS;
- BrowseShortNames = TRUE;
- BrowseTimeout = DEFAULT_TIMEOUT;
- Browsing = TRUE;
+ BrowseInterval = DEFAULT_INTERVAL;
+ BrowsePort = ippPort();
+ BrowseLocalProtocols = BROWSE_CUPS;
+ BrowseRemoteProtocols = BROWSE_CUPS;
+ BrowseShortNames = TRUE;
+ BrowseTimeout = DEFAULT_TIMEOUT;
+ Browsing = TRUE;
ClearString(&BrowseLocalOptions);
ClearString(&BrowseRemoteOptions);
*/
#ifdef HAVE_VSYSLOG
- if (strcmp(AccessLog, "syslog") == 0 ||
- strcmp(ErrorLog, "syslog") == 0 ||
- strcmp(PageLog, "syslog") == 0)
+ if (!strcmp(AccessLog, "syslog") ||
+ !strcmp(ErrorLog, "syslog") ||
+ !strcmp(PageLog, "syslog"))
openlog("cupsd", LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_LPR);
#endif /* HAVE_VSYSLOG */
TempDir, strerror(errno));
}
+ /*
+ * Setup environment variables...
+ */
+
+ cupsdInitEnv();
+
/*
* Check the MaxClients setting, and then allocate memory for it...
*/
"Renew-Subscription Cancel-Subscription "
"Get-Notifications Reprocess-Job Cancel-Current-Job "
"Suspend-Current-Job Resume-Job CUPS-Move-Job>");
- LogMessage(L_INFO, "Order Allow,Deny");
+ LogMessage(L_INFO, "Order Deny,Allow");
po = cupsdAddPolicyOp(p, NULL, IPP_SEND_DOCUMENT);
- po->order_type = AUTH_DENY;
+ po->order_type = AUTH_ALLOW;
po->level = AUTH_USER;
AddName(po, "@OWNER");
"Schedule-Job-After CUPS-Add-Printer "
"CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class "
"CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>");
- LogMessage(L_INFO, "Order Allow,Deny");
+ LogMessage(L_INFO, "Order Deny,Allow");
LogMessage(L_INFO, "AuthType Basic");
po = cupsdAddPolicyOp(p, NULL, IPP_PAUSE_PRINTER);
- po->order_type = AUTH_DENY;
+ po->order_type = AUTH_ALLOW;
po->type = AUTH_BASIC;
po->level = AUTH_USER;
LogMessage(L_INFO, "</Limit>");
LogMessage(L_INFO, "<Limit All>");
- LogMessage(L_INFO, "Order Allow,Deny");
+ LogMessage(L_INFO, "Order Deny,Allow");
po = cupsdAddPolicyOp(p, NULL, IPP_ANY_OPERATION);
- po->order_type = AUTH_DENY;
+ po->order_type = AUTH_ALLOW;
LogMessage(L_INFO, "</Limit>");
LogMessage(L_INFO, "</Policy>");
http_addr_t *address) /* O - Socket address */
{
char hostname[256], /* Hostname or IP */
- portname[256]; /* Port number or name */
+ portname[256], /* Port number or name */
+ *ptr; /* Pointer into hostname string */
struct hostent *host; /* Host address */
struct servent *port; /* Port number */
+ /*
+ * Check for an empty value...
+ */
+
+ if (!*value)
+ {
+ LogMessage(L_ERROR, "Bad (empty) address!");
+ return (0);
+ }
+
/*
* Initialize the socket address to the defaults...
*/
address->un.sun_family = AF_LOCAL;
strcpy(address->un.sun_path, value);
-
- return (1);
}
+ else
#endif /* AF_LOCAL */
/*
* Try to grab a hostname and port number...
*/
- switch (sscanf(value, "%255[^:]:%255s", hostname, portname))
+ strlcpy(hostname, value, sizeof(hostname));
+
+ if ((ptr = strrchr(hostname, ':')) != NULL)
{
- case 1 :
- if (strchr(hostname, '.') == NULL && defaddress == INADDR_ANY)
- {
- /*
- * Hostname is a port number...
- */
+ /*
+ * Copy hostname and port separately...
+ */
- strlcpy(portname, hostname, sizeof(portname));
- hostname[0] = '\0';
- }
- else
- portname[0] = '\0';
- break;
+ *ptr++ = '\0';
- case 2 :
- break;
+ strlcpy(portname, ptr, sizeof(portname));
+ }
+ else if (isdigit(value[0] & 255))
+ {
+ /*
+ * Port number...
+ */
- default :
- LogMessage(L_ERROR, "Unable to decode address \"%s\"!", value);
- return (0);
+ hostname[0] = '\0';
+ strlcpy(portname, value, sizeof(portname));
+ }
+ else
+ {
+ /*
+ * Hostname by itself...
+ */
+
+ portname[0] = '\0';
}
/*
* Check for an IPv6 address...
*/
- if ((ptr = strchr(value, ':')) != NULL && ptr < maskval)
+ if (*value == '[')
{
/*
* Parse hexadecimal IPv6 address...
family = AF_INET6;
- for (i = 0, ptr = value; *ptr && i < 4; i ++)
+ for (i = 0, ptr = value + 1; *ptr && i < 4; i ++)
{
- if (*ptr == ':')
+ if (*ptr == ']')
+ break;
+ else if (*ptr == ':')
ip[i] = 0;
else
ip[i] = strtoul(ptr, (char **)&ptr, 16);
- if (*ptr == ':')
+ if (*ptr == ':' || *ptr == ']')
ptr ++;
}
family = AF_INET;
ipcount = sscanf(value, "%u.%u.%u.%u", ip + 0, ip + 1, ip + 2, ip + 3);
+
+ ip[3] |= ((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8;
+ ip[0] = ip[1] = ip[2] = 0;
}
if (*maskval)
memset(mask, 0, sizeof(unsigned) * 4);
#ifdef AF_INET6
- if (strchr(maskval, ':'))
+ if (maskval[1] == '[')
{
/*
* Get hexadecimal mask value...
*/
- for (i = 0, ptr = maskval; *ptr && i < 4; i ++)
+ for (i = 0, ptr = maskval + 1; *ptr && i < 4; i ++)
{
- if (*ptr == ':')
+ if (*ptr == ']')
+ break;
+ else if (*ptr == ':')
mask[i] = 0;
else
mask[i] = strtoul(ptr, (char **)&ptr, 16);
- if (*ptr == ':')
+ if (*ptr == ':' || *ptr == ']')
ptr ++;
}
- while (i < 4)
- {
- mask[i] = 0;
- i ++;
- }
-
- if (*ptr && *ptr != '/')
+ if (*ptr)
return (0);
}
else
if (sscanf(maskval, "%u.%u.%u.%u", mask + 0, mask + 1, mask + 2, mask + 3) != 4)
return (0);
+
+ mask[3] |= ((((mask[0] << 8) | mask[1]) << 8) | mask[2]) << 8;
+ mask[0] = mask[1] = mask[2] = 0;
}
else
{
{
i = 32 - i;
- if (i <= 24)
- mask[0] = 0xffffffff;
- else
- mask[0] = 0xffffff00 | ((0xff << (i - 24)) & 0xff);
+ mask[0] = 0xffffffff;
+ mask[1] = 0xffffffff;
+ mask[2] = 0xffffffff;
- if (i <= 16)
- mask[1] = 0xffffffff;
- else if (i >= 24)
- mask[1] = 0xffffff00;
- else
- mask[1] = 0xffffff00 | ((0xff << (i - 16)) & 0xff);
-
- if (i <= 8)
- mask[2] = 0xffffffff;
- else if (i >= 16)
- mask[2] = 0xffffff00;
+ if (i > 0)
+ mask[3] = (0xffffffff << i) & 0xffffffff;
else
- mask[2] = 0xffffff00 | ((0xff << (i - 8)) & 0xff);
-
- if (i == 0)
mask[3] = 0xffffffff;
- else if (i >= 8)
- mask[3] = 0xffffff00;
- else
- mask[3] = 0xffffff00 | ((0xff << i) & 0xff);
}
}
}
memset(lis, 0, sizeof(listener_t));
+#ifdef AF_INET6
+ if (get_address(value, INADDR_ANY, IPP_PORT, AF_INET6, &(lis->address)))
+#else
if (get_address(value, INADDR_ANY, IPP_PORT, AF_INET, &(lis->address)))
+#endif /* AF_INET6 */
{
httpAddrString(&(lis->address), temp, sizeof(temp));
ntohs(lis->address.ipv6.sin6_port));
else
#endif /* AF_INET6 */
- LogMessage(L_INFO, "Listening to %s:%d", temp,
- ntohs(lis->address.ipv4.sin_port));
+#ifdef AF_LOCAL
+ if (lis->address.addr.sa_family == AF_LOCAL)
+ LogMessage(L_INFO, "Listening to %s (Domain)", temp);
+ else
+#endif /* AF_LOCAL */
+ LogMessage(L_INFO, "Listening to %s:%d", temp,
+ ntohs(lis->address.ipv4.sin_port));
+
NumListeners ++;
}
else
LogMessage(L_ERROR, "Unknown BrowseOrder value %s on line %d.",
value, linenum);
}
- else if (!strcasecmp(line, "BrowseProtocols"))
+ else if (!strcasecmp(line, "BrowseProtocols") ||
+ !strcasecmp(line, "BrowseLocalProtocols") ||
+ !strcasecmp(line, "BrowseRemoteProtocols"))
{
/*
* "BrowseProtocol name [... name]"
*/
- BrowseProtocols = 0;
+ if (strcasecmp(line, "BrowseLocalProtocols"))
+ BrowseRemoteProtocols = 0;
+ if (strcasecmp(line, "BrowseRemoteProtocols"))
+ BrowseLocalProtocols = 0;
for (; *value;)
{
}
if (!strcasecmp(value, "cups"))
- BrowseProtocols |= BROWSE_CUPS;
+ {
+ if (strcasecmp(line, "BrowseLocalProtocols"))
+ BrowseRemoteProtocols |= BROWSE_CUPS;
+ if (strcasecmp(line, "BrowseRemoteProtocols"))
+ BrowseLocalProtocols |= BROWSE_CUPS;
+ }
else if (!strcasecmp(value, "slp"))
- BrowseProtocols |= BROWSE_SLP;
+ {
+ if (strcasecmp(line, "BrowseLocalProtocols"))
+ BrowseRemoteProtocols |= BROWSE_SLP;
+ if (strcasecmp(line, "BrowseRemoteProtocols"))
+ BrowseLocalProtocols |= BROWSE_SLP;
+ }
else if (!strcasecmp(value, "ldap"))
- BrowseProtocols |= BROWSE_LDAP;
+ {
+ if (strcasecmp(line, "BrowseLocalProtocols"))
+ BrowseRemoteProtocols |= BROWSE_LDAP;
+ if (strcasecmp(line, "BrowseRemoteProtocols"))
+ BrowseLocalProtocols |= BROWSE_LDAP;
+ }
else if (!strcasecmp(value, "all"))
- BrowseProtocols |= BROWSE_ALL;
+ {
+ if (strcasecmp(line, "BrowseLocalProtocols"))
+ BrowseRemoteProtocols |= BROWSE_ALL;
+ if (strcasecmp(line, "BrowseRemoteProtocols"))
+ BrowseLocalProtocols |= BROWSE_ALL;
+ }
else
{
LogMessage(L_ERROR, "Unknown browse protocol \"%s\" on line %d.",