|
|
researchv10 Norman
#include <sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/inet/in.h>
#include <stdio.h>
#include <ctype.h>
struct namefile {
char *name;
char *data;
long time;
};
static struct namefile files[] = {
{ "/tmp/networks", 0, 0 },
{ 0, 0, 0},
};
struct hash {
struct hash *next;
in_addr addr;
char *name;
};
#define HSIZE 1023
static struct hash ht[HSIZE];
/* imported */
extern char *in_getw();
extern char *malloc();
/* exported */
int in_host_dostat=1;
static int
getfile(i)
int i;
{
int fd;
struct stat sbuf;
unsigned int x;
if (in_host_dostat)
stat(files[i].name, &sbuf);
else
sbuf.st_mtime = files[i].time;
if (files[i].data == 0 || sbuf.st_mtime>files[i].time) {
if (!in_host_dostat)
stat(files[i].name, &sbuf);
fd = open(files[i].name, 0);
if (fd<0)
return -1;
if (files[i].data!=0)
free(files[i].data);
x = sbuf.st_size;
files[i].data = malloc(x+2);
if (files[i].data==0) {
close(fd);
return -1;
}
if (read(fd, files[i].data, x)!=x){
close(fd);
return -1;
}
close(fd);
files[i].data[sbuf.st_size] = '\n';
files[i].data[sbuf.st_size+1] = 0;
files[i].time = sbuf.st_mtime;
for (i=0; i<HSIZE; i++)
ht[i].addr = 0;
}
return 0;
}
#define SKIPWHITE while(*p==' ' || *p=='\t') p++
#define GETBLACK xp = b;\
while(*p!=' ' && *p!='\t' && *p!='\n' && *p!='\0')\
*xp++ = *p++;\
*xp = '\0'
char *
in_host(addr)
in_addr addr;
{
register char *p, *xp;
unsigned char *yp;
static char b[32];
int i;
in_addr x, in_netof(), in_aton();
if (addr==0)
return "*";
i = addr==in_netof(addr) ? 0 : 1;
if (getfile(i) < 0) {
perror(files[i].name);
} else if (addr == ht[addr%HSIZE].addr) {
p = ht[addr%HSIZE].name;
GETBLACK;
return(b);
} else for (p = files[i].data; *p; p++){
/* get number */
SKIPWHITE;
GETBLACK;
x = in_aton(b);
SKIPWHITE;
if (x != 0 && *p != '\n') {
/* get name & insert into hash table */
i = x%HSIZE;
ht[i].addr = x;
ht[i].name = p;
GETBLACK;
/* see if this is the one */
if (x==addr)
return b;
}
/* drop rest of line */
while(*p!='\n'&&*p!='\0') p++;
}
yp = (unsigned char *) &addr;
sprintf(b, "%d.%d.%d.%d", yp[3], yp[2], yp[1], yp[0]);
return(b);
}
main()
{
in_addr net, addr, onet;
char line[128];
char *name, *cp;
onet = -1;
while(gets(line)!=NULL) {
/* comments */
if (line[0]=='#'||line[0]=='\n' || line[0]==' ' || line[0]=='\t'){
puts(line);
continue;
}
/* get addr and net */
for (name=line; *name&&*name!=' '&&*name!='\t'; name++)
;
if (*name=='\0')
continue;
*name++ = '\0';
if ((addr=in_aton(line))==0 || (net=in_netof(addr))==0) {
printf("%s %s\n", line, name);
continue;
}
if (net!=onet) {
onet = net;
printf("%s %s\n", in_ntoa(net), in_host(net));
}
/* get name */
for (; *name==' '||*name=='\t'; name++)
;
if (*name=='\0')
continue;
for (cp=name; *cp&&*cp!=' '&&*cp!='\t'; cp++)
;
if (*cp!='\0')
*cp++ = '\0';
/* print out both addresses */
printf("%s %s/%s %s %s\n", line, in_host(net),name,name,cp);
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.