From: Georg Richter Date: March 20 2008 4:55pm Subject: Re: Community contributions - WL #1624 List-Archive: http://lists.mysql.com/contributions/6 Message-Id: <47E296F9.9050101@mysql.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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 > + > +/* > + 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 >> + >> +/* >> + 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