1efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o/*
2106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   Unix SMB/CIFS implementation.
3106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   Samba database functions
4106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   Copyright (C) Andrew Tridgell              1999-2000
5106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   Copyright (C) Paul `Rusty' Russell		   2000
6106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   Copyright (C) Jeremy Allison			   2000
7106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   Copyright (C) Andrew Esh                        2001
8106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
9106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   This program is free software; you can redistribute it and/or modify
10106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   it under the terms of the GNU General Public License as published by
11106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   the Free Software Foundation; either version 2 of the License, or
12106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   (at your option) any later version.
13efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
14106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   This program is distributed in the hope that it will be useful,
15106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   but WITHOUT ANY WARRANTY; without even the implied warranty of
16106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   GNU General Public License for more details.
18efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
19106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   You should have received a copy of the GNU General Public License
20106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   along with this program; if not, write to the Free Software
21106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o*/
23106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
24d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h"
25106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <errno.h>
26106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <stdlib.h>
27106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <stdio.h>
28106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <fcntl.h>
29106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <unistd.h>
30106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <string.h>
31106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <fcntl.h>
32106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <time.h>
33106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <sys/mman.h>
34106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <sys/stat.h>
35106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <sys/time.h>
36106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <ctype.h>
37106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <signal.h>
38106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include <stdarg.h>
39106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
40106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o#include "tdb.h"
41106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
42106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int do_command(void);
43106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'oconst char *cmdname;
44106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ochar *arg1, *arg2;
45106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'osize_t arg1len, arg2len;
46106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'oint bIterate = 0;
47106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ochar *line;
48106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'oTDB_DATA iterate_kbuf;
49106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ochar cmdline[1024];
50106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
51106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'oenum commands {
52106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_CREATE_TDB,
53106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_OPEN_TDB,
54106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_ERASE,
55106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_DUMP,
56106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_INSERT,
57106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_MOVE,
58106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_STORE,
59106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_SHOW,
60106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_KEYS,
61106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_HEXKEYS,
62106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_DELETE,
63106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_LIST_HASH_FREE,
64106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_LIST_FREE,
65106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_INFO,
66106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_FIRST,
67106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_NEXT,
68106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_SYSTEM,
69106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_QUIT,
70106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	CMD_HELP
71106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o};
72106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
73106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'otypedef struct {
74106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	const char *name;
75106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	enum commands cmd;
76106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o} COMMAND_TABLE;
77106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
78106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'oCOMMAND_TABLE cmd_table[] = {
79106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"create",	CMD_CREATE_TDB},
80106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"open",	CMD_OPEN_TDB},
81106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"erase",	CMD_ERASE},
82106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"dump",	CMD_DUMP},
83106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"insert",	CMD_INSERT},
84106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"move",	CMD_MOVE},
85106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"store",	CMD_STORE},
86106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"show",	CMD_SHOW},
87106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"keys",	CMD_KEYS},
88106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"hexkeys",	CMD_HEXKEYS},
89106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"delete",	CMD_DELETE},
90106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"list",	CMD_LIST_HASH_FREE},
91106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"free",	CMD_LIST_FREE},
92106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"info",	CMD_INFO},
93106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"first",	CMD_FIRST},
94106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"1",		CMD_FIRST},
95106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"next",	CMD_NEXT},
96106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"n",		CMD_NEXT},
97106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"quit",	CMD_QUIT},
98106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"q",		CMD_QUIT},
99106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{"!",		CMD_SYSTEM},
100106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	{NULL,		CMD_HELP}
101106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o};
102106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
103106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o/* a tdb tool for manipulating a tdb database */
104106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
105106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic TDB_CONTEXT *tdb;
106106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
107106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int print_rec(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state);
108106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int print_key(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state);
109106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int print_hexkey(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state);
110106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
111106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void print_asc(const char *buf,int len)
112106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
113106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	int i;
114106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
115106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	/* We're probably printing ASCII strings so don't try to display
116106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	   the trailing NULL character. */
117106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
118106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (buf[len - 1] == 0)
119106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	        len--;
120106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
121106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	for (i=0;i<len;i++)
122106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf("%c",isprint(buf[i])?buf[i]:'.');
123106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
124106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
125106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void print_data(const char *buf,int len)
126106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
127106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	int i=0;
128106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (len<=0) return;
129106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("[%03X] ",i);
130106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	for (i=0;i<len;) {
131106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf("%02X ",(int)buf[i]);
132106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		i++;
133106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (i%8 == 0) printf(" ");
134efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		if (i%16 == 0) {
135106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			print_asc(&buf[i-16],8); printf(" ");
136106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			print_asc(&buf[i-8],8); printf("\n");
137106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			if (i<len) printf("[%03X] ",i);
138106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		}
139106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
140106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (i%16) {
141106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		int n;
142efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
143106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		n = 16 - (i%16);
144106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf(" ");
145106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (n>8) printf(" ");
146106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		while (n--) printf("   ");
147efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
148106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		n = i%16;
149106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (n > 8) n = 8;
150106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		print_asc(&buf[i-(i%16)],n); printf(" ");
151106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		n = (i%16) - n;
152efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		if (n>0) print_asc(&buf[i-n],n);
153efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		printf("\n");
154106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
155106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
156106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
157106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void help(void)
158106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
159106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("\n"
160106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"tdbtool: \n"
161106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  create    dbname     : create a database\n"
162106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  open      dbname     : open an existing database\n"
163106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  erase                : erase the database\n"
164106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  dump                 : dump the database as strings\n"
165106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  keys                 : dump the database keys as strings\n"
166106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  hexkeys              : dump the database keys as hex values\n"
167106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  info                 : print summary info about the database\n"
168106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  insert    key  data  : insert a record\n"
169106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  move      key  file  : move a record to a destination tdb\n"
170106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  store     key  data  : store a record (replace)\n"
171106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  show      key        : show a record by key\n"
172106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  delete    key        : delete a record by key\n"
173106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  list                 : print the database hash table and freelist\n"
174106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  free                 : print the database freelist\n"
175efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o"  ! command            : execute system command\n"
176106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  1 | first            : print the first record\n"
177106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  n | next             : print the next record\n"
178106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  q | quit             : terminate\n"
179106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"  \\n                   : repeat 'next' command\n"
180106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o"\n");
181106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
182106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
183106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void terror(const char *why)
184106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
185106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("%s\n", why);
186106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
187106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
188106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void create_tdb(const char *tdbname)
189106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
190106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (tdb) tdb_close(tdb);
191106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	tdb = tdb_open(tdbname, 0, TDB_CLEAR_IF_FIRST,
192106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		       O_RDWR | O_CREAT | O_TRUNC, 0600);
193106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (!tdb) {
194106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf("Could not create %s: %s\n", tdbname, strerror(errno));
195106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
196106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
197106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
198106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void open_tdb(const char *tdbname)
199106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
200106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (tdb) tdb_close(tdb);
201106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	tdb = tdb_open(tdbname, 0, 0, O_RDWR, 0600);
202106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (!tdb) {
203106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf("Could not open %s: %s\n", tdbname, strerror(errno));
204106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
205106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
206106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
207106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void insert_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
208106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
209106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_DATA key, dbuf;
210106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
211106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ((keyname == NULL) || (keylen == 0)) {
212106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("need key");
213106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
214106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
215106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
216106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dptr = (unsigned char *)keyname;
217106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dsize = keylen;
218106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf.dptr = (unsigned char *)data;
219106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf.dsize = datalen;
220106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
221106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (tdb_store(tdb, key, dbuf, TDB_INSERT) == -1) {
222106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("insert failed");
223106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
224106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
225106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
226106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void store_tdb(char *keyname, size_t keylen, char* data, size_t datalen)
227106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
228106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_DATA key, dbuf;
229106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
230106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ((keyname == NULL) || (keylen == 0)) {
231106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("need key");
232106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
233106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
234106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
235106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ((data == NULL) || (datalen == 0)) {
236106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("need data");
237106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
238106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
239106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
240106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dptr = (unsigned char *)keyname;
241106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dsize = keylen;
242106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf.dptr = (unsigned char *)data;
243106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf.dsize = datalen;
244106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
245106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("Storing key:\n");
246106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	print_rec(tdb, key, dbuf, NULL);
247106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
248106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (tdb_store(tdb, key, dbuf, TDB_REPLACE) == -1) {
249106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("store failed");
250106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
251106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
252106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
253106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void show_tdb(char *keyname, size_t keylen)
254106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
255106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_DATA key, dbuf;
256106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
257106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ((keyname == NULL) || (keylen == 0)) {
258106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("need key");
259106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
260106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
261106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
262106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dptr = (unsigned char *)keyname;
263106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dsize = keylen;
264106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
265106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf = tdb_fetch(tdb, key);
266106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (!dbuf.dptr) {
267106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    terror("fetch failed");
268106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    return;
269106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
270efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
271106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	print_rec(tdb, key, dbuf, NULL);
272efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
273106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	free( dbuf.dptr );
274efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
275106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return;
276106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
277106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
278106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void delete_tdb(char *keyname, size_t keylen)
279106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
280106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_DATA key;
281106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
282106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ((keyname == NULL) || (keylen == 0)) {
283106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("need key");
284106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
285106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
286106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
287106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dptr = (unsigned char *)keyname;
288106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dsize = keylen;
289106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
290106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (tdb_delete(tdb, key) != 0) {
291106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("delete failed");
292106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
293106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
294106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
295106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void move_rec(char *keyname, size_t keylen, char* tdbname)
296106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
297106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_DATA key, dbuf;
298106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_CONTEXT *dst_tdb;
299106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
300106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ((keyname == NULL) || (keylen == 0)) {
301106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("need key");
302106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
303106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
304106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
305106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ( !tdbname ) {
306106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("need destination tdb name");
307106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
308106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
309106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
310106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dptr = (unsigned char *)keyname;
311106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	key.dsize = keylen;
312106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
313106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf = tdb_fetch(tdb, key);
314106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (!dbuf.dptr) {
315106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("fetch failed");
316106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
317106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
318efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
319106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	print_rec(tdb, key, dbuf, NULL);
320efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
321106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dst_tdb = tdb_open(tdbname, 0, 0, O_RDWR, 0600);
322106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ( !dst_tdb ) {
323106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("unable to open destination tdb");
324106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return;
325106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
326efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
327106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ( tdb_store( dst_tdb, key, dbuf, TDB_REPLACE ) == -1 ) {
328106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("failed to move record");
329106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
330106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	else
331106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf("record moved\n");
332efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
333106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	tdb_close( dst_tdb );
334efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
335106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return;
336106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
337106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
338106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int print_rec(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
339106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
340106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("\nkey %d bytes\n", (int)key.dsize);
341106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	print_asc((const char *)key.dptr, key.dsize);
342106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("\ndata %d bytes\n", (int)dbuf.dsize);
343106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	print_data((const char *)dbuf.dptr, dbuf.dsize);
344106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return 0;
345106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
346106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
347106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int print_key(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
348106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
349106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("key %d bytes: ", (int)key.dsize);
350106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	print_asc((const char *)key.dptr, key.dsize);
351106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("\n");
352106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return 0;
353106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
354106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
355106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int print_hexkey(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
356106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
357106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("key %d bytes\n", (int)key.dsize);
358106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	print_data((const char *)key.dptr, key.dsize);
359106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	printf("\n");
360106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return 0;
361106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
362106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
363106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int total_bytes;
364106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
365106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
366106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
367106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	total_bytes += dbuf.dsize;
368106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return 0;
369106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
370106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
371106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void info_tdb(void)
372106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
373106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	int count;
374106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	total_bytes = 0;
375106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if ((count = tdb_traverse(tdb, traverse_fn, NULL)) == -1)
376106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf("Error = %s\n", tdb_errorstr(tdb));
377106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	else
378106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		printf("%d records totalling %d bytes\n", count, total_bytes);
379106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
380106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
381106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic char *tdb_getline(const char *prompt)
382106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
383106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	static char thisline[1024];
384106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	char *p;
385106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	fputs(prompt, stdout);
386106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	thisline[0] = 0;
387106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	p = fgets(thisline, sizeof(thisline)-1, stdin);
388106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (p) p = strchr(p, '\n');
389106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (p) *p = 0;
390106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return p?thisline:NULL;
391106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
392106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
393106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int do_delete_fn(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf,
394106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o                     void *state)
395106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
396106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    return tdb_delete(the_tdb, key);
397106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
398106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
399106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void first_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey)
400106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
401106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_DATA dbuf;
402106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	*pkey = tdb_firstkey(the_tdb);
403efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
404106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf = tdb_fetch(the_tdb, *pkey);
405106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (!dbuf.dptr) terror("fetch failed");
406106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	else {
407106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		print_rec(the_tdb, *pkey, dbuf, NULL);
408106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
409106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
410106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
411106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic void next_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey)
412106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
413106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	TDB_DATA dbuf;
414106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	*pkey = tdb_nextkey(the_tdb, *pkey);
415efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
416106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	dbuf = tdb_fetch(the_tdb, *pkey);
417efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	if (!dbuf.dptr)
418106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("fetch failed");
419106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	else
420106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		print_rec(the_tdb, *pkey, dbuf, NULL);
421106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
422106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
423106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic int do_command(void)
424106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
425106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	COMMAND_TABLE *ctp = cmd_table;
426106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	enum commands mycmd = CMD_HELP;
427106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	int cmd_len;
428106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
429106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (cmdname && strlen(cmdname) == 0) {
430106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    mycmd = CMD_NEXT;
431106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	} else {
432106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    while (ctp->name) {
433106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		cmd_len = strlen(ctp->name);
434106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (strncmp(ctp->name,cmdname,cmd_len) == 0) {
435106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			mycmd = ctp->cmd;
436106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			break;
437106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		}
438106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		ctp++;
439106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    }
440106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
441106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
442106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	switch (mycmd) {
443106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case CMD_CREATE_TDB:
444106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            bIterate = 0;
445106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            create_tdb(arg1);
446106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    return 0;
447106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case CMD_OPEN_TDB:
448106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            bIterate = 0;
449106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            open_tdb(arg1);
450106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            return 0;
451106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case CMD_SYSTEM:
452106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    /* Shell command */
453106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    system(arg1);
454106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    return 0;
455106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case CMD_QUIT:
456106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    return 1;
457106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	default:
458106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    /* all the rest require a open database */
459106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    if (!tdb) {
460106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
461106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		terror("database not open");
462106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		help();
463106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
464106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    }
465106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    switch (mycmd) {
466106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_ERASE:
467106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
468106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		tdb_traverse(tdb, do_delete_fn, NULL);
469106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
470106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_DUMP:
471106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
472106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		tdb_traverse(tdb, print_rec, NULL);
473106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
474106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_INSERT:
475106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
476106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		insert_tdb(arg1, arg1len,arg2,arg2len);
477106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
478106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_MOVE:
479106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
480106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		move_rec(arg1,arg1len,arg2);
481106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
482106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_STORE:
483106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
484106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		store_tdb(arg1,arg1len,arg2,arg2len);
485106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
486106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_SHOW:
487106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
488106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		show_tdb(arg1, arg1len);
489106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
490106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_KEYS:
491106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		tdb_traverse(tdb, print_key, NULL);
492106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
493106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_HEXKEYS:
494106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		tdb_traverse(tdb, print_hexkey, NULL);
495106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
496106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_DELETE:
497106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 0;
498106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		delete_tdb(arg1,arg1len);
499106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
500106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_LIST_HASH_FREE:
501106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		tdb_dump_all(tdb);
502106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
503106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_LIST_FREE:
504106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		tdb_printfreelist(tdb);
505106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
506106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_INFO:
507106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		info_tdb();
508106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
509106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_FIRST:
510106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		bIterate = 1;
511106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		first_record(tdb, &iterate_kbuf);
512106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
513106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_NEXT:
514106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	       if (bIterate)
515106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		  next_record(tdb, &iterate_kbuf);
516106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
517106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    case CMD_HELP:
518106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		help();
519106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		return 0;
520106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            case CMD_CREATE_TDB:
521106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            case CMD_OPEN_TDB:
522106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            case CMD_SYSTEM:
523106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o            case CMD_QUIT:
524106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o                /*
525106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o                 * unhandled commands.  cases included here to avoid compiler
526106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o                 * warnings.
527106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o                 */
528106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o                return 0;
529106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    }
530106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
531106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
532106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	return 0;
533106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
534106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
535106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'ostatic char *convert_string(char *instring, size_t *sizep)
536106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
537106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    size_t length = 0;
538106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    char *outp, *inp;
539106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    char temp[3];
540efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
541106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
542106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    outp = inp = instring;
543106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
544106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    while (*inp) {
545106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	if (*inp == '\\') {
546106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    inp++;
547106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    if (*inp && strchr("0123456789abcdefABCDEF",(int)*inp)) {
548106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		temp[0] = *inp++;
549106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		temp[1] = '\0';
550106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (*inp && strchr("0123456789abcdefABCDEF",(int)*inp)) {
551106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		    temp[1] = *inp++;
552106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		    temp[2] = '\0';
553106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		}
554106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		*outp++ = (char)strtol((const char *)temp,NULL,16);
555106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    } else {
556106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		*outp++ = *inp++;
557106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    }
558106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	} else {
559106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    *outp++ = *inp++;
560106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	}
561106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	length++;
562106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    }
563106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    *sizep = length;
564106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    return instring;
565106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
566106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
567106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'oint main(int argc, char *argv[])
568106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o{
569106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    cmdname = "";
570106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    arg1 = NULL;
571106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    arg1len = 0;
572106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    arg2 = NULL;
573106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    arg2len = 0;
574106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
575106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    if (argv[1]) {
576106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	cmdname = "open";
577106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	arg1 = argv[1];
578106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o        do_command();
579106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	cmdname =  "";
580106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	arg1 = NULL;
581106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    }
582106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
583106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    switch (argc) {
584106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case 1:
585106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case 2:
586106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    /* Interactive mode */
587106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    while ((cmdname = tdb_getline("tdb> "))) {
588106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		arg2 = arg1 = NULL;
589106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if ((arg1 = strchr((const char *)cmdname,' ')) != NULL) {
590106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		    arg1++;
591106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		    arg2 = arg1;
592106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		    while (*arg2) {
593106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			if (*arg2 == ' ') {
594106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			    *arg2++ = '\0';
595106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			    break;
596106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			}
597106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			if ((*arg2++ == '\\') && (*arg2 == ' ')) {
598106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			    arg2++;
599106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o			}
600106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		    }
601106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		}
602106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (arg1) arg1 = convert_string(arg1,&arg1len);
603106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (arg2) arg2 = convert_string(arg2,&arg2len);
604106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o		if (do_command()) break;
605106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    }
606106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    break;
607106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case 5:
608106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    arg2 = convert_string(argv[4],&arg2len);
609106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case 4:
610106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    arg1 = convert_string(argv[3],&arg1len);
611106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	case 3:
612106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    cmdname = argv[2];
613106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	default:
614106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    do_command();
615106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o	    break;
616106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    }
617106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
618106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    if (tdb) tdb_close(tdb);
619106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o
620106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o    return 0;
621106ad96daee151064aa44a857f82ba10c8258b40Theodore Ts'o}
622