]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
set USE_WINSOCK if on windows. error string routine. start and clean winsock.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 16 Jun 2008 15:02:52 +0000 (15:02 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 16 Jun 2008 15:02:52 +0000 (15:02 +0000)
git-svn-id: file:///svn/unbound/trunk@1123 be551aaa-1e26-0410-a405-d3ace91eadb9

config.h.in
configure
configure.ac
daemon/daemon.c
doc/Changelog
util/log.c
util/log.h

index c534d824f29ca1d06a46cc9a433ecb6ea4e27a15..788ab1d1da2fcc0e2c64ecf4765040cac0784124 100644 (file)
 /* Define if you want to use internal select based events */
 #undef USE_MINI_EVENT
 
+/* Whether the windows socket API is used */
+#undef USE_WINSOCK
+
 /* the version of the windows API enabled */
 #undef WINVER
 
index b6a14d78ac864c8abdcd4f49c38523bd30a9682d..37bae2769bc7cceb1799befc519bcc7ded339935 100755 (executable)
--- a/configure
+++ b/configure
 
 echo "$as_me:$LINENO: checking for getaddrinfo" >&5
 echo $ECHO_N "checking for getaddrinfo... $ECHO_C" >&6
-if test "${ac_cv_func_getaddrinfo+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_func_getaddrinfo=no
+ac_cv_func_getaddrinfo=no
 cat >conftest.$ac_ext <<_ACEOF
 
 #ifdef __cplusplus
@@ -23219,12 +23216,19 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_func_getaddrinfo="yes"
+
+ac_cv_func_getaddrinfo="yes"
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_WINSOCK 1
+_ACEOF
+
 
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
+
 ac_cv_func_getaddrinfo="no"
 LIBS="$ORIGLIBS"
 
@@ -23234,9 +23238,6 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 
-fi
-
-
 echo "$as_me:$LINENO: result: $ac_cv_func_getaddrinfo" >&5
 echo "${ECHO_T}$ac_cv_func_getaddrinfo" >&6
 if test $ac_cv_func_getaddrinfo = yes; then
index eaab37d855bdf0f34ee2b1fd49b5e5840cd9d2c6..0202bc66e5c0429ded143fe59db2e99ffd5f130f 100644 (file)
@@ -701,8 +701,7 @@ int test() {
 AC_DEFUN([AC_CHECK_GETADDRINFO_WITH_INCLUDES],
 [AC_REQUIRE([AC_PROG_CC])
 AC_MSG_CHECKING(for getaddrinfo)
-AC_CACHE_VAL(ac_cv_func_getaddrinfo,
-[ac_cv_func_getaddrinfo=no
+ac_cv_func_getaddrinfo=no
 AC_LINK_IFELSE(
 [
 #ifdef __cplusplus
@@ -735,14 +734,16 @@ AC_LANG_PROGRAM(
         (void)getaddrinfo(NULL, NULL, NULL, NULL);
 ]
 ),
-[ac_cv_func_getaddrinfo="yes"
+[
+ac_cv_func_getaddrinfo="yes"
 dnl already: LIBS="$LIBS -lws2_32"
+AC_DEFINE(USE_WINSOCK, 1, [Whether the windows socket API is used])
 ],
-[ac_cv_func_getaddrinfo="no"
+[
+ac_cv_func_getaddrinfo="no"
 LIBS="$ORIGLIBS"
 ])
 )
-])
 
 AC_MSG_RESULT($ac_cv_func_getaddrinfo)
 if test $ac_cv_func_getaddrinfo = yes; then
index 7a83cd7080aec0d8a48c9584ef9cace2c8fa10a3..dda9c4e36d2b98001d8509285a5c2c119f748b9e 100644 (file)
@@ -146,8 +146,19 @@ daemon_init()
 {
        struct daemon* daemon = (struct daemon*)calloc(1, 
                sizeof(struct daemon));
+#ifdef USE_WINSOCK
+       int r;
+       WSADATA wsa_data;
+#endif
        if(!daemon)
                return NULL;
+#ifdef USE_WINSOCK
+       r = WSAStartup(MAKEWORD(2,2), &wsa_data);
+       if(r != 0) {
+               fatal_exit("could not init winsock. WSAStartup: %s",
+                       wsa_strerror(r));
+       }
+#endif /* USE_WINSOCK */
        signal_handling_record();
        checklock_start();
        ERR_load_crypto_strings();
@@ -458,4 +469,10 @@ daemon_delete(struct daemon* daemon)
        ERR_free_strings();
        RAND_cleanup();
        checklock_stop();
+#ifdef USE_WINSOCK
+       if(WSACleanup() != 0) {
+               log_err("Could not WSACleanup: %s", 
+                       wsa_strerror(WSAGetLastError()));
+       }
+#endif
 }
index fdf4d106f4316d013884bb8b52effdefde7445fc..aeed63a608657b52655130e649b2c3c67cb57f19 100644 (file)
@@ -2,6 +2,9 @@
        - on windows, use windows threads, mutex and thread-local-storage(Tls).
        - detect if openssl needs gdi32.
        - if no threading, THREADS_DISABLED is defined for use in the code.
+       - sets USE_WINSOCK if using ws2_32 on windows.
+       - wsa_strerror() function for more readable errors.
+       - WSA Startup and Cleanup called in unbound.exe.
 
 13 June 2008: Wouter
        - port mingw32, more signal ifdefs, detect sleep, usleep, 
index 614541e33b5b5b634a21bcd31ad7ee71fd2a602d..1245f8eff3d4870a93ccb723a9911903ffa52d2f 100644 (file)
@@ -270,3 +270,112 @@ void log_buf(enum verbosity_value level, const char* msg, ldns_buffer* buf)
                return;
        log_hex(msg, ldns_buffer_begin(buf), ldns_buffer_limit(buf));
 }
+
+#ifdef USE_WINSOCK
+char* wsa_strerror(DWORD err)
+{
+       static char unknown[32];
+
+       switch(err) {
+       case WSA_INVALID_HANDLE: return "Specified event object handle is invalid.";
+       case WSA_NOT_ENOUGH_MEMORY: return "Insufficient memory available.";
+       case WSA_INVALID_PARAMETER: return "One or more parameters are invalid.";
+       case WSA_OPERATION_ABORTED: return "Overlapped operation aborted.";
+       case WSA_IO_INCOMPLETE: return "Overlapped I/O event object not in signaled state.";
+       case WSA_IO_PENDING: return "Overlapped operations will complete later.";
+       case WSAEINTR: return "Interrupted function call.";
+       case WSAEBADF: return "File handle is not valid.";
+       case WSAEACCES: return "Permission denied.";
+       case WSAEFAULT: return "Bad address.";
+       case WSAEINVAL: return "Invalid argument.";
+       case WSAEMFILE: return "Too many open files.";
+       case WSAEWOULDBLOCK: return "Resource temporarily unavailable.";
+       case WSAEINPROGRESS: return "Operation now in progress.";
+       case WSAEALREADY: return "Operation already in progress.";
+       case WSAENOTSOCK: return "Socket operation on nonsocket.";
+       case WSAEDESTADDRREQ: return "Destination address required.";
+       case WSAEMSGSIZE: return "Message too long.";
+       case WSAEPROTOTYPE: return "Protocol wrong type for socket.";
+       case WSAENOPROTOOPT: return "Bad protocol option.";
+       case WSAEPROTONOSUPPORT: return "Protocol not supported.";
+       case WSAESOCKTNOSUPPORT: return "Socket type not supported.";
+       case WSAEOPNOTSUPP: return "Operation not supported.";
+       case WSAEPFNOSUPPORT: return "Protocol family not supported.";
+       case WSAEAFNOSUPPORT: return "Address family not supported by protocol family.";
+       case WSAEADDRINUSE: return "Address already in use.";
+       case WSAEADDRNOTAVAIL: return "Cannot assign requested address.";
+       case WSAENETDOWN: return "Network is down.";
+       case WSAENETUNREACH: return "Network is unreachable.";
+       case WSAENETRESET: return "Network dropped connection on reset.";
+       case WSAECONNABORTED: return "Software caused connection abort.";
+       case WSAECONNRESET: return "Connection reset by peer.";
+       case WSAENOBUFS: return "No buffer space available.";
+       case WSAEISCONN: return "Socket is already connected.";
+       case WSAENOTCONN: return "Socket is not connected.";
+       case WSAESHUTDOWN: return "Cannot send after socket shutdown.";
+       case WSAETOOMANYREFS: return "Too many references.";
+       case WSAETIMEDOUT: return "Connection timed out.";
+       case WSAECONNREFUSED: return "Connection refused.";
+       case WSAELOOP: return "Cannot translate name.";
+       case WSAENAMETOOLONG: return "Name too long.";
+       case WSAEHOSTDOWN: return "Host is down.";
+       case WSAEHOSTUNREACH: return "No route to host.";
+       case WSAENOTEMPTY: return "Directory not empty.";
+       case WSAEPROCLIM: return "Too many processes.";
+       case WSAEUSERS: return "User quota exceeded.";
+       case WSAEDQUOT: return "Disk quota exceeded.";
+       case WSAESTALE: return "Stale file handle reference.";
+       case WSAEREMOTE: return "Item is remote.";
+       case WSASYSNOTREADY: return "Network subsystem is unavailable.";
+       case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range.";
+       case WSANOTINITIALISED: return "Successful WSAStartup not yet performed.";
+       case WSAEDISCON: return "Graceful shutdown in progress.";
+       case WSAENOMORE: return "No more results.";
+       case WSAECANCELLED: return "Call has been canceled.";
+       case WSAEINVALIDPROCTABLE: return "Procedure call table is invalid.";
+       case WSAEINVALIDPROVIDER: return "Service provider is invalid.";
+       case WSAEPROVIDERFAILEDINIT: return "Service provider failed to initialize.";
+       case WSASYSCALLFAILURE: return "System call failure.";
+       case WSASERVICE_NOT_FOUND: return "Service not found.";
+       case WSATYPE_NOT_FOUND: return "Class type not found.";
+       case WSA_E_NO_MORE: return "No more results.";
+       case WSA_E_CANCELLED: return "Call was canceled.";
+       case WSAEREFUSED: return "Database query was refused.";
+       case WSAHOST_NOT_FOUND: return "Host not found.";
+       case WSATRY_AGAIN: return "Nonauthoritative host not found.";
+       case WSANO_RECOVERY: return "This is a nonrecoverable error.";
+       case WSANO_DATA: return "Valid name, no data record of requested type.";
+       case WSA_QOS_RECEIVERS: return "QOS receivers.";
+       case WSA_QOS_SENDERS: return "QOS senders.";
+       case WSA_QOS_NO_SENDERS: return "No QOS senders.";
+       case WSA_QOS_NO_RECEIVERS: return "QOS no receivers.";
+       case WSA_QOS_REQUEST_CONFIRMED: return "QOS request confirmed.";
+       case WSA_QOS_ADMISSION_FAILURE: return "QOS admission error.";
+       case WSA_QOS_POLICY_FAILURE: return "QOS policy failure.";
+       case WSA_QOS_BAD_STYLE: return "QOS bad style.";
+       case WSA_QOS_BAD_OBJECT: return "QOS bad object.";
+       case WSA_QOS_TRAFFIC_CTRL_ERROR: return "QOS traffic control error.";
+       case WSA_QOS_GENERIC_ERROR: return "QOS generic error.";
+       case WSA_QOS_ESERVICETYPE: return "QOS service type error.";
+       case WSA_QOS_EFLOWSPEC: return "QOS flowspec error.";
+       case WSA_QOS_EPROVSPECBUF: return "Invalid QOS provider buffer.";
+       case WSA_QOS_EFILTERSTYLE: return "Invalid QOS filter style.";
+       case WSA_QOS_EFILTERTYPE: return "Invalid QOS filter type.";
+       case WSA_QOS_EFILTERCOUNT: return "Incorrect QOS filter count.";
+       case WSA_QOS_EOBJLENGTH: return "Invalid QOS object length.";
+       case WSA_QOS_EFLOWCOUNT: return "Incorrect QOS flow count.";
+       /*case WSA_QOS_EUNKOWNPSOBJ: return "Unrecognized QOS object.";*/
+       case WSA_QOS_EPOLICYOBJ: return "Invalid QOS policy object.";
+       case WSA_QOS_EFLOWDESC: return "Invalid QOS flow descriptor.";
+       case WSA_QOS_EPSFLOWSPEC: return "Invalid QOS provider-specific flowspec.";
+       case WSA_QOS_EPSFILTERSPEC: return "Invalid QOS provider-specific filterspec.";
+       case WSA_QOS_ESDMODEOBJ: return "Invalid QOS shape discard mode object.";
+       case WSA_QOS_ESHAPERATEOBJ: return "Invalid QOS shaping rate object.";
+       case WSA_QOS_RESERVED_PETYPE: return "Reserved policy QOS element type.";
+       default:
+               snprintf(unknown, sizeof(unknown),
+                       "unknown WSA error code %d", (int)err);
+               return unknown;
+       }
+}
+#endif /* USE_WINSOCK */
index 04c2577ced5823a7f9a59f167207920905f1819c..39a15310a12cb4b6ae27b26365a40c221deea417 100644 (file)
@@ -180,4 +180,13 @@ void log_vmsg(int pri, const char* type, const char* format, va_list args);
 #  define log_assert(x) /*nothing*/
 #endif
 
+#ifdef USE_WINSOCK
+/**
+ * Convert WSA error into string.
+ * @param err: from WSAGetLastError()
+ * @return: string.
+ */
+char* wsa_strerror(DWORD err);
+#endif /* USE_WINSOCK */
+
 #endif /* UTIL_LOG_H */