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 [mailto:mysql@stripped]
> 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
>
> +
>
>