This is ndrev.c in view mode; [Download] [Up]
/* * 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 hm; int i; char name[80],instr[80],instr2[80],adrs[80],deptname[80]; int a1, a2, a3, a4; int nadr = 0; int 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); name[0] = '\0'; do { do ch=getc(f); while (ch=='\n' && ch!=EOF); if (ch>='A' && ch<='Z' || ch >='a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch == '@' || ch == ' ' || ch == '\t') { ungetc(ch,f); if (ch == ' ' || ch == '\t') { hm = 1; } else { hm=fscanf(f,"%s",name); } if (hm == 1) { do ch = getc(f); while (ch==' ' || ch == '\t'); if (ch >= '0' && ch <= '9') { ungetc(ch,f); fscanf(f,"%s",instr); } else { ungetc(ch,f); } hm=fscanf(f,"%s %s %s",instr,instr2,adrs) + 1; } ch = gotoeol(f); if (hm>=4 && ((ncstrcmp("IN",instr)==NULL) && ((ncstrcmp("A",instr2)==NULL) || (ncstrcmp("SA",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"); if (strcmp("@",name) == 0) { fprintf(stdout,"%s",deptname); } else { fprintf(stdout,"%s",name); if (strlen(deptname)>0 && name[strlen(name)-1] != '.') fprintf(stdout,".%s",deptname); } putc('\n',stdout); } } } else { switch (ch) { case '$': { fscanf(f,"%s %s",instr,instr2); ch=gotoeol(f); if (ncstrcmp("ORIGIN",instr)==NULL) { strcpy(deptname,instr2); name[0] = '\0'; } break; } /* case ';': { putc(ch,stdout); while (ch!='\n' && ch!=EOF) { ch=getc(f); putc(ch,stdout); } break; } */ default: { ch=gotoeol(f); break; } } } } 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.