Well, under the heading of "If you want it done, do it yourself", I
wrote the following UDF this afternoon. I needed something to take the
4-byte integers representing IP addresses from Snort/ACID and turn them
into fully qualified domain names for reports. This works under Linux.
The examples that I found were written for Solaris and wouldn't work on
my box. Feel free to use this example. I've stripped all of the
unnecessary code and comments from the original example.
#ifdef STANDARD
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#ifdef __WIN__
typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
typedef __int64 longlong;
#else
typedef unsigned long long ulonglong;
typedef long long longlong;
#endif /*__WIN__*/
#else
#include <my_global.h>
#include <my_sys.h>
#endif
#include <mysql.h>
#include <m_ctype.h>
#include <m_string.h> // To get strmov()
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#ifdef HAVE_DLOPEN
extern "C" {
my_bool reverse_lookup_init(UDF_INIT *initid, UDF_ARGS *args, char
*message);
char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
unsigned long *length, char *is_null, char *error);
}
my_bool reverse_lookup_init(UDF_INIT *initid, UDF_ARGS *args, char
*message) {
if (args->arg_count == 1)
{
if (args->arg_type[0] == STRING_RESULT)
{
args->arg_type[0] == INT_RESULT;
}
}
else
{
strmov(message, "Wrong number of arguments to reverse_lookup_init");
return 1;
}
initid->max_length = 255;
initid->maybe_null = 1;
return 0;
}
char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
unsigned long *length, char *is_null, char *error)
{
struct in_addr addr;
struct hostent *hostent;
if (args->arg_count == 1)
{
memcpy(&addr, args->args[0], 4); /* copy arg to struct */
addr.s_addr = htonl(addr.s_addr); /* convert to network byte order
*/
hostent = gethostbyaddr((const void *) &addr.s_addr,
sizeof(struct in_addr),
AF_INET);
if (hostent == NULL)
{
strcpy(result, "----No lookup available----");
*length = strlen(result);
return result;
}
else
{
*is_null = 0;
*length = strlen(hostent->h_name);
return hostent->h_name;
}
}
else
{
strcpy(result, "Wrong number of arguments to reverse_lookup");
*length = strlen(result);
return result;
}
}
#endif /* HAVE_DLOPEN */
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]