keydump.c

来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 427 行

C
427
字号
/*************************************************************************** *                                                                         * * db.*                                                                    * * open source database, keydump utility                                   * *                                                                         * * Copyright (c) 2000 Centura Software Corporation. All rights reserved.   * *                                                                         * * Use of this software, whether in source code format, or in executable,  * * binary object code form, is governed by the CENTURA OPEN SOURCE LICENSE * * which is fully described in the LICENSE.TXT file, included within this  * * distribution of source code files.                                      *  *                                                                         * **************************************************************************//*-----------------------------------------------------------------------    keydump.c - db.* key file formatted dump utility    This utility will create a formatted dump of the contents of each    node in a key file (named on the ddlp command line).-----------------------------------------------------------------------*/#define MOD keydump#include "db.star.h"#include "version.h"#define KEYDUMP#include "cnvfld.h"#define MAXTEXT 1600/* ********************** TYPE DEFINITIONS *************************** *//* node number of root */#define ROOT_ADDR (F_ADDR) 1/* ********************** LOCAL FUNCTION DECLARATIONS **************** */static void pr_keyfile_header(FILE_NO, DB_TASK *);static int  pr_node(FILE_NO, F_ADDR, int *, int *, DB_BOOLEAN, DB_TASK *);static void p_hex(char *, int);static void usage(void);/* List the valid key file names*/static void list_key_files(DB_TASK *task){    int i;    vftprintf(stderr, DB_TEXT("Valid key file names are:\n"));    for (i = 0; i < task->size_ft; i++)    {        if (task->file_table[i].ft_type == 'k')            vftprintf(stderr, DB_TEXT("\t%s\n"), task->file_table[i].ft_name);    }}void EXTERNAL_FCN keydump_dberr(int errnum, DB_TCHAR *msg){    vtprintf(DB_TEXT("\n*** Database error %d - %s\n"),        errnum, msg);    vtprintf(DB_TEXT("\terrno = %d\n"), errno);}int MAIN(int argc, DB_TCHAR *argv[]){    DB_TCHAR    dbfname[FILENMLEN];    DB_TCHAR   *keyfile = NULL;    DB_TCHAR   *dbname = NULL;    int         i, status, num_keys = 0;    int        *key_fld = NULL;    int        *key_len = NULL;    DB_BOOLEAN  hex = FALSE;    FILE_NO     fno;    F_ADDR      page, pz_next;    DB_TASK    *task;    SG         *sg = NULL;#if defined(SAFEGARDE)    DB_TCHAR   *cp;    DB_TCHAR   *password;    int         mode;#endif    vtprintf(DBSTAR_UTIL_DESC(DB_TEXT("Key File Dump")));    /* process the options */    if (argc < 2)    {        usage();        return(1);    }    for (i = 1; i < argc; ++i)    {        if (argv[i][0] == DB_TEXT('-'))        {            switch (vtotlower(argv[i][1]))            {                case DB_TEXT('h'):                    hex = TRUE;                    break;                case DB_TEXT('s'):                    if (vtotlower(argv[i][2]) != DB_TEXT('g') || i == argc - 1)                    {                        usage();                        return 1;                    }#if defined(SAFEGARDE)                    if ((cp = vtstrchr(argv[++i], DB_TEXT(','))) != NULL)                        *cp++ = DB_TEXT('\0');                    if (cp)                    {                        if (vtstrcmp(argv[i], "low") == 0)                            mode = LOW_ENC;                        else if (vtstrcmp(argv[i], "med") == 0)                            mode = MED_ENC;                        else if (vtstrcmp(argv[i], "high") == 0)                            mode = HIGH_ENC;                        else                        {                            usage();                            return 1;                        }                        password = cp;                    }                    else                    {                        mode = MED_ENC;                        password = argv[i];                    }                    break;#else                    vftprintf(stderr, DB_TEXT("SafeGarde is not available in this version\n"));                    return 1;#endif                default:                    usage();                    return(1);            }        }        else if (dbname == NULL)            dbname = argv[i];        else            keyfile = argv[i];    }    if (! dbname)    {        vftprintf(stderr, DB_TEXT("A database name must be supplied.\n"));        usage();        return(1);    }    if ((status = d_opentask(&task)) == S_OKAY)    {#if defined(SAFEGARDE)        if (mode != NO_ENC && (sg = sg_create(mode, password)) == NULL)        {            vftprintf(stderr, DB_TEXT("Failed to create SafeGarde context\n"));            return 1;        }#endif        if ((status = d_set_dberr(keydump_dberr, task)) == S_OKAY)        {            if ((status = d_open_sg(dbname, DB_TEXT("o"), sg, task)) == S_OKAY)            {                /* make sure all components are present */                if (! keyfile)                {                    vftprintf(stderr, DB_TEXT("A key file name must be supplied.\n"));                    list_key_files(task);   /* database must be open for this */                }                else                {                    /* look up file table entry */                    con_dbf(dbfname, keyfile, dbname,                              get_element(task->dbfpath, 0), task);                    for (fno = 0; fno < task->size_ft; ++fno)                    {                        if (psp_fileNameCmp(task->file_table[fno].ft_name, dbfname) == 0)                            break;                    }                    if (fno == task->size_ft)                    {                        vftprintf(stderr, DB_TEXT("File '%s' not found in database %s\n"),                                     keyfile, dbname);                        list_key_files(task);                    }                    else                    {                        if (task->file_table[fno].ft_type != 'k')                        {                            vftprintf(stderr, DB_TEXT("File '%s' is not a key file\n"),                                         keyfile);                            list_key_files(task);                        }                        else                        {                            /* build arrays of key indexes in fld table, and sizes */                            for (i = 0; i < (int) task->size_fd; ++i)                            {                                if (task->field_table[i].fd_key != NOKEY)                                    ++num_keys;                            }                            key_len = (int *) psp_cGetMemory(num_keys *                                    sizeof(int), 0);                            key_fld = (int *) psp_cGetMemory(num_keys *                                    sizeof(int), 0);                            if (!key_len || !key_fld)                            {                                vftprintf(stderr, DB_TEXT("unable to allocate memory for keys\n"));                            }                            else                            {                                for (i = 0; i < (int) task->size_fd; ++i)                                {                                    if (task->field_table[i].fd_key != NOKEY)                                    {                                        key_len[task->field_table[i].fd_keyno] = task->field_table[i].fd_len;                                        key_fld[task->field_table[i].fd_keyno] = i;                                    }                                }                                /* find out how many nodes there are, and dump them */                                if ((status = dio_pzread(fno, task)) == S_OKAY)                                {                                    pz_next = task->pgzero[fno].pz_next;                                    pr_keyfile_header(fno, task);                                    /* print each node */                                    for (page = ROOT_ADDR; page < pz_next; ++page)                                    {                                        status = pr_node(fno, page, key_fld, key_len,                                                              hex, task);                                        if (status != S_OKAY)                                            break;                                    }                                }                                psp_freeMemory(key_len, 0);                                psp_freeMemory(key_fld, 0);                            }                        }                    }                }                d_close(task);            }        }        d_closetask(task);    }    if (status != S_OKAY)    {        switch (status)        {            case S_INVDB:                vftprintf(stderr, DB_TEXT("Unable to locate database: %s\n"), dbname);                break;            case S_INCOMPAT:                vftprintf(stderr, DB_TEXT("Incompatible dictionary file. Re-run ddlp.\n"));                break;            default:                vftprintf(stderr, DB_TEXT("Error %d opening database.\n"), status);                break;        }        return(1);    }    return(0);}/* Print key dump header info*/static void pr_keyfile_header(FILE_NO fno, DB_TASK *task){    DB_TCHAR buf[80];    d_dbver(DB_TEXT("%V"), buf, sizeof(buf) / sizeof(DB_TCHAR));    vtprintf(DB_TEXT("%s\n"), buf);    vtprintf(DB_TEXT("Key File Dump Utility\n"));    d_dbver(DB_TEXT("%C"), buf, sizeof(buf) / sizeof(DB_TCHAR));    vtprintf(DB_TEXT("%s\n"), buf);    vtprintf(DB_TEXT("------------------------------------"));    vtprintf(DB_TEXT("------------------------------------\n"));    vtprintf(DB_TEXT("KEY FILE      : %s\n"), task->file_table[fno].ft_name);    vtprintf(DB_TEXT("DATABASE      : %s\n"), task->curr_db_table->db_name);    vtprintf(DB_TEXT("PAGE SIZE     : %d\n"), (int) task->file_table[fno].ft_pgsize);    vtprintf(DB_TEXT("SLOT SIZE     : %d\n"), (int) task->file_table[fno].ft_slsize);    vtprintf(DB_TEXT("SLOTS PER PAGE: %d\n"), (int) task->file_table[fno].ft_slots);    vtprintf(DB_TEXT("NEXT PAGE     : %ld (%08lx)\n"), task->pgzero[fno].pz_next, task->pgzero[fno].pz_next);    vtprintf(DB_TEXT("DELETE CHAIN  : %ld (%08lx)\n"), task->pgzero[fno].pz_dchain, task->pgzero[fno].pz_dchain);    vtprintf(DB_TEXT("------------------------------------"));    vtprintf(DB_TEXT("------------------------------------\n\n\n"));}/* Print node*/static int pr_node(    FILE_NO fno,    F_ADDR page,    int *key_fld,    int *key_len,    DB_BOOLEAN hex,    DB_TASK *task){    NODE       *node;    KEY_TYPE    key;    F_ADDR      orphan;    DB_ADDR     dba;    int         slot, fld, kt, status;    int         slot_len = task->file_table[fno].ft_slsize;    DB_TCHAR    text[MAXTEXT];    status = dio_get(fno, page, (char **) &node, NOPGHOLD, task);    if (status != S_OKAY)        return status;    if (node->used_slots == 0)    {        memcpy(&orphan, node->slots, sizeof(F_ADDR));        vtprintf(DB_TEXT("NODE : %ld (%08lx)  DELETED,  NEXT NODE: %ld (%08lx)\n\n\n"),                 page, page, orphan, orphan);    }    else    {        vtprintf(DB_TEXT("NODE : %ld (%08lx)\n"), page, page);        vtprintf(DB_TEXT("SLOTS: %d\n"), node->used_slots);        vtprintf(DB_TEXT("TIME : %s"), vtctime(&(node->last_chgd)));        for (slot = 0; slot < node->used_slots; ++slot)        {            memcpy(&key, node->slots + slot * slot_len, slot_len);            memcpy(&dba, key.ks.data + key_len[key.ks.keyno], sizeof(DB_ADDR));            vtprintf(DB_TEXT("SLOT:%3d  CHILD: %6ld (%08lx)  PREFIX: %3d  "),                     slot, key.ks.child, key.ks.child, key.ks.keyno);            vtprintf(DB_TEXT("LENGTH: %3d  DB_ADDR: %08lx"),                     key_len[key.ks.keyno], dba);            fld = key_fld[key.ks.keyno];            if (hex)            {                if (task->field_table[fld].fd_type == COMKEY)                {                    kt = task->field_table[fld].fd_ptr;                    while (task->key_table[kt].kt_key == fld)                    {                        p_hex(key.ks.data + task->key_table[kt].kt_ptr,                              task->field_table[task->key_table[kt].kt_field].fd_len);                        kt++;                    }                    vtprintf(DB_TEXT("\n"));                }                else                {                    p_hex(key.ks.data, key_len[key.ks.keyno]);                    vtprintf(DB_TEXT("\n"));                }            }            else            {                if (task->field_table[fld].fd_type == COMKEY)                {                    kt = task->field_table[fld].fd_ptr;                    while (task->key_table[kt].kt_key == fld)                    {                        fldtotxt(task->key_table[kt].kt_field,                                 key.ks.data + task->key_table[kt].kt_ptr,                                 text, 0, task);                        vtprintf(DB_TEXT("\n          %s"), text);                        kt++;                    }                    vtprintf(DB_TEXT("\n"));                }                else                {                    fldtotxt(fld, key.ks.data, text, 0, task);                    vtprintf(DB_TEXT("\n          %s\n"), text);                }            }        }        memcpy(&orphan, node->slots + slot * slot_len, sizeof(F_ADDR));        vtprintf(DB_TEXT("SLOT:%3d  CHILD: %6ld (%08lx)\n\n\n"), slot, orphan, orphan);    }    return(0);}static void p_hex(char *s, int len){    char ch;    int i;    for (i = 0; i < len; ++i)    {        if (i % 36 == 0)            vtprintf(DB_TEXT("\n          "));        ch = s[i];        vtprintf(DB_TEXT("%02x "), 0xFF & ch);    }}static void usage(){    vftprintf(stderr, DB_TEXT("usage: keydump [-h] dbname keyfile\n"));    vftprintf(stderr, DB_TEXT("   where   -h prints fields in hexidecimal notation\n"));    vftprintf(stderr, DB_TEXT("Default is formatted field output.\n"));    vftprintf(stderr, DB_TEXT("To see list of key files, omit keyfile from command ddlp_g.line.\n"));}VXSTARTUP("keydump", 0)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?