Mercurial > libpst
view src/getidblock.c @ 59:7d5c637aaafb
General cleanup and code fixes.
Use autoscan to cleanup our autoconf system.
Use autoconf to detect when we need to use our XGetopt files and other header files.
Decode BCC field.
Fix missing LE32_CPU byte swapping for FILETIME types.
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Thu, 14 Feb 2008 14:55:32 -0800 |
parents | 034641c26ab9 |
children | 3cb02cb1e6cd |
line wrap: on
line source
#include "define.h" #include <stdio.h> #include <string.h> #ifndef __GNUC__ # include "XGetopt.h" #endif #ifndef _WIN32 # include <unistd.h> #endif #include "libpst.h" static void usage(); int main(int argc, char ** argv) { // pass the id number to display on the command line char *fname, *sid; pst_file pstfile; unsigned int 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 = (unsigned int)strtol(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 %#x, size %#x[%i]\n",id, (unsigned int)readSize, (int) readSize); if (decrypt!=0) if (pst_decrypt(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"); }