All of lore.kernel.org
 help / color / mirror / Atom feed
* grub2-rc1-emu under cygwin
@ 2013-01-31 22:20 Cyrille Lefevre
  2013-02-07  2:06 ` does grub-emu is supposed to build right ? (was Re: grub2-rc1-emu under cygwin) Cyrille Lefevre
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Cyrille Lefevre @ 2013-01-31 22:20 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 1670 bytes --]

Hi,

I'm attempting to build grub2-rc1 -emu under cygwin w/o success.
I've made a fast and dirty patch about the missing stuff (emunet tap), 
see attachment,
but I don't known how to say to the build machine these symbols came 
from cygwin
and should be resolved at last ? see bellow... everything else seems to 
be ok.

thanks in advance.

build environment => cygwin2 up-to-date w/ gcc4

$ uname -a
CYGWIN_NT-6.0 pcvista 1.7.17(0.262/5/3) 2012-10-19 14:39 i686 Cygwin

the configure command I use :

CC=gcc-4 ./configure --with-platform=emu --enable-grub-emu-usb 
--enable-grub-emu-sdl

and the make command :

make -j 1 -k

-j 1 is to avoid fork failures.

what's wrong is :

cat syminfo.lst | sort | awk -f ./genmoddep.awk > moddep.lst || (rm -f 
moddep.lst; exit 1)
__imp__CloseHandle@4 in emunet is not defined
__imp__CreateEventA@16 in emunet is not defined
__imp__CreateFileA@28 in emunet is not defined
__imp__DeviceIoControl@32 in emunet is not defined
__imp__GetLastError@0 in emunet is not defined
__imp__GetOverlappedResult@16 in emunet is not defined
__imp__ReadFile@20 in emunet is not defined
__imp__RegCloseKey@4 in emunet is not defined
__imp__RegEnumKeyExA@32 in emunet is not defined
__imp__RegOpenKeyExA@20 in emunet is not defined
__imp__RegQueryValueExA@24 in emunet is not defined
__imp__ResetEvent@4 in emunet is not defined
__imp__WaitForSingleObject@8 in emunet is not defined
__imp__WriteFile@20 in emunet is not defined
_cygwin_attach_handle_to_fd in emunet is not defined
_get_osfhandle in emunet is not defined
Makefile:81312: recipe for target `moddep.lst' failed

Regards,

Cyrille Lefevre
-- 
mailto:Cyrille.Lefevre-lists@laposte.net



[-- Attachment #2: grub_emu.diff --]
[-- Type: text/x-diff, Size: 15634 bytes --]

diff -uN /opt/bzr/grub/grub-core/net/drivers/emu/emunet.c grub-core/net/drivers/emu/emunet.c
--- /opt/bzr/grub/grub-core/net/drivers/emu/emunet.c	2013-01-31 03:44:09.248831000 +0100
+++ grub-core/net/drivers/emu/emunet.c	2013-01-31 08:57:26.999999900 +0100
@@ -21,8 +21,7 @@
 #include <sys/socket.h>
 #include <grub/net.h>
 #include <sys/types.h>
-#include <linux/if.h>
-#include <linux/if_tun.h>
+#include "emutuntap.h"
 #include <sys/ioctl.h>
 #include <fcntl.h>
 #include <unistd.h>
@@ -31,15 +30,19 @@
 
 GRUB_MOD_LICENSE ("GPLv3+");
 
-static int fd;
+#include "emutuntap.c"
 
-static grub_err_t 
+/* _xxx to avoid "declaration of 'xxx' shadows a global declaration" warning */
+static char _dev[IFNAMSIZ];
+static int _fd;
+
+static grub_err_t
 send_card_buffer (struct grub_net_card *dev __attribute__ ((unused)),
 		  struct grub_net_buff *pack)
 {
   ssize_t actual;
 
-  actual = write (fd, pack->data, pack->tail - pack->data);
+  actual = tun_write (_fd, pack->data, pack->tail - pack->data);
   if (actual < 0)
     return grub_error (GRUB_ERR_IO, N_("couldn't send network packet"));
 
@@ -65,7 +68,7 @@
       return NULL;
     }
 
-  actual = read (fd, nb->data, 1536);
+  actual = tun_read (_fd, nb->data, 1536);
   if (actual < 0)
     {
       grub_netbuff_free (nb);
@@ -76,14 +79,14 @@
   return nb;
 }
 
-static struct grub_net_card_driver emudriver = 
+static struct grub_net_card_driver emudriver =
   {
     .name = "emu",
     .send = send_card_buffer,
     .recv = get_card_packet
   };
 
-static struct grub_net_card emucard = 
+static struct grub_net_card emucard =
   {
     .name = "emu0",
     .driver = &emudriver,
@@ -97,26 +100,17 @@
 
 GRUB_MOD_INIT(emunet)
 {
-  struct ifreq ifr;
-  fd = open ("/dev/net/tun", O_RDWR | O_NONBLOCK);
-  if (fd < 0)
+  _fd = tun_open(_dev, IF_MODE_TAP);
+  if (_fd < 0)
     return;
-  grub_memset (&ifr, 0, sizeof (ifr));
-  ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
-  if (ioctl (fd, TUNSETIFF, &ifr) < 0)
-    {
-      close (fd);
-      fd = -1;
-      return;
-    }
   grub_net_card_register (&emucard);
 }
 
 GRUB_MOD_FINI(emunet)
 {
-  if (fd >= 0)
+  if (_fd >= 0)
     {
-      close (fd);
+      tun_close (_fd, _dev);
       grub_net_card_unregister (&emucard);
     }
 }
diff -uN /opt/bzr/grub/grub-core/net/drivers/emu/emutuntap.c grub-core/net/drivers/emu/emutuntap.c
--- /opt/bzr/grub/grub-core/net/drivers/emu/emutuntap.c	1970-01-01 01:00:00.000000000 +0100
+++ grub-core/net/drivers/emu/emutuntap.c	2013-01-31 08:57:48.999999900 +0100
@@ -0,0 +1,365 @@
+/* from http://svn.unix-ag.uni-kl.de/vpnc/trunk/sysdep.c */
+
+#if defined(__CYGWIN__)
+
+/*
+ * Overlapped structures for asynchronous read and write
+ */
+static OVERLAPPED overlap_read, overlap_write;
+
+typedef enum {
+	SEARCH_IF_GUID_FROM_NAME,
+	SEARCH_IF_NAME_FROM_GUID
+} search_if_en;
+
+/*
+ * Get interface guid/name from registry
+ */
+static char *search_if(char *value, char *key, search_if_en type)
+{
+	int i = 0;
+	LONG status;
+	DWORD len;
+	HKEY net_conn_key;
+	BOOL found = FALSE;
+	char guid[256];
+	char ifname[256];
+	char conn_string[512];
+	HKEY conn_key;
+	DWORD value_type;
+
+	if (!value || !key) {
+		return NULL;
+	}
+
+	status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+		NETWORK_CONNECTIONS_KEY,
+		0,
+		KEY_READ,
+		&net_conn_key);
+
+	if (status != ERROR_SUCCESS) {
+		printf("Error opening registry key: %s\n", NETWORK_CONNECTIONS_KEY);
+		return NULL;
+	}
+
+	while (!found) {
+		len = sizeof(guid);
+		status = RegEnumKeyEx(net_conn_key, i++, guid, &len,
+			NULL, NULL, NULL, NULL);
+		if (status == ERROR_NO_MORE_ITEMS) {
+			break;
+		} else if (status != ERROR_SUCCESS) {
+			continue;
+		}
+		snprintf(conn_string, sizeof(conn_string),
+			"%s\\%s\\Connection",
+			NETWORK_CONNECTIONS_KEY, guid);
+		status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			conn_string,
+			0,
+			KEY_READ,
+			&conn_key);
+		if (status != ERROR_SUCCESS) {
+			continue;
+		}
+		len = sizeof(ifname);
+		status = RegQueryValueEx(conn_key, "Name", NULL,
+			&value_type, (LPBYTE) ifname, &len);
+		if (status != ERROR_SUCCESS || value_type != REG_SZ) {
+			RegCloseKey(conn_key);
+			continue;
+		}
+
+		switch (type) {
+		case SEARCH_IF_GUID_FROM_NAME:
+			if (!grub_strcmp(key, ifname)) {
+				grub_strcpy(value, guid);
+				found = TRUE;
+			}
+			break;
+		case SEARCH_IF_NAME_FROM_GUID:
+			if (!grub_strcmp(key, guid)) {
+				grub_strcpy(value, ifname);
+				found = TRUE;
+			}
+			break;
+		default:
+			break;
+		}
+		RegCloseKey(conn_key);
+	}
+	RegCloseKey(net_conn_key);
+
+	if (found) {
+		return value;
+	}
+
+	return NULL;
+}
+
+/*
+ * Open the TUN/TAP device with the provided guid
+ */
+static int open_tun_device (char *guid __attribute__ ((unused)),
+	char *dev __attribute__ ((unused)), enum if_mode_enum mode)
+{
+	HANDLE handle;
+	ULONG len, status, info[3];
+	char device_path[512];
+
+	printf("Device: %s\n", dev);
+
+	if (mode == IF_MODE_TUN) {
+		printf("TUN mode is not supported\n");
+		return -1;
+	}
+
+	/*
+	 * Let's try to open Windows TAP-Win32 adapter
+	 */
+	snprintf(device_path, sizeof(device_path), "%s%s%s",
+		USERMODEDEVICEDIR, guid, TAPSUFFIX);
+
+	handle = CreateFile(device_path,
+		GENERIC_READ | GENERIC_WRITE,
+		0, /* Don't let other processes share or open
+		the resource until the handle's been closed */
+		0,
+		OPEN_EXISTING,
+		FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED,
+		0);
+
+	if (handle == INVALID_HANDLE_VALUE) {
+		return -1;
+	}
+
+	/*
+	 * get driver version info
+	 */
+	grub_memset(info, 0, sizeof(info));
+	if (DeviceIoControl(handle, TAP_IOCTL_GET_VERSION,
+		&info, sizeof(info),
+		&info, sizeof(info), &len, NULL)) {
+		printf("TAP-Win32 Driver Version %d.%d %s\n",
+		(int) info[0],
+		(int) info[1],
+		(info[2] ? "(DEBUG)" : ""));
+	}
+
+	/*
+	 * Set driver media status to 'connected'
+	 */
+	status = TRUE;
+	if (!DeviceIoControl(handle, TAP_IOCTL_SET_MEDIA_STATUS,
+		&status, sizeof(status),
+		&status, sizeof(status), &len, NULL)) {
+		printf("WARNING: The TAP-Win32 driver rejected a "
+		"TAP_IOCTL_SET_MEDIA_STATUS DeviceIoControl call.\n");
+	}
+
+	/*
+	 * Initialize overlapped structures
+	 */
+	overlap_read.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+	overlap_write.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+	if (!overlap_read.hEvent || !overlap_write.hEvent) {
+		return -1;
+	}
+
+	/*
+	 * Return fd
+	 */
+	return cygwin_attach_handle_to_fd(NULL, -1, handle, 1, GENERIC_READ | GENERIC_WRITE);
+}
+
+/*
+ * Allocate TUN device, returns opened fd.
+ * Stores dev name in the first arg (must be large enough).
+ */
+int tun_open (char *dev, enum if_mode_enum mode)
+{
+	int fd = -1;
+	HKEY unit_key;
+	char guid[256];
+	char comp_id[256];
+	char enum_name[256];
+	char unit_string[512];
+	BOOL found = FALSE;
+	HKEY adapter_key;
+	DWORD value_type;
+	LONG status;
+	DWORD len;
+
+	if (!dev) {
+		return -1;
+	}
+
+	/*
+	 * Device name has been provided. Open such device.
+	 */
+	if (*dev != '\0') {
+		if (!search_if(guid, dev, SEARCH_IF_GUID_FROM_NAME)) {
+			return -1;
+		}
+		return open_tun_device(guid, dev, mode);
+	}
+
+	/*
+	 * Device name has non been specified. Look for one available!
+	 */
+	int i = 0;
+	status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+		ADAPTER_KEY,
+		0,
+		KEY_READ,
+		&adapter_key);
+	if (status != ERROR_SUCCESS) {
+		printf("Error opening registry key: %s", ADAPTER_KEY);
+		return -1;
+	}
+
+	while (!found) {
+		len = sizeof(enum_name);
+		status = RegEnumKeyEx(adapter_key, i++,
+			enum_name, &len,
+			NULL, NULL, NULL, NULL);
+		if (status == ERROR_NO_MORE_ITEMS) {
+			break;
+		} else if (status != ERROR_SUCCESS) {
+			continue;
+		}
+		snprintf(unit_string, sizeof(unit_string), "%s\\%s",
+			ADAPTER_KEY, enum_name);
+		status = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+			unit_string,
+			0,
+			KEY_READ,
+			&unit_key);
+		if (status != ERROR_SUCCESS) {
+			continue;
+		}
+		len = sizeof(comp_id);
+		status = RegQueryValueEx(unit_key,
+			"ComponentId", NULL,
+			&value_type, (LPBYTE) comp_id, &len);
+		if (status != ERROR_SUCCESS || value_type != REG_SZ) {
+			RegCloseKey(unit_key);
+			continue;
+		}
+		len = sizeof(guid);
+		status = RegQueryValueEx(unit_key,
+			"NetCfgInstanceId", NULL,
+			&value_type, (LPBYTE) guid, &len);
+		if (status != ERROR_SUCCESS || value_type != REG_SZ) {
+			RegCloseKey(unit_key);
+			continue;
+		}
+
+		int j = 0;
+		while (TAP_COMPONENT_ID[j]) {
+			if (!grub_strcmp(comp_id, TAP_COMPONENT_ID[j])) {
+				break;
+			}
+			j++;
+		}
+		if (!TAP_COMPONENT_ID[j]) {
+			RegCloseKey(unit_key);
+			continue;
+		}
+
+		/*
+		 * Let's try to open this device
+		 */
+		search_if(dev, guid, SEARCH_IF_NAME_FROM_GUID);
+		fd = open_tun_device(guid, dev, mode);
+		if (fd != -1) {
+			found = TRUE;
+		}
+
+		RegCloseKey(unit_key);
+	}
+	RegCloseKey(adapter_key);
+
+	return fd;
+}
+
+int tun_close(int fd, char *dev __attribute__ ((unused)))
+{
+	return CloseHandle((HANDLE) get_osfhandle(fd));
+}
+
+int tun_read(int fd, unsigned char *buf, int len)
+{
+	DWORD read_size;
+
+	ResetEvent(overlap_read.hEvent);
+	if (ReadFile((HANDLE) get_osfhandle(fd), buf, len, &read_size, &overlap_read)) {
+		return read_size;
+	}
+	switch (GetLastError()) {
+	case ERROR_IO_PENDING:
+		WaitForSingleObject(overlap_read.hEvent, INFINITE);
+		GetOverlappedResult((HANDLE) get_osfhandle(fd), &overlap_read, &read_size, FALSE);
+		return read_size;
+		break;
+	default:
+		break;
+	}
+
+	return -1;
+}
+
+int tun_write(int fd, unsigned char *buf, int len)
+{
+	DWORD write_size;
+
+	ResetEvent(overlap_write.hEvent);
+	if (WriteFile((HANDLE) get_osfhandle(fd),
+		buf,
+		len,
+		&write_size,
+		&overlap_write)) {
+		return write_size;
+	}
+	switch (GetLastError()) {
+	case ERROR_IO_PENDING:
+		WaitForSingleObject(overlap_write.hEvent, INFINITE);
+		GetOverlappedResult((HANDLE) get_osfhandle(fd), &overlap_write,
+			&write_size, FALSE);
+		return write_size;
+		break;
+	default:
+		break;
+	}
+
+	return -1;
+}
+
+#else
+
+int tun_open(char *dev, enum if_mode_enum mode)
+{
+	struct ifreq ifr;
+	int fd;
+
+	/* sysdep.c doesn't have O_NONBLOCK */
+	fd = open ("/dev/net/tun", O_RDWR | O_NONBLOCK);
+	if (fd < 0)
+		return -1;
+
+	grub_memset (&ifr, 0, sizeof (ifr));
+	ifr.ifr_flags = ((mode == IF_MODE_TUN) ? IFF_TUN : IFF_TAP) | IFF_NO_PI;
+	if (*dev)
+		grub_strncpy(ifr.ifr_name, dev, IFNAMSIZ);
+
+	if (ioctl (fd, TUNSETIFF, &ifr) < 0) {
+		close (fd);
+		return -1;
+	}
+
+	grub_strcpy(dev, ifr.ifr_name);
+	return fd;
+}
+
+#endif
diff -uN /opt/bzr/grub/grub-core/net/drivers/emu/emutuntap.h grub-core/net/drivers/emu/emutuntap.h
--- /opt/bzr/grub/grub-core/net/drivers/emu/emutuntap.h	1970-01-01 01:00:00.000000000 +0100
+++ grub-core/net/drivers/emu/emutuntap.h	2013-01-31 08:56:47.999999900 +0100
@@ -0,0 +1,41 @@
+/* from http://svn.unix-ag.uni-kl.de/vpnc/trunk/sysdep.c */
+
+#if defined(__CYGWIN__)
+#include <io.h>
+#include <w32api/windef.h>
+#include <w32api/winbase.h>
+#include <w32api/winnt.h>
+#include <w32api/winioctl.h>
+#include <w32api/iphlpapi.h>
+#include <w32api/iptypes.h>
+#include <w32api/winreg.h>
+#include <sys/cygwin.h>
+
+#include "tap-win32.h"
+
+#ifdef IFNAMSIZ
+#undef IFNAMSIZ
+#endif
+#define IFNAMSIZ 256
+
+#define printf(fmt, ...)
+#define snprintf(fmt, ...)
+
+int tun_close(int fd, char *dev);
+int tun_write(int fd, unsigned char *buf, int len);
+int tun_read(int fd, unsigned char *buf, int len);
+#else
+#include <linux/if.h>
+#include <linux/if_tun.h>
+
+#define tun_close(fd,dev) close(fd)
+#define tun_read(fd,buf,len) read(fd,buf,len)
+#define tun_write(fd,buf,len) write(fd,buf,len)
+#endif
+
+enum if_mode_enum {
+	IF_MODE_TUN,
+	IF_MODE_TAP
+};
+
+int tun_open(char *dev, enum if_mode_enum mode);
diff -uN /opt/bzr/grub/grub-core/net/drivers/emu/tap-win32.h grub-core/net/drivers/emu/tap-win32.h
--- /opt/bzr/grub/grub-core/net/drivers/emu/tap-win32.h	1970-01-01 01:00:00.000000000 +0100
+++ grub-core/net/drivers/emu/tap-win32.h	2013-01-31 06:44:38.999999900 +0100
@@ -0,0 +1,87 @@
+/* from http://svn.unix-ag.uni-kl.de/vpnc/trunk/sysdep.c */
+
+/*
+ *  This file has been borrowed from the Win32 OpenVPN Tap driver
+ *  (common.h is the original file name).
+ *
+ *  TAP-Win32 -- A kernel driver to provide virtual tap device functionality
+ *               on Windows.  Originally derived from the CIPE-Win32
+ *               project by Damion K. Wilson, with extensive modifications by
+ *               James Yonan.
+ *
+ *  All source code which derives from the CIPE-Win32 project is
+ *  Copyright (C) Damion K. Wilson, 2003, and is released under the
+ *  GPL version 2 (see below).
+ *
+ *  All other source code is Copyright (C) 2002-2005 OpenVPN Solutions LLC,
+ *  and is released under the GPL version 2 (see below).
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2
+ *  as published by the Free Software Foundation.
+ *
+ *  This program 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 this program (see the file COPYING included with this
+ *  distribution); if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/* ===============================================
+    This file is included both by OpenVPN and
+    the TAP-Win32 driver and contains definitions
+    common to both.
+   =============================================== */
+
+/* =============
+    TAP IOCTLs
+   ============= */
+
+#define TAP_CONTROL_CODE(request,method) \
+  CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS)
+
+/* Present in 8.1 */
+
+#define TAP_IOCTL_GET_MAC               TAP_CONTROL_CODE (1, METHOD_BUFFERED)
+#define TAP_IOCTL_GET_VERSION           TAP_CONTROL_CODE (2, METHOD_BUFFERED)
+#define TAP_IOCTL_GET_MTU               TAP_CONTROL_CODE (3, METHOD_BUFFERED)
+#define TAP_IOCTL_GET_INFO              TAP_CONTROL_CODE (4, METHOD_BUFFERED)
+#define TAP_IOCTL_CONFIG_POINT_TO_POINT TAP_CONTROL_CODE (5, METHOD_BUFFERED)
+#define TAP_IOCTL_SET_MEDIA_STATUS      TAP_CONTROL_CODE (6, METHOD_BUFFERED)
+#define TAP_IOCTL_CONFIG_DHCP_MASQ      TAP_CONTROL_CODE (7, METHOD_BUFFERED)
+#define TAP_IOCTL_GET_LOG_LINE          TAP_CONTROL_CODE (8, METHOD_BUFFERED)
+#define TAP_IOCTL_CONFIG_DHCP_SET_OPT   TAP_CONTROL_CODE (9, METHOD_BUFFERED)
+
+/* Added in 8.2 */
+
+/* obsoletes TAP_IOCTL_CONFIG_POINT_TO_POINT */
+#define TAP_IOCTL_CONFIG_TUN            TAP_CONTROL_CODE (10, METHOD_BUFFERED)
+
+/* =================
+    Registry keys
+   ================= */
+
+#define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
+
+#define NETWORK_CONNECTIONS_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}"
+
+/* ======================
+    Filesystem prefixes
+   ====================== */
+
+#define USERMODEDEVICEDIR "\\\\.\\Global\\"
+#define SYSDEVICEDIR      "\\Device\\"
+#define USERDEVICEDIR     "\\DosDevices\\Global\\"
+#define TAPSUFFIX         ".tap"
+
+/* =========================================================
+    TAP_COMPONENT_ID -- These strings defines the TAP driver
+    types -- different component IDs can reside in the system
+    simultaneously.
+   ========================================================= */
+
+static const char* TAP_COMPONENT_ID[] = { "tap0901", "tap0801", NULL };


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-10-17 23:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-31 22:20 grub2-rc1-emu under cygwin Cyrille Lefevre
2013-02-07  2:06 ` does grub-emu is supposed to build right ? (was Re: grub2-rc1-emu under cygwin) Cyrille Lefevre
2013-02-07  9:14   ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-04-03 14:28 ` grub2-rc1-emu under cygwin Vladimir 'φ-coder/phcoder' Serbinenko
2013-10-17 23:10 ` Vladimir 'φ-coder/phcoder' Serbinenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.