view src/getidblock.c @ 118:0f1492b7fe8b

patch from Fridrich Strba for building on mingw and general cleanup of autoconf files add processing for pst files of type 0x0f start adding support for properly building and installing libpst.so and the header files required to use it. remove version.h since the version number is now in config.h more const correctness issues regarding getopt()
author Carl Byington <carl@five-ten-sg.com>
date Sat, 31 Jan 2009 12:12:36 -0800
parents 3ec5ad97e926
children 6395ced2b8b2
line wrap: on
line source


#include "define.h"
#include "libpst.h"

static void usage();

int main(int argc, char* const* argv)
{
    // pass the id number to display on the command line
    char *fname, *sid;
    pst_file pstfile;
    uint64_t id;
    int decrypt = 0, process = 0, binary = 0, c;
    char *buf = NULL;
    size_t readSize;
    pst_item *item;
    pst_desc_ll *ptr;

    DEBUG_INIT("getidblock.log");
    DEBUG_REGISTER_CLOSE();
    DEBUG_ENT("main");

    while ((c = getopt(argc, argv, "bdp")) != -1) {
        switch (c) {
            case 'b':
                // enable binary output
                binary = 1;
                break;
            case 'd':
                //enable decrypt
                decrypt = 1;
                break;
            case 'p':
                // enable procesing of block
                process = 1;
                break;
            default:
                usage();
                exit(EXIT_FAILURE);
        }
    }

    if (optind + 1 >= argc) {
        // no more items on the cmd
        usage();
        exit(EXIT_FAILURE);
    }
    fname = argv[optind];
    sid   = argv[optind + 1];
    id    = (uint64_t)strtoll(sid, NULL, 0);

    DEBUG_MAIN(("Opening file\n"));
    memset(&pstfile, 0, sizeof(pstfile));
    if (pst_open(&pstfile, fname)) {
        DIE(("Error opening file\n"));
    }

    DEBUG_MAIN(("Loading Index\n"));
    if (pst_load_index(&pstfile) != 0) {
        DIE(("Error loading file index\n"));
    }
    //  if ((ptr = pst_getID(&pstfile, id)) == NULL) {
    //    DIE(("id not found [%#x]\n", id));
    //  }

    DEBUG_MAIN(("Loading block\n"));

    if ((readSize = pst_ff_getIDblock(&pstfile, id, &buf)) <= 0 || buf == NULL) {
        //      if ((readSize = pst_read_block_size(&pstfile, ptr->offset, ptr->size, &buf, 1, 1)) < ptr->size) {
        DIE(("Error loading block\n"));
    }
    if (binary == 0)
        printf("Block %#"PRIx64", size %#x[%i]\n", id, (unsigned int) readSize, (int) readSize);

    if (decrypt != 0)
        if (pst_decrypt(id, buf, readSize, (int) pstfile.encryption) != 0) {
            DIE(("Error decrypting block\n"));
        }

    DEBUG_MAIN(("Printing block... [id %#x, size %#x]\n", id, readSize));
    if (binary == 0) {
        pst_debug_hexdumper(stdout, buf, readSize, 0x10, 0);
    } else {
        if (fwrite(buf, 1, readSize, stdout) != 0) {
            DIE(("Error occured during writing of buf to stdout\n"));
        }
    }
    free(buf);

    if (process != 0) {
        DEBUG_MAIN(("Parsing block...\n"));
        ptr = pstfile.d_head;
        while (ptr != NULL) {
            if (ptr->list_index != NULL && ptr->list_index->id == id)
                break;
            if (ptr->desc != NULL && ptr->desc->id == id)
                break;
            ptr = pst_getNextDptr(ptr);
        }
        if (ptr == NULL) {
            ptr = (pst_desc_ll *) xmalloc(sizeof(pst_desc_ll));
            ptr->desc = pst_getID(&pstfile, id);
            ptr->list_index = NULL;
        }
        if (ptr != NULL) {
            if ((item = pst_parse_item(&pstfile, ptr)) != NULL)
                pst_freeItem(item);
        } else {
            DEBUG_MAIN(("item not found with this ID\n"));
            printf("Cannot find the owning Record of this ID. Cannot parse\n");
        }
    }

    if (pst_close(&pstfile) != 0) {
        DIE(("pst_close failed\n"));
    }

    DEBUG_RET();
    return 0;
}

void usage()
{
    printf("usage: getidblock [options] filename id\n");
    printf("\tfilename - name of the file to access\n");
    printf("\tid - ID of the block to fetch - can begin with 0x for hex\n");
    printf("\toptions\n");
    printf("\t\t-d\tDecrypt the block before printing\n");
    printf("\t\t-p\tProcess the block before finishing.\n");
    printf("\t\t\tView the debug log for information\n");
}