/*
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 .
SPDX-License-Identifier: AGPL3.0-or-later
*/
/**
* @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;
}