]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Refactor the defaults code so that the correct order of precedence is
authorMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 18 Nov 2019 18:20:34 +0000 (13:20 -0500)
committerMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 18 Nov 2019 18:21:53 +0000 (13:21 -0500)
respected in all cases (Issue #5683)

CHANGES.md
cups/dest.c

index 485a2b614767017a1260d284e2517138a552d158..737eaae0da9c86bb6ca389c57a65ec4711f2e6b6 100644 (file)
@@ -1,4 +1,4 @@
-CHANGES - 2.3.1 - 2019-11-14
+CHANGES - 2.3.1 - 2019-11-18
 ============================
 
 
@@ -20,7 +20,8 @@ Changes in CUPS v2.3.1
 - The `--with-dbusdir` option was ignored by the configure script (Issue #5671)
 - Sandboxed applications were not able to get the default printer (Issue #5676)
 - Log file access controls were not preserved by `cupsctl` (Issue #5677)
-- Default printers set with `lpoptions` did not work in all cases (Issue #5681)
+- Default printers set with `lpoptions` did not work in all cases (Issue #5681,
+  Issue #5683)
 - The IPP backend did not detect all cases where a job should be retried using
   a raster format (rdar://56021091)
 - Fixed spelling of "fold-accordion".
index fd57d979461646440a818ee624c0feeb11e2bbd6..cde987a0951f2f9a27e8d2e973aca34ee6f903fd 100644 (file)
@@ -2256,7 +2256,7 @@ _cupsUserDefault(char   *name,            /* I - Name buffer */
   * system preferences...
   */
 
-  if ((locprinter = _cupsAppleCopyDefaultPrinter()) != NULL)
+  if (!getenv("CUPS_NO_APPLE_DEFAULT") && (locprinter = _cupsAppleCopyDefaultPrinter()) != NULL)
   {
     CFStringGetCString(locprinter, name, (CFIndex)namesize, kCFStringEncodingUTF8);
     CFRelease(locprinter);
@@ -3379,10 +3379,9 @@ cups_enum_dests(
   int           i, j,                  /* Looping vars */
                 num_dests;              /* Number of destinations */
   cups_dest_t   *dests = NULL,          /* Destinations */
-                *dest,                  /* Current destination */
-                *user_dest;            /* User destination */
+                *dest;                 /* Current destination */
   cups_option_t        *option;                /* Current option */
-  char          *user_default;          /* User default printer */
+  const char   *user_default;          /* Default printer from environment */
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
   int           count,                  /* Number of queries started */
                 completed,              /* Number of completed queries */
@@ -3437,47 +3436,49 @@ cups_enum_dests(
 
   memset(&data, 0, sizeof(data));
 
-  if ((user_default = _cupsUserDefault(data.def_name, sizeof(data.def_name))) == NULL)
+  user_default = _cupsUserDefault(data.def_name, sizeof(data.def_name));
+
+  snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot);
+  data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
+
+  if (cg->home)
   {
-    const char *defprinter = cupsGetDefault2(http);
-                                       /* Server default, if any */
+    snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home);
 
-    if (defprinter)
-      strlcpy(data.def_name, defprinter, sizeof(data.def_name));
+    data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
   }
 
-  if (data.def_name[0])
+  if (!user_default && (dest = cupsGetDest(NULL, NULL, data.num_dests, data.dests)) != NULL)
   {
    /*
-    * Separate printer and instance name...
+    * Use an lpoptions default printer...
     */
 
-    if ((data.def_instance = strchr(data.def_name, '/')) != NULL)
-      *data.def_instance++ = '\0';
+    if (dest->instance)
+      snprintf(data.def_name, sizeof(data.def_name), "%s/%s", dest->name, dest->instance);
+    else
+      strlcpy(data.def_name, dest->name, sizeof(data.def_name));
   }
-
-  DEBUG_printf(("1cups_enum_dests: def_name=\"%s\", def_instance=\"%s\"", data.def_name, data.def_instance));
-
-  snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot);
-  data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
-
-  if (cg->home)
+  else
   {
-    snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", cg->home);
+    const char *default_printer;       /* Server default printer */
 
-    data.num_dests = cups_get_dests(filename, NULL, NULL, 1, user_default != NULL, data.num_dests, &data.dests);
+    if ((default_printer = cupsGetDefault2(http)) != NULL)
+      strlcpy(data.def_name, default_printer, sizeof(data.def_name));
   }
 
-  if (!data.def_name[0] && (user_dest = cupsGetDest(NULL, NULL, data.num_dests, data.dests)) != NULL)
+  if (data.def_name[0])
   {
    /*
-    * Use an lpoptions default printer...
+    * Separate printer and instance name...
     */
 
-    strlcpy(data.def_name, user_dest->name, sizeof(data.def_name));
-    data.def_instance = user_dest->instance;
+    if ((data.def_instance = strchr(data.def_name, '/')) != NULL)
+      *data.def_instance++ = '\0';
   }
 
+  DEBUG_printf(("1cups_enum_dests: def_name=\"%s\", def_instance=\"%s\"", data.def_name, data.def_instance));
+
  /*
   * Get ready to enumerate...
   */
@@ -3515,8 +3516,9 @@ cups_enum_dests(
          i > 0 && (!cancel || !*cancel);
          i --, dest ++)
     {
+      cups_dest_t      *user_dest;     /* Destination from lpoptions */
 #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI)
-      const char *device_uri;    /* Device URI */
+      const char       *device_uri;    /* Device URI */
 #endif /* HAVE_DNSSD || HAVE_AVAHI */
 
       if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL)
@@ -3785,6 +3787,8 @@ cups_enum_dests(
 
         if ((device->type & mask) == type)
         {
+          cups_dest_t  *user_dest;     /* Destination from lpoptions */
+
           dest = &device->dest;
 
          if ((user_dest = cupsGetDest(dest->name, dest->instance, data.num_dests, data.dests)) != NULL)