X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fgns%2Fw32nsp-install.c;h=7a8beb703097a57d789635375c0a5cacecffa01a;hb=4df7069dcd17ac39c786ee6f21455c96e6a6dbf4;hp=5c2ccf23e1a6ddaee3c363b21a365ba8bd6c5ab0;hpb=61c39c60565b386e0e12ea669556b030e8cd7180;p=oweals%2Fgnunet.git diff --git a/src/gns/w32nsp-install.c b/src/gns/w32nsp-install.c index 5c2ccf23e..7a8beb703 100644 --- a/src/gns/w32nsp-install.c +++ b/src/gns/w32nsp-install.c @@ -1,21 +1,19 @@ /* 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 - by the Free Software Foundation; either version 3, or (at your - option) any later version. + 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 - General Public License for more details. - - 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. + 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 @@ -23,10 +21,10 @@ * @author LRN */ -#define INITGUID +#include #include #include -#include +#include #include "gnunet_w32nsp_lib.h" #include @@ -40,42 +38,104 @@ main (int argc, char **argv) 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) + if (WSAStartup (MAKEWORD (2,2), &wsd) != 0) { - fprintf (stderr, "WSAStartup() failed: %lu\n", GetLastError()); + 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(); + WSACleanup (); return 2; } wargv = CommandLineToArgvW (cmdl, &wargc); if (wargv == NULL) { - WSACleanup(); + WSACleanup (); return 3; } r = 4; if (wargc == 2) { - ret = WSCInstallNameSpace (L"GNUnet DNS provider", wargv[1], NS_DNS, 1, &id); + 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", + "WSCInstallNameSpace (L\"GNUnet DNS provider\", \"%S\", %d, 0, %p) failed: %lu\n", wargv[1], NS_DNS, &id, GetLastError ()); } } - WSACleanup(); + else + fprintf (stderr, "Usage: %S \n", wargv[0]); + WSACleanup (); return r; }