]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/conf.c
Update scheduler to use new environment variable API - this reduces code
[thirdparty/cups.git] / scheduler / conf.c
index 6e4430040854ad777c1ad3a9ea4cadc04627ab37..b2161003b80d9feaf195ec881b3626c9e5808bbd 100644 (file)
@@ -399,12 +399,13 @@ ReadConfiguration(void)
   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);
@@ -457,9 +458,9 @@ ReadConfiguration(void)
   */
 
 #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 */
 
@@ -649,6 +650,12 @@ ReadConfiguration(void)
                  TempDir, strerror(errno));
   }
 
+ /*
+  * Setup environment variables...
+  */
+
+  cupsdInitEnv();
+
  /*
   * Check the MaxClients setting, and then allocate memory for it...
   */
@@ -731,10 +738,10 @@ ReadConfiguration(void)
                         "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");
@@ -769,11 +776,11 @@ ReadConfiguration(void)
                         "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;
 
@@ -805,10 +812,10 @@ ReadConfiguration(void)
       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>");
@@ -942,11 +949,22 @@ get_address(const char  *value,           /* I - Value string */
             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...
   */
@@ -986,37 +1004,42 @@ get_address(const char  *value,          /* I - Value string */
 
     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';
   }
 
  /*
@@ -1109,7 +1132,7 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
   * Check for an IPv6 address...
   */
 
-  if ((ptr = strchr(value, ':')) != NULL && ptr < maskval)
+  if (*value == '[')
   {
    /*
     * Parse hexadecimal IPv6 address...
@@ -1117,14 +1140,16 @@ get_addr_and_mask(const char *value,    /* I - String from config file */
 
     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 ++;
     }
 
@@ -1142,6 +1167,9 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
 
     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)
@@ -1153,30 +1181,26 @@ get_addr_and_mask(const char *value,    /* I - String from config file */
     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
@@ -1189,6 +1213,9 @@ get_addr_and_mask(const char *value,      /* I - String from config file */
 
       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
     {
@@ -1234,31 +1261,14 @@ get_addr_and_mask(const char *value,    /* I - String from config file */
       {
         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);
       }
     }
   }
@@ -1708,7 +1718,11 @@ read_configuration(cups_file_t *fp)      /* I - File to read from */
 
       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));
 
@@ -1718,8 +1732,14 @@ read_configuration(cups_file_t *fp)      /* I - File to read from */
                      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
@@ -1858,13 +1878,18 @@ read_configuration(cups_file_t *fp)     /* I - File to read from */
         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;)
       {
@@ -1879,13 +1904,33 @@ read_configuration(cups_file_t *fp)     /* I - File to read from */
        }
 
         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.",