# HG changeset patch
# User carl
# Date 1201795410 28800
# Node ID 034641c26ab914c088e0ba93a65ec87ae1565b4b
# Parent 06c0262ad68955aebf8d1e6e5ec77495e24638b9
code cleanup
diff -r 06c0262ad689 -r 034641c26ab9 ChangeLog
--- a/ChangeLog Tue Jan 22 14:39:02 2008 -0800
+++ b/ChangeLog Thu Jan 31 08:03:30 2008 -0800
@@ -1,3 +1,11 @@
+LibPST 0.6.6 (2008-01-xx)
+===============================
+
+ * More code cleanup, removing unnecessary null terminations on
+ binary buffers. All pst file reads now go thru one function.
+ Logging all pst reads to detect cases where we read the same data
+ multiple times - discovers node sizes are actually 512 bytes.
+
LibPST 0.6.5 (2008-01-22)
===============================
diff -r 06c0262ad689 -r 034641c26ab9 configure.in
--- a/configure.in Tue Jan 22 14:39:02 2008 -0800
+++ b/configure.in Thu Jan 31 08:03:30 2008 -0800
@@ -1,7 +1,7 @@
AC_INIT(configure.in)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(libpst,0.6.5)
+AM_INIT_AUTOMAKE(libpst,0.6.6)
AC_PATH_PROGS(BASH, bash)
AC_LANG_CPLUSPLUS
diff -r 06c0262ad689 -r 034641c26ab9 regression/regression-tests.bash
--- a/regression/regression-tests.bash Tue Jan 22 14:39:02 2008 -0800
+++ b/regression/regression-tests.bash Thu Jan 31 08:03:30 2008 -0800
@@ -29,5 +29,5 @@
$val ../src/lspst -d dumper ams.pst >out9.err 2>&1
../src/readpstlog -f I dumper >ams.log
-rm -f dumper lspst.debug
+rm -f dumper
diff -r 06c0262ad689 -r 034641c26ab9 src/dumpblocks.c
--- a/src/dumpblocks.c Tue Jan 22 14:39:02 2008 -0800
+++ b/src/dumpblocks.c Thu Jan 31 08:03:30 2008 -0800
@@ -10,7 +10,7 @@
pst_file pstfile;
pst_index_ll *ptr;
char *outdir=NULL, *file=NULL, *outname=NULL;
- unsigned char *buf=NULL;
+ char *buf=NULL;
int c;
FILE *fp;
diff -r 06c0262ad689 -r 034641c26ab9 src/getidblock.c
--- a/src/getidblock.c Tue Jan 22 14:39:02 2008 -0800
+++ b/src/getidblock.c Thu Jan 31 08:03:30 2008 -0800
@@ -21,7 +21,7 @@
pst_file pstfile;
unsigned int id;
int decrypt = 0, process = 0, binary = 0, c;
- unsigned char *buf = NULL;
+ char *buf = NULL;
size_t readSize;
pst_item *item;
pst_desc_ll* ptr;
diff -r 06c0262ad689 -r 034641c26ab9 src/libpst.c
--- a/src/libpst.c Tue Jan 22 14:39:02 2008 -0800
+++ b/src/libpst.c Thu Jan 31 08:03:30 2008 -0800
@@ -40,21 +40,21 @@
#define INDEX_BACK32 (off_t)0xC0
#define SECOND_POINTER32 (off_t)0xBC
#define SECOND_BACK32 (off_t)0xB8
-#define ENC_OFFSET32 (off_t)0x1CD
+#define ENC_TYPE32 (off_t)0x1CD
#define FILE_SIZE_POINTER64 (off_t)0xB8
#define INDEX_POINTER64 (off_t)0xF0
#define INDEX_BACK64 (off_t)0xE8
#define SECOND_POINTER64 (off_t)0xE0
#define SECOND_BACK64 (off_t)0xD8
-#define ENC_OFFSET64 (off_t)0x201
+#define ENC_TYPE64 (off_t)0x201
#define FILE_SIZE_POINTER ((pf->do_read64) ? FILE_SIZE_POINTER64 : FILE_SIZE_POINTER32)
#define INDEX_POINTER ((pf->do_read64) ? INDEX_POINTER64 : INDEX_POINTER32)
#define INDEX_BACK ((pf->do_read64) ? INDEX_BACK64 : INDEX_BACK32)
#define SECOND_POINTER ((pf->do_read64) ? SECOND_POINTER64 : SECOND_POINTER32)
#define SECOND_BACK ((pf->do_read64) ? SECOND_BACK64 : SECOND_BACK32)
-#define ENC_OFFSET ((pf->do_read64) ? ENC_OFFSET64 : ENC_OFFSET32)
+#define ENC_TYPE ((pf->do_read64) ? ENC_TYPE64 : ENC_TYPE32)
#define PST_SIGNATURE 0x4E444221
@@ -176,7 +176,7 @@
}
// Check pst file magic
- if (fread(&sig, sizeof(sig), (size_t)1, pf->fp) == 0) {
+ if (pst_getAtPos(pf, 0, &sig, sizeof(sig)) != sizeof(sig)) {
(void)fclose(pf->fp);
WARN(("cannot read signature from PST file. Closing on error\n"));
DEBUG_RET();
@@ -192,7 +192,7 @@
}
// read index type
- (void)pst_getAtPos(pf->fp, INDEX_TYPE_OFFSET, &(pf->ind_type), sizeof(pf->ind_type));
+ (void)pst_getAtPos(pf, INDEX_TYPE_OFFSET, &(pf->ind_type), sizeof(pf->ind_type));
DEBUG_INFO(("index_type = %i\n", pf->ind_type));
switch (pf->ind_type) {
case INDEX_TYPE32 :
@@ -208,7 +208,7 @@
}
// read encryption setting
- (void)pst_getAtPos(pf->fp, ENC_OFFSET, &(pf->encryption), sizeof(pf->encryption));
+ (void)pst_getAtPos(pf, ENC_TYPE, &(pf->encryption), sizeof(pf->encryption));
DEBUG_INFO(("encrypt = %i\n", pf->encryption));
pf->index2_back = pst_getIntAtPos(pf, SECOND_BACK);
@@ -264,7 +264,7 @@
}
-size_t pst_attach_to_mem(pst_file *pf, pst_item_attach *attach, unsigned char **b){
+size_t pst_attach_to_mem(pst_file *pf, pst_item_attach *attach, char **b){
size_t size=0;
pst_index_ll *ptr;
pst_holder h = {b, NULL, 0, "", 0};
@@ -395,14 +395,15 @@
pst_desc_ll *p;
pst_num_array *na;
pst_index2_ll *id2_head = NULL;
- unsigned char *buffer=NULL, *headerbuffer=NULL;
+ char *buffer=NULL, *headerbuffer=NULL;
size_t bsize=0, hsize=0, bptr=0;
pst_x_attrib xattrib;
int32_t tint, err=0, x;
pst_x_attrib_ll *ptr, *p_head=NULL, *p_sh=NULL, *p_sh2=NULL;
DEBUG_ENT("pst_loadExtendedAttributes");
- if ((p = pst_getDptr(pf, (uint64_t)0x61)) == NULL) {
+ p = pst_getDptr(pf, (uint64_t)0x61);
+ if (!p) {
DEBUG_WARN(("Cannot find DescID 0x61 for loading the Extended Attributes\n"));
DEBUG_RET();
return 0;
@@ -527,8 +528,7 @@
return 1;
}
-#define BLOCK_SIZE32 516 // index blocks
-#define DESC_BLOCK_SIZE32 516 // descriptor blocks
+
#define ITEM_COUNT_OFFSET32 0x1f0 // count byte
#define LEVEL_INDICATOR_OFFSET32 0x1f3 // node or leaf
#define BACKLINK_OFFSET32 0x1f8 // backlink u1 value
@@ -537,8 +537,6 @@
#define INDEX_COUNT_MAX32 41 // max active items
#define DESC_COUNT_MAX32 31 // max active items
-#define BLOCK_SIZE64 512 // index blocks
-#define DESC_BLOCK_SIZE64 512 // descriptor blocks
#define ITEM_COUNT_OFFSET64 0x1e8 // count byte
#define LEVEL_INDICATOR_OFFSET64 0x1eb // node or leaf
#define BACKLINK_OFFSET64 0x1f8 // backlink u1 value
@@ -547,8 +545,8 @@
#define INDEX_COUNT_MAX64 20 // max active items
#define DESC_COUNT_MAX64 15 // max active items
-#define BLOCK_SIZE (size_t)((pf->do_read64) ? BLOCK_SIZE64 : BLOCK_SIZE32)
-#define DESC_BLOCK_SIZE (size_t)((pf->do_read64) ? DESC_BLOCK_SIZE64 : DESC_BLOCK_SIZE32)
+#define BLOCK_SIZE 512 // index blocks
+#define DESC_BLOCK_SIZE 512 // descriptor blocks
#define ITEM_COUNT_OFFSET (size_t)((pf->do_read64) ? ITEM_COUNT_OFFSET64 : ITEM_COUNT_OFFSET32)
#define LEVEL_INDICATOR_OFFSET (size_t)((pf->do_read64) ? LEVEL_INDICATOR_OFFSET64 : LEVEL_INDICATOR_OFFSET32)
#define BACKLINK_OFFSET (size_t)((pf->do_read64) ? BACKLINK_OFFSET64 : BACKLINK_OFFSET32)
@@ -1296,8 +1294,8 @@
pst_num_array * pst_parse_block(pst_file *pf, uint64_t block_id, pst_index2_ll *i2_head, pst_num_array *na_head) {
- unsigned char *buf = NULL;
- size_t read_size = 0;
+ char *buf = NULL;
+ size_t read_size = 0;
pst_subblocks subblocks;
pst_num_array *na_ptr = NULL;
pst_block_offset_pointer block_offset1;
@@ -4005,7 +4003,7 @@
}
-int pst_getBlockOffset(unsigned char *buf, size_t read_size, uint32_t i_offset, uint32_t offset, pst_block_offset *p) {
+int pst_getBlockOffset(char *buf, size_t read_size, uint32_t i_offset, uint32_t offset, pst_block_offset *p) {
uint32_t low = offset & 0xf;
uint32_t of1 = offset >> 4;
DEBUG_ENT("pst_getBlockOffset");
@@ -4021,6 +4019,7 @@
DEBUG_WARN(("get block offset finds from=%i(%#x), to=%i(%#x)\n", p->from, p->from, p->to, p->to));
if (p->from > p->to) {
DEBUG_WARN(("get block offset from > to"));
+ DEBUG_RET();
return 0;
}
DEBUG_RET();
@@ -4054,8 +4053,7 @@
pst_index_ll * pst_getID2(pst_index2_ll *ptr, uint64_t id) {
DEBUG_ENT("pst_getID2");
- DEBUG_INDEX(("Head = %p\n", ptr));
- DEBUG_INDEX(("Trying to find %#x\n", id));
+ DEBUG_INDEX(("Head = %p id = %#llx\n", ptr, id));
while (ptr && (ptr->id2 != id)) {
ptr = ptr->next;
}
@@ -4133,24 +4131,29 @@
}
+/**
+ * Read a block of data from file into memory
+ * @param pf PST file
+ * @param offset offset in the pst file of the data
+ * @param size size of the block to be read
+ * @param buf reference to pointer to buffer. If this pointer
+ is non-NULL, it will first be free()d
+ * @return size of block read into memory
+ */
size_t pst_read_block_size(pst_file *pf, off_t offset, size_t size, char **buf) {
- off_t fpos;
size_t rsize;
-
DEBUG_ENT("pst_read_block_size");
DEBUG_READ(("Reading block from %#x, %i bytes\n", offset, size));
- fpos = ftell(pf->fp);
- (void)fseek(pf->fp, offset, SEEK_SET);
if (*buf) {
DEBUG_READ(("Freeing old memory\n"));
free(*buf);
}
-
- *buf = (void*) xmalloc(size);
- rsize = fread(*buf, (size_t)1, size, pf->fp);
+ *buf = (char*) xmalloc(size);
+
+ rsize = pst_getAtPos(pf, offset, *buf, size);
if (rsize != size) {
- DEBUG_WARN(("Didn't read all that I could. fread returned less [%i instead of %i]\n", rsize, size));
+ DEBUG_WARN(("Didn't read all the data. fread returned less [%i instead of %i]\n", rsize, size));
if (feof(pf->fp)) {
DEBUG_WARN(("We tried to read past the end of the file at [offset %#x, size %#x]\n", offset, size));
} else if (ferror(pf->fp)) {
@@ -4158,12 +4161,10 @@
} else {
DEBUG_WARN(("I can't tell why it failed\n"));
}
- size = rsize;
}
- (void)fseek(pf->fp, fpos, SEEK_SET);
DEBUG_RET();
- return size;
+ return rsize;
}
@@ -4214,51 +4215,81 @@
uint64_t buf64;
uint32_t buf32;
if (pf->do_read64) {
- (void)pst_getAtPos(pf->fp, pos, &buf64, sizeof(buf64));
+ (void)pst_getAtPos(pf, pos, &buf64, sizeof(buf64));
LE64_CPU(buf64);
return buf64;
}
else {
- (void)pst_getAtPos(pf->fp, pos, &buf32, sizeof(buf32));
+ (void)pst_getAtPos(pf, pos, &buf32, sizeof(buf32));
LE32_CPU(buf32);
return buf32;
}
}
-
-int pst_getAtPos(FILE *fp, off_t pos, void* buf, size_t size) {
+/**
+ * Read part of the pst file.
+ *
+ * @param pf PST file structure
+ * @param pos offset of the data in the pst file
+ * @param buf buffer to contain the data
+ * @param size size of the buffer and the amount of data to be read
+ * @return actual read size, 0 if seek error
+ */
+
+size_t pst_getAtPos(pst_file *pf, off_t pos, void* buf, size_t size) {
+ size_t rc;
DEBUG_ENT("pst_getAtPos");
- if (fseek(fp, pos, SEEK_SET) == -1) {
+// pst_block_recorder **t = &pf->block_head;
+// pst_block_recorder *p = pf->block_head;
+// while (p && ((p->offset+p->size) <= pos)) {
+// t = &p->next;
+// p = p->next;
+// }
+// if (p && (p->offset <= pos) && (pos < (p->offset+p->size))) {
+// // bump the count
+// p->readcount++;
+// } else {
+// // add a new block
+// pst_block_recorder *tail = *t;
+// p = (pst_block_recorder*)xmalloc(sizeof(*p));
+// *t = p;
+// p->next = tail;
+// p->offset = pos;
+// p->size = size;
+// p->readcount = 1;
+// }
+// DEBUG_MAIN(("pst file old offset %#llx old size %#x read count %i offset %#llx size %#x\n",
+// p->offset, p->size, p->readcount, pos, size));
+
+ if (fseek(pf->fp, pos, SEEK_SET) == -1) {
DEBUG_RET();
- return 1;
+ return 0;
}
- if (fread(buf, (size_t)1, size, fp) < size) {
- DEBUG_RET();
- return 2;
- }
+ rc = fread(buf, (size_t)1, size, pf->fp);
DEBUG_RET();
- return 0;
+ return rc;
}
/**
* Get an ID block from file using _pst_ff_getIDblock and decrypt if necessary
- * @param pf PST file structure
- * @param id ID of block to retrieve
- * @param b Reference to pointer that will be set to new block. Any memory
- pointed to by buffer will be free()d beforehand
- * @return Size of block pointed to by *b
+ *
+ * @param pf PST file structure
+ * @param id ID of block to retrieve
+ * @param buf Reference to pointer that will be set to new block. Any memory
+ pointed to by buffer will be free()d beforehand
+ * @return Size of block pointed to by *b
*/
-size_t pst_ff_getIDblock_dec(pst_file *pf, uint64_t id, unsigned char **b) {
+size_t pst_ff_getIDblock_dec(pst_file *pf, uint64_t id, char **buf) {
size_t r;
int noenc = (int)(id & 2); // disable encryption
DEBUG_ENT("pst_ff_getIDblock_dec");
DEBUG_INDEX(("for id %#x\n", id));
- r = pst_ff_getIDblock(pf, id, b);
+ r = pst_ff_getIDblock(pf, id, buf);
if ((pf->encryption) && !(noenc)) {
- (void)pst_decrypt(*b, r, pf->encryption);
+ (void)pst_decrypt(*buf, r, pf->encryption);
}
- DEBUG_HEXDUMPC(*b, r, 16);
+ DEBUG_HEXDUMPC(*buf, r, 16);
DEBUG_RET();
return r;
}
@@ -4266,47 +4297,31 @@
/**
* Read a block of data from file into memory
- * @param pf PST file
- * @param id identifier of block to read
- * @param b reference to pointer to buffer. If this pointer
- is non-NULL, it will first be free()d
- * @return size of block read into memory
+ * @param pf PST file
+ * @param id identifier of block to read
+ * @param buf reference to pointer to buffer. If this pointer
+ is non-NULL, it will first be free()d
+ * @return size of block read into memory
*/
-size_t pst_ff_getIDblock(pst_file *pf, uint64_t id, unsigned char** b) {
+size_t pst_ff_getIDblock(pst_file *pf, uint64_t id, char** buf) {
pst_index_ll *rec;
- size_t rsize = 0;
+ size_t rsize;
DEBUG_ENT("pst_ff_getIDblock");
- if ((rec = pst_getID(pf, id)) == NULL) {
+ rec = pst_getID(pf, id);
+ if (!rec) {
DEBUG_INDEX(("Cannot find ID %#llx\n", id));
DEBUG_RET();
return 0;
}
- (void)fseek(pf->fp, rec->offset, SEEK_SET);
- if (*b) {
- DEBUG_INDEX(("freeing old memory in b\n"));
- free(*b);
- }
-
DEBUG_INDEX(("id = %#llx, record size = %#x, offset = %#x\n", id, rec->size, rec->offset));
- *b = (char*) xmalloc(rec->size+1);
- rsize = fread(*b, (size_t)1, rec->size, pf->fp);
- if (rsize != rec->size) {
- DEBUG_WARN(("Didn't read all the size. fread returned less [%i instead of %i]\n", rsize, rec->size));
- if (feof(pf->fp)) {
- DEBUG_WARN(("We tried to read past the end of the file [offset %#x, size %#x]\n", rec->offset, rec->size));
- } else if (ferror(pf->fp)) {
- DEBUG_WARN(("Some error occured on the file stream\n"));
- } else {
- DEBUG_WARN(("No error has been set on the file stream\n"));
- }
- }
+ rsize = pst_read_block_size(pf, rec->offset, rec->size, buf);
DEBUG_RET();
return rsize;
}
#define PST_PTR_BLOCK_SIZE 0x120
-size_t pst_ff_getID2block(pst_file *pf, uint64_t id2, pst_index2_ll *id2_head, unsigned char** buf) {
+size_t pst_ff_getID2block(pst_file *pf, uint64_t id2, pst_index2_ll *id2_head, char** buf) {
size_t ret;
pst_index_ll* ptr;
pst_holder h = {buf, NULL, 0, "", 0};
@@ -4326,7 +4341,7 @@
size_t pst_ff_getID2data(pst_file *pf, pst_index_ll *ptr, pst_holder *h) {
size_t ret;
- unsigned char *b = NULL, *t;
+ char *b = NULL, *t;
DEBUG_ENT("pst_ff_getID2data");
if (!(ptr->id & 0x02)) {
ret = pst_ff_getIDblock_dec(pf, ptr->id, &b);
@@ -4351,8 +4366,8 @@
DEBUG_READ(("Assuming it is a multi-block record because of it's id\n"));
ret = pst_ff_compile_ID(pf, ptr->id, h, (size_t)0);
}
- if (h->buf && *h->buf)
- (*(h->buf))[ret]='\0';
+ // bogus null termination off the end of the buffer!!
+ //if (h->buf && *h->buf) (*(h->buf))[ret]='\0';
DEBUG_RET();
return ret;
}
@@ -4361,8 +4376,8 @@
size_t pst_ff_compile_ID(pst_file *pf, uint64_t id, pst_holder *h, size_t size) {
size_t z, a, b;
uint16_t count, y;
- unsigned char * buf3 = NULL, *buf2 = NULL, *t;
- unsigned char *b_ptr;
+ char * buf3 = NULL, *buf2 = NULL, *t;
+ char *b_ptr;
pst_block_hdr block_hdr;
pst_table3_rec table3_rec; //for type 3 (0x0101) blocks
@@ -4370,6 +4385,7 @@
a = pst_ff_getIDblock(pf, id, &buf3);
if (!a) {
if (buf3) free(buf3);
+ DEBUG_RET();
return 0;
}
DEBUG_HEXDUMPC(buf3, a, 0x10);
@@ -4409,6 +4425,7 @@
DEBUG_WARN(("call to getIDblock returned zero %i\n", z));
if (buf2) free(buf2);
free(buf3);
+ DEBUG_RET();
return z;
}
if (h->buf) {
diff -r 06c0262ad689 -r 034641c26ab9 src/libpst.h
--- a/src/libpst.h Tue Jan 22 14:39:02 2008 -0800
+++ b/src/libpst.h Thu Jan 31 08:03:30 2008 -0800
@@ -480,11 +480,19 @@
} pst_x_attrib_ll;
+typedef struct pst_block_recorder {
+ struct pst_block_recorder *next;
+ off_t offset;
+ size_t size;
+ int readcount;
+} pst_block_recorder;
+
+
typedef struct pst_file {
pst_index_ll *i_head, *i_tail;
- pst_index2_ll *i2_head;
- pst_desc_ll *d_head, *d_tail;
+ pst_desc_ll *d_head, *d_tail;
pst_x_attrib_ll *x_head;
+ pst_block_recorder *block_head;
//set this to 0 to read 32-bit pst files (pre Outlook 2003)
//set this to 1 to read 64-bit pst files (Outlook 2003 and later)
@@ -508,18 +516,18 @@
typedef struct pst_block_offset_pointer {
- unsigned char *from;
- unsigned char *to;
- int needfree;
+ char *from;
+ char *to;
+ int needfree;
} pst_block_offset_pointer;
typedef struct pst_num_item {
- uint32_t id; // not an id1 or id2, this is actually some sort of type code
- unsigned char *data;
- uint32_t type;
- size_t size;
- char *extra;
+ uint32_t id; // not an id1 or id2, this is actually some sort of type code
+ char *data;
+ uint32_t type;
+ size_t size;
+ char *extra;
} pst_num_item;
@@ -533,7 +541,7 @@
typedef struct pst_holder {
- unsigned char **buf;
+ char **buf;
FILE * fp;
int base64;
char base64_extra_chars[3];
@@ -542,9 +550,9 @@
typedef struct pst_subblock {
- unsigned char *buf;
- size_t read_size;
- size_t i_offset;
+ char *buf;
+ size_t read_size;
+ size_t i_offset;
} pst_subblock;
@@ -558,7 +566,7 @@
int pst_open(pst_file *pf, char *name, char *mode);
int pst_close(pst_file *pf);
pst_desc_ll * pst_getTopOfFolders(pst_file *pf, pst_item *root);
-size_t pst_attach_to_mem(pst_file *pf, pst_item_attach *attach, unsigned char **b);
+size_t pst_attach_to_mem(pst_file *pf, pst_item_attach *attach, char **b);
size_t pst_attach_to_file(pst_file *pf, pst_item_attach *attach, FILE* fp);
size_t pst_attach_to_file_base64(pst_file *pf, pst_item_attach *attach, FILE* fp);
int pst_load_index (pst_file *pf);
@@ -578,7 +586,7 @@
void pst_free_desc (pst_desc_ll *head);
void pst_free_xattrib(pst_x_attrib_ll *x);
int pst_getBlockOffsetPointer(pst_file *pf, pst_index2_ll *i2_head, pst_subblocks *subblocks, uint32_t offset, pst_block_offset_pointer *p);
-int pst_getBlockOffset(unsigned char *buf, size_t read_size, uint32_t i_offset, uint32_t offset, pst_block_offset *p);
+int pst_getBlockOffset(char *buf, size_t read_size, uint32_t i_offset, uint32_t offset, pst_block_offset *p);
pst_index2_ll* pst_build_id2(pst_file *pf, pst_index_ll* list, pst_index2_ll* head_ptr);
pst_index_ll* pst_getID(pst_file* pf, uint64_t id);
pst_index_ll* pst_getID2(pst_index2_ll * ptr, uint64_t id);
@@ -587,10 +595,10 @@
int pst_decrypt(unsigned char *buf, size_t size, unsigned char type);
uint64_t pst_getIntAt(pst_file *pf, char *buf);
uint64_t pst_getIntAtPos(pst_file *pf, off_t pos);
-int pst_getAtPos(FILE *fp, off_t pos, void* buf, size_t size);
-size_t pst_ff_getIDblock_dec(pst_file *pf, uint64_t id, unsigned char **b);
-size_t pst_ff_getIDblock(pst_file *pf, uint64_t id, unsigned char** b);
-size_t pst_ff_getID2block(pst_file *pf, uint64_t id2, pst_index2_ll *id2_head, unsigned char** buf);
+size_t pst_getAtPos(pst_file *pf, off_t pos, void* buf, size_t size);
+size_t pst_ff_getIDblock_dec(pst_file *pf, uint64_t id, char **b);
+size_t pst_ff_getIDblock(pst_file *pf, uint64_t id, char** b);
+size_t pst_ff_getID2block(pst_file *pf, uint64_t id2, pst_index2_ll *id2_head, char** buf);
size_t pst_ff_getID2data(pst_file *pf, pst_index_ll *ptr, pst_holder *h);
size_t pst_ff_compile_ID(pst_file *pf, uint64_t id, pst_holder *h, size_t size);
diff -r 06c0262ad689 -r 034641c26ab9 src/lspst.c
--- a/src/lspst.c Tue Jan 22 14:39:02 2008 -0800
+++ b/src/lspst.c Thu Jan 31 08:03:30 2008 -0800
@@ -145,6 +145,7 @@
}
}
close_enter_dir(&ff);
+ DEBUG_RET();
}
diff -r 06c0262ad689 -r 034641c26ab9 src/pst2ldif.cpp
--- a/src/pst2ldif.cpp Tue Jan 22 14:39:02 2008 -0800
+++ b/src/pst2ldif.cpp Thu Jan 31 08:03:30 2008 -0800
@@ -147,7 +147,7 @@
pst_item *item = NULL;
while (d_ptr) {
if (d_ptr->desc) {
- item = (pst_item*)pst_parse_item(&pstfile, d_ptr);
+ item = pst_parse_item(&pstfile, d_ptr);
DEBUG_INFO(("item pointer is %p\n", item));
if (item) {
if (item->message_store) {
diff -r 06c0262ad689 -r 034641c26ab9 src/readpst.c
--- a/src/readpst.c Tue Jan 22 14:39:02 2008 -0800
+++ b/src/readpst.c Thu Jan 31 08:03:30 2008 -0800
@@ -330,6 +330,7 @@
int l=0;
if (NULL == (fp = fopen(fname, "rb"))) {
fprintf(stderr, "Couldn't open file %s\n", fname );
+ DEBUG_RET();
return 1;
}
@@ -339,9 +340,11 @@
if (l != fwrite( buf, 1, l, stdout)) {
fprintf(stderr, "Couldn't output to stdout?\n");
+ DEBUG_RET();
return 1;
}
}
+ DEBUG_RET();
return 0;
}
@@ -662,8 +665,10 @@
// my_stristr varies from strstr in that its searches are case-insensitive
char *x=haystack, *y=needle, *z = NULL;
DEBUG_ENT("my_stristr");
- if (!haystack || !needle)
+ if (!haystack || !needle) {
+ DEBUG_RET();
return NULL;
+ }
while (*y != '\0' && *x != '\0') {
if (tolower(*y) == tolower(*x)) {
// move y on one
@@ -687,6 +692,7 @@
DEBUG_ENT("check_filename");
if (!t) {
DEBUG_RET();
+ return;
}
while ((t = strpbrk(t, "/\\:"))) {
// while there are characters in the second string that we don't want
@@ -767,6 +773,7 @@
enc = base64_encode (current_attach->data, current_attach->size);
if (!enc) {
DEBUG_EMAIL(("ERROR base64_encode returned NULL. Must have failed\n"));
+ DEBUG_RET();
return;
}
}
diff -r 06c0262ad689 -r 034641c26ab9 src/readpstlog.c
--- a/src/readpstlog.c Tue Jan 22 14:39:02 2008 -0800
+++ b/src/readpstlog.c Thu Jan 31 08:03:30 2008 -0800
@@ -21,219 +21,223 @@
int is_in(int a, int *b, int c);
int main(int argc, char** argv) {
- int level = 0;
+ int identity = 0;
+ int level = 0;
off_t *i = NULL;
- int x, ptr, stop=0, flag;
- char *fname, *buf, rec_type;
- unsigned char version;
- int *show_type=NULL, show_size=0;
- int *ex_type=NULL, ex_size=0;
- unsigned int funcname=0, filename=0, text=0, end=0, dtype=0, line=0, c;
- FILE *fp;
- struct pst_debug_file_rec_m mfile_rec;
- struct pst_debug_file_rec_l lfile_rec;
- char format = 'D'; // default
- while ((c = getopt(argc, argv, "f:t:x:")) != -1) {
- switch(c) {
- case 'f':
- // change the output format
- format = toupper(optarg[0]);
- break;
- case 't':
- //change the type of statements shown
- show_size = split_args(optarg, &show_type);
- // type = atoi(optarg);
- break;
- case 'x':
- // change the type of statements excluded
- ex_size = split_args(optarg, &ex_type);
- break;
- }
- }
- if (argc > optind) {
- fname = argv[optind++];
- } else {
- usage();
- exit(2);
- }
+ int x, ptr, stop=0, flag;
+ char *fname, *buf, rec_type;
+ unsigned char version;
+ int *show_type=NULL, show_size=0;
+ int *ex_type=NULL, ex_size=0;
+ unsigned int funcname=0, filename=0, text=0, end=0, dtype=0, line=0, c;
+ FILE *fp;
+ struct pst_debug_file_rec_m mfile_rec;
+ struct pst_debug_file_rec_l lfile_rec;
+ char format = 'D'; // default
+ while ((c = getopt(argc, argv, "f:t:x:")) != -1) {
+ switch(c) {
+ case 'f':
+ // change the output format
+ format = toupper(optarg[0]);
+ break;
+ case 't':
+ //change the type of statements shown
+ show_size = split_args(optarg, &show_type);
+ // type = atoi(optarg);
+ break;
+ case 'x':
+ // change the type of statements excluded
+ ex_size = split_args(optarg, &ex_type);
+ break;
+ }
+ }
+ if (argc > optind) {
+ fname = argv[optind++];
+ } else {
+ usage();
+ exit(2);
+ }
- fp = fopen(fname, "rb");
- if (fp == NULL) {
- printf("Error. couldn't open debug file\n");
- return 2;
- }
- if (get(&version, sizeof(char), 1, fp)==0) {
- printf("Error. could not read version byte from front of file");
- return 3;
- }
+ fp = fopen(fname, "rb");
+ if (fp == NULL) {
+ printf("Error. couldn't open debug file\n");
+ return 2;
+ }
+ if (get(&version, sizeof(char), 1, fp)==0) {
+ printf("Error. could not read version byte from front of file");
+ return 3;
+ }
- if (version > DEBUG_VERSION) {
- printf("Version number is higher than the format I know about.");
- return 4;
- }
+ if (version > DEBUG_VERSION) {
+ printf("Version number is higher than the format I know about.");
+ return 4;
+ }
- buf = (char*) xmalloc(BUF_SIZE);
+ buf = (char*) xmalloc(BUF_SIZE);
- while (!stop) {
+ while (!stop) {
off_t temp;
- if (fread(&temp, sizeof(off_t), 1, fp)<=0) break;
+ if (fread(&temp, sizeof(off_t), 1, fp)<=0) break;
x = (int)temp;
- ptr = 0;
- if (x > 0) {
- if (i) free(i);
- i = (off_t*)xmalloc(sizeof(off_t)*(x+1));
- // plus 1 cause we want to read the offset of the next index
- if (get(i, sizeof(off_t), x+1, fp)==0) {
- // we have reached the end of the debug file
- printf("oh dear. we must now end\n");
- break;
- }
- while (ptr < x) {
- fseek(fp, i[ptr++], SEEK_SET);
- get(&rec_type, 1, sizeof(char), fp);
- if (rec_type == 'L') {
- get(&lfile_rec, sizeof(lfile_rec), 1, fp);
- funcname=lfile_rec.funcname;
- filename=lfile_rec.filename;
- text = lfile_rec.text;
- end = lfile_rec.end;
- dtype = lfile_rec.type;
- line = lfile_rec.line;
- } else if (rec_type == 'M') {
- get(&mfile_rec, sizeof(mfile_rec), 1, fp);
- funcname = mfile_rec.funcname;
- filename = mfile_rec.filename;
- text = mfile_rec.text;
- end = mfile_rec.end;
- dtype = mfile_rec.type;
- line = mfile_rec.line;
- }
- if (dtype == DEBUG_FUNCENT_NO) level++;
- if ((show_type == NULL || is_in(dtype, show_type, show_size)) &&
- (ex_type == NULL || !is_in(dtype, ex_type, ex_size))) {
- c = 0; flag = 0;
- while (c < end) {
- int ii = (level-1) * 4;
- if (ii < 0) ii = 0;
- if (ii > 64) ii = 64;
- char indent[ii+1];
- memset(indent, ' ', ii);
- indent[ii] = '\0';
- if (c + (BUF_SIZE-1) < end) {
- get(buf, 1, BUF_SIZE-1, fp);
- buf[BUF_SIZE-1] = '\0';
- c += BUF_SIZE-1;
- } else {
- get(buf, 1, end-c, fp);
- buf[end-c] = '\0';
- c = end;
- }
- if (flag == 0) {
- if (format == 'I') { // indented text format
- char *b = buf+text;
- printf("%s %s/%s[%d]: ", indent, &buf[filename], &buf[funcname], line);
- while (b) {
- char *p = strchr(b, '\n');
- if (p) {
- *p = '\0';
- printf("%s\n%s ", b, indent);
- b = p + 1;
- }
- else {
- printf("%s", b);
- b = NULL;
- }
- }
- }
- else if (format == 'T') { // text format
- printf("%s/%s[%d]: %s", &buf[filename], &buf[funcname], line, &buf[text]);
- } else {
- printf("Type: %d\nFile[line]: %s[%d]\nFunction:%s\nText:%s", dtype,
- &buf[filename], line, &buf[funcname], &buf[text]);
- }
- flag = 1;
- } else {
- if (format == 'I') {
- char *b = buf;
- while (b) {
- char *p = strchr(b, '\n');
- if (p) {
- *p = '\0';
- printf("%s\n%s ", b, indent);
- b = p + 1;
- }
- else {
- printf("%s", b);
- b = NULL;
- }
- }
- }
- else printf("%s", buf);
- }
- }
- printf("\n");
- }
- if (dtype == DEBUG_FUNCRET_NO) level--;
- }
- if (fseek(fp, i[ptr], SEEK_SET)==-1) {
- printf("finished\n");
- break;
- }
- } else {
- printf("...no more items\n");
- break;
- }
- }
- free(buf);
- fclose(fp);
- return 0;
+ ptr = 0;
+ if (x > 0) {
+ if (i) free(i);
+ i = (off_t*)xmalloc(sizeof(off_t)*(x+1));
+ // plus 1 cause we want to read the offset of the next index
+ if (get(i, sizeof(off_t), x+1, fp)==0) {
+ // we have reached the end of the debug file
+ printf("oh dear. we must now end\n");
+ break;
+ }
+ while (ptr < x) {
+ fseek(fp, i[ptr++], SEEK_SET);
+ get(&rec_type, 1, sizeof(char), fp);
+ if (rec_type == 'L') {
+ get(&lfile_rec, sizeof(lfile_rec), 1, fp);
+ funcname=lfile_rec.funcname;
+ filename=lfile_rec.filename;
+ text = lfile_rec.text;
+ end = lfile_rec.end;
+ dtype = lfile_rec.type;
+ line = lfile_rec.line;
+ } else if (rec_type == 'M') {
+ get(&mfile_rec, sizeof(mfile_rec), 1, fp);
+ funcname = mfile_rec.funcname;
+ filename = mfile_rec.filename;
+ text = mfile_rec.text;
+ end = mfile_rec.end;
+ dtype = mfile_rec.type;
+ line = mfile_rec.line;
+ }
+ if (dtype == DEBUG_FUNCENT_NO) level++;
+ if ((show_type == NULL || is_in(dtype, show_type, show_size)) &&
+ (ex_type == NULL || !is_in(dtype, ex_type, ex_size))) {
+ c = 0; flag = 0;
+ while (c < end) {
+ int ii = (level-1) * 4;
+ if (ii < 0) ii = 0;
+ if (ii > 64) ii = 64;
+ char indent[ii+1];
+ memset(indent, ' ', ii);
+ indent[ii] = '\0';
+ if (c + (BUF_SIZE-1) < end) {
+ get(buf, 1, BUF_SIZE-1, fp);
+ buf[BUF_SIZE-1] = '\0';
+ c += BUF_SIZE-1;
+ } else {
+ get(buf, 1, end-c, fp);
+ buf[end-c] = '\0';
+ c = end;
+ }
+ if (flag == 0) {
+ if (format == 'I') { // indented text format
+ char *b = buf+text;
+ identity++;
+ //printf("%s %d %s/%s[%d]: ", indent, identity, &buf[filename], &buf[funcname], line);
+ printf("%s %s/%s[%d]: ", indent, &buf[filename], &buf[funcname], line);
+ while (b) {
+ char *p = strchr(b, '\n');
+ if (p) {
+ *p = '\0';
+ printf("%s\n%s ", b, indent);
+ b = p + 1;
+ }
+ else {
+ printf("%s", b);
+ b = NULL;
+ }
+ }
+ }
+ else if (format == 'T') { // text format
+ printf("%s/%s[%d]: %s", &buf[filename], &buf[funcname], line, &buf[text]);
+ } else {
+ printf("Type: %d\nFile[line]: %s[%d]\nFunction:%s\nText:%s", dtype,
+ &buf[filename], line, &buf[funcname], &buf[text]);
+ }
+ flag = 1;
+ } else {
+ if (format == 'I') {
+ char *b = buf;
+ while (b) {
+ char *p = strchr(b, '\n');
+ if (p) {
+ *p = '\0';
+ printf("%s\n%s ", b, indent);
+ b = p + 1;
+ }
+ else {
+ printf("%s", b);
+ b = NULL;
+ }
+ }
+ }
+ else printf("%s", buf);
+ }
+ }
+ printf("\n");
+ }
+ if (dtype == DEBUG_FUNCRET_NO) level--;
+ }
+ if (fseek(fp, i[ptr], SEEK_SET)==-1) {
+ printf("finished\n");
+ break;
+ }
+ } else {
+ printf("...no more items\n");
+ break;
+ }
+ }
+ free(buf);
+ fclose(fp);
+ if (format == 'I') printf("final indent level = %i\n", level);
+ return 0;
}
size_t get(void *buf, int size, unsigned int count, FILE *fp) {
- size_t z;
- if ((z=fread(buf, size, count, fp)) < count) {
- printf("Read Failed! (size=%d, count=%d,z=%ld)\n", size, count, (long)z);
- exit(1);
- }
- return z;
+ size_t z;
+ if ((z=fread(buf, size, count, fp)) < count) {
+ printf("Read Failed! (size=%d, count=%d,z=%ld)\n", size, count, (long)z);
+ exit(1);
+ }
+ return z;
}
int usage() {
- printf("readlog -t[show_type] -x[exclude_type] -f[format] filename\n");
- printf("\tformat:\n\t\tt: text log format\n");
- printf("\t\ti: indented text log format\n");
- printf("\tshow_type:\n\t\tcomma separated list of types to show "
- "[ie, 2,4,1,6]\n");
- printf("\texclude_type:\n\t\tcomma separated list of types to exclude "
- "[ie, 1,5,3,7]\n");
- return 0;
+ printf("readlog -t[show_type] -x[exclude_type] -f[format] filename\n");
+ printf("\tformat:\n\t\tt: text log format\n");
+ printf("\t\ti: indented text log format\n");
+ printf("\tshow_type:\n\t\tcomma separated list of types to show "
+ "[ie, 2,4,1,6]\n");
+ printf("\texclude_type:\n\t\tcomma separated list of types to exclude "
+ "[ie, 1,5,3,7]\n");
+ return 0;
}
int split_args(char *args, int **targ) {
- int count = 1, *i, x, z;
- char *tmp = args, *y;
- if (*targ != NULL) {
- free(*targ);
- }
- // find the number of tokens in the string. Starting
- // from 1 cause there will always be one
- while ((tmp = strchr(tmp, ',')) != NULL) {
- tmp++; count++;
- }
- *targ = (int*)xmalloc(count * sizeof(int));
- i = *targ; // for convienience
- tmp = args;
- z = 0;
- for (x = 0; x < count; x++) {
- y = strtok(tmp, ",");
- tmp = NULL; // must be done after first call
- if (y != NULL) {
- i[x] = atoi(y);
- z++;
- }
- }
- return z;
+ int count = 1, *i, x, z;
+ char *tmp = args, *y;
+ if (*targ != NULL) {
+ free(*targ);
+ }
+ // find the number of tokens in the string. Starting
+ // from 1 cause there will always be one
+ while ((tmp = strchr(tmp, ',')) != NULL) {
+ tmp++; count++;
+ }
+ *targ = (int*)xmalloc(count * sizeof(int));
+ i = *targ; // for convienience
+ tmp = args;
+ z = 0;
+ for (x = 0; x < count; x++) {
+ y = strtok(tmp, ",");
+ tmp = NULL; // must be done after first call
+ if (y != NULL) {
+ i[x] = atoi(y);
+ z++;
+ }
+ }
+ return z;
}
@@ -241,13 +245,13 @@
// the size of which is specified with the third arg. If the second
// arg is NULL, then it is obvious that it is not there.
int is_in(int a, int *b, int c){
- int d = 0;
- if (b == NULL || c == 0) { // no array or no items in array
- return 0;
- }
- while (d < c) {
- if (a == b[d]) return 1;
- d++;
- }
- return 0;
+ int d = 0;
+ if (b == NULL || c == 0) { // no array or no items in array
+ return 0;
+ }
+ while (d < c) {
+ if (a == b[d]) return 1;
+ d++;
+ }
+ return 0;
}
diff -r 06c0262ad689 -r 034641c26ab9 xml/libpst.in
--- a/xml/libpst.in Tue Jan 22 14:39:02 2008 -0800
+++ b/xml/libpst.in Thu Jan 31 08:03:30 2008 -0800
@@ -23,7 +23,7 @@
- 2008-01-19
+ 2008-01-27
@@ -206,9 +206,9 @@
- CVS Version
+ Version
- $Id$
+ @VERSION@
@@ -216,7 +216,7 @@
- 2008-01-19
+ 2008-01-27
@@ -309,9 +309,9 @@
- CVS Version
+ Version
- $Id$
+ @VERSION@
@@ -319,7 +319,7 @@
- 2008-01-19
+ 2008-01-27
@@ -484,9 +484,9 @@
- CVS Version
+ Version
- $Id$
+ @VERSION@
@@ -494,7 +494,7 @@
- 2008-01-19
+ 2008-01-27
@@ -608,9 +608,9 @@
- CVS Version
+ Version
- $Id$
+ @VERSION@
@@ -618,7 +618,7 @@
- 2008-01-19
+ 2008-01-27
@@ -772,7 +772,7 @@
32 bit Index 1 Node
- The 32 bit index1 b-tree nodes are 516 byte blocks with the
+ The 32 bit index1 b-tree nodes are 512 byte blocks with the
following format.
32 bit Index 1 Leaf Node
- The 32 bit index1 b-tree leaf nodes are 516 byte blocks with the
+ The 32 bit index1 b-tree leaf nodes are 512 byte blocks with the
following format.
32 bit Index 2 Node
- The 32 bit index2 b-tree nodes are 516 byte blocks with the
+ The 32 bit index2 b-tree nodes are 512 byte blocks with the
following format.
32 bit Index 2 Leaf Node
- The 32 bit index2 b-tree leaf nodes are 516 byte blocks with the
+ The 32 bit index2 b-tree leaf nodes are 512 byte blocks with the
following format.