zone V1.0
This commit is contained in:
parent
3f89db0f48
commit
cab9c9994f
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: zone.c,v 1.3 1999/06/15 20:05:25 akool Exp $
|
/* $Id: zone.c,v 1.4 1999/06/18 12:41:57 akool Exp $
|
||||||
*
|
*
|
||||||
* Zonenberechnung
|
* Zonenberechnung
|
||||||
*
|
*
|
||||||
|
@ -19,6 +19,9 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*
|
*
|
||||||
* $Log: zone.c,v $
|
* $Log: zone.c,v $
|
||||||
|
* Revision 1.4 1999/06/18 12:41:57 akool
|
||||||
|
* zone V1.0
|
||||||
|
*
|
||||||
* Revision 1.3 1999/06/15 20:05:25 akool
|
* Revision 1.3 1999/06/15 20:05:25 akool
|
||||||
* isdnlog Version 3.33
|
* isdnlog Version 3.33
|
||||||
* - big step in using the new zone files
|
* - big step in using the new zone files
|
||||||
|
@ -38,7 +41,11 @@
|
||||||
* deinitialize
|
* deinitialize
|
||||||
*
|
*
|
||||||
* int getZone(int provider, char *from, char *to)
|
* int getZone(int provider, char *from, char *to)
|
||||||
* returns zone for provider, -1 on not found, -2 on error
|
* returns zone for provider, UNKNOWN on not found, -2 on error
|
||||||
|
*
|
||||||
|
* int getAreacode(int provider, char *num, char **text)
|
||||||
|
* returns len of areacode in num and in text a malloced string
|
||||||
|
* UNKNOWN on not found
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -64,11 +71,14 @@ extern const char *basename (const char *name);
|
||||||
#include "isdnlog.h"
|
#include "isdnlog.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
#endif
|
#endif
|
||||||
#include <gdbm.h>
|
|
||||||
#include "zone.h"
|
#include "zone.h"
|
||||||
|
/* this config (from config.in) could go in global policy */
|
||||||
|
#include "zone/config.h"
|
||||||
|
#include "zone/common.h"
|
||||||
|
|
||||||
struct sth {
|
struct sth {
|
||||||
GDBM_FILE fh;
|
_DB fh;
|
||||||
char *path;
|
char *path;
|
||||||
int provider;
|
int provider;
|
||||||
int used;
|
int used;
|
||||||
|
@ -76,20 +86,14 @@ struct sth {
|
||||||
int *table;
|
int *table;
|
||||||
char pack_key, pack_table;
|
char pack_key, pack_table;
|
||||||
int table_size;
|
int table_size;
|
||||||
|
int oz;
|
||||||
|
int numlen;
|
||||||
} ;
|
} ;
|
||||||
typedef unsigned char UC; /* len 1 */
|
|
||||||
typedef unsigned short US; /* len 2 */
|
|
||||||
typedef unsigned long UL; /* len 4 */
|
|
||||||
|
|
||||||
typedef enum {false,true} bool;
|
|
||||||
|
|
||||||
#ifndef min
|
|
||||||
#define min(a,b) (a) < (b) ? (a) : (b)
|
#define min(a,b) (a) < (b) ? (a) : (b)
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct sth *sthp;
|
static struct sth *sthp;
|
||||||
static int count;
|
static int count;
|
||||||
static char version[] = "0.92";
|
static char version[] = "1.00";
|
||||||
#define LINK 127
|
#define LINK 127
|
||||||
#define INFO_LEN 80
|
#define INFO_LEN 80
|
||||||
#define LENGTH 120
|
#define LENGTH 120
|
||||||
|
@ -129,7 +133,7 @@ void exitZone(int provider)
|
||||||
sthp[i].path = 0;
|
sthp[i].path = 0;
|
||||||
free(sthp[i].table);
|
free(sthp[i].table);
|
||||||
sthp[i].table = 0;
|
sthp[i].table = 0;
|
||||||
gdbm_close(sthp[i].fh);
|
CLOSE(sthp[i].fh);
|
||||||
sthp[i].fh = 0;
|
sthp[i].fh = 0;
|
||||||
if (i == count-1) /* last released ? */
|
if (i == count-1) /* last released ? */
|
||||||
count--;
|
count--;
|
||||||
|
@ -203,11 +207,15 @@ int initZone(int provider, char *path, char **msg)
|
||||||
sthp[ocount].used=0;
|
sthp[ocount].used=0;
|
||||||
sthp[ocount].fh=0;
|
sthp[ocount].fh=0;
|
||||||
sthp[ocount].real = -1;
|
sthp[ocount].real = -1;
|
||||||
|
sthp[ocount].oz=1;
|
||||||
|
sthp[ocount].numlen=0;
|
||||||
/* now search for same path */
|
/* now search for same path */
|
||||||
found = false;
|
found = false;
|
||||||
for (i=0; i<count-1; i++) {
|
for (i=0; i<count-1; i++) {
|
||||||
if (sthp[i].path && strcmp(sthp[i].path, path) == 0) {
|
if (sthp[i].path && strcmp(sthp[i].path, path) == 0) {
|
||||||
sthp[ocount].fh = sthp[i].fh;
|
sthp[ocount].fh = sthp[i].fh;
|
||||||
|
sthp[ocount].oz = sthp[i].oz;
|
||||||
|
sthp[ocount].numlen = sthp[i].numlen;
|
||||||
sthp[ocount].pack_key = sthp[i].pack_key;
|
sthp[ocount].pack_key = sthp[i].pack_key;
|
||||||
sthp[ocount].pack_table = sthp[i].pack_table;
|
sthp[ocount].pack_table = sthp[i].pack_table;
|
||||||
sthp[ocount].table = sthp[i].table;
|
sthp[ocount].table = sthp[i].table;
|
||||||
|
@ -231,17 +239,17 @@ int initZone(int provider, char *path, char **msg)
|
||||||
"Zone V%s: Error: Out of mem 2", version);
|
"Zone V%s: Error: Out of mem 2", version);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if((sthp[ocount].fh = gdbm_open(path, 0, GDBM_READER, 0, 0)) == 0) {
|
if((sthp[ocount].fh = OPEN(path, READ)) == 0) {
|
||||||
if (msg)
|
if (msg)
|
||||||
snprintf (message, LENGTH,
|
snprintf (message, LENGTH,
|
||||||
"Zone V%s: Error: gdbm_open '%s': '%s'",
|
"Zone V%s: Error: gdbm_open '%s': '%s'",
|
||||||
version, path, gdbm_strerror(gdbm_errno));
|
version, path, GET_ERR);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* read info */
|
/* read info */
|
||||||
key.dptr = vinfo;
|
key.dptr = vinfo;
|
||||||
key.dsize = 7;
|
key.dsize = 7;
|
||||||
value = gdbm_fetch(sthp[ocount].fh, key);
|
value = FETCH(sthp[ocount].fh, key);
|
||||||
if (value.dptr == 0) {
|
if (value.dptr == 0) {
|
||||||
if (msg)
|
if (msg)
|
||||||
snprintf (message, LENGTH,
|
snprintf (message, LENGTH,
|
||||||
|
@ -256,6 +264,14 @@ int initZone(int provider, char *path, char **msg)
|
||||||
for (p++,n=0,q=dversion; n<6 && *p != ' '; n++)
|
for (p++,n=0,q=dversion; n<6 && *p != ' '; n++)
|
||||||
*q++ = *p++;
|
*q++ = *p++;
|
||||||
*q = '\0';
|
*q = '\0';
|
||||||
|
if (*dversion != *version) {
|
||||||
|
if (msg)
|
||||||
|
snprintf (message, LENGTH,
|
||||||
|
"Zone V%s: Error: Provider %d File '%s': incompatible Dataversion %s",
|
||||||
|
version, provider, path, dversion);
|
||||||
|
exitZone(provider);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'K' :
|
case 'K' :
|
||||||
sthp[ocount].pack_key = *(++p);
|
sthp[ocount].pack_key = *(++p);
|
||||||
|
@ -271,6 +287,14 @@ int initZone(int provider, char *path, char **msg)
|
||||||
p++;
|
p++;
|
||||||
tsize = strtol(p, &p, 10);
|
tsize = strtol(p, &p, 10);
|
||||||
break;
|
break;
|
||||||
|
case 'O' :
|
||||||
|
p++;
|
||||||
|
sthp[ocount].oz = strtol(p, &p, 10);
|
||||||
|
break;
|
||||||
|
case 'L' :
|
||||||
|
p++;
|
||||||
|
sthp[ocount].numlen = strtol(p, &p, 10);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} /* for */
|
} /* for */
|
||||||
free (value.dptr);
|
free (value.dptr);
|
||||||
|
@ -280,12 +304,13 @@ int initZone(int provider, char *path, char **msg)
|
||||||
strchr("SL", sthp[ocount].pack_key) == 0 ||
|
strchr("SL", sthp[ocount].pack_key) == 0 ||
|
||||||
sthp[ocount].pack_table == '\x0' ||
|
sthp[ocount].pack_table == '\x0' ||
|
||||||
strchr("CSL", sthp[ocount].pack_table) == 0 ||
|
strchr("CSL", sthp[ocount].pack_table) == 0 ||
|
||||||
|
sthp[ocount].numlen == 0 ||
|
||||||
csize == 0 ||
|
csize == 0 ||
|
||||||
tsize == 0) {
|
tsize == 0) {
|
||||||
if (msg)
|
if (msg)
|
||||||
snprintf (message, LENGTH,
|
snprintf (message, LENGTH,
|
||||||
"Zone V%s: Error: Provider %d File '%s' seems to be corrupted",
|
"Zone V%s: Error: Provider %d File '%s' seems to be corrupted:\n%s",
|
||||||
version, provider, path);
|
version, provider, path, value.dptr);
|
||||||
exitZone(provider);
|
exitZone(provider);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -303,7 +328,7 @@ int initZone(int provider, char *path, char **msg)
|
||||||
}
|
}
|
||||||
key.dptr = table;
|
key.dptr = table;
|
||||||
key.dsize = 7;
|
key.dsize = 7;
|
||||||
value = gdbm_fetch(sthp[ocount].fh, key);
|
value = FETCH(sthp[ocount].fh, key);
|
||||||
if (value.dptr == 0) {
|
if (value.dptr == 0) {
|
||||||
if (msg)
|
if (msg)
|
||||||
snprintf (message, LENGTH,
|
snprintf (message, LENGTH,
|
||||||
|
@ -321,10 +346,10 @@ int initZone(int provider, char *path, char **msg)
|
||||||
if (msg) {
|
if (msg) {
|
||||||
snprintf (message, LENGTH,
|
snprintf (message, LENGTH,
|
||||||
"Zone V%s: Provider %d File '%s' opened fine - "
|
"Zone V%s: Provider %d File '%s' opened fine - "
|
||||||
"V%s K%d C%d N%d T%d",
|
"V%s K%d C%d N%d T%d O%d L%d",
|
||||||
version, provider, path,
|
version, provider, path,
|
||||||
dversion, sthp[ocount].pack_key, sthp[ocount].pack_table,
|
dversion, sthp[ocount].pack_key, sthp[ocount].pack_table,
|
||||||
csize, tsize);
|
csize, tsize, sthp[ocount].oz, sthp[ocount].numlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -342,8 +367,11 @@ static int _getZ(struct sth *sthp, char *from, char *sto) {
|
||||||
static char newfrom[LENGTH];
|
static char newfrom[LENGTH];
|
||||||
bool found = false;
|
bool found = false;
|
||||||
char *temp;
|
char *temp;
|
||||||
|
int res;
|
||||||
|
|
||||||
if (strcmp(from, sto) > 0) {
|
if ((res=strcmp(from, sto)) == 0)
|
||||||
|
return sthp->oz;
|
||||||
|
else if (res > 0) {
|
||||||
temp=from;
|
temp=from;
|
||||||
from=sto;
|
from=sto;
|
||||||
sto=temp;
|
sto=temp;
|
||||||
|
@ -360,14 +388,16 @@ static int _getZ(struct sth *sthp, char *from, char *sto) {
|
||||||
key.dptr = (char *) &lifrom;
|
key.dptr = (char *) &lifrom;
|
||||||
key.dsize = sizeof(UL);
|
key.dsize = sizeof(UL);
|
||||||
}
|
}
|
||||||
value = gdbm_fetch(fh, key);
|
value = FETCH(fh, key);
|
||||||
if (value.dptr) {
|
if (value.dptr) {
|
||||||
char *p = value.dptr;
|
char *p = value.dptr;
|
||||||
char to[10];
|
char to[10];
|
||||||
US count;
|
US count;
|
||||||
int ito;
|
int ito;
|
||||||
unsigned char z=0;
|
unsigned char z=0;
|
||||||
|
/* here is since 1.00 a zero-terminated strring */
|
||||||
|
while (*p++);
|
||||||
|
/* skipped */
|
||||||
count = *((US*)p)++;
|
count = *((US*)p)++;
|
||||||
while (count--) {
|
while (count--) {
|
||||||
bool ind = true;
|
bool ind = true;
|
||||||
|
@ -401,7 +431,7 @@ static int _getZ(struct sth *sthp, char *from, char *sto) {
|
||||||
} /* if dptr */
|
} /* if dptr */
|
||||||
newfrom[strlen(newfrom)-1] = '\0';
|
newfrom[strlen(newfrom)-1] = '\0';
|
||||||
}
|
}
|
||||||
return -1;
|
return UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getZone(int provider, char *from, char *to)
|
int getZone(int provider, char *from, char *to)
|
||||||
|
@ -418,8 +448,57 @@ int getZone(int provider, char *from, char *to)
|
||||||
return UNKNOWN;
|
return UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _getAreacode(struct sth *sthp, char *from, char **text) {
|
||||||
|
_DB fh = sthp->fh;
|
||||||
|
datum key, value;
|
||||||
|
static char newfrom[LENGTH];
|
||||||
|
bool found = false;
|
||||||
|
int len;
|
||||||
|
strncpy(newfrom, from, sthp->numlen);
|
||||||
|
newfrom[sthp->numlen] = '\0';
|
||||||
|
while ((len=strlen(newfrom))) {
|
||||||
|
UL lifrom = (UL) atol(newfrom); /* keys could be long */
|
||||||
|
US ifrom = (US) lifrom;
|
||||||
|
if (sthp->pack_key == 2) {
|
||||||
|
key.dptr = (char *) &ifrom;
|
||||||
|
key.dsize = sizeof(US);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
key.dptr = (char *) &lifrom;
|
||||||
|
key.dsize = sizeof(UL);
|
||||||
|
}
|
||||||
|
value = FETCH(fh, key);
|
||||||
|
if (value.dptr) {
|
||||||
|
if (!*value.dptr) {/* found shortcut */
|
||||||
|
if (*dbv == 'G') /* GDBM has a malloced string in dptr */
|
||||||
|
free(value.dptr);
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
if (*dbv == 'G') /* GDBM has a malloced string in dptr */
|
||||||
|
*text = value.dptr;
|
||||||
|
else
|
||||||
|
*text = strdup(value.dptr);
|
||||||
|
return len;
|
||||||
|
} /* if dptr */
|
||||||
|
newfrom[strlen(newfrom)-1] = '\0';
|
||||||
|
}
|
||||||
|
return UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ZONETEST
|
int getAreacode(int provider, char *from, char **text)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *path=NULL;
|
||||||
|
for (i=0; i<count; i++)
|
||||||
|
if (sthp[i].provider == provider) {
|
||||||
|
path = sthp[i].path ? sthp[i].path : sthp[sthp[i].real].path;
|
||||||
|
if (sthp[i].fh == 0)
|
||||||
|
return UNKNOWN;
|
||||||
|
return _getAreacode(&sthp[i], from, text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef STANDALONE
|
||||||
|
|
||||||
static int checkZone(char *zf, char* df,int num1,int num2, bool verbose)
|
static int checkZone(char *zf, char* df,int num1,int num2, bool verbose)
|
||||||
{
|
{
|
||||||
|
@ -431,11 +510,12 @@ static int checkZone(char *zf, char* df,int num1,int num2, bool verbose)
|
||||||
fprintf(stderr,"%s\n", msg);
|
fprintf(stderr,"%s\n", msg);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
if(verbose)
|
||||||
|
printf("%s\n", msg);
|
||||||
if (num1 && num2) {
|
if (num1 && num2) {
|
||||||
snprintf(from, 9, "%d",num1);
|
snprintf(from, 9, "%d",num1);
|
||||||
snprintf(to, 9, "%d",num2);
|
snprintf(to, 9, "%d",num2);
|
||||||
ret = getZone(1, from, to);
|
ret = getZone(1, from, to);
|
||||||
if (verbose)
|
|
||||||
printf("%s %s = %d\n", from, to, ret);
|
printf("%s %s = %d\n", from, to, ret);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -482,12 +562,33 @@ static int checkZone(char *zf, char* df,int num1,int num2, bool verbose)
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("'%s' verified ok.\n", df);
|
printf("'%s' verified %s.\n", df, ret==0? "Ok": "NoNo");
|
||||||
}
|
}
|
||||||
exitZone(1);
|
exitZone(1);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int checkArea(char *df, char *from, int verbose) {
|
||||||
|
char *msg, *text;
|
||||||
|
int ret=0;
|
||||||
|
|
||||||
|
if (initZone(1, df, &msg)) {
|
||||||
|
fprintf(stderr,"%s\n", msg);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if(verbose)
|
||||||
|
printf("%s\n", msg);
|
||||||
|
ret = getAreacode(1, from, &text);
|
||||||
|
if(ret != UNKNOWN) {
|
||||||
|
printf("%s:%d '%s'\n", from, ret, text);
|
||||||
|
free(text);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("%s - UNKNOWN\n", from);
|
||||||
|
exitZone(1);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int verbose=false;
|
int verbose=false;
|
||||||
|
@ -495,6 +596,7 @@ int main (int argc, char *argv[])
|
||||||
char *zf=0;
|
char *zf=0;
|
||||||
int c;
|
int c;
|
||||||
int num1=0, num2=0;
|
int num1=0, num2=0;
|
||||||
|
char snum1[LENGTH];
|
||||||
while ( (c=getopt(argc, argv, "vVd:z:")) != EOF) {
|
while ( (c=getopt(argc, argv, "vVd:z:")) != EOF) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'v' : verbose = true; break;
|
case 'v' : verbose = true; break;
|
||||||
|
@ -506,6 +608,7 @@ int main (int argc, char *argv[])
|
||||||
while (optind < argc) {
|
while (optind < argc) {
|
||||||
if (!num1 && isdigit(*argv[optind])) {
|
if (!num1 && isdigit(*argv[optind])) {
|
||||||
num1 = atoi(argv[optind]);
|
num1 = atoi(argv[optind]);
|
||||||
|
strncpy(snum1, argv[optind], LENGTH);
|
||||||
optind++;
|
optind++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -518,7 +621,10 @@ int main (int argc, char *argv[])
|
||||||
}
|
}
|
||||||
if (df && (zf || (num1 && num2)))
|
if (df && (zf || (num1 && num2)))
|
||||||
return checkZone(zf, df, num1, num2, verbose);
|
return checkZone(zf, df, num1, num2, verbose);
|
||||||
|
if (df && num1)
|
||||||
|
return checkArea(df, snum1, verbose);
|
||||||
fprintf(stderr, "Usage:\n%s -d DBfile -v -V { -z Zonefile | num1 num2 }\n", basename(argv[0]));
|
fprintf(stderr, "Usage:\n%s -d DBfile -v -V { -z Zonefile | num1 num2 }\n", basename(argv[0]));
|
||||||
|
fprintf(stderr, "\t-d DBfile -v -V num1\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
#
|
||||||
|
# Makefile for mkzonedb (borrowed from iMON)
|
||||||
|
#
|
||||||
|
# (C) 1999 l.toetsch <lt@toetsch.at>
|
||||||
|
#
|
||||||
|
SHELL = /bin/sh
|
||||||
|
CFLAGS = -Wall -O2
|
||||||
|
INCLUDES =
|
||||||
|
LDFLAGS = @DBMLIB@
|
||||||
|
DBEXT = @DBEXT@
|
||||||
|
RDBEXT = @RDBEXT@
|
||||||
|
PROGRAM = mkzonedb
|
||||||
|
MODULES = $(PROGRAM).o
|
||||||
|
MANPAGE = $(PROGRAM).8
|
||||||
|
HEADERS = config.h common.h
|
||||||
|
MANDIR = @CONFIG_MANDIR@
|
||||||
|
SBINDIR = @CONFIG_SBINDIR@
|
||||||
|
MAN8DIR = $(MANDIR)/man8
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_PROGRAM = $(INSTALL) -o 0 -g 0 -m 0750
|
||||||
|
INSTALL_MAN = $(INSTALL) -o 0 -g 0 -m 0644
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
CC = @CC@
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
|
%.o: %.c Makefile
|
||||||
|
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
|
||||||
|
|
||||||
|
all: $(PROGRAM) zone
|
||||||
|
|
||||||
|
config:
|
||||||
|
@./configure
|
||||||
|
|
||||||
|
config.h: config.h.in
|
||||||
|
@./configure
|
||||||
|
|
||||||
|
Makefile: Makefile.in config.status
|
||||||
|
./config.status
|
||||||
|
|
||||||
|
config.status: configure
|
||||||
|
./config.status --recheck
|
||||||
|
|
||||||
|
$(MODULES): $(HEADERS)
|
||||||
|
|
||||||
|
$(PROGRAM): $(MODULES)
|
||||||
|
$(CC) $(CFLAGS) $? $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
zone: ../zone.c $(HEADERS) Makefile
|
||||||
|
$(CC) -DSTANDALONE -g ../zone.c $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
install-man: $(PROGRAM).man
|
||||||
|
mkdir -p $(DESTDIR)$(MAN8DIR)
|
||||||
|
$(INSTALL_MAN) $< $(DESTDIR)$(MAN8DIR)/$(MANPAGE)
|
||||||
|
|
||||||
|
install: $(PROGRAM) install-man
|
||||||
|
$(INSTALL_PROGRAM) $(PROGRAM) $(DESTDIR)$(SBINDIR)/$(PROGRAM)
|
||||||
|
|
||||||
|
install-strip: $(PROGRAM)
|
||||||
|
$(INSTALL_PROGRAM) -s $(PROGRAM) $(DESTDIR)$(SBINDIR)/$(PROGRAM)
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm -f $(DESTDIR)$(SBINDIR)/$(PROGRAM) $(DESTDIR)$(MAN8DIR)/$(MANPAGE)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *~ $(PROGRAM) *.db *.gdbm zone
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f config.h config.status config.cache config.log *.man Makefile
|
||||||
|
|
||||||
|
test:
|
||||||
|
./$(PROGRAM) -d uta$(DBEXT) -r at/uta/zred.uta -c at/code -v
|
||||||
|
./zone -d uta$(RDBEXT) -z at/uta/zoneall.uta -v
|
||||||
|
|
||||||
|
zonefiles:
|
||||||
|
./$(PROGRAM) -d ../../zone-at-1012$(DBEXT) -r at/1012/zred-at-1012 -c at/code -v -l4
|
||||||
|
./$(PROGRAM) -d ../../zone-at-uta$(DBEXT) -r at/uta/zred.uta -c at/code -v
|
||||||
|
./$(PROGRAM) -d ../../zone-at-pta$(DBEXT) -r at/pta/zred.pta -c at/code -v
|
||||||
|
./$(PROGRAM) -d ../../zone-de-dtag$(DBEXT) -r de/01033/zred.dtag -c de/code -v
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,65 @@
|
||||||
|
/* mkzonedb.c, zone.c needs this */
|
||||||
|
#define READ 0
|
||||||
|
#define WRITE 1
|
||||||
|
#if HAVE_LIBGDBM
|
||||||
|
#include <gdbm.h>
|
||||||
|
static char dbv[]="GDBM"; /* don't change */
|
||||||
|
#define OPEN(name,wr) gdbm_open(name,0,wr?GDBM_NEWDB:GDBM_READER,0644,0)
|
||||||
|
#define CLOSE(db) gdbm_close(db)
|
||||||
|
#define GET_ERR gdbm_strerror(gdbm_errno)
|
||||||
|
#define STORE(db, key, value) gdbm_store(db, key, value, GDBM_INSERT)
|
||||||
|
#define FETCH(db, key) gdbm_fetch(db, key)
|
||||||
|
#define _DB GDBM_FILE
|
||||||
|
#elif HAVE_LIBDBM
|
||||||
|
/* this is not tested, I don't have libdbm installed */
|
||||||
|
#include <ndbm.h> /* Fixme: which include? */
|
||||||
|
#include <fcntl.h>
|
||||||
|
static char dbv[]="DBM";
|
||||||
|
#define OPEN(name,wr) dbm_open(name,wr?O_RDWR|O_CREAT:O_RONLY,0644)
|
||||||
|
#define CLOSE(db) dbm_close(db)
|
||||||
|
#define GET_ERR "unknown"
|
||||||
|
#define STORE(db, key, value) dbm_store(db, key, value, DBM_INSERT)
|
||||||
|
#define FETCH(db, key) dbm_fetch(db, key)
|
||||||
|
#define _DB DBM *
|
||||||
|
#elif HAVE_LIBDB
|
||||||
|
#if 0
|
||||||
|
/* there are too mny libdb out there */
|
||||||
|
#define DB_DBM_HSEARCH
|
||||||
|
#include <db.h>
|
||||||
|
#else
|
||||||
|
#include <ndbm.h>
|
||||||
|
#endif
|
||||||
|
#include <fcntl.h>
|
||||||
|
static char dbv[]="DB";
|
||||||
|
#define OPEN(name,wr) dbm_open(name,wr?O_RDWR|O_CREAT:O_RONLY,0644)
|
||||||
|
#define CLOSE(db) dbm_close(db)
|
||||||
|
#define GET_ERR "unknown"
|
||||||
|
#define STORE(db, key, value) dbm_store(db, key, value, DBM_INSERT)
|
||||||
|
#define FETCH(db, key) dbm_fetch(db, key)
|
||||||
|
#define _DB DB *
|
||||||
|
#else
|
||||||
|
Sorry, no database found in configure
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* if the following doesn't - how can we find datatypes with len 1,2,4 ? */
|
||||||
|
#if SIZEOF_CHAR != 1
|
||||||
|
Something is wrong sizeof(char) != 1
|
||||||
|
#else
|
||||||
|
typedef unsigned char UC;
|
||||||
|
#endif
|
||||||
|
#if SIZEOF_SHORT != 2
|
||||||
|
Something is wrong sizeof(short) != 2
|
||||||
|
#else
|
||||||
|
typedef unsigned short US; /* len 2 */
|
||||||
|
#endif
|
||||||
|
#if SIZEOF_LONG != 4
|
||||||
|
#if SIZEOF_INT != 4
|
||||||
|
Something is wrong sizeof(long/int) != 4
|
||||||
|
#else
|
||||||
|
typedef unsigned int UL; /* len 4 */
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
typedef unsigned long UL; /* len 4 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {false,true} bool;
|
|
@ -52,9 +52,12 @@ else {
|
||||||
# verify codefile against orig or reduced zone file
|
# verify codefile against orig or reduced zone file
|
||||||
sub get_codes {
|
sub get_codes {
|
||||||
open(IN, $codef) || die("Can't read $codef");
|
open(IN, $codef) || die("Can't read $codef");
|
||||||
my @codes = <IN>;
|
my (@codes, $num, $ort, $line);
|
||||||
|
while ($line = <IN>) {
|
||||||
|
($num, $ort) =split(/\t/, $line);
|
||||||
|
push(@codes, $num);
|
||||||
|
}
|
||||||
close(IN);
|
close(IN);
|
||||||
chomp(@codes);
|
|
||||||
if($mem && $reducedf) {
|
if($mem && $reducedf) {
|
||||||
&read_compact;
|
&read_compact;
|
||||||
}
|
}
|
||||||
|
@ -121,6 +124,9 @@ sub read_compact {
|
||||||
next if ($key eq "_tAbLe\x0" || $key eq "vErSiO\x0");
|
next if ($key eq "_tAbLe\x0" || $key eq "vErSiO\x0");
|
||||||
my($temp) = unpack($pack_key, $key);
|
my($temp) = unpack($pack_key, $key);
|
||||||
next if( $temp !~ /\d/);
|
next if( $temp !~ /\d/);
|
||||||
|
my($ind);
|
||||||
|
my($ort) = substr($value,0, $ind=index($value, "\x0"));
|
||||||
|
$value = substr($value, $ind+1);
|
||||||
my($count) = unpack('S', $value);
|
my($count) = unpack('S', $value);
|
||||||
$value=substr($value, 2); # past count
|
$value=substr($value, 2); # past count
|
||||||
while ($count--) {
|
while ($count--) {
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
/* configure sets these don't change */
|
||||||
|
|
||||||
|
#undef HAVE_LIBGDBM
|
||||||
|
#undef HAVE_LIBDBM
|
||||||
|
#undef HAVE_LIBDB
|
||||||
|
|
||||||
|
#undef SIZEOF_CHAR
|
||||||
|
#undef SIZEOF_SHORT
|
||||||
|
#undef SIZEOF_LONG
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,44 @@
|
||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
AC_INIT(mkzonedb.c)
|
||||||
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
AC_PREFIX_DEFAULT(/usr)
|
||||||
|
|
||||||
|
CONFIG_MANDIR=`eval echo ${CONFIG_MANDIR:-"/usr/man"}`
|
||||||
|
CONFIG_SBINDIR=`eval echo ${CONFIG_SBINDIR:-"/sbin"}`
|
||||||
|
|
||||||
|
dnl Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
|
dnl Checks for libraries.
|
||||||
|
dnl Berkeley DB appends RDBEXT
|
||||||
|
AC_CHECK_LIB(gdbm, gdbm_open, DBMLIB=-lgdbm;DBEXT=".gdbm";RDBEXT=".gdbm"; AC_DEFINE(HAVE_LIBGDBM),
|
||||||
|
AC_CHECK_LIB(dbm, dbm_open, DBMLIB=-ldbm;RDBEXT=".db"; AC_DEFINE(HAVE_LIBDBM),
|
||||||
|
AC_CHECK_LIB(db, dbm_open, DBMLIB=-ldb;RDBEXT=".db"; AC_DEFINE(HAVE_LIBDB),
|
||||||
|
AC_MSG_ERROR("No db found"))))
|
||||||
|
|
||||||
|
dnl Checks for header files.
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS(unistd.h)
|
||||||
|
|
||||||
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
|
||||||
|
dnl Only 1,2,4 will work by now
|
||||||
|
AC_CHECK_SIZEOF(char,1)
|
||||||
|
AC_CHECK_SIZEOF(short,2)
|
||||||
|
AC_CHECK_SIZEOF(long,4)
|
||||||
|
AC_CHECK_SIZEOF(int,4)
|
||||||
|
|
||||||
|
dnl Checks for library functions.
|
||||||
|
AC_CHECK_FUNCS(strdup strtoul)
|
||||||
|
|
||||||
|
AC_SUBST(DBMLIB)
|
||||||
|
AC_SUBST(DBEXT)
|
||||||
|
AC_SUBST(RDBEXT)
|
||||||
|
AC_SUBST(CC)
|
||||||
|
AC_SUBST(INSTALL)
|
||||||
|
AC_SUBST(CONFIG_SBINDIR)
|
||||||
|
AC_SUBST(CONFIG_MANDIR)
|
||||||
|
|
||||||
|
AC_OUTPUT(Makefile)
|
|
@ -0,0 +1,120 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# dump database
|
||||||
|
#
|
||||||
|
# Copyright 1999 by Leopold Toetsch <lt@toetsch.at>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use GDBM_File;
|
||||||
|
use Getopt::Std;
|
||||||
|
|
||||||
|
my $LINK = 127;
|
||||||
|
|
||||||
|
my($L) = 'S'; # pack short
|
||||||
|
$| =1;
|
||||||
|
|
||||||
|
my($zonef, $reducedf, $from, $to, $auto,$verbose, $mem, %all, %link);
|
||||||
|
my($halt, $codef, %zones, $reverse, $dbm, @nums);
|
||||||
|
my $reduce_a=1; #dont't turn on, it doesn't work
|
||||||
|
&getargs;
|
||||||
|
&read_compact;
|
||||||
|
|
||||||
|
sub min {
|
||||||
|
return $_[0] < $_[1] ? $_[0] : $_[1];
|
||||||
|
}
|
||||||
|
sub read_compact {
|
||||||
|
my ($from,$to,$z,$n);
|
||||||
|
$verbose=3;
|
||||||
|
|
||||||
|
print "Reading $reducedf...\n" if($verbose);
|
||||||
|
my(%db,$key,$value);
|
||||||
|
tie(%db, 'GDBM_File',$reducedf, GDBM_READER, 644);
|
||||||
|
my ($vers) = $db{"vErSiO\x0"};
|
||||||
|
print "$vers\n" if($verbose);
|
||||||
|
my (@vinfo) = split(/ /, $vers);
|
||||||
|
my ($v, $pack_key, $pack_table, $n, $t, $i, $ind);
|
||||||
|
foreach (@vinfo) {
|
||||||
|
$v = $1 if(/V(.*)/);
|
||||||
|
$pack_key = $1 if(/K(\w)/);
|
||||||
|
$pack_table = $1 if(/C(\w)/);
|
||||||
|
$n = $1 if(/N(\d+)/);
|
||||||
|
$t = $1 if(/T(\d+)/);
|
||||||
|
}
|
||||||
|
my($bnum) = $db{"_tAbLe\x0"};
|
||||||
|
my %len = ('C' => 1, 'S' => 2, 'L' => 4);
|
||||||
|
print "pack_table $pack_table pack_ke $pack_key\n" if($verbose>=2);
|
||||||
|
$i=min($n, 256);
|
||||||
|
@nums = unpack("$pack_table$i", $bnum);
|
||||||
|
print "Table $i:\n@nums\n" if($verbose>=3);
|
||||||
|
$n=0;
|
||||||
|
print "Entries\n";
|
||||||
|
while ( ($key, $value) = each(%db) ) {
|
||||||
|
next if ($key eq "_tAbLe\x0" || $key eq "vErSiO\x0");
|
||||||
|
my($temp) = unpack($pack_key, $key);
|
||||||
|
next if( $temp !~ /\d/);
|
||||||
|
my($ind);
|
||||||
|
my($ort) = substr($value,0, $ind=index($value, "\x0"));
|
||||||
|
print "$temp $ort\n";
|
||||||
|
$value = substr($value, $ind+1);
|
||||||
|
my($count) = unpack('S', $value);
|
||||||
|
$value=substr($value, 2); # past count
|
||||||
|
while ($count--) {
|
||||||
|
my($b, $z, $v);
|
||||||
|
$z = unpack("C", $value);
|
||||||
|
$value=substr($value, 1);
|
||||||
|
$L = 'C';
|
||||||
|
$ind = 1;
|
||||||
|
if ($z >= 128) {
|
||||||
|
$z -= 128;
|
||||||
|
$L = $pack_key;
|
||||||
|
$ind=0;
|
||||||
|
}
|
||||||
|
$b = unpack($L, $value);
|
||||||
|
$value=substr($value, $len{$L});
|
||||||
|
print STDERR "$n\r" if ($verbose==1 && $n%1000==0);
|
||||||
|
$n++;
|
||||||
|
$b = $nums[$b] if($ind);
|
||||||
|
print "$temp $b $z\n" if($verbose==3);
|
||||||
|
$all{"$temp $b"} = $z;
|
||||||
|
$link{$temp} = $b if($z eq $LINK);
|
||||||
|
}
|
||||||
|
} # while each
|
||||||
|
print STDERR "$n\n" if ($verbose);
|
||||||
|
untie(%db);
|
||||||
|
print STDERR "$n\n" if ($verbose);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub getargs {
|
||||||
|
my(%opt);
|
||||||
|
$from = $to = '';
|
||||||
|
$auto=0;
|
||||||
|
$dbm=0;
|
||||||
|
$halt=1;
|
||||||
|
$mem=1; # for mem = 0, data must be resorted for 'look'
|
||||||
|
$verbose=1;
|
||||||
|
push(@ARGV,'-V'); # last options seems not to work, so I push 1 more
|
||||||
|
getopt('d:v:', \%opt);
|
||||||
|
$reducedf=$opt{'d'};
|
||||||
|
$verbose=$opt{'v'} if($opt{'v'} ne '');
|
||||||
|
$verbose=3;
|
||||||
|
&usage unless($reducedf);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub usage {
|
||||||
|
print "ddb -d database\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
exit 0
|
|
@ -0,0 +1,469 @@
|
||||||
|
/*
|
||||||
|
* Make zone datafile
|
||||||
|
*
|
||||||
|
* Copyright 1999 by Leopold Toetsch <lt@toetsch.at>
|
||||||
|
*
|
||||||
|
* SYNOPSIS
|
||||||
|
* mkzonedb -r Zonefile -d database [ -f ] [ -v ] [ - V ]
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char progversion[] = "1.00";
|
||||||
|
/* first char must match dataversion */
|
||||||
|
|
||||||
|
|
||||||
|
#define STANDALONE
|
||||||
|
|
||||||
|
#define _MKZONEDB_C_
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#ifdef STANDALONE
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define __USE_GNU
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#ifndef __USE_MISC
|
||||||
|
extern const char *basename (const char *name);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include "isdnlog.h"
|
||||||
|
#include "tools.h"
|
||||||
|
#endif
|
||||||
|
#include "config.h"
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
|
||||||
|
void usage(char *argv[]) {
|
||||||
|
fprintf(stderr, "%s: -r RedZonefile -c Code -d Database [ -v ] [ -V ] [ -o Localzone ] [ -l Len ]\n",
|
||||||
|
basename(argv[0]));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int (*zones)[3];
|
||||||
|
static int *numbers;
|
||||||
|
static bool verbose=false;
|
||||||
|
static int table[256];
|
||||||
|
static int tablelen, keylen, keydigs, maxnum;
|
||||||
|
static int n, nn;
|
||||||
|
typedef struct {
|
||||||
|
int num;
|
||||||
|
char *code;
|
||||||
|
} code_t;
|
||||||
|
static code_t *codes = 0;
|
||||||
|
static int nc;
|
||||||
|
static int ortszone=1;
|
||||||
|
static int numlen;
|
||||||
|
|
||||||
|
static void read_codefile(char *cf) {
|
||||||
|
FILE *fp;
|
||||||
|
int l, llen = 0;
|
||||||
|
#if 0
|
||||||
|
char *line, *p;
|
||||||
|
#else
|
||||||
|
char line[BUFSIZ], *p;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
nc = 0;
|
||||||
|
if (verbose)
|
||||||
|
printf("Reading %s\n", cf);
|
||||||
|
if ((fp=fopen(cf, "r")) == 0) {
|
||||||
|
fprintf(stderr, "Coudn't read '%s'\n", cf);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
maxnum = 0;
|
||||||
|
while (!feof(fp)) {
|
||||||
|
if (verbose && (nc % 1000) == 0) {
|
||||||
|
printf("%d\r", nc);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
l = getline(&line, &llen, fp);
|
||||||
|
#else
|
||||||
|
fgets(line, BUFSIZ, fp);
|
||||||
|
#endif
|
||||||
|
if (!isdigit(*line))
|
||||||
|
continue;
|
||||||
|
line[strlen(line)-1] = '\0';
|
||||||
|
if ((codes=realloc(codes, (nc+1)*sizeof(code_t))) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
codes[nc].num = strtoul(line, &p, 10);
|
||||||
|
if (codes[nc].num > maxnum)
|
||||||
|
maxnum = codes[nc].num;
|
||||||
|
if (*p != '\t') {
|
||||||
|
fprintf(stderr, "'%s' seems to be an invalide codfile\n", cf);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if ( (codes[nc].code = strdup(++p)) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
nc++;
|
||||||
|
}
|
||||||
|
if (verbose) {
|
||||||
|
printf("%d Codes read\n", nc);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
/* we append a dumm for not defined nums */
|
||||||
|
if ((codes=realloc(codes, (nc+1)*sizeof(code_t))) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
codes[nc].num=-1;
|
||||||
|
codes[nc].code=strdup("");
|
||||||
|
free(cf);
|
||||||
|
#if 0
|
||||||
|
free(line);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void read_rzfile(char *rf) {
|
||||||
|
int i;
|
||||||
|
char *line, *p, *op;
|
||||||
|
size_t llen, l;
|
||||||
|
FILE *fp;
|
||||||
|
int from,to,z;
|
||||||
|
|
||||||
|
if ((fp=fopen(rf, "r")) == 0) {
|
||||||
|
fprintf(stderr, "Coudn't read '%s'\n", rf);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if ((line = malloc(40)) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
llen=40;
|
||||||
|
n=0;
|
||||||
|
zones = 0;
|
||||||
|
if ((numbers = calloc(maxnum+1, sizeof(int))) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
i=keylen=keydigs=0;
|
||||||
|
if (verbose)
|
||||||
|
printf("Reading %s\n", rf);
|
||||||
|
|
||||||
|
while (!feof(fp)) {
|
||||||
|
if (verbose && (n % 1000) == 0) {
|
||||||
|
printf("%d\r", n);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
l = getline(&line, &llen, fp);
|
||||||
|
#else
|
||||||
|
fgets(line, BUFSIZ, fp);
|
||||||
|
l = strlen(line);
|
||||||
|
#endif
|
||||||
|
if (!l || l == -1 || !*line)
|
||||||
|
break;
|
||||||
|
if (l>40)
|
||||||
|
fprintf(stderr, "Possible junk in line %d", n);
|
||||||
|
p = line;
|
||||||
|
from = strtoul(p, &p, 10);
|
||||||
|
if (p-line > keydigs)
|
||||||
|
keydigs=p-line;
|
||||||
|
p++;
|
||||||
|
op = p;
|
||||||
|
to = strtoul(p, &p, 10);
|
||||||
|
if (p-op > keydigs)
|
||||||
|
keydigs=p-op;
|
||||||
|
p++;
|
||||||
|
z = strtoul(p, &p, 10);
|
||||||
|
if (z > 127) {
|
||||||
|
fprintf(stderr, "Something is wrong with this file (line %d)\n", n);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if ((zones = realloc(zones, (n+1)*3*sizeof(int))) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
zones[n][0]=from;
|
||||||
|
zones[n][1]=to;
|
||||||
|
zones[n][2]=z;
|
||||||
|
if (from > keylen)
|
||||||
|
keylen=from;
|
||||||
|
if (to > keylen)
|
||||||
|
keylen=to;
|
||||||
|
numbers[to]++;
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
free(line);
|
||||||
|
free(rf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void make_table() {
|
||||||
|
int i, j, k;
|
||||||
|
tablelen = 0;
|
||||||
|
if (verbose)
|
||||||
|
printf("%d\nSorting\n", n);
|
||||||
|
nn = maxnum;
|
||||||
|
for (j=0; j<256; j++) {
|
||||||
|
int max = 0;
|
||||||
|
k = -1;
|
||||||
|
for (i=0; i<=maxnum; i++) {
|
||||||
|
if (numbers[i] > max) {
|
||||||
|
k = i;
|
||||||
|
max = numbers[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (k == -1) {
|
||||||
|
nn = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
numbers[k]=0;
|
||||||
|
table[j] = k;
|
||||||
|
if (k > tablelen)
|
||||||
|
tablelen = k;
|
||||||
|
}
|
||||||
|
free(numbers);
|
||||||
|
if (nn > 256)
|
||||||
|
nn = 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int comp_func(const void *p1, const void *p2) {
|
||||||
|
return ((code_t*)p1)->num - ((code_t*)p2)->num;
|
||||||
|
}
|
||||||
|
/* insert the code of from into value */
|
||||||
|
static void insert_code(datum *value, int ifrom) {
|
||||||
|
int l;
|
||||||
|
code_t *cp, key;
|
||||||
|
key.num = ifrom;
|
||||||
|
cp = bsearch(&key, codes, nc, sizeof(code_t), comp_func);
|
||||||
|
if (!cp)
|
||||||
|
cp = &codes[nc];
|
||||||
|
|
||||||
|
l = strlen(cp->code) + 1;
|
||||||
|
if ((value->dptr = realloc(value->dptr, value->dsize+l)) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
memmove(value->dptr+l, value->dptr, value->dsize);
|
||||||
|
value->dsize += l;
|
||||||
|
memcpy(value->dptr, cp->code, l);
|
||||||
|
*cp->code = '\0'; /* invalidate */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_remaining_codes(_DB db) {
|
||||||
|
int i,l;
|
||||||
|
UL kul;
|
||||||
|
US kus;
|
||||||
|
datum key, value;
|
||||||
|
char *val;
|
||||||
|
for (i=0 ; i< nc; i++)
|
||||||
|
if (codes[i].num > 0 && *codes[i].code) {
|
||||||
|
if (keylen == 4) {
|
||||||
|
kul = (UL)codes[i].num;
|
||||||
|
key.dptr = (char*)&kul;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
kus = (US)codes[i].num;
|
||||||
|
key.dptr = (char*)&kus;
|
||||||
|
}
|
||||||
|
key.dsize = keylen;
|
||||||
|
val = malloc(l=(strlen(codes[i].code)+3));
|
||||||
|
strcpy(val, codes[i].code);
|
||||||
|
val[l-1] = val[l-2] = '\0'; /* count=0 */
|
||||||
|
value.dptr = val;
|
||||||
|
value.dsize = l;
|
||||||
|
if(STORE(db, key, value)) {
|
||||||
|
fprintf(stderr, "Error storing key '%d' - %s\n",codes[i].num,GET_ERR);
|
||||||
|
/* exit(EXIT_FAILURE); */
|
||||||
|
}
|
||||||
|
free(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_db(char * df) {
|
||||||
|
_DB db;
|
||||||
|
datum key, value;
|
||||||
|
UL ul, kul;
|
||||||
|
US us, kus;
|
||||||
|
int ofrom;
|
||||||
|
int vlen;
|
||||||
|
US count;
|
||||||
|
char *val, *p;
|
||||||
|
int i, j;
|
||||||
|
char version[80];
|
||||||
|
|
||||||
|
qsort(codes, nc, sizeof(code_t), comp_func);
|
||||||
|
if (verbose)
|
||||||
|
printf("Writing\n");
|
||||||
|
if((db=OPEN(df,WRITE)) == 0) {
|
||||||
|
fprintf(stderr, "Can't create '%s' - %s\n", df, GET_ERR);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
/* tablelen .. len of table entries */
|
||||||
|
/* keylen = keysize */
|
||||||
|
keylen = keylen > 0xffff ? 4 : 2;
|
||||||
|
tablelen = tablelen > 0xffff ? 4 : tablelen > 0xff ? 2 : 1;
|
||||||
|
|
||||||
|
/* write version & table */
|
||||||
|
key.dptr = "vErSiO";
|
||||||
|
key.dsize = 7;
|
||||||
|
sprintf(version,"V1.00 K%c C%c N%d T%d O%d L%d",
|
||||||
|
keylen==2?'S':'L',tablelen==1?'C':tablelen==2?'S':'L',
|
||||||
|
nn,n, ortszone, numlen?numlen:keydigs);
|
||||||
|
value.dptr = version;
|
||||||
|
value.dsize = strlen(version)+1;
|
||||||
|
STORE(db, key, value);
|
||||||
|
|
||||||
|
if ((p = val = calloc(nn, tablelen)) == 0) {
|
||||||
|
fprintf(stderr, "Out of mem\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
key.dptr = "_tAbLe";
|
||||||
|
key.dsize = 7;
|
||||||
|
for (i=0; i<nn; i++)
|
||||||
|
if(tablelen==1)
|
||||||
|
*p++ = (UC)table[i];
|
||||||
|
else if(tablelen == 2)
|
||||||
|
*((US*)p)++ = (US)table[i];
|
||||||
|
else
|
||||||
|
*((UL*)p)++ = (UL)table[i];
|
||||||
|
value.dptr = val;
|
||||||
|
value.dsize = nn*tablelen;
|
||||||
|
STORE(db, key, value);
|
||||||
|
free(val);
|
||||||
|
|
||||||
|
/* and write data */
|
||||||
|
val = malloc(2); /* size */
|
||||||
|
vlen = 2;
|
||||||
|
ofrom = -1;
|
||||||
|
count = 0;
|
||||||
|
for (i=0; i<n; i++) {
|
||||||
|
bool found = false;
|
||||||
|
UC uc;
|
||||||
|
|
||||||
|
if (verbose && (i % 1000) == 0) {
|
||||||
|
printf("%d\r", i);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
if (ofrom != -1 && ofrom != zones[i][0]) {
|
||||||
|
*((US*)val) = count;
|
||||||
|
value.dptr = val;
|
||||||
|
value.dsize = vlen;
|
||||||
|
insert_code(&value, ofrom);
|
||||||
|
if(STORE(db, key, value)) {
|
||||||
|
fprintf(stderr, "Error storing key '%d' - %s\n",ofrom,GET_ERR);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
free(val);
|
||||||
|
}
|
||||||
|
if (ofrom != zones[i][0]) {
|
||||||
|
count = 0;
|
||||||
|
val = malloc(2); /* size */
|
||||||
|
vlen = 2;
|
||||||
|
/* set up key */
|
||||||
|
ofrom = zones[i][0];
|
||||||
|
if (keylen == 4) {
|
||||||
|
kul = (UL)ofrom;
|
||||||
|
key.dptr = (char*)&kul;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
kus = (US)ofrom;
|
||||||
|
key.dptr = (char*)&kus;
|
||||||
|
}
|
||||||
|
key.dsize = keylen;
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
for (j=0; j<nn; j++)
|
||||||
|
if(table[j] == zones[i][1]) {
|
||||||
|
found = true;
|
||||||
|
val = realloc(val, vlen+2);
|
||||||
|
uc = (UC)zones[i][2];
|
||||||
|
val[vlen++] = uc;
|
||||||
|
uc = (UC)j;
|
||||||
|
val[vlen++] = uc;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
val = realloc(val, vlen+1+keylen);
|
||||||
|
zones[i][2] |= 128;
|
||||||
|
uc = (UC)zones[i][2];
|
||||||
|
val[vlen++] = uc;
|
||||||
|
if(keylen == 2) {
|
||||||
|
us = (US)zones[i][1];
|
||||||
|
*((US*)(&val[vlen])) = us;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ul = (UL)zones[i][1];
|
||||||
|
*((UL*)(&val[vlen])) = ul;
|
||||||
|
}
|
||||||
|
vlen+=keylen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(verbose)
|
||||||
|
printf("%d\n", i);
|
||||||
|
/* write last */
|
||||||
|
*((US*)val) = count;
|
||||||
|
value.dptr = val;
|
||||||
|
value.dsize = vlen;
|
||||||
|
insert_code(&value, ofrom);
|
||||||
|
STORE(db, key, value);
|
||||||
|
free(val);
|
||||||
|
write_remaining_codes(db);
|
||||||
|
CLOSE(db);
|
||||||
|
free(zones);
|
||||||
|
free(df);
|
||||||
|
for (i = 0; i <= nc; i++)
|
||||||
|
free(codes[i].code);
|
||||||
|
free(codes);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char *df=0;
|
||||||
|
char *rf=0;
|
||||||
|
char *cf=0;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
usage(argv);
|
||||||
|
while ( (c=getopt(argc, argv, "vVr:d:c:o:l:")) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case 'v' : verbose = true; break;
|
||||||
|
case 'V' : printf("%s: V%s Db=%s\n",
|
||||||
|
basename(argv[0]), progversion, dbv); exit(1);
|
||||||
|
case 'd' : df = strdup(optarg); break;
|
||||||
|
case 'r' : rf = strdup(optarg); break;
|
||||||
|
case 'c' : cf = strdup(optarg); break;
|
||||||
|
case 'o' : ortszone = atoi(optarg); break;
|
||||||
|
case 'l' : numlen = atoi(optarg); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
read_codefile(cf);
|
||||||
|
read_rzfile(rf);
|
||||||
|
/* make table of 256 maxused to's */
|
||||||
|
make_table();
|
||||||
|
|
||||||
|
write_db(df);
|
||||||
|
|
||||||
|
|
||||||
|
/* Uff this got longer as I thought,
|
||||||
|
C is a real low level language -
|
||||||
|
now it's clear, why I prefer Perl
|
||||||
|
*/
|
||||||
|
return(EXIT_SUCCESS);
|
||||||
|
}
|
|
@ -15,7 +15,7 @@
|
||||||
<LI>zone.c, <A HREF="#zone">zone</A> - i4l-zonefuncs / Standalone zonefile verify</LI>
|
<LI>zone.c, <A HREF="#zone">zone</A> - i4l-zonefuncs / Standalone zonefile verify</LI>
|
||||||
</UL>
|
</UL>
|
||||||
<H2><A NAME="redzone">redzone</A></H2>
|
<H2><A NAME="redzone">redzone</A></H2>
|
||||||
<P><CITE>redzone</CITE> reduces a <A HREF="#zonef">Zonefile</A> by inserting wildcards. The reduction for AT is 99,6%,
|
<P><CITE>redzone</CITE> reduces a <A HREF="#zonef">Zonefile</A> by inserting wildcards. The reduction for AT is 99,5%,
|
||||||
for DE 99,3%. </P>
|
for DE 99,3%. </P>
|
||||||
<H3>Synopsis</H3>
|
<H3>Synopsis</H3>
|
||||||
<PRE>redzone -z<CITE>Zonefile</CITE> -r<CITE>Reducedfile</CITE> [ -v<CITE>verboselevel</CITE> ] [ -n ] [ -llen ] [ -k ] [ -o ]</PRE>
|
<PRE>redzone -z<CITE>Zonefile</CITE> -r<CITE>Reducedfile</CITE> [ -v<CITE>verboselevel</CITE> ] [ -n ] [ -llen ] [ -k ] [ -o ]</PRE>
|
||||||
|
@ -56,20 +56,23 @@ compzone { -z<CITE>Zonefile</CITE> | -r<CITE>Reducedfile</CITE> } -c<CITE>Codefi
|
||||||
<PRE>./compzone -zzoneall -rzoneall.red -a -m</PRE>
|
<PRE>./compzone -zzoneall -rzoneall.red -a -m</PRE>
|
||||||
|
|
||||||
<P>Verifys the reduced zonefile against the full file and stops on first error.</P>
|
<P>Verifys the reduced zonefile against the full file and stops on first error.</P>
|
||||||
<H2>mkzonedb</H2>
|
<H2><A NAME="mkzonedb">mkzonedb</A></H2>
|
||||||
<P>Makes a zonedatabase (gdbm - GNU Database) from a reduced file.</P>
|
<P>Makes a zonedatabase (gdbm - GNU Database or db - Berkeley DB) from a reduced file.</P>
|
||||||
<H3>Synopsis</H3>
|
<H3>Synopsis</H3>
|
||||||
<PRE>./mkzonedb -d<CITE>zone-CC-PP.gdbm</CITE> -r<CITE>ReducedFile</CITE> [ -f ] [ -v<CITE>Verboselevel</CITE> ]</PRE>
|
<PRE>./mkzonedb -d <CITE>zone-CC-PP.gdbm</CITE> -r <CITE>ReducedFile</CITE> -c Codefile [ -v<CITE>Verboselevel</CITE> ] [ -o Localzone ] [ -l Len ]</PRE>
|
||||||
|
|
||||||
<H3>Options</H3>
|
<H3>Options</H3>
|
||||||
<PRE>-r<CITE>ReducedFile</CITE> ... reduced zone file from <STRONG>redzone</STRONG>
|
<PRE>-r <CITE>ReducedFile</CITE> ... reduced zone file from <STRONG>redzone</STRONG>
|
||||||
-d<CITE>zone-CC-PP.gdbm</CITE> ...CC = Iso-Countrycode, PP = Providernumber<BR>-f force a new file, don't update an existing
|
-d <CITE>zone-CC-PP.gdbm</CITE> ...CC = Iso-Countrycode, PP = Providername/number<BR>-c <CITE>Codefile</CITE><BR>-v Verboselevel ... default = 1<BR>-o Localzone ... default = 1<BR>-l Len ... default = maxlen of data</PRE>
|
||||||
-vVerboselevel ... default = 1</PRE>
|
|
||||||
|
|
||||||
|
<P>For examples look at the <TT>Makefile</TT> in target <TT>zonefiles</TT>.</P>
|
||||||
<H2><A NAME="zone">zone</A></H2>
|
<H2><A NAME="zone">zone</A></H2>
|
||||||
<H3>Standalone-Synopsis</H3>
|
<H3>Standalone-Synopsis</H3>
|
||||||
<PRE>zone -d <CITE>Datafile</CITE> [ -v ] [ -V ] { -z <CITE>zonefile</CITE> | num1 num2 }</PRE>
|
<PRE>zone -d <CITE>Datafile</CITE> [ -v ] [ -V ] { -z <CITE>zonefile</CITE> | num1 num2 }</PRE>
|
||||||
|
|
||||||
|
<P>or</P>
|
||||||
|
<PRE>zone -d <CITE>Datafile</CITE> [ -v ] [ -V ] num1 </PRE>
|
||||||
|
|
||||||
<H3>Options</H3>
|
<H3>Options</H3>
|
||||||
<PRE>-v ... verbose
|
<PRE>-v ... verbose
|
||||||
-V ... print version and exit</PRE>
|
-V ... print version and exit</PRE>
|
||||||
|
@ -78,7 +81,8 @@ compzone { -z<CITE>Zonefile</CITE> | -r<CITE>Reducedfile</CITE> } -c<CITE>Codefi
|
||||||
<PRE>cc -DSTANDALONE -o zone zone.c -lgdbm</PRE>
|
<PRE>cc -DSTANDALONE -o zone zone.c -lgdbm</PRE>
|
||||||
|
|
||||||
<H3>I4L-Interface:</H3>
|
<H3>I4L-Interface:</H3>
|
||||||
<PRE>int initZone(int provider, char *datapath, char **msg)<BR> returns -1 on error, 0 if ok<BR>void exitZone(int provider)<BR>int getZone(int provider, char *from, char *to)<BR> returns -2 on error, -1 on not found, zone if ok</PRE>
|
<PRE>int initZone(int provider, char *datapath, char **msg)<BR> returns -1 on error, 0 if ok<BR>void exitZone(int provider)<BR>int getZone(int provider, char *from, char *to)<BR> returns -2 on error, UNKNOWN on not found, zone if ok<BR>int getAreacode(int provider, char *num, char **text)<BR> returns UNKNOWN if not found, or len of areacode<BR> text is a malloced string containing the name of the area
|
||||||
|
the caller should free this text.</PRE>
|
||||||
|
|
||||||
<H2>Glossary</H2>
|
<H2>Glossary</H2>
|
||||||
<H4><A NAME="zonef">Zonefile</A></H4>
|
<H4><A NAME="zonef">Zonefile</A></H4>
|
||||||
|
|
Loading…
Reference in New Issue