FAQ
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

  • Chris Runyan at Mar 19, 2008 at 8:14 pm
    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

    +
  • Georg Richter at Mar 20, 2008 at 4:56 pm
    Vladislav Vaintroub schrieb:

    Hello Vladislav and Chris,

    Thanks for the good work!

    Since 5.1 is closed, the contribution will go into MySQL 6.0-alpha.
    I assigned Iggy Galarza as second reviewer - as soon his review is done,
    Vlad should push the code into 6.0-alpha.

    Vlad: if it's done please send a short info to our doc team (Martin
    Brown) to add an entry to the changelog (including kudos for Chris).

    /Georg



    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

    +

    --
    Georg Richter, Development Manager - Connectors & Client Connectivity
    MySQL GmbH, Dachauer Str.37, D- 80335 München, www.mysql.com
    Geschäftsführer: Kaj Arnö - HRB München 162140

Related Discussions

Discussion Navigation
viewthread | post
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