/* ntdbrestore -- construct a ntdb from (n)tdbdump output. Copyright (C) Rusty Russell 2012 Copyright (C) Volker Lendecke 2010 Copyright (C) Simon McVittie 2005 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 3 of the License, 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, see . */ #include "config.h" #include "ntdb.h" #include #ifdef HAVE_LIBREPLACE #include #include #else #include #include #include #include #include #endif static int read_linehead(FILE *f) { int i, c; int num_bytes; char prefix[128]; while (1) { c = getc(f); if (c == EOF) { return -1; } if (c == '(') { break; } } for (i=0; idptr = (unsigned char *)malloc(size); if (d->dptr == NULL) { return -1; } d->dsize = size; for (i=0; idptr[i] = (low|high); } else { d->dptr[i] = c; } } return 0; } static int swallow(FILE *f, const char *s, int *eof) { char line[128]; if (fgets(line, sizeof(line), f) == NULL) { if (eof != NULL) { *eof = 1; } return -1; } if (strcmp(line, s) != 0) { return -1; } return 0; } static bool read_rec(FILE *f, struct ntdb_context *ntdb, int *eof) { int length; NTDB_DATA key, data; bool ret = false; enum NTDB_ERROR e; key.dptr = NULL; data.dptr = NULL; if (swallow(f, "{\n", eof) == -1) { goto fail; } length = read_linehead(f); if (length == -1) { goto fail; } if (read_data(f, &key, length) == -1) { goto fail; } if (swallow(f, "\"\n", NULL) == -1) { goto fail; } length = read_linehead(f); if (length == -1) { goto fail; } if (read_data(f, &data, length) == -1) { goto fail; } if ((swallow(f, "\"\n", NULL) == -1) || (swallow(f, "}\n", NULL) == -1)) { goto fail; } e = ntdb_store(ntdb, key, data, NTDB_INSERT); if (e != NTDB_SUCCESS) { fprintf(stderr, "NTDB error: %s\n", ntdb_errorstr(e)); goto fail; } ret = true; fail: free(key.dptr); free(data.dptr); return ret; } static int restore_ntdb(const char *fname, unsigned int hsize) { struct ntdb_context *ntdb; union ntdb_attribute hashsize; hashsize.base.attr = NTDB_ATTRIBUTE_HASHSIZE; hashsize.base.next = NULL; hashsize.hashsize.size = hsize; ntdb = ntdb_open(fname, 0, O_RDWR|O_CREAT|O_EXCL, 0666, hsize ? &hashsize : NULL); if (!ntdb) { perror("ntdb_open"); fprintf(stderr, "Failed to open %s\n", fname); return 1; } while (1) { int eof = 0; if (!read_rec(stdin, ntdb, &eof)) { if (eof) { break; } return 1; } } if (ntdb_close(ntdb)) { fprintf(stderr, "Error closing ntdb\n"); return 1; } fprintf(stderr, "EOF\n"); return 0; } int main(int argc, char *argv[]) { unsigned int hsize = 0; const char *execname = argv[0]; if (argv[1] && strcmp(argv[1], "-h") == 0) { if (argv[2]) { hsize = atoi(argv[2]); } if (hsize == 0) { fprintf(stderr, "-h requires a integer value" " (eg. 128 or 131072)\n"); exit(1); } argv += 2; argc -= 2; } if (argc != 2) { printf("Usage: %s [-h ] dbname < tdbdump_output\n", execname); exit(1); } return restore_ntdb(argv[1], hsize); }