244 lines
7.6 KiB
Diff
244 lines
7.6 KiB
Diff
diff -up cups-2.1.4/cups/auth.c.resolv_reload cups-2.1.4/cups/auth.c
|
|
--- cups-2.1.4/cups/auth.c.resolv_reload 2016-06-14 19:45:32.000000000 +0200
|
|
+++ cups-2.1.4/cups/auth.c 2017-04-05 17:36:21.812611389 +0200
|
|
@@ -522,6 +522,16 @@ cups_gss_getname(
|
|
DEBUG_printf(("7cups_gss_getname(http=%p, service_name=\"%s\")", http,
|
|
service_name));
|
|
|
|
+#ifdef HAVE_RES_INIT
|
|
+ /*
|
|
+ * Check if /etc/resolv.conf is modified.
|
|
+ * If so, reload resolver.
|
|
+ */
|
|
+
|
|
+ http_resolv_check_t status;
|
|
+
|
|
+ status = httpCheckResolv();
|
|
+#endif /* HAVE_RES_INIT */
|
|
|
|
/*
|
|
* Get the hostname...
|
|
diff -up cups-2.1.4/cups/http-addr.c.resolv_reload cups-2.1.4/cups/http-addr.c
|
|
--- cups-2.1.4/cups/http-addr.c.resolv_reload 2017-04-05 17:36:21.798611527 +0200
|
|
+++ cups-2.1.4/cups/http-addr.c 2017-04-05 17:36:21.812611389 +0200
|
|
@@ -364,6 +364,17 @@ httpAddrLookup(
|
|
|
|
#ifdef HAVE_RES_INIT
|
|
/*
|
|
+ * Check if /etc/resolv.conf is modified.
|
|
+ * If so, reload resolver and set need_res_init to 0.
|
|
+ */
|
|
+
|
|
+ http_resolv_check_t status;
|
|
+
|
|
+ status = httpCheckResolv();
|
|
+
|
|
+ if (status == HTTP_RESOLV_CHECK_RELOADED && cg->need_res_init == 1)
|
|
+ cg->need_res_init = 0;
|
|
+ /*
|
|
* STR #2920: Initialize resolver after failure in cups-polld
|
|
*
|
|
* If the previous lookup failed, re-initialize the resolver to prevent
|
|
diff -up cups-2.1.4/cups/http-addrlist.c.resolv_reload cups-2.1.4/cups/http-addrlist.c
|
|
--- cups-2.1.4/cups/http-addrlist.c.resolv_reload 2017-04-05 17:36:21.781611694 +0200
|
|
+++ cups-2.1.4/cups/http-addrlist.c 2017-04-05 17:36:21.813611379 +0200
|
|
@@ -414,6 +414,17 @@ httpAddrGetList(const char *hostname, /*
|
|
|
|
#ifdef HAVE_RES_INIT
|
|
/*
|
|
+ * Check if /etc/resolv.conf is modified.
|
|
+ * If so, reload resolver and set cg->need_res_init to 0
|
|
+ */
|
|
+
|
|
+ http_resolv_check_t status;
|
|
+
|
|
+ status = httpCheckResolv();
|
|
+
|
|
+ if (status == HTTP_RESOLV_CHECK_RELOADED && cg->need_res_init == 1)
|
|
+ cg->need_res_init = 0;
|
|
+ /*
|
|
* STR #2920: Initialize resolver after failure in cups-polld
|
|
*
|
|
* If the previous lookup failed, re-initialize the resolver to prevent
|
|
diff -up cups-2.1.4/cups/http.c.resolv_reload cups-2.1.4/cups/http.c
|
|
--- cups-2.1.4/cups/http.c.resolv_reload 2016-06-14 19:45:32.000000000 +0200
|
|
+++ cups-2.1.4/cups/http.c 2017-04-05 17:53:16.856712660 +0200
|
|
@@ -109,6 +109,9 @@ static const char * const http_fields[]
|
|
"Allow",
|
|
"Server"
|
|
};
|
|
+#ifdef HAVE_RES_INIT
|
|
+time_t resolv_conf_modtime = 0;
|
|
+#endif /* HAVE_RES_INIT */
|
|
|
|
|
|
/*
|
|
@@ -4848,6 +4851,45 @@ http_write_chunk(http_t *http, /* I
|
|
return (bytes);
|
|
}
|
|
|
|
+#ifdef HAVE_RES_INIT
|
|
+/*
|
|
+ * Function to check modification time of resolv.conf.
|
|
+ * If time is changed, it reloads resolver.
|
|
+ * If /etc/resolv.conf doesn't exist, it tries to reload local resolver.
|
|
+ * If even reloading local resolver doesn't work, it ends with error.
|
|
+ */
|
|
+
|
|
+http_resolv_check_t
|
|
+httpCheckResolv()
|
|
+{
|
|
+ http_resolv_check_t status = HTTP_RESOLV_CHECK_OK;
|
|
+ struct stat resolv_conf_status;
|
|
+
|
|
+ status = stat(HTTP_RESOLV_CONF_PATH, &resolv_conf_status);
|
|
+
|
|
+ /* /etc/resolv.conf couldn't be stated because it doesn't exist, try resolver on localhost */
|
|
+ if (status == HTTP_RESOLV_CHECK_ERROR && errno == ENOENT)
|
|
+ {
|
|
+ status = res_init();
|
|
+ return(status);
|
|
+ }
|
|
+
|
|
+ /* If stat ends with different errno, return status */
|
|
+ if (status == HTTP_RESOLV_CHECK_ERROR)
|
|
+ return (status);
|
|
+
|
|
+ if (resolv_conf_modtime != 0 && resolv_conf_status.st_mtime != resolv_conf_modtime)
|
|
+ {
|
|
+ res_init();
|
|
+
|
|
+ status = HTTP_RESOLV_CHECK_RELOADED;
|
|
+ }
|
|
+
|
|
+ resolv_conf_modtime = resolv_conf_status.st_mtime;
|
|
+
|
|
+ return (status);
|
|
+}
|
|
+#endif /* HAVE_RES_INIT */
|
|
|
|
/*
|
|
* End of "$Id: http.c 12970 2015-11-13 20:02:51Z msweet $".
|
|
diff -up cups-2.1.4/cups/http.h.resolv_reload cups-2.1.4/cups/http.h
|
|
--- cups-2.1.4/cups/http.h.resolv_reload 2016-06-14 19:45:32.000000000 +0200
|
|
+++ cups-2.1.4/cups/http.h 2017-04-05 17:36:21.814611369 +0200
|
|
@@ -57,6 +57,12 @@ typedef off_t ssize_t; /* @private@ */
|
|
# define SO_PEERCRED LOCAL_PEERCRED
|
|
# endif /* LOCAL_PEERCRED && !SO_PEERCRED */
|
|
# endif /* WIN32 */
|
|
+# ifdef HAVE_RES_INIT
|
|
+# include <sys/stat.h>
|
|
+# include <unistd.h>
|
|
+# include <arpa/nameser.h>
|
|
+# include <resolv.h>
|
|
+# endif /* HAVE_RES_INIT */
|
|
|
|
|
|
/*
|
|
@@ -97,6 +103,13 @@ extern "C" {
|
|
#endif /* AF_INET6 && !s6_addr32 */
|
|
|
|
|
|
+#ifdef HAVE_RES_INIT
|
|
+/*
|
|
+ * Global variable for storing old modification time of resolv.conf
|
|
+ */
|
|
+ extern time_t resolv_conf_modtime;
|
|
+#endif /* HAVE_RES_INIT */
|
|
+
|
|
/*
|
|
* Limits...
|
|
*/
|
|
@@ -105,6 +118,9 @@ extern "C" {
|
|
# define HTTP_MAX_HOST 256 /* Max length of hostname string */
|
|
# define HTTP_MAX_BUFFER 2048 /* Max length of data buffer */
|
|
# define HTTP_MAX_VALUE 256 /* Max header field value length */
|
|
+# ifdef HAVE_RES_INIT
|
|
+# define HTTP_RESOLV_CONF_PATH "/etc/resolv.conf" /* Path to resolv.conf */
|
|
+# endif /* HAVE_RES_INIT */
|
|
|
|
|
|
/*
|
|
@@ -408,6 +424,15 @@ typedef enum http_version_e /**** HTTP
|
|
# endif /* !_CUPS_NO_DEPRECATED */
|
|
} http_version_t;
|
|
|
|
+#ifdef HAVE_RES_INIT
|
|
+typedef enum http_resolv_check_e
|
|
+{
|
|
+ HTTP_RESOLV_CHECK_ERROR = -1,
|
|
+ HTTP_RESOLV_CHECK_OK = 0,
|
|
+ HTTP_RESOLV_CHECK_RELOADED = 1
|
|
+} http_resolv_check_t;
|
|
+#endif /* HAVE_RES_INIT */
|
|
+
|
|
typedef union _http_addr_u /**** Socket address union, which
|
|
**** makes using IPv6 and other
|
|
**** address types easier and
|
|
@@ -646,6 +671,11 @@ extern void httpShutdown(http_t *http)
|
|
extern const char *httpStateString(http_state_t state) _CUPS_API_2_0;
|
|
extern const char *httpURIStatusString(http_uri_status_t status) _CUPS_API_2_0;
|
|
|
|
+/**** Prototype of function to check modification time of /etc/resolv.conf ****/
|
|
+#ifdef HAVE_RES_INIT
|
|
+extern http_resolv_check_t httpCheckResolv();
|
|
+#endif /* HAVE_RES_INIT */
|
|
+
|
|
/*
|
|
* C++ magic...
|
|
*/
|
|
diff -up cups-2.1.4/cups/http-support.c.resolv_reload cups-2.1.4/cups/http-support.c
|
|
--- cups-2.1.4/cups/http-support.c.resolv_reload 2017-04-05 17:36:21.795611556 +0200
|
|
+++ cups-2.1.4/cups/http-support.c 2017-04-05 17:36:21.814611369 +0200
|
|
@@ -2266,6 +2266,16 @@ http_resolve_cb(
|
|
http_addrlist_t *addrlist, /* List of addresses */
|
|
*addr; /* Current address */
|
|
|
|
+#ifdef HAVE_RES_INIT
|
|
+ /*
|
|
+ * Check if resolv.conf is modified, if so, reload resolver
|
|
+ */
|
|
+
|
|
+ http_resolv_check_t status;
|
|
+
|
|
+ status = httpCheckResolv();
|
|
+#endif /* HAVE_RES_INIT */
|
|
+
|
|
DEBUG_printf(("8http_resolve_cb: Looking up \"%s\".", hostTarget));
|
|
|
|
snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port));
|
|
diff -up cups-2.1.4/scheduler/conf.c.resolv_reload cups-2.1.4/scheduler/conf.c
|
|
--- cups-2.1.4/scheduler/conf.c.resolv_reload 2017-04-05 17:36:21.810611409 +0200
|
|
+++ cups-2.1.4/scheduler/conf.c 2017-04-05 17:36:21.815611359 +0200
|
|
@@ -939,6 +939,12 @@ cupsdReadConfiguration(void)
|
|
if (!RemotePort)
|
|
BrowseLocalProtocols = 0; /* Disable sharing - no remote access */
|
|
|
|
+#ifdef HAVE_RES_INIT
|
|
+ http_resolv_check_t res_status; /* Return status of httpCheckResolv() */
|
|
+
|
|
+ res_status = httpCheckResolv();
|
|
+#endif /* HAVE_RES_INIT */
|
|
+
|
|
/*
|
|
* See if the ServerName is an IP address...
|
|
*/
|
|
diff -up cups-2.1.4/scheduler/main.c.resolv_reload cups-2.1.4/scheduler/main.c
|
|
--- cups-2.1.4/scheduler/main.c.resolv_reload 2017-04-05 17:36:21.805611458 +0200
|
|
+++ cups-2.1.4/scheduler/main.c 2017-04-05 17:39:05.278005085 +0200
|
|
@@ -141,6 +141,14 @@ main(int argc, /* I - Number of comm
|
|
#endif /* HAVE_AVAHI */
|
|
|
|
|
|
+#ifdef HAVE_RES_INIT
|
|
+ http_resolv_check_t status; /* Return status from httpCheckResolv() */
|
|
+
|
|
+ status = httpCheckResolv();
|
|
+ if (status == HTTP_RESOLV_CHECK_ERROR)
|
|
+ fputs("cupsd: Cannot reload a resolver, using old configuration now.\n", stderr);
|
|
+#endif /* HAVE_RES_INIT */
|
|
+
|
|
#ifdef HAVE_GETEUID
|
|
/*
|
|
* Check for setuid invocation, which we do not support!
|