#include #include #include #include #include /* Dump a gdbm data base on stdout in binary format: key_size (4 bytes), key, content_size (4 bytes), content P. Humblet July 2003. Public domain, use at own risk. */ main (int argc, char * argv[]) { GDBM_FILE dbf; datum key, nextkey, content; int count = 0; if (argc != 2) { fprintf (stderr,"Usage: dumpgdbm filename\n"); exit (1); } dbf = gdbm_open (argv[1], 0, GDBM_READER, 0, NULL); if (dbf == NULL) { fprintf(stderr, "Error opening %s: %s\n", argv[1], errno?strerror(errno):gdbm_strerror (gdbm_errno)); exit(1); } key = gdbm_firstkey (dbf); while (key.dptr) { content = gdbm_fetch (dbf, key); if (!content.dptr) { fprintf(stderr, "gdbm_fetch: %s\n", errno?strerror (errno):gdbm_strerror (gdbm_errno)); goto err; } #ifdef DEBUG fprintf(stderr, "%d key size %d content size %d\n", count, key.dsize, content.dsize); #endif if (fwrite (&key.dsize, sizeof(key.dsize), 1, stdout) != 1) { perror ("Key size\n"); goto err; } if (fwrite (key.dptr, key.dsize, 1, stdout) != 1) { perror ("Key\n"); goto err; } if (fwrite (&content.dsize, sizeof(content.dsize), 1, stdout) != 1) { perror ("Content size\n"); goto err; } if (fwrite (content.dptr, content.dsize, 1, stdout) != 1) { perror ("Content\n"); goto err; } nextkey = gdbm_nextkey (dbf, key); free (key.dptr); free (content.dptr); key = nextkey; count++; } gdbm_close (dbf); fprintf (stderr,"%d records dumped\n", count); exit (0); err: gdbm_close (dbf); fprintf (stderr,"Error at record %d\n", count); exit (1); }