Mercurial > libpst
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"); }