[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r25309 - gnunet/src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r25309 - gnunet/src/vpn |
Date: |
Fri, 7 Dec 2012 15:15:05 +0100 |
Author: cfuchs
Date: 2012-12-07 15:15:05 +0100 (Fri, 07 Dec 2012)
New Revision: 25309
Modified:
gnunet/src/vpn/gnunet-helper-vpn-windows.c
Log:
solved fixme's, linked device handling functions to main program flow,
added some fixes here and there. added more comments to the code.
Modified: gnunet/src/vpn/gnunet-helper-vpn-windows.c
===================================================================
--- gnunet/src/vpn/gnunet-helper-vpn-windows.c 2012-12-07 13:25:32 UTC (rev
25308)
+++ gnunet/src/vpn/gnunet-helper-vpn-windows.c 2012-12-07 14:15:05 UTC (rev
25309)
@@ -32,17 +32,11 @@
*/
#include <stdio.h>
+#include <tchar.h>
#include <windows.h>
#include <setupapi.h>
#include "platform.h"
-//#include <tchar.h>
-//#include <stdlib.h>
-//#include <regstr.h>
-//#include <string.h>
-//#include <malloc.h>
-//#include <objbase.h>
-
/**
* Need 'struct GNUNET_MessageHeader'.
*/
@@ -64,6 +58,18 @@
*/
#define MAX_SIZE 65536
+/**
+ * Name or Path+Name of our driver in Unicode.
+ * The .sys and .cat files HAVE to be in the same location as this file!
+ */
+#define INF_FILE _T("tapw32.inf")
+
+/**
+ * Hardware ID used in the inf-file.
+ * This might change over time, as openvpn advances their driver
+ */
+#define HARDWARE_ID _T("TAP0901")
+
/**
* This is our own local instance of a virtual network interface
* It is (somewhat) equivalent to using tun/tap in unixoid systems
@@ -76,54 +82,29 @@
static HDEVINFO DeviceInfo = INVALID_HANDLE_VALUE;
/**
- * FIXME
+ * Registry Key we hand over to windows to spawn a new virtual interface
*/
static SP_DEVINFO_DATA DeviceNode;
/**
- * FIXME
+ * Class-tag of our virtual device
*/
static TCHAR class[128];
/**
- * FIXME
+ * GUID of our virtual device in the form of
+ * {12345678-1234-1234-1234-123456789abc} - in hex
*/
static GUID guid;
-
/**
- * Creates a tun-interface called dev;
- *
- * @param dev is asumed to point to a char[IFNAMSIZ]
- * if *dev == '\\0', uses the name supplied by the kernel;
- * @return the fd to the tun or -1 on error
- */
-static int
-init_tun (char *dev)
-{
- int fd;
-
- if (NULL == dev)
- {
- errno = EINVAL;
- return -1;
- }
-
- /* Hello, I am a stub function! I did my job, yay me! */
-
- return fd;
-}
-
-
-/**
* @brief Sets the IPv6-Address given in address on the interface dev
*
- * @param dev the interface to configure
* @param address the IPv6-Address
* @param prefix_len the length of the network-prefix
*/
static void
-set_address6 (const char *dev, const char *address, unsigned long prefix_len)
+set_address6 (const char *address, unsigned long prefix_len)
{
int fd = -1;
@@ -206,7 +187,9 @@
/**
- * FIXME.
+ * Setup a new virtual interface to use for tunneling.
+ *
+ * @return: TRUE if setup was successful, else FALSE
*/
static boolean
setup_interface ()
@@ -217,25 +200,18 @@
* We do not directly input all the props here, because openvpn will update
* these details over time.
*/
- TCHAR InfFile[] = _T("tapw32.inf"); // FIXME: inline or #define, no
'variable'
- TCHAR hwid[] = _T("TAP0901");
TCHAR InfFilePath[MAX_PATH];
TCHAR hwIdList[LINE_LEN + 4];
-#if DEAD
/**
* Locate the inf-file, we need to store it somewhere where the system can
* find it. A good choice would be CWD/PDW or %WINDIR$\system32\
*
- * TODO: Finde a more sane way to do this!
+ * TODO: Find a more sane way to do this!
+ * TODO: How about win64 in the future?
*/
+ GetFullPathName (INF_FILE, MAX_PATH, InfFilePath, NULL);
- if (NULL == (InfFilePath = calloc (MAX_PATH, sizeof (TCHAR))))
- return FALSE;
-#endif
- GetFullPathName (InfFile, MAX_PATH, InfFilePath, NULL);
-
-#if DEAD
/**
* Set the device's hardware ID and add it to a list.
* This information will later on identify this device in registry.
@@ -243,13 +219,7 @@
* TODO: Currently we just use TAP0901 as HWID,
* but we might want to add additional information
*/
- hwIdList = calloc (LINE_LEN + 4, sizeof (TCHAR));
- if (hwIdList == NULL)
- {
- goto cleanup1;
- }
-#endif
- strncpy (hwIdList, hwid, LINE_LEN);
+ strncpy (hwIdList, HARDWARE_ID, LINE_LEN);
/**
* Bootstrap our device info using the drivers inf-file
@@ -258,19 +228,16 @@
&guid,
class, sizeof (class) / sizeof (TCHAR),
NULL))
- {
- goto cleanup2;
- }
-
+ return FALSE;
+
/**
* Collect all the other needed information...
* let the system fill our this form
*/
DeviceInfo = SetupDiCreateDeviceInfoList (&guid, NULL);
if (DeviceInfo == INVALID_HANDLE_VALUE)
- {
- goto cleanup3;
- }
+ goto cleanup;
+
DeviceNode.cbSize = sizeof (SP_DEVINFO_DATA);
if (!SetupDiCreateDeviceInfo (DeviceInfo,
class,
@@ -279,56 +246,60 @@
NULL,
DICD_GENERATE_ID,
&DeviceNode))
- {
- goto cleanup3;
- }
-
+ goto cleanup;
+
/* Deploy all the information collected into the registry */
if (!SetupDiSetDeviceRegistryProperty (DeviceInfo,
&DeviceNode,
SPDRP_HARDWAREID,
(LPBYTE) hwIdList,
(lstrlen (hwIdList) + 2) * sizeof
(TCHAR)))
- {
- goto cleanup3;
- }
+ goto cleanup;
+
/* Install our new class(=device) into the system */
if (SetupDiCallClassInstaller (DIF_REGISTERDEVICE,
DeviceInfo,
&DeviceNode))
- {
return TRUE;
- }
-
+
//disabled for debug-reasons...
-cleanup3:
- //GNUNET_free(DeviceInfo);
- ;
-cleanup2:
- //GNUNET_free(hwIdList);
- ;
-cleanup1:
- //GNUNET_free(InfFilePath);
- ;
+cleanup:
+// GNUNET_free(DeviceInfo);
return FALSE;
}
+/**
+ * Remove our new virtual interface to use for tunneling.
+ * This function must be called AFTER setup_interface!
+ *
+ * @return: TRUE if destruction was successful, else FALSE
+ */
static boolean
remove_interface ()
{
SP_REMOVEDEVICE_PARAMS remove;
-
+
+ if (INVALID_HANDLE_VALUE == DeviceInfo)
+ return FALSE;
+
remove.ClassInstallHeader.cbSize = sizeof (SP_CLASSINSTALL_HEADER);
remove.HwProfile = 0;
remove.Scope = DI_REMOVEDEVICE_GLOBAL;
remove.ClassInstallHeader.InstallFunction = DIF_REMOVE;
+ /*
+ * 1. Prepare our existing device information set, and place the
+ * uninstall related information into the structure
+ */
if (! SetupDiSetClassInstallParams (DeviceInfo,
(PSP_DEVINFO_DATA) &DeviceNode,
&remove.ClassInstallHeader,
sizeof (remove)))
return FALSE;
+ /*
+ * 2. Uninstall the virtual interface using the class installer
+ */
if (! SetupDiCallClassInstaller (DIF_REMOVE,
DeviceInfo,
(PSP_DEVINFO_DATA) &DeviceNode))
@@ -336,7 +307,34 @@
return TRUE;
}
+/**
+ * Creates a tun-interface called dev;
+ *
+ * @param hwid is asumed to point to a TCHAR[LINE_LEN]
+ * if *dev == '\\0', uses the name supplied by the kernel;
+ * @return the fd to the tun or -1 on error
+ */
+static int
+init_tun (TCHAR *hwid)
+{
+ int fd;
+ if (NULL == hwid)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (FALSE == setup_interface()){
+ errno = ENODEV;
+ return -1;
+ }
+
+
+
+ return fd;
+}
+
/**
* Start forwarding to and from the tunnel.
*
@@ -357,7 +355,7 @@
*/
unsigned char bufin[MAX_SIZE];
ssize_t bufin_size = 0;
- size_t bufin_rpos = 0;
+ ssize_t bufin_rpos = 0;
unsigned char *bufin_read = NULL;
/* Hello, I am a stub function! I did my job, yay me! */
@@ -369,7 +367,7 @@
*
* @param argc must be 6
* @param argv 0: binary name (gnunet-helper-vpn)
- * 1: tunnel interface name (gnunet-vpn)
+ * 1: tunnel interface name (gnunet-vpn) (unused, can be used as
additional HWID in the future)
* 2: IPv6 address (::1), "-" to disable
* 3: IPv6 netmask length in bits (64), ignored if #2 is "-"
* 4: IPv4 address (1.2.3.4), "-" to disable
@@ -378,7 +376,7 @@
int
main (int argc, char **argv)
{
- //char dev[IFNAMSIZ];
+ TCHAR hwid[LINE_LEN];
int fd_tun;
int global_ret;
@@ -388,21 +386,19 @@
return 1;
}
- /*
- * strncpy (dev, argv[1], IFNAMSIZ);
- * dev[IFNAMSIZ - 1] = '\0';
- */
- /* if (-1 == (fd_tun = init_tun (dev)))
+ strncpy (hwid, argv[1], LINE_LEN);
+ hwid[LINE_LEN - 1] = _T('\0');
+
+ if (-1 == (fd_tun = init_tun (hwid)))
{
- fprintf (stderr, "Fatal: could not initialize tun-interface with IPv6
%s/%s and IPv4 %s/%s\n",
- dev,
+ fprintf (stderr, "Fatal: could not initialize virtual-interface %s with
IPv6 %s/%s and IPv4 %s/%s\n",
+ hwid,
argv[2],
argv[3],
argv[4],
argv[5]);
return 1;
}
- */
if (0 != strcmp (argv[2], "-"))
{
@@ -415,7 +411,7 @@
return 1;
}
- //set_address6 (dev, address, prefix_len);
+ set_address6 (address, prefix_len);
}
if (0 != strcmp (argv[4], "-"))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r25309 - gnunet/src/vpn,
gnunet <=