• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src/router/samba-3.0.25b/source/tdb/tools/
1/*
2   Unix SMB/CIFS implementation.
3   simple tdb dump util
4   Copyright (C) Andrew Tridgell              2001
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*/
20
21#include <errno.h>
22#include <stdlib.h>
23#include <stdio.h>
24#include <fcntl.h>
25#include <unistd.h>
26#include <string.h>
27#include <fcntl.h>
28#include <time.h>
29#include <sys/stat.h>
30#include <sys/time.h>
31#include <ctype.h>
32#include <signal.h>
33#include "tdb.h"
34
35static void print_data(TDB_DATA d)
36{
37	unsigned char *p = (unsigned char *)d.dptr;
38	int len = d.dsize;
39	while (len--) {
40		if (isprint(*p) && !strchr("\"\\", *p)) {
41			fputc(*p, stdout);
42		} else {
43			printf("\\%02X", *p);
44		}
45		p++;
46	}
47}
48
49static int traverse_fn(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
50{
51	printf("{\n");
52	printf("key(%d) = \"", (int)key.dsize);
53	print_data(key);
54	printf("\"\n");
55	printf("data(%d) = \"", (int)dbuf.dsize);
56	print_data(dbuf);
57	printf("\"\n");
58	printf("}\n");
59	return 0;
60}
61
62static int dump_tdb(const char *fname, const char *keyname)
63{
64	TDB_CONTEXT *tdb;
65	TDB_DATA key, value;
66
67	tdb = tdb_open(fname, 0, 0, O_RDONLY, 0);
68	if (!tdb) {
69		printf("Failed to open %s\n", fname);
70		return 1;
71	}
72
73	if (!keyname) {
74		tdb_traverse(tdb, traverse_fn, NULL);
75	} else {
76		key.dptr = (char *)keyname;
77		key.dsize = strlen( keyname);
78		value = tdb_fetch(tdb, key);
79		if (!value.dptr) {
80			return 1;
81		} else {
82			print_data(value);
83			free(value.dptr);
84		}
85	}
86
87	return 0;
88}
89
90static void usage( void)
91{
92	printf( "Usage: tdbdump [options] <filename>\n\n");
93	printf( "   -h          this help message\n");
94	printf( "   -k keyname  dumps value of keyname\n");
95}
96
97 int main(int argc, char *argv[])
98{
99	char *fname, *keyname=NULL;
100	int c;
101
102	if (argc < 2) {
103		printf("Usage: tdbdump <fname>\n");
104		exit(1);
105	}
106
107	while ((c = getopt( argc, argv, "hk:")) != -1) {
108		switch (c) {
109		case 'h':
110			usage();
111			exit( 0);
112		case 'k':
113			keyname = optarg;
114			break;
115		default:
116			usage();
117			exit( 1);
118		}
119	}
120
121	fname = argv[optind];
122
123	return dump_tdb(fname, keyname);
124}
125