FAQ
Thanks Vlad,

I just noticed the diff put: #ifdef VOID #undef VOID #define VOID
all on the same line. This may be messing up the #elif.

Anyway, this was a very enlightening experience, and quite fun. Frankly
I am considering applying for a position at MySQL and this seems to
be a great way to get to know the company.

What do you recommend I work on next?

Regards,

-Chris
-----Original Message-----
From: Vladislav Vaintroub
Sent: Wednesday, March 19, 2008 12:38 PM
To: 'Chris Runyan'; contributions@lists.mysql.com
Cc: georg@mysql.com
Subject: RE: Community contributions - WL #1624

Hi Chris,

I think this revision is very decent and can be checked in. I had one
minor problem with the patch
(#elif's somehow did not work) , this however can stem from the fact
that your patch is against another bitkeeper tree.

Below is mine variation that compiles against current mysql-5.1 . The
difference to your patch is in only 2 lines, namely

+#elif defined(__WIN__)
+#else /* __FreeBSD__ || __linux__ || __WIN__ */


I have yet to find out in which MySQL version this patch will go into
(5.1, more probably into 6.0), hope Georg can provide further info on
this.

Thank you,
Vlad

===== my_gethwaddr.c 1.7 vs edited =====
--- 1.7/mysys/my_gethwaddr.c 2007-08-09 14:56:52 +02:00
+++ edited/mysys/my_gethwaddr.c 2008-03-19 19:14:02 +01:00
@@ -101,14 +101,117 @@
return res;
}

-#else /* FreeBSD elif linux */
+#elif defined(__WIN__)
+
+/* Workaround for BUG#32082 (Definition of VOID in my_global.h
conflicts with windows headers) */
+#ifdef VOID
+#undef VOID
+#define VOID void
+#endif
+
+#include <iphlpapi.h>
+
+/*
+ The following typedef is for dynamically loading
+ iphlpapi.dll / GetAdaptersAddresses. Dynamic loading is
+ used because GetAdaptersAddresses is not available on Windows 2000
+ which MySQL still supports. Static linking would cause an
unresolved export.
+*/
+typedef DWORD (WINAPI *pfnGetAdaptersAddresses)(IN ULONG Family,
+ IN DWORD Flags,IN PVOID Reserved,
+ OUT PIP_ADAPTER_ADDRESSES pAdapterAddresses,
+ IN OUT PULONG pOutBufLen);
+
+/*
+ my_gethwaddr - Windows version
+
+ @brief Retrieve MAC address from network hardware
+
+ @param[out] to MAC address exactly six bytes
+
+ @return Operation status
+ @retval 0 OK
+ @retval <>0 FAILED
+*/
+my_bool my_gethwaddr(uchar *to)
+{
+ PIP_ADAPTER_ADDRESSES pAdapterAddresses;
+ PIP_ADAPTER_ADDRESSES pCurrAddresses;
+ IP_ADAPTER_ADDRESSES adapterAddresses;
+ ULONG address_len;
+ my_bool return_val= 1;
+
+
+
+ static pfnGetAdaptersAddresses fnGetAdaptersAddresses=
+ (pfnGetAdaptersAddresses)-1;
+
+ if(fnGetAdaptersAddresses == (pfnGetAdaptersAddresses)-1)
+ {
+ /* Get the function from the DLL */
+ fnGetAdaptersAddresses= (pfnGetAdaptersAddresses)
+
GetProcAddress(LoadLibrary("iphlpapi.dll"),
+ "GetAdaptersAddresses");
+ }
+ if (!fnGetAdaptersAddresses)
+ return 1; /* failed to get
function */
+ address_len= sizeof (IP_ADAPTER_ADDRESSES);
+
+ /* Get the required size for the address data. */
+ if (fnGetAdaptersAddresses(AF_UNSPEC, 0, 0, &adapterAddresses,
&address_len)
+ == ERROR_BUFFER_OVERFLOW)
+ {
+ pAdapterAddresses= my_malloc(address_len, 0);
+ if (!pAdapterAddresses)
+ return 1; /* error, alloc
failed */
+ }
+ else
+ pAdapterAddresses= &adapterAddresses; /* one is enough
don't alloc */
+
+ /* Get the hardware info. */
+ if (fnGetAdaptersAddresses(AF_UNSPEC, 0, 0, pAdapterAddresses,
&address_len)
+ == NO_ERROR)
+ {
+ pCurrAddresses= pAdapterAddresses;
+
+ while (pCurrAddresses)
+ {
+ /* Look for ethernet cards. */
+ if (pCurrAddresses->IfType == IF_TYPE_ETHERNET_CSMACD)
+ {
+ /* check for a good address */
+ if (pCurrAddresses->PhysicalAddressLength < 6)
+ continue; /* bad address */
+
+ /* save 6 bytes of the address in the 'to' parameter */
+ memcpy(to, pCurrAddresses->PhysicalAddress, 6);
+
+ /* Network card found, we're done. */
+ return_val= 0;
+ break;
+ }
+ pCurrAddresses= pCurrAddresses->Next;
+ }
+ }
+
+ /* Clean up memory allocation. */
+ if (pAdapterAddresses != &adapterAddresses)
+ my_free(pAdapterAddresses, 0);
+
+ return return_val;
+}
+
+#else /* __FreeBSD__ || __linux__ || __WIN__ */
+
/* just fail */
my_bool my_gethwaddr(uchar *to __attribute__((unused)))
{
return 1;
}
+
#endif

+
#else /* MAIN */
int main(int argc __attribute__((unused)),char **argv)
{
@@ -130,3 +233,4 @@
}
#endif

+

-----Original Message-----
From: Chris Runyan
Sent: Wednesday, March 19, 2008 4:41 PM
To: 'Vladislav Vaintroub'
Subject: RE: Community contributions - WL #1624

Hi Vlad,

I've made the latest changes. Hopefully this is the last revision. ;)
-Chris



****************************

--- my_gethwaddr.c 2008-03-07 06:46:29.000000000 -0700
+++ /home/chris/my_gethwaddr.c 2008-03-19 09:29:00.000000000 -0600
@@ -102,11 +102,117 @@
}

#else /* FreeBSD elif linux */
+
+#ifdef __WIN__
+
+/* Workaround for BUG#32082 (Definition of VOID in my_global.h
conflicts with windows headers) */
+#ifdef VOID
+#undef VOID
+#define VOID void
+#endif
+
+#include <iphlpapi.h>
+
+/*
+ The following typedef is for dynamically loading
+ iphlpapi.dll / GetAdaptersAddresses. Dynamic loading is
+ used because GetAdaptersAddresses is not available on Windows 2000
+ which MySQL still supports. Static linking would cause an
unresolved export.
+*/
+typedef DWORD (WINAPI *pfnGetAdaptersAddresses)(IN ULONG Family,
+ IN DWORD Flags,IN PVOID Reserved,
+ OUT PIP_ADAPTER_ADDRESSES pAdapterAddresses,
+ IN OUT PULONG pOutBufLen);
+
+/*
+ my_gethwaddr - Windows version
+
+ @brief Retrieve MAC address from network hardware
+
+ @param[out] to MAC address exactly six bytes
+
+ @return Operation status
+ @retval 0 OK
+ @retval <>0 FAILED
+*/
+my_bool my_gethwaddr(uchar *to)
+{
+ PIP_ADAPTER_ADDRESSES pAdapterAddresses;
+ PIP_ADAPTER_ADDRESSES pCurrAddresses;
+ IP_ADAPTER_ADDRESSES adapterAddresses;
+ ULONG address_len;
+ my_bool return_val= 1;
+
+
+
+ static pfnGetAdaptersAddresses fnGetAdaptersAddresses=
+ (pfnGetAdaptersAddresses)-1;
+
+ if(fnGetAdaptersAddresses == (pfnGetAdaptersAddresses)-1)
+ {
+ /* Get the function from the DLL */
+ fnGetAdaptersAddresses= (pfnGetAdaptersAddresses)
+
GetProcAddress(LoadLibrary("iphlpapi.dll"),
+ "GetAdaptersAddresses");
+ }
+ if (!fnGetAdaptersAddresses)
+ return 1; /* failed to get
function */
+ address_len= sizeof (IP_ADAPTER_ADDRESSES);
+
+ /* Get the required size for the address data. */
+ if (fnGetAdaptersAddresses(AF_UNSPEC, 0, 0, &adapterAddresses,
&address_len)
+ == ERROR_BUFFER_OVERFLOW)
+ {
+ pAdapterAddresses= my_malloc(address_len, 0);
+ if (!pAdapterAddresses)
+ return 1; /* error, alloc
failed */
+ }
+ else
+ pAdapterAddresses= &adapterAddresses; /* one is enough
don't alloc */
+
+ /* Get the hardware info. */
+ if (fnGetAdaptersAddresses(AF_UNSPEC, 0, 0, pAdapterAddresses,
&address_len)
+ == NO_ERROR)
+ {
+ pCurrAddresses= pAdapterAddresses;
+
+ while (pCurrAddresses)
+ {
+ /* Look for ethernet cards. */
+ if (pCurrAddresses->IfType == IF_TYPE_ETHERNET_CSMACD)
+ {
+ /* check for a good address */
+ if (pCurrAddresses->PhysicalAddressLength < 6)
+ continue; /* bad address */
+
+ /* save 6 bytes of the address in the 'to' parameter */
+ memcpy(to, pCurrAddresses->PhysicalAddress, 6);
+
+ /* Network card found, we're done. */
+ return_val= 0;
+ break;
+ }
+ pCurrAddresses= pCurrAddresses->Next;
+ }
+ }
+
+ /* Clean up memory allocation. */
+ if (pAdapterAddresses != &adapterAddresses)
+ my_free(pAdapterAddresses, 0);
+
+ return return_val;
+}
+
+#elif
+
/* just fail */
my_bool my_gethwaddr(uchar *to __attribute__((unused)))
{
return 1;
}
+
+#endif
+
#endif

#else /* MAIN */
@@ -130,3 +236,4 @@
}
#endif

+

Search Discussions

Discussion Posts

Previous

Follow ups

Related Discussions

Discussion Navigation
viewthread | post
posts ‹ prev | 2 of 3 | next ›
Discussion Overview
groupcontributions @
categoriesmysql
postedMar 19, '08 at 6:38p
activeMar 20, '08 at 4:56p
posts3
users3
websitemysql.com
irc#mysql

People

Translate

site design / logo © 2021 Grokbase