/*
Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/
/* configure all options BEFORE including system stuff. */
#include "config.h"
#include "mud.h"
#ifdef WIN32
#include "getopt.h"
#endif
extern char *optarg;
extern int optind;
extern int opterr;
#ifdef DB_DIRHASH
extern int dhdb_init ();
extern int dhdb_travstart ();
extern int dhdb_traverse ();
extern int dhdb_travend ();
extern Obj *dhdb_get ();
extern int dhdb_close ();
extern int dhdb_backup ();
#endif
#ifdef DB_DBMFILE
extern int dddb_init ();
extern int dddb_travstart ();
extern int dddb_traverse ();
extern int dddb_travend ();
extern Obj *dddb_get ();
extern int dddb_close ();
extern int dddb_backup ();
#endif
#ifdef DB_GDBMFILE
extern int dgdb_init ();
extern int dgdb_travstart ();
extern int dgdb_traverse ();
extern int dgdb_travend ();
extern Obj *dgdb_get ();
extern int dgdb_close ();
extern int dgdb_backup ();
#endif
int usage ();
int setexpr (char *s);
int checkexpr (char *nam, Obj * op);
int main (int ac, char **av)
{
int (*initin) () = 0;
int (*travstart) () = 0;
int (*trav) () = 0;
int (*travclose) () = 0;
Obj *(*objget) () = 0;
int (*closer) () = 0;
int (*backup) () = 0;
char obuf[MAXOID];
char *outfile = (char *) 0;
Obj *op;
FILE *out = stdout;
char typ = '\0';
char *fdir = (char *) 0;
char *cexp = (char *) 0;
int cnt = 0;
int vflg = 0;
int lflg = 0;
int Bflg = 0;
int bflg = 0;
int x;
while ((x = getopt (ac, av, "Bb:c:o:f:hdgvl")) != EOF) {
switch (x) {
case 'o':
outfile = optarg;
break;
case 'b':
bflg = atoi (optarg);
if (bflg <= 0) {
fprintf (stderr, "%s not a valid size\n", optarg);
exit (1);
}
break;
case 'B':
Bflg = 1;
break;
#ifdef DB_DIRHASH
case 'h':
initin = dhdb_init;
travstart = dhdb_travstart;
trav = dhdb_traverse;
travclose = dhdb_travend;
objget = dhdb_get;
closer = dhdb_close;
backup = dhdb_backup;
typ = 'h';
break;
#endif
#ifdef DB_DBMFILE
case 'd':
initin = dddb_init;
travstart = dddb_travstart;
trav = dddb_traverse;
travclose = dddb_travend;
objget = dddb_get;
closer = dddb_close;
backup = dddb_backup;
typ = 'd';
break;
#endif
#ifdef DB_GDBMFILE
case 'g':
initin = dgdb_init;
travstart = dgdb_travstart;
trav = dgdb_traverse;
travclose = dgdb_travend;
objget = dgdb_get;
closer = dgdb_close;
backup = dgdb_backup;
typ = 'g';
break;
#endif
case 'c':
cexp = optarg;
break;
case 'f':
fdir = optarg;
break;
case 'v':
vflg++;
break;
case 'l':
lflg++;
break;
case '?':
default:
exit (usage ());
}
}
if (initin == 0) {
fprintf (stderr, "what kind of database is this?\n");
exit (1);
}
if (fdir != (char *) 0) {
#ifdef DB_DIRHASH
if (typ == 'h') {
dhdb_sethpath (fdir);
if (bflg)
dhdb_sethsiz (bflg);
}
#endif
#ifdef DB_DBMFILE
if (typ == 'd') {
dddb_setfile (fdir);
if (bflg)
dddb_setbsiz (bflg);
}
#endif
#ifdef DB_GDBMFILE
if (typ == 'g')
dgdb_setfile (fdir);
#endif
}
/* compile expression and check syntax */
if (cexp != (char *) 0 && setexpr (cexp))
exit (1);
/* open database */
if ((*initin) ()) {
fprintf (stderr, "cannot initialize db layer\n");
exit (1);
}
/* backup mode/setup output */
if (Bflg) {
if (outfile == (char *) 0) {
fprintf (stderr, "backup requires an output filename\n");
exit (1);
}
/* do backup and exit */
if ((*backup) (outfile)) {
fprintf (stderr, "cannot backup db\n");
exit (1);
}
exit (0);
} else {
if (outfile != (char *) 0) {
if ((out = fopen (outfile, "wb")) == (FILE *) 0) {
perror (outfile);
exit (1);
}
}
}
/* ready traverse */
if ((*travstart) ()) {
fprintf (stderr, "cannot start db traverse\n");
exit (1);
}
/* traverse */
while ((*trav) (obuf)) {
tmp_sync ();
if ((op = (*objget) (obuf)) == (Obj *) 0) {
fprintf (stderr, "WARNING: cannot get object %s\n", obuf);
continue;
}
if (cexp != (char *) 0 && checkexpr (obuf, op) == 0) {
if (vflg)
fprintf (stderr, "-> %s\n", obuf);
objfree (op);
continue;
}
/* list only */
if (lflg) {
fprintf (out, "%s\n", obuf);
cnt++;
objfree (op);
continue;
}
oiftoFILE (op, out, obuf);
objfree (op);
if (vflg)
fprintf (stderr, "+> %s\n", obuf);
cnt++;
}
if ((*travclose) ()) {
fprintf (stderr, "cannot cleanly shut down db traverse\n");
exit (1);
}
if ((*closer) ()) {
fprintf (stderr, "cannot cleanly close db\n");
exit (1);
}
fprintf (stderr, "dumped %d objects\n", cnt);
exit (0);
}
int usage ()
{
fprintf (stderr,
"usage: dumpdb -d|h|g [db type] [-f datapath] [-o outfile]\n");
return (1);
}