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 +# include +# include +# include +# 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!