From b1f4c1e6649ca937b9c8a3d926303f060b32f27f Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 18 Nov 2019 13:20:34 -0500 Subject: Refactor the defaults code so that the correct order of precedence is respected in all cases (Issue #5683) --- cups/dest.c | 58 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 27 deletions(-) (limited to 'cups') diff --git a/cups/dest.c b/cups/dest.c index fd57d9794..cde987a09 100644 --- a/cups/dest.c +++ b/cups/dest.c @@ -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) -- cgit v1.2.1