logresolve.c revision bbe866808ba50d71809ab58bbee377cadf60d3b7
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * logresolve 1.1
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * Tom Rathborne - tomr@uunet.ca - http://www.uunet.ca/~tomr/
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * UUNET Canada, April 16, 1995
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * Rewritten by David Robinson. (drtr@ast.cam.ac.uk)
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * Usage: logresolve [-s filename] [-c] < access_log > new_log
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * -s filename name of a file to record statistics
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * -c check the DNS for a matching A record for the host.
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * To generate meaningful statistics from an HTTPD log file, it's good
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * to have the domain name of each machine that accessed your site, but
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * doing this on the fly can slow HTTPD down.
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * Compiling NCSA HTTPD with the -DMINIMAL_DNS flag turns IP#->hostname
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * resolution off. Before running your stats program, just run your log
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * file through this program (logresolve) and all of your IP numbers will
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * be resolved into hostnames (where possible).
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * logresolve takes an HTTPD access log (in the COMMON log file format,
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * or any other format that has the IP number/domain name as the first
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * field for that matter), and outputs the same file with all of the
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * domain names looked up. Where no domain name can be found, the IP
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * number is left in.
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * To minimize impact on your nameserver, logresolve has its very own
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * internal hash-table cache. This means that each IP number will only
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * be looked up the first time it is found in the log file.
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * The -c option causes logresolve to apply the same check as httpd
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * compiled with -DMAXIMUM_DNS; after finding the hostname from the IP
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * address, it looks up the IP addresses for the hostname and checks
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder * that one of these matches the original address.
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maederstatic void cgethost(struct in_addr ipnum, char *string, int check);
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maederstatic int getline(char *s, int n);
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder/* maximum line length */
765f3b8c82bca96eeb44463da2305201b1a493daChristian Maeder/* maximum length of a domain name */
#if defined(NEED_STRDUP)
char *dup;
return NULL;
return dup;
struct nsrec {
char *hostname;
int noname;
#ifndef h_errno
static int cachehits = 0;
static int cachesize = 0;
static int entries = 0;
static int resolves = 0;
static int withname = 0;
char *name;
cachesize++;
AF_INET);
if (check) {
char **hptr;
cachehits++;
char *ipstring;
for (i = 0; i < BUCKETS; i++)
ipstring);
static int getline (char *s, int n)
char *cp;
if (cp)
int i, check;
check = 0;
exit(0);
for (i = 0; i < BUCKETS; i++)
errors[i] = 0;
entries++;
withname++;
withname++;
resolves++;
,statfile);