Mercurial > libpst
view src/getidblock.c @ 60:97b7706bdda2
Work around bogus 7c.b5 blocks in some messages that have been read.
They appear to have attachments, but of some unknown format.
Before the message was read, it did not have any attachments.
Use autoscan to cleanup our autoconf system.
Use autoconf to detect when we need to use our XGetopt files
and other header files.
More fields, including BCC.
Fix missing LE32_CPU byte swapping for FILETIME types.
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Sat, 16 Feb 2008 12:26:35 -0800 |
parents | 7d5c637aaafb |
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"); }