From df4a264f6a4bf53592f9e273462a8861ea7e6a6d Mon Sep 17 00:00:00 2001 From: Matthias Andree Date: Mon, 14 Aug 2006 01:28:47 +0000 Subject: Wrap getaddrinfo() and block SIGALRM where needed. Also wrap freeaddrinfo() without added functionality. svn path=/branches/BRANCH_6-3/; revision=4895 --- fm_getaddrinfo.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 fm_getaddrinfo.c (limited to 'fm_getaddrinfo.c') diff --git a/fm_getaddrinfo.c b/fm_getaddrinfo.c new file mode 100644 index 00000000..97cec65c --- /dev/null +++ b/fm_getaddrinfo.c @@ -0,0 +1,40 @@ +#include "config.h" +#include "fetchmail.h" +#include "i18n.h" + +#include +#include +#include + +/** This is a getaddrinfo() replacement that blocks SIGALRM, + * to avoid issues with non-reentrant getaddrinfo() implementations + * after SIGALRM timeouts, for instance on MacOS X or NetBSD. */ +int fm_getaddrinfo(const char *node, const char *serv, const struct addrinfo *hints, struct addrinfo **res) +{ + int rc; + +#ifndef GETADDRINFO_ASYNCSAFE + sigset_t ss, os; + + sigemptyset(&ss); + sigaddset(&ss, SIGALRM); + + if (sigprocmask(SIG_BLOCK, &ss, &os)) + report(stderr, GT_("Cannot modify signal mask: %s"), strerror(errno)); +#endif + + rc = getaddrinfo(node, serv, hints, res); + +#ifndef GETADDRINFO_ASYNCSAFE + if (sigprocmask(SIG_SETMASK, &os, NULL)) + report(stderr, GT_("Cannot modify signal mask: %s"), strerror(errno)); +#endif + + return rc; +} + +/** this is a debugging freeaddrinfo() wrapper. */ +void fm_freeaddrinfo(struct addrinfo *ai) +{ + freeaddrinfo(ai); +} -- cgit v1.2.3