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