X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fgns%2Fw32nsp.c;h=3e926fcc429ad407605451120f249dad5770ec01;hb=2105059516320800eaa8fff1196b58f29a50ba7c;hp=9737c75029cf489f8abc7a453775371950e64a09;hpb=bbfebd03c83c09915c23470944533c8d6c611a1e;p=oweals%2Fgnunet.git diff --git a/src/gns/w32nsp.c b/src/gns/w32nsp.c index 9737c7502..3e926fcc4 100644 --- a/src/gns/w32nsp.c +++ b/src/gns/w32nsp.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2012 Christian Grothoff (and other contributing authors) + Copyright (C) 2012 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** * @file gns/w32nsp.c @@ -26,19 +26,21 @@ * "Network Programming For Microsoft Windows, 2Nd Edition". */ +#define VERBOSE 0 +#if !VERBOSE +# define DEBUGLOG(s, ...) +#endif +#if VERBOSE +# define __printf__ printf +# define DEBUGLOG(s, ...) printf (s, ##__VA_ARGS__) +#endif + #include #include #include #include #include -#if 1 -# define DEBUGLOG(s, ...) -#endif -#if 0 -# define DEBUGLOG(s, ...) printf (s, ##__VA_ARGS__) -#endif - #define WINDOWS 1 #define MINGW 1 #ifndef __BYTE_ORDER @@ -69,20 +71,13 @@ #endif #endif #include "w32resolver.h" -#define INITGUID +#include #include "gnunet_w32nsp_lib.h" #undef INITGUID #define NSPAPI_VERSION_MAJOR 4 #define NSPAPI_VERSION_MINOR 4 -#define REPLY_LIFETIME 60*5 - -#define STATE_BEGIN 0x01 -#define STATE_END 0x02 -#define STATE_REPLY 0x04 -#define STATE_GHBN 0x08 - static CRITICAL_SECTION records_cs; struct record @@ -108,7 +103,7 @@ resize_records () SetLastError (WSA_NOT_ENOUGH_MEMORY); return 0; } - memcpy (new_records, records, records_len * sizeof (struct record)); + GNUNET_memcpy (new_records, records, records_len * sizeof (struct record)); memset (&new_records[records_len], 0, sizeof (struct record) * (new_size - records_len)); records_size = new_size; free (records); @@ -149,14 +144,6 @@ add_record (SOCKET s, const wchar_t *name, DWORD flags) return res; } -static void -free_record (int i) -{ - if (records[i].name) - free (records[i].name); - records[i].state = 0; -} - /* These are not defined by mingw.org headers at the moment*/ typedef INT (WSPAPI *LPNSPIOCTL) (HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION,LPWSATHREADID); typedef struct _NSP_ROUTINE_XP { @@ -215,7 +202,6 @@ send_name_to_ip_request (LPWSAQUERYSETW lpqsRestrictions, char *buf; int ret = 1; int i; - uint32_t id; size_t size = sizeof (struct GNUNET_W32RESOLVER_GetMessage); size_t namelen = 0; if (lpqsRestrictions->lpszServiceInstanceName) @@ -243,7 +229,7 @@ send_name_to_ip_request (LPWSAQUERYSETW lpqsRestrictions, else msg->af = htonl (AF_UNSPEC); if (lpqsRestrictions->lpszServiceInstanceName) - memcpy (&msg[1], lpqsRestrictions->lpszServiceInstanceName, namelen); + GNUNET_memcpy (&msg[1], lpqsRestrictions->lpszServiceInstanceName, namelen); msg->sc_data1 = htonl (lpqsRestrictions->lpServiceClassId->Data1); msg->sc_data2 = htons (lpqsRestrictions->lpServiceClassId->Data2); msg->sc_data3 = htons (lpqsRestrictions->lpServiceClassId->Data3); @@ -254,7 +240,9 @@ send_name_to_ip_request (LPWSAQUERYSETW lpqsRestrictions, { if (size != send (*resolver, buf, size, 0)) { +#if VERBOSE DWORD err = GetLastError (); +#endif closesocket (*resolver); *resolver = INVALID_SOCKET; DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: failed to send request: %lu\n", err); @@ -317,7 +305,7 @@ GNUNET_W32NSP_LookupServiceBegin (LPGUID lpProviderId, LPWSAQUERYSETW lpqsRestri if (lpqsRestrictions->dwNameSpace != NS_DNS && lpqsRestrictions->dwNameSpace != NS_ALL) { DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: wrong namespace\n"); - SetLastError (WSANO_DATA); + SetLastError (WSAEINVAL); return SOCKET_ERROR; } if (lpqsRestrictions->lpszServiceInstanceName != NULL) @@ -333,7 +321,7 @@ GNUNET_W32NSP_LookupServiceBegin (LPGUID lpProviderId, LPWSAQUERYSETW lpqsRestri else { DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: unsupported TLD\n"); - SetLastError (WSANO_DATA); + SetLastError (WSAEINVAL); return SOCKET_ERROR; } } @@ -392,7 +380,7 @@ static int WSAAPI GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, LPDWORD lpdwBufferLength, LPWSAQUERYSETW lpqsResults) { - DWORD effective_flags; + /*DWORD effective_flags;*/ int i; struct GNUNET_MessageHeader header = {0, 0}; int rec = -1; @@ -425,37 +413,37 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, //LeaveCriticalSection (&records_cs); return SOCKET_ERROR; } - effective_flags = dwControlFlags & records[rec].flags; + /*effective_flags = dwControlFlags & records[rec].flags;*/ if (records[rec].buf) { + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: checking buffer\n"); header = *((struct GNUNET_MessageHeader *) records[rec].buf); - if (dwControlFlags & LUP_FLUSHCACHE) + if (*lpdwBufferLength < header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)) { - free (records[rec].buf); - records[rec].buf = NULL; - } - else - { - if (*lpdwBufferLength < header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)) - { - DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: client buffer is too small\n"); - SetLastError (WSAEFAULT); - //LeaveCriticalSection (&records_cs); - return SOCKET_ERROR; - } - memcpy (lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)records[rec].buf)[1], header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); - free (records[rec].buf); - records[rec].buf = NULL; + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: client buffer is too small\n"); + SetLastError (WSAEFAULT); //LeaveCriticalSection (&records_cs); - UnmarshallWSAQUERYSETW ((LPWSAQUERYSETW) lpqsResults); - DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: OK (from buffer)\n"); - return NO_ERROR; + return SOCKET_ERROR; } + GNUNET_memcpy (lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)records[rec].buf)[1], header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); + free (records[rec].buf); + records[rec].buf = NULL; + //LeaveCriticalSection (&records_cs); + UnmarshallWSAQUERYSETW ((LPWSAQUERYSETW) lpqsResults); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: OK (from buffer)\n"); + return NO_ERROR; } records[rec].state |= 8; //LeaveCriticalSection (&records_cs); to_receive = sizeof (header); rc = 0; +#if VERBOSE + { + unsigned long have; + int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: reading %d bytes as a header from %p, %lu bytes available\n", to_receive, hLookup, have); + } +#endif while (to_receive > 0) { t = recv ((SOCKET) hLookup, &((char *) &header)[rc], to_receive, 0); @@ -467,6 +455,13 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, else break; } +#if VERBOSE + { + unsigned long have; + int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: read %d bytes as a header from %p, %lu bytes available\n", rc, hLookup, have); + } +#endif //EnterCriticalSection (&records_cs); records[rec].state &= ~8; if (rc != sizeof (header)) @@ -478,7 +473,7 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, } else { - DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data\n"); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data for a header (rc %d != %u, state is 0x%0X)\n", rc, sizeof (header), records[rec].state); SetLastError (WSA_E_NO_MORE); } records[rec].state |= 4; @@ -488,12 +483,16 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, records[rec].state &= ~8; header.type = ntohs (header.type); header.size = ntohs (header.size); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: header type %d, header size %u\n", header.type, header.size); if (header.type != GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE || (header.type == GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE && header.size == sizeof (header))) { records[rec].state |= 4; - DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: header is wrong or type is wrong or no data\n"); + if (header.type != GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE) + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: header type is wrong\n"); + else + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: empty header - no data\n"); //LeaveCriticalSection (&records_cs); SetLastError (WSA_E_NO_MORE); return SOCKET_ERROR; @@ -509,12 +508,21 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, } records[rec].state |= 8; //LeaveCriticalSection (&records_cs); - memcpy (buf, &header, sizeof (header)); + GNUNET_memcpy (buf, &header, sizeof (header)); to_receive = header.size - sizeof (header); rc = 0; +#if VERBOSE + { + unsigned long have; + int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: reading %d bytes as a body from %p, %lu bytes available\n", to_receive, hLookup, have); + } +#endif while (to_receive > 0) { + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: recv (%d)\n", to_receive); t = recv ((SOCKET) hLookup, &((char *) &((struct GNUNET_MessageHeader *) buf)[1])[rc], to_receive, 0); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: recv returned %d\n", t); if (t > 0) { rc += t; @@ -523,6 +531,13 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, else break; } +#if VERBOSE + { + unsigned long have; + int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: read %d bytes as a body from %p, %lu bytes available\n", rc, hLookup, have); + } +#endif //EnterCriticalSection (&records_cs); records[rec].state &= ~8; if (rc != header.size - sizeof (header)) @@ -535,7 +550,7 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, } else { - DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data\n"); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data for the rest (rc %d != %d, state is 0x%0X)\n", rc, header.size - sizeof (header), records[rec].state); SetLastError (WSA_E_NO_MORE); } records[rec].state |= 4; @@ -551,7 +566,8 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, return SOCKET_ERROR; } //LeaveCriticalSection (&records_cs); - memcpy (lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)buf)[1], header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); + DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: writing %d bytes into result buffer\n", header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); + GNUNET_memcpy (lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)buf)[1], header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); free (buf); DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: OK\n"); UnmarshallWSAQUERYSETW ((LPWSAQUERYSETW) lpqsResults); @@ -562,12 +578,8 @@ GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, static int WSPAPI GNUNET_W32NSP_LookupServiceEnd (HANDLE hLookup) { - DWORD effective_flags; int i; - struct GNUNET_MessageHeader header = {0, 0}; int rec = -1; - int rc; - char *buf; DEBUGLOG ("GNUNET_W32NSP_LookupServiceEnd\n"); //EnterCriticalSection (&records_cs);