This is ndrev.c in view mode; [Download] [Up]
#if 0
Date: Mon, 26 Apr 1993 18:03:06 -0400
From: Andy Poling <andy@jhunix.hcf.jhu.edu>
Subject: Re: send me your tools
To: Paul A Vixie <vixie>
In-Reply-To: <9304261923.AA15488@cognition.pa.dec.com>
Message-Id: <Pine.3.05.9304261804.B1586-d100000@jhunix2.hcf.jhu.edu>
Mime-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
On Mon, 26 Apr 1993, Paul A Vixie wrote:
> more is better. send it along.
Here is the source (the date will give you an idea of its age), which
luckily contains the original author's name (though I apparently lost his
address long ago).
-Andy
Andy Poling Internet: andy@jhunix.hcf.jhu.edu
UNIX Systems Programmer Bitnet: ANDY@JHUNIX
Homewood Academic Computing Voice: (410)516-8096
Johns Hopkins University UUCP: uunet!mimsy!aplcen!jhunix!andy
===============================================================================
#endif /*0*/
/*
* Ndrev Takes a standard "NAMED" file and creates "reverse" (PTR)
* entries from each host (IN A) entry.
*
* Calling sequence:
*
* ndrev NETWORK -d DOMAIN [FILE]
*
* where: NETWORK is the class a, b, or c network or subnetwork
* number to reverse. All entries not belonging
* to this network will be ignored.
*
* DOMAIN is the root domain of the NAMED file being processed.
*
* FILE is the source file name. Default is standard input.
*
* Written by Douglas E. Nelson, Michigan State University
*
* Copyright, 1989, Michigan State University Board of Trustees
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
gotoeol(f)
register FILE *f;
{
register char ch;
do
ch=getc(f);
while(ch!='\n' && ch!=EOF);
if (ch==EOF)
return(EOF);
else
return(0);
}
/* subroutine: no case string compare(str1,str2)
* compares two strings ignoring alphabetic case
* returns NULL if they are equal
*/
int
ncstrcmp(str1,str2)
register unsigned char *str1,*str2;
{
register unsigned char ch1,ch2;
if (str1==str2) return(0);
if (str1==NULL || str2==NULL) return(1);
while (*str1!=NULL && *str2!=NULL)
{
ch1= *str1>='A'&&*str1<='Z'?*str1++|32:*str1++;
ch2= *str2>='A'&&*str2<='Z'?*str2++|32:*str2++;
if (ch1!=ch2) return(1);
}
if (*str1!=NULL || *str2!=NULL)
return(-1);
return(0);
}
main(argc,argv)
int argc;
char *argv[];
{
FILE *f;
char ch;
int i,hwmany;
char name[80],instr[80],instr2[80],adrs[80],deptname[80];
int a1, a2, a3, a4;
int nadr, adr1, adr2, adr3, adr4;
deptname[0]='\0';
f = stdin;
while (--argc)
{
++argv;
if (**argv >= '0' && **argv <= '9')
{
nadr = sscanf (*argv,"%d.%d.%d.%d",&adr1,&adr2,&adr3,&adr4);
if (!nadr)
{
fprintf (stderr, "Unknown argument: %s\n",*argv);
exit (-1);
}
if (nadr > 3)
{
fprintf (stderr, "Cannot reverse a single host\n");
exit (-1);
}
}
else if (strcmp(*argv,"-d") == 0)
{
if (--argc < 1)
{
fprintf (stderr, "Domain name argument missing for -d\n");
exit (-1);
}
strcpy (deptname, *++argv);
strcat (deptname, ".");
}
else
{
f=fopen(*argv,"r");
if (f==0)
{
fprintf (stderr, "Unable to open file: %s\n",*argv);
exit (-2);
}
}
}
if (!nadr)
{
fprintf (stderr, "Must specify the (sub)network to reverse, e.g. 35.8\n");
exit (-1);
}
fprintf (stdout, "$ORIGIN\t");
if (nadr > 2)
fprintf (stdout, "%d.",adr3);
if (nadr > 1)
fprintf (stdout, "%d.",adr2);
fprintf (stdout, "%d.IN-ADDR.ARPA.\n",adr1);
do
{
do
ch=getc(f);
while (ch=='\n' && ch!=EOF);
if (ch<'A' || ch>'z' || ch>'Z' && ch<'a')
{
switch (ch)
{
case '$':
{
fscanf(f,"%s %s",name,instr);
ch=gotoeol(f);
if (ncstrcmp("ORIGIN",name)==NULL)
{
strcpy(deptname,instr);
}
break;
}
/*
case ';':
{
putc(ch,stdout);
while (ch!='\n' && ch!=EOF)
{
ch=getc(f);
putc(ch,stdout);
}
break;
}
*/
default:
{
ch=gotoeol(f);
break;
}
}
}
else
{
ungetc(ch,f);
hwmany=fscanf(f,"%s %s %s %s",name,instr,instr2,adrs);
if (hwmany>=4 && ((ncstrcmp("IN",instr)==NULL) && (ncstrcmp("A",instr2)==NULL)))
{
sscanf (adrs,"%d.%d.%d.%d",&a1,&a2,&a3,&a4);
if (a1 == adr1 && (nadr < 2 || a2 == adr2) &&
(nadr < 3 || a3 == adr3))
{
fprintf(stdout,"%d",a4);
if (nadr < 3)
fprintf(stdout,".%d",a3);
if (nadr < 2)
fprintf(stdout,".%d",a2);
fprintf(stdout,"\tIN\tPTR\t");
fprintf(stdout,"%s",name);
if (strlen(deptname)>0 && name[strlen(name)-1] != '.')
fprintf(stdout,".%s",deptname);
putc('\n',stdout);
}
}
}
}
while (ch!=EOF);
fclose(f);
return(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.