Merge branch 'master' of gnunet.org:gnunet
[oweals/gnunet.git] / src / gns / w32nsp-install.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2012 GNUnet e.V.
4
5      GNUnet is free software: you can redistribute it and/or modify it
6      under the terms of the GNU Affero General Public License as published
7      by the Free Software Foundation, either version 3 of the License,
8      or (at your option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      Affero General Public License for more details.
14     
15      You should have received a copy of the GNU Affero General Public License
16      along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19 */
20 /**
21  * @file gns/w32nsp-install.c
22  * @brief W32 integration installer for GNS
23  * @author LRN
24  */
25
26 #include <ws2spi.h>
27 #include <windows.h>
28 #include <nspapi.h>
29 #include <initguid.h>
30 #include "gnunet_w32nsp_lib.h"
31 #include <stdio.h>
32
33 int
34 main (int argc, char **argv)
35 {
36   int ret;
37   int r = 1;
38   WSADATA wsd;
39   GUID id = GNUNET_NAMESPACE_PROVIDER_DNS;
40   wchar_t *cmdl;
41   int wargc;
42   wchar_t **wargv;
43   /* Allocate a 4K buffer to retrieve all the namespace providers */
44   DWORD dwInitialBufferLen = 4096;
45   DWORD dwBufferLen;
46   WSANAMESPACE_INFO *pi;
47   int p_count;
48   int i;
49
50   if (WSAStartup (MAKEWORD (2,2), &wsd) != 0)
51   {
52     fprintf (stderr, "WSAStartup () failed: %lu\n", GetLastError ());
53     return 5;
54   }
55
56   dwBufferLen = dwInitialBufferLen;
57   pi = malloc (dwBufferLen);
58   if (NULL == pi)
59   {
60     fprintf (stderr, "malloc (%lu) failed: %d\n", dwBufferLen, errno);
61     WSACleanup ();
62     return 6;
63   }
64   p_count = WSAEnumNameSpaceProviders (&dwBufferLen, pi);
65   if (SOCKET_ERROR == p_count)
66   {
67     DWORD err = GetLastError ();
68     if (WSAEFAULT == err && dwBufferLen != dwInitialBufferLen)
69     {
70       free (pi);
71
72       pi = malloc (dwBufferLen);
73       if (pi == NULL)
74       {
75         fprintf (stderr, "malloc (%lu) failed: %d\n", dwBufferLen, errno);
76         WSACleanup ();
77         return 6;
78       }
79
80       p_count = WSAEnumNameSpaceProviders (&dwBufferLen, pi);
81       if (SOCKET_ERROR == p_count)
82       {
83         fprintf (stderr, "WSAEnumNameSpaceProviders (&%lu, %p) failed: %lu\n", dwBufferLen, pi, GetLastError ());
84         free (pi);
85         WSACleanup ();
86         return 7;
87       }
88     }
89     else
90     {
91       fprintf (stderr, "WSAEnumNameSpaceProviders (&%lu, %p) failed: %lu\n", dwBufferLen, pi, GetLastError ());
92       free (pi);
93       WSACleanup ();
94       return 8;
95     }
96   }
97   for (i= 0; i < p_count; i++)
98   {
99     if (IsEqualGUID (&pi[i].NSProviderId, &id))
100     {
101       fprintf (stderr, "GNUnet DNS provider is already installed\n");
102       free (pi);
103       WSACleanup ();
104       return 0;
105     }
106   }
107   free (pi);
108
109   cmdl = GetCommandLineW ();
110   if (cmdl == NULL)
111   {
112     WSACleanup ();
113     return 2;
114   }
115   wargv = CommandLineToArgvW (cmdl, &wargc);
116   if (wargv == NULL)
117   {
118     WSACleanup ();
119     return 3;
120   }
121   r = 4;
122
123   if (wargc == 2)
124   {
125     ret = WSCInstallNameSpace (L"GNUnet DNS provider", wargv[1], NS_DNS, 0, &id);
126     if (ret == NO_ERROR)
127     {
128       fprintf (stderr, "Installed GNUnet DNS provider\n");
129       r = 0;
130     }
131     else
132     {
133       r = 1;
134       fprintf (stderr,
135           "WSCInstallNameSpace (L\"GNUnet DNS provider\", \"%S\", %d, 0, %p) failed: %lu\n",
136           wargv[1], NS_DNS, &id, GetLastError ());
137     }
138   }
139   else
140     fprintf (stderr, "Usage: %S <path-to-libw32nsp>\n", wargv[0]);
141   WSACleanup ();
142   return r;
143 }