view src/dumpblocks.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 <stdlib.h>
#include <unistd.h>
#include "libpst.h"

#define OUT_BUF 20
int main(int argc, char **argv) {
  pst_file pstfile;
  pst_index_ll *ptr;
  char *outdir=NULL, *file=NULL, *outname=NULL;
  char *buf=NULL;
  int c;
  FILE *fp;

  while ((c=getopt(argc, argv, "o:"))!=-1) {
    switch(c) {
    case 'o':
      outdir=optarg;
      break;
    default:
      printf("Unknown switch %c\n", c);
    }
  }
  if (optind < argc) {
    file = argv[optind];
  } else {
    printf("Usage: dumpblocks [options] pstfile\n");
    printf("\tcopies the datablocks from the pst file into seperate files\n");
    printf("Options: \n");
    printf("\t-o target\tSpecify the output directory\n");
    exit(1);
  }
  DEBUG_INIT("dumpblocks.log");
  DEBUG_REGISTER_CLOSE();
  DEBUG_ENT("main");

  printf("Opening file %s\n",file);
  if (pst_open(&pstfile, file)) {
    printf("Failed to open file %s\n", file);
    exit(1);
  }

  printf("Reading Indexes\n");
  if (pst_load_index(&pstfile)) {
    printf("Failed to load indexes in file %s\n", argv[1]);
    exit(1);
   }

  if (outdir != NULL)
    if (chdir(outdir)) {
      printf("Failed to change into directory %s\n", outdir);
      exit(1);
    }

  ptr = pstfile.i_head;
  outname = (char*) xmalloc(OUT_BUF);
  printf("Saving blocks\n");
  while (ptr != NULL) {
    /*    if (pstfile.encryption == PST_ENC) {
      c = pst_ff_getIDblock_dec(&pstfile, ptr->id, buf);
      } else {*/
    if ((ptr->id & 0x02)==0 && pstfile.encryption == PST_ENC) {
      c = pst_ff_getIDblock_dec(&pstfile, ptr->id, &buf);
    } else {
      c = pst_ff_getIDblock(&pstfile, ptr->id, &buf);
    }

    if (c > 0) {
      snprintf(outname, OUT_BUF, "%llx", ptr->id);
      if ((fp = fopen(outname, "wb")) == NULL) {
	printf("Failed to open file %s\n", outname);
	continue;
      }
      fwrite(buf, 1, c, fp);
      fclose(fp);
    } else {
      printf("Failed to read block id %#llx\n", ptr->id);
    }
    ptr = ptr->next;
  }
  pst_close(&pstfile);
  DEBUG_RET();
  return 0;
}