/*
- * "$Id: http-addr.c 6814 2007-08-20 20:09:25Z mike $"
+ * "$Id: http-addr.c 7910 2008-09-06 00:25:17Z mike $"
*
* HTTP address routines for the Common UNIX Printing System (CUPS).
*
* Include necessary headers...
*/
+#include "http-private.h"
#include "globals.h"
#include "debug.h"
#include <stdlib.h>
#include <stddef.h>
+#ifdef HAVE_RESOLV_H
+# include <resolv.h>
+#endif /* HAVE_RESOLV_H */
/*
char *name, /* I - Host name buffer */
int namelen) /* I - Size of name buffer */
{
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Global data */
+
+
DEBUG_printf(("httpAddrLookup(addr=%p, name=%p, namelen=%d)\n",
addr, name, namelen));
#ifdef AF_LOCAL
if (addr->addr.sa_family == AF_LOCAL)
+ {
strlcpy(name, addr->un.sun_path, namelen);
- else
+ return (name);
+ }
#endif /* AF_LOCAL */
+
+#ifdef HAVE_RES_INIT
+ /*
+ * STR #2920: Initialize resolver after failure in cups-polld
+ *
+ * If the previous lookup failed, re-initialize the resolver to prevent
+ * temporary network errors from persisting. This *should* be handled by
+ * the resolver libraries, but apparently the glibc folks do not agree.
+ *
+ * We set a flag at the end of this function if we encounter an error that
+ * requires reinitialization of the resolver functions. We then call
+ * res_init() if the flag is set on the next call here or in httpAddrLookup().
+ */
+
+ if (cg->need_res_init)
+ {
+ res_init();
+
+ cg->need_res_init = 0;
+ }
+#endif /* HAVE_RES_INIT */
+
#ifdef HAVE_GETNAMEINFO
{
/*
* do...
*/
- if (getnameinfo(&addr->addr, httpAddrLength(addr), name, namelen,
- NULL, 0, 0))
+ int error = getnameinfo(&addr->addr, httpAddrLength(addr), name, namelen,
+ NULL, 0, 0);
+
+ if (error)
+ {
+ if (error == EAI_FAIL)
+ cg->need_res_init = 1;
+
return (httpAddrString(addr, name, namelen));
+ }
}
#else
{
* No hostname, so return the raw address...
*/
- httpAddrString(addr, name, namelen);
- return (NULL);
+ if (h_errno == NO_RECOVERY)
+ cg->need_res_init = 1;
+
+ return (httpAddrString(addr, name, namelen));
}
strlcpy(name, host->h_name, namelen);
int /* O - Port number */
_httpAddrPort(http_addr_t *addr) /* I - Address */
{
+ if (!addr)
+ return (ippPort());
#ifdef AF_INET6
- if (addr->addr.sa_family == AF_INET6)
+ else if (addr->addr.sa_family == AF_INET6)
return (ntohs(addr->ipv6.sin6_port));
- else
#endif /* AF_INET6 */
- if (addr->addr.sa_family == AF_INET)
+ else if (addr->addr.sa_family == AF_INET)
return (ntohs(addr->ipv4.sin_port));
else
return (ippPort());
/*
- * End of "$Id: http-addr.c 6814 2007-08-20 20:09:25Z mike $".
+ * End of "$Id: http-addr.c 7910 2008-09-06 00:25:17Z mike $".
*/