X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fgns%2Fw32nsp-install.c;h=7a8beb703097a57d789635375c0a5cacecffa01a;hb=4df7069dcd17ac39c786ee6f21455c96e6a6dbf4;hp=e5c168b6ca1fe4aa88c85ca09b987bbe8ce1a637;hpb=fd6a2c706f26aa0d525f6eb1ca09bc1a0dc5e4d9;p=oweals%2Fgnunet.git diff --git a/src/gns/w32nsp-install.c b/src/gns/w32nsp-install.c index e5c168b6c..7a8beb703 100644 --- a/src/gns/w32nsp-install.c +++ b/src/gns/w32nsp-install.c @@ -1,56 +1,141 @@ -#define INITGUID -#include -#include -#include -#include "gnunet_w32nsp_lib.h" -#include - -int -main (int argc, char **argv) -{ - int ret; - int r = 1; - WSADATA wsd; - GUID id = GNUNET_NAMESPACE_PROVIDER_DNS; - wchar_t *cmdl; - int wargc; - wchar_t **wargv; - - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) - { - fprintf (stderr, "WSAStartup() failed: %lu\n", GetLastError()); - return 5; - } - - cmdl = GetCommandLineW (); - if (cmdl == NULL) - { - WSACleanup(); - return 2; - } - wargv = CommandLineToArgvW (cmdl, &wargc); - if (wargv == NULL) - { - WSACleanup(); - return 3; - } - r = 4; - - if (wargc == 2) - { - ret = WSCInstallNameSpace (L"GNUnet DNS provider", wargv[1], NS_DNS, 1, &id); - if (ret == NO_ERROR) - { - r = 0; - } - else - { - r = 1; - fprintf (stderr, - "WSCInstallNameSpace(L\"GNUnet DNS provider\", \"%S\", %d, 0, %p) failed: %lu\n", - wargv[1], NS_DNS, &id, GetLastError ()); - } - } - WSACleanup(); - return r; -} \ No newline at end of file +/* + This file is part of GNUnet. + Copyright (C) 2012 GNUnet e.V. + + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/** + * @file gns/w32nsp-install.c + * @brief W32 integration installer for GNS + * @author LRN + */ + +#include +#include +#include +#include +#include "gnunet_w32nsp_lib.h" +#include + +int +main (int argc, char **argv) +{ + int ret; + int r = 1; + WSADATA wsd; + GUID id = GNUNET_NAMESPACE_PROVIDER_DNS; + wchar_t *cmdl; + int wargc; + wchar_t **wargv; + /* Allocate a 4K buffer to retrieve all the namespace providers */ + DWORD dwInitialBufferLen = 4096; + DWORD dwBufferLen; + WSANAMESPACE_INFO *pi; + int p_count; + int i; + + if (WSAStartup (MAKEWORD (2,2), &wsd) != 0) + { + fprintf (stderr, "WSAStartup () failed: %lu\n", GetLastError ()); + return 5; + } + + dwBufferLen = dwInitialBufferLen; + pi = malloc (dwBufferLen); + if (NULL == pi) + { + fprintf (stderr, "malloc (%lu) failed: %d\n", dwBufferLen, errno); + WSACleanup (); + return 6; + } + p_count = WSAEnumNameSpaceProviders (&dwBufferLen, pi); + if (SOCKET_ERROR == p_count) + { + DWORD err = GetLastError (); + if (WSAEFAULT == err && dwBufferLen != dwInitialBufferLen) + { + free (pi); + + pi = malloc (dwBufferLen); + if (pi == NULL) + { + fprintf (stderr, "malloc (%lu) failed: %d\n", dwBufferLen, errno); + WSACleanup (); + return 6; + } + + p_count = WSAEnumNameSpaceProviders (&dwBufferLen, pi); + if (SOCKET_ERROR == p_count) + { + fprintf (stderr, "WSAEnumNameSpaceProviders (&%lu, %p) failed: %lu\n", dwBufferLen, pi, GetLastError ()); + free (pi); + WSACleanup (); + return 7; + } + } + else + { + fprintf (stderr, "WSAEnumNameSpaceProviders (&%lu, %p) failed: %lu\n", dwBufferLen, pi, GetLastError ()); + free (pi); + WSACleanup (); + return 8; + } + } + for (i= 0; i < p_count; i++) + { + if (IsEqualGUID (&pi[i].NSProviderId, &id)) + { + fprintf (stderr, "GNUnet DNS provider is already installed\n"); + free (pi); + WSACleanup (); + return 0; + } + } + free (pi); + + cmdl = GetCommandLineW (); + if (cmdl == NULL) + { + WSACleanup (); + return 2; + } + wargv = CommandLineToArgvW (cmdl, &wargc); + if (wargv == NULL) + { + WSACleanup (); + return 3; + } + r = 4; + + if (wargc == 2) + { + ret = WSCInstallNameSpace (L"GNUnet DNS provider", wargv[1], NS_DNS, 0, &id); + if (ret == NO_ERROR) + { + fprintf (stderr, "Installed GNUnet DNS provider\n"); + r = 0; + } + else + { + r = 1; + fprintf (stderr, + "WSCInstallNameSpace (L\"GNUnet DNS provider\", \"%S\", %d, 0, %p) failed: %lu\n", + wargv[1], NS_DNS, &id, GetLastError ()); + } + } + else + fprintf (stderr, "Usage: %S \n", wargv[0]); + WSACleanup (); + return r; +}