📄 tdbtool.c
字号:
} if ( tdb_store( dst_tdb, key, dbuf, TDB_REPLACE ) == -1 ) { terror("failed to move record"); } else printf("record moved\n"); tdb_close( dst_tdb ); return;}static int print_conn_key(TDB_DATA key){ printf( "\nkey %d bytes\n", (int)key.dsize); printf( "pid =%5d ", ((connections_key*)key.dptr)->pid); printf( "cnum =%10d ", ((connections_key*)key.dptr)->cnum); printf( "name =[%s]\n", ((connections_key*)key.dptr)->name); return 0;}static int print_conn_data(TDB_DATA dbuf){ printf( "\ndata %d bytes\n", (int)dbuf.dsize); printf( "pid =%5d ", ((connections_data*)dbuf.dptr)->pid); printf( "cnum =%10d ", ((connections_data*)dbuf.dptr)->cnum); printf( "name =[%s]\n", ((connections_data*)dbuf.dptr)->name); printf( "uid =%5d ", ((connections_data*)dbuf.dptr)->uid); printf( "addr =[%s]\n", ((connections_data*)dbuf.dptr)->addr); printf( "gid =%5d ", ((connections_data*)dbuf.dptr)->gid); printf( "machine=[%s]\n", ((connections_data*)dbuf.dptr)->machine); printf( "start = %s\n", ctime(&((connections_data*)dbuf.dptr)->start)); printf( "magic = 0x%x ", ((connections_data*)dbuf.dptr)->magic); printf( "flags = 0x%x\n", ((connections_data*)dbuf.dptr)->bcast_msg_flags); return 0;}static int print_rec(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state){ if (do_connections && (dbuf.dsize == sizeof(connections_data))) print_crec(the_tdb, key, dbuf, state); else print_arec(the_tdb, key, dbuf, state); return 0;}static int print_crec(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state){ print_conn_key(key); print_conn_data(dbuf); return 0;}static int print_arec(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state){ printf("\nkey %d bytes\n", (int)key.dsize); print_asc(key.dptr, key.dsize); printf("\ndata %d bytes\n", (int)dbuf.dsize); print_data(dbuf.dptr, dbuf.dsize); return 0;}static int print_key(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state){ printf("key %d bytes: ", (int)key.dsize); print_asc(key.dptr, key.dsize); printf("\n"); return 0;}static int print_hexkey(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state){ printf("key %d bytes\n", (int)key.dsize); print_data(key.dptr, key.dsize); printf("\n"); return 0;}static int total_bytes;static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state){ total_bytes += dbuf.dsize; return 0;}static void info_tdb(void){ int count; total_bytes = 0; if ((count = tdb_traverse(tdb, traverse_fn, NULL)) == -1) printf("Error = %s\n", tdb_errorstr(tdb)); else printf("%d records totalling %d bytes\n", count, total_bytes);}static char *tdb_getline(const char *prompt){ static char thisline[1024]; char *p; fputs(prompt, stdout); thisline[0] = 0; p = fgets(thisline, sizeof(thisline)-1, stdin); if (p) p = strchr(p, '\n'); if (p) *p = 0; return p?thisline:NULL;}static int do_delete_fn(TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA dbuf, void *state){ return tdb_delete(the_tdb, key);}static void first_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey){ TDB_DATA dbuf; *pkey = tdb_firstkey(the_tdb); dbuf = tdb_fetch(the_tdb, *pkey); if (!dbuf.dptr) terror("fetch failed"); else { print_rec(the_tdb, *pkey, dbuf, NULL); }}static void next_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey){ TDB_DATA dbuf; *pkey = tdb_nextkey(the_tdb, *pkey); dbuf = tdb_fetch(the_tdb, *pkey); if (!dbuf.dptr) terror("fetch failed"); else print_rec(the_tdb, *pkey, dbuf, NULL);}static int do_command(void){ COMMAND_TABLE *ctp = cmd_table; enum commands mycmd = CMD_HELP; int cmd_len; do_connections = 0; if (cmdname && strlen(cmdname) == 0) { mycmd = CMD_NEXT; } else { while (ctp->name) { cmd_len = strlen(ctp->name); if (strncmp(ctp->name,cmdname,cmd_len) == 0) { mycmd = ctp->cmd; break; } ctp++; } } switch (mycmd) { case CMD_CREATE_TDB: bIterate = 0; create_tdb(arg1); return 0; case CMD_OPEN_TDB: bIterate = 0; open_tdb(arg1); return 0; case CMD_SYSTEM: /* Shell command */ system(arg1); return 0; case CMD_QUIT: return 1; default: /* all the rest require a open database */ if (!tdb) { bIterate = 0; terror("database not open"); help(); return 0; } switch (mycmd) { case CMD_ERASE: bIterate = 0; tdb_traverse(tdb, do_delete_fn, NULL); return 0; case CMD_DUMP: bIterate = 0; tdb_traverse(tdb, print_rec, NULL); return 0; case CMD_CDUMP: do_connections = 1; bIterate = 0; tdb_traverse(tdb, print_rec, NULL); return 0; case CMD_INSERT: bIterate = 0; insert_tdb(arg1, arg1len,arg2,arg2len); return 0; case CMD_MOVE: bIterate = 0; move_rec(arg1,arg1len,arg2); return 0; case CMD_STORE: bIterate = 0; store_tdb(arg1,arg1len,arg2,arg2len); return 0; case CMD_SHOW: bIterate = 0; show_tdb(arg1, arg1len); return 0; case CMD_KEYS: tdb_traverse(tdb, print_key, NULL); return 0; case CMD_HEXKEYS: tdb_traverse(tdb, print_hexkey, NULL); return 0; case CMD_DELETE: bIterate = 0; delete_tdb(arg1,arg1len); return 0; case CMD_LIST_HASH_FREE: tdb_dump_all(tdb); return 0; case CMD_LIST_FREE: tdb_printfreelist(tdb); return 0; case CMD_INFO: info_tdb(); return 0; case CMD_FIRST: bIterate = 1; first_record(tdb, &iterate_kbuf); return 0; case CMD_NEXT: if (bIterate) next_record(tdb, &iterate_kbuf); return 0; case CMD_HELP: help(); return 0; case CMD_CREATE_TDB: case CMD_OPEN_TDB: case CMD_SYSTEM: case CMD_QUIT: /* * unhandled commands. cases included here to avoid compiler * warnings. */ return 0; } } return 0;}static char *convert_string(char *instring, size_t *sizep){ size_t length = 0; char *outp, *inp; char temp[3]; outp = inp = instring; while (*inp) { if (*inp == '\\') { inp++; if (*inp && strchr("0123456789abcdefABCDEF",(int)*inp)) { temp[0] = *inp++; temp[1] = '\0'; if (*inp && strchr("0123456789abcdefABCDEF",(int)*inp)) { temp[1] = *inp++; temp[2] = '\0'; } *outp++ = (char)strtol((const char *)temp,NULL,16); } else { *outp++ = *inp++; } } else { *outp++ = *inp++; } length++; } *sizep = length; return instring;}int main(int argc, char *argv[]){ cmdname = (char *) ""; arg1 = NULL; arg1len = 0; arg2 = NULL; arg2len = 0; if (argv[1]) { cmdname = (char *) "open"; arg1 = argv[1]; do_command(); cmdname = (char *) ""; arg1 = NULL; } switch (argc) { case 1: case 2: /* Interactive mode */ while ((cmdname = tdb_getline("tdb> "))) { arg2 = arg1 = NULL; if ((arg1 = strchr((const char *)cmdname,' ')) != NULL) { arg1++; arg2 = arg1; while (*arg2) { if (*arg2 == ' ') { *arg2++ = '\0'; break; } if ((*arg2++ == '\\') && (*arg2 == ' ')) { arg2++; } } } if (arg1) arg1 = convert_string(arg1,&arg1len); if (arg2) arg2 = convert_string(arg2,&arg2len); if (do_command()) break; } break; case 5: arg2 = convert_string(argv[4],&arg2len); case 4: arg1 = convert_string(argv[3],&arg1len); case 3: cmdname = argv[2]; default: do_command(); break; } if (tdb) tdb_close(tdb); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -