libpst.c File Reference

#include "define.h"
Include dependency graph for libpst.c:

Go to the source code of this file.

Data Structures

struct  pst_block_offset
struct  pst_block_offset_pointer
struct  pst_holder
struct  pst_subblock
struct  pst_subblocks
struct  pst_mapi_element
struct  pst_mapi_object
struct  pst_desc32
struct  pst_index32
struct  pst_table_ptr_struct32
struct  pst_desc
struct  pst_index
struct  pst_table_ptr_struct
struct  pst_block_header
struct  pst_id2_assoc32
struct  pst_id2_assoc
struct  pst_table3_rec32
struct  pst_table3_rec
struct  pst_block_hdr
struct  pst_x_attrib

Defines

#define ASSERT(x)   { if(!(x)) raise( SIGSEGV ); }
#define INDEX_TYPE32   0x0E
#define INDEX_TYPE32A   0x0F
#define INDEX_TYPE64   0x17
#define INDEX_TYPE64A   0x15
#define INDEX_TYPE_OFFSET   (int64_t)0x0A
#define FILE_SIZE_POINTER32   (int64_t)0xA8
#define INDEX_POINTER32   (int64_t)0xC4
#define INDEX_BACK32   (int64_t)0xC0
#define SECOND_POINTER32   (int64_t)0xBC
#define SECOND_BACK32   (int64_t)0xB8
#define ENC_TYPE32   (int64_t)0x1CD
#define FILE_SIZE_POINTER64   (int64_t)0xB8
#define INDEX_POINTER64   (int64_t)0xF0
#define INDEX_BACK64   (int64_t)0xE8
#define SECOND_POINTER64   (int64_t)0xE0
#define SECOND_BACK64   (int64_t)0xD8
#define ENC_TYPE64   (int64_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_TYPE   ((pf->do_read64) ? ENC_TYPE64 : ENC_TYPE32)
#define PST_SIGNATURE   0x4E444221
#define ITEM_COUNT_OFFSET32   0x1f0
#define LEVEL_INDICATOR_OFFSET32   0x1f3
#define BACKLINK_OFFSET32   0x1f8
#define ITEM_SIZE32   12
#define DESC_SIZE32   16
#define INDEX_COUNT_MAX32   41
#define DESC_COUNT_MAX32   31
#define ITEM_COUNT_OFFSET64   0x1e8
#define LEVEL_INDICATOR_OFFSET64   0x1eb
#define BACKLINK_OFFSET64   0x1f8
#define ITEM_SIZE64   24
#define DESC_SIZE64   32
#define INDEX_COUNT_MAX64   20
#define DESC_COUNT_MAX64   15
#define BLOCK_SIZE   512
#define DESC_BLOCK_SIZE   512
#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)
#define ITEM_SIZE   (size_t)((pf->do_read64) ? ITEM_SIZE64 : ITEM_SIZE32)
#define DESC_SIZE   (size_t)((pf->do_read64) ? DESC_SIZE64 : DESC_SIZE32)
#define INDEX_COUNT_MAX   (int32_t)((pf->do_read64) ? INDEX_COUNT_MAX64 : INDEX_COUNT_MAX32)
#define DESC_COUNT_MAX   (int32_t)((pf->do_read64) ? DESC_COUNT_MAX64 : DESC_COUNT_MAX32)
#define SAFE_FREE(x)   {if (x) free(x);}
#define SAFE_FREE_STR(x)   SAFE_FREE(x.str)
#define SAFE_FREE_BIN(x)   SAFE_FREE(x.data)
#define MALLOC_EMAIL(x)   { if (!x->email) { x->email = (pst_item_email*) pst_malloc(sizeof(pst_item_email)); memset(x->email, 0, sizeof(pst_item_email) );} }
#define MALLOC_FOLDER(x)   { if (!x->folder) { x->folder = (pst_item_folder*) pst_malloc(sizeof(pst_item_folder)); memset(x->folder, 0, sizeof(pst_item_folder) );} }
#define MALLOC_CONTACT(x)   { if (!x->contact) { x->contact = (pst_item_contact*) pst_malloc(sizeof(pst_item_contact)); memset(x->contact, 0, sizeof(pst_item_contact) );} }
#define MALLOC_MESSAGESTORE(x)   { if (!x->message_store) { x->message_store = (pst_item_message_store*) pst_malloc(sizeof(pst_item_message_store)); memset(x->message_store, 0, sizeof(pst_item_message_store));} }
#define MALLOC_JOURNAL(x)   { if (!x->journal) { x->journal = (pst_item_journal*) pst_malloc(sizeof(pst_item_journal)); memset(x->journal, 0, sizeof(pst_item_journal) );} }
#define MALLOC_APPOINTMENT(x)   { if (!x->appointment) { x->appointment = (pst_item_appointment*) pst_malloc(sizeof(pst_item_appointment)); memset(x->appointment, 0, sizeof(pst_item_appointment) );} }
#define LIST_COPY(targ, type)
#define LIST_COPY_CSTR(targ)
#define LIST_COPY_BOOL(label, targ)
#define LIST_COPY_EMAIL_BOOL(label, targ)
#define LIST_COPY_CONTACT_BOOL(label, targ)
#define LIST_COPY_APPT_BOOL(label, targ)
#define LIST_COPY_INT16_N(targ)
#define LIST_COPY_INT16(label, targ)
#define LIST_COPY_INT32_N(targ)
#define LIST_COPY_INT32(label, targ)
#define LIST_COPY_EMAIL_INT32(label, targ)
#define LIST_COPY_APPT_INT32(label, targ)
#define LIST_COPY_FOLDER_INT32(label, targ)
#define LIST_COPY_STORE_INT32(label, targ)
#define LIST_COPY_ENUM(label, targ, delta, count,...)
#define LIST_COPY_EMAIL_ENUM(label, targ, delta, count,...)
#define LIST_COPY_APPT_ENUM(label, targ, delta, count,...)
#define LIST_COPY_ENUM16(label, targ, delta, count,...)
#define LIST_COPY_CONTACT_ENUM16(label, targ, delta, count,...)
#define LIST_COPY_ENTRYID(label, targ)
#define LIST_COPY_EMAIL_ENTRYID(label, targ)
#define LIST_COPY_STORE_ENTRYID(label, targ)
#define LIST_COPY_STR(label, targ)
#define LIST_COPY_EMAIL_STR(label, targ)
#define LIST_COPY_CONTACT_STR(label, targ)
#define LIST_COPY_APPT_STR(label, targ)
#define LIST_COPY_JOURNAL_STR(label, targ)
#define LIST_COPY_TIME(label, targ)
#define LIST_COPY_EMAIL_TIME(label, targ)
#define LIST_COPY_CONTACT_TIME(label, targ)
#define LIST_COPY_APPT_TIME(label, targ)
#define LIST_COPY_JOURNAL_TIME(label, targ)
#define LIST_COPY_BIN(targ)
#define LIST_COPY_EMAIL_BIN(label, targ)
#define LIST_COPY_APPT_BIN(label, targ)
#define NULL_CHECK(x)   { if (!x) { DEBUG_WARN(("NULL_CHECK: Null Found\n")); break;} }

Functions

static size_t pst_append_holder (pst_holder *h, size_t size, char **buf, size_t z)
 append (buf,z) data to the output destination (h,size)
static int pst_build_desc_ptr (pst_file *pf, int64_t offset, int32_t depth, uint64_t linku1, uint64_t start_val, uint64_t end_val)
 Process the index2 b-tree from the pst file and create the pf->d_head tree from it.
static pst_id2_treepst_build_id2 (pst_file *pf, pst_index_ll *list)
static int pst_build_id_ptr (pst_file *pf, int64_t offset, int32_t depth, uint64_t linku1, uint64_t start_val, uint64_t end_val)
 Process the index1 b-tree from the pst file and create the pf->i_head linked list from it.
static int pst_chr_count (char *str, char x)
static size_t pst_ff_compile_ID (pst_file *pf, uint64_t i_id, pst_holder *h, size_t size)
 find the actual data from an indirection i_id and send it to the destination specified by the pst_holder.
static size_t pst_ff_getIDblock (pst_file *pf, uint64_t i_id, char **buf)
 Read a block of data from file into memory.
static size_t pst_ff_getID2block (pst_file *pf, uint64_t id2, pst_id2_tree *id2_head, char **buf)
static size_t pst_ff_getID2data (pst_file *pf, pst_index_ll *ptr, pst_holder *h)
 find the actual data from an i_id and send it to the destination specified by the pst_holder h.
static size_t pst_finish_cleanup_holder (pst_holder *h, size_t size)
 finish cleanup for base64 encoding to a file with extra bytes left over
static void pst_free_attach (pst_item_attach *attach)
static void pst_free_desc (pst_desc_tree *head)
static void pst_free_id2 (pst_id2_tree *head)
static void pst_free_list (pst_mapi_object *list)
static void pst_free_xattrib (pst_x_attrib_ll *x)
static size_t pst_getAtPos (pst_file *pf, int64_t pos, void *buf, size_t size)
 Read part of the pst file.
static int pst_getBlockOffsetPointer (pst_file *pf, pst_id2_tree *i2_head, pst_subblocks *subblocks, uint32_t offset, pst_block_offset_pointer *p)
 The offset might be zero, in which case we have no data, so return a pair of null pointers.
static int pst_getBlockOffset (char *buf, size_t read_size, uint32_t i_offset, uint32_t offset, pst_block_offset *p)
static pst_id2_treepst_getID2 (pst_id2_tree *ptr, uint64_t id)
static pst_desc_treepst_getDptr (pst_file *pf, uint64_t d_id)
 find the id in the descriptor tree rooted at pf->d_head
static uint64_t pst_getIntAt (pst_file *pf, char *buf)
static uint64_t pst_getIntAtPos (pst_file *pf, int64_t pos)
static pst_mapi_objectpst_parse_block (pst_file *pf, uint64_t block_id, pst_id2_tree *i2_head)
 Process a low level descriptor block (0x0101, 0xbcec, 0x7cec) into a list of MAPI objects, each of which contains a list of MAPI elements.
static void pst_printDptr (pst_file *pf, pst_desc_tree *ptr)
static void pst_printID2ptr (pst_id2_tree *ptr)
static int pst_process (uint64_t block_id, pst_mapi_object *list, pst_item *item, pst_item_attach *attach)
 process the list of MAPI objects produced from parse_block()
static size_t pst_read_block_size (pst_file *pf, int64_t offset, size_t size, char **buf)
 Read a block of data from file into memory.
static int pst_decrypt (uint64_t i_id, char *buf, size_t size, unsigned char type)
 Decrypt a block of data from the pst file.
static int pst_strincmp (char *a, char *b, size_t x)
static char * pst_wide_to_single (char *wt, size_t size)
static char * pst_getcwd (void)
int pst_open (pst_file *pf, const char *name, const char *charset)
 Open a pst file.
int pst_reopen (pst_file *pf)
 Reopen the pst file after a fork.
int pst_close (pst_file *pf)
 Close a pst file.
static void add_descriptor_to_list (pst_desc_tree *node, pst_desc_tree **head, pst_desc_tree **tail)
 add a pst descriptor node to a linked list of such nodes.
static void record_descriptor (pst_file *pf, pst_desc_tree *node)
 add a pst descriptor node into the global tree.
static pst_id2_treedeep_copy (pst_id2_tree *head)
 make a deep copy of part of the id2 mapping tree, for use by an attachment containing an embedded rfc822 message.
pst_desc_treepst_getTopOfFolders (pst_file *pf, const pst_item *root)
 Get the top of folders descriptor tree.
pst_binary pst_attach_to_mem (pst_file *pf, pst_item_attach *attach)
 Assemble the binary attachment into a single buffer.
size_t pst_attach_to_file (pst_file *pf, pst_item_attach *attach, FILE *fp)
 Write a binary attachment to a file.
size_t pst_attach_to_file_base64 (pst_file *pf, pst_item_attach *attach, FILE *fp)
 Write a binary attachment base64 encoded to a file.
int pst_load_index (pst_file *pf)
 Load the index entries from the pst file.
pst_desc_treepst_getNextDptr (pst_desc_tree *d)
 Walk the descriptor tree.
int pst_load_extended_attributes (pst_file *pf)
 Try to load the extended attributes from the pst file.
static size_t pst_decode_desc (pst_file *pf, pst_desc *desc, char *buf)
static size_t pst_decode_table (pst_file *pf, struct pst_table_ptr_struct *table, char *buf)
static size_t pst_decode_index (pst_file *pf, pst_index *index, char *buf)
static size_t pst_decode_assoc (pst_file *pf, pst_id2_assoc *assoc, char *buf)
static size_t pst_decode_type3 (pst_file *pf, pst_table3_rec *table3_rec, char *buf)
pst_itempst_parse_item (pst_file *pf, pst_desc_tree *d_ptr, pst_id2_tree *m_head)
 Process a high level object from the pst file.
static void freeall (pst_subblocks *subs, pst_block_offset_pointer *p1, pst_block_offset_pointer *p2, pst_block_offset_pointer *p3, pst_block_offset_pointer *p4, pst_block_offset_pointer *p5, pst_block_offset_pointer *p6, pst_block_offset_pointer *p7)
void pst_freeItem (pst_item *item)
 Free the item returned by pst_parse_item().
static int pst_getID_compare (const void *key, const void *entry)
pst_index_llpst_getID (pst_file *pf, uint64_t i_id)
 Lookup the i_id in the index linked list, and return a pointer to the element.
size_t pst_ff_getIDblock_dec (pst_file *pf, uint64_t i_id, char **buf)
 Get an ID block from file using pst_ff_getIDblock() and decrypt if necessary.
int pst_stricmp (char *a, char *b)
 compare strings case-insensitive.
size_t pst_fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream)
 fwrite with checking for null pointer.
char * pst_rfc2426_escape (char *str, char **buf, size_t *buflen)
 Add any necessary escape characters for rfc2426 vcard format.
char * pst_rfc2425_datetime_format (const FILETIME *ft, int buflen, char *result)
 Convert a FILETIME into rfc2425 date/time format 1953-10-15T23:10:00Z which is the same as one of the forms in the ISO3601 standard.
char * pst_rfc2445_datetime_format (const FILETIME *ft, int buflen, char *result)
 Convert a FILETIME into rfc2445 date/time format 19531015T231000Z.
char * pst_rfc2445_datetime_format_now (int buflen, char *result)
 Convert the current time rfc2445 date/time format 19531015T231000Z.
static const char * codepage (int cp, int buflen, char *result)
 Convert a code page integer into a string suitable for iconv().
const char * pst_default_charset (pst_item *item, int buflen, char *result)
 Get the default character set for this item.
void pst_rfc2231 (pst_string *str)
 Convert str to rfc2231 encoding of str.
void pst_rfc2047 (pst_item *item, pst_string *str, int needs_quote)
 Convert str to rfc2047 encoding of str, possibly enclosed in quotes if it contains spaces.
void pst_convert_utf8_null (pst_item *item, pst_string *str)
 Convert str to utf8 if possible; null strings are preserved.
void pst_convert_utf8 (pst_item *item, pst_string *str)
 Convert str to utf8 if possible; null strings are converted into empty strings.
pst_recurrencepst_convert_recurrence (pst_item_appointment *appt)
 Decode raw recurrence data into a better structure.
void pst_free_recurrence (pst_recurrence *r)
 Free a recurrence structure.

Variables

static unsigned char comp_enc []
 for "compressible" encryption, just a simple substitution cipher, plaintext = comp_enc[ciphertext]; for "strong" encryption, this is the first rotor of an Enigma 3 rotor cipher.
static unsigned char comp_high1 []
 for "strong" encryption, this is the second rotor of an Enigma 3 rotor cipher.
static unsigned char comp_high2 []
 for "strong" encryption, this is the third rotor of an Enigma 3 rotor cipher.

Define Documentation

#define ASSERT (  )     { if(!(x)) raise( SIGSEGV ); }

Definition at line 20 of file libpst.c.

Referenced by pst_vbgrow().

#define BACKLINK_OFFSET   (size_t)((pf->do_read64) ? BACKLINK_OFFSET64 : BACKLINK_OFFSET32)

Definition at line 829 of file libpst.c.

Referenced by pst_build_desc_ptr(), and pst_build_id_ptr().

#define BACKLINK_OFFSET32   0x1f8

Definition at line 811 of file libpst.c.

#define BACKLINK_OFFSET64   0x1f8

Definition at line 819 of file libpst.c.

#define BLOCK_SIZE   512

Definition at line 825 of file libpst.c.

Referenced by pst_build_id_ptr().

#define DESC_BLOCK_SIZE   512

Definition at line 826 of file libpst.c.

Referenced by pst_build_desc_ptr().

#define DESC_COUNT_MAX   (int32_t)((pf->do_read64) ? DESC_COUNT_MAX64 : DESC_COUNT_MAX32)

Definition at line 833 of file libpst.c.

Referenced by pst_build_desc_ptr().

#define DESC_COUNT_MAX32   31

Definition at line 815 of file libpst.c.

#define DESC_COUNT_MAX64   15

Definition at line 823 of file libpst.c.

#define DESC_SIZE   (size_t)((pf->do_read64) ? DESC_SIZE64 : DESC_SIZE32)

Definition at line 831 of file libpst.c.

#define DESC_SIZE32   16

Definition at line 813 of file libpst.c.

Referenced by pst_build_desc_ptr().

#define DESC_SIZE64   32

Definition at line 821 of file libpst.c.

#define ENC_TYPE   ((pf->do_read64) ? ENC_TYPE64 : ENC_TYPE32)

Definition at line 47 of file libpst.c.

Referenced by pst_open().

#define ENC_TYPE32   (int64_t)0x1CD

Definition at line 33 of file libpst.c.

#define ENC_TYPE64   (int64_t)0x201

Definition at line 40 of file libpst.c.

#define FILE_SIZE_POINTER   ((pf->do_read64) ? FILE_SIZE_POINTER64 : FILE_SIZE_POINTER32)

Definition at line 42 of file libpst.c.

Referenced by pst_open().

#define FILE_SIZE_POINTER32   (int64_t)0xA8

Definition at line 28 of file libpst.c.

#define FILE_SIZE_POINTER64   (int64_t)0xB8

Definition at line 35 of file libpst.c.

#define INDEX_BACK   ((pf->do_read64) ? INDEX_BACK64 : INDEX_BACK32)

Definition at line 44 of file libpst.c.

Referenced by pst_open().

#define INDEX_BACK32   (int64_t)0xC0

Definition at line 30 of file libpst.c.

#define INDEX_BACK64   (int64_t)0xE8

Definition at line 37 of file libpst.c.

#define INDEX_COUNT_MAX   (int32_t)((pf->do_read64) ? INDEX_COUNT_MAX64 : INDEX_COUNT_MAX32)

Definition at line 832 of file libpst.c.

Referenced by pst_build_desc_ptr(), and pst_build_id_ptr().

#define INDEX_COUNT_MAX32   41

Definition at line 814 of file libpst.c.

#define INDEX_COUNT_MAX64   20

Definition at line 822 of file libpst.c.

#define INDEX_POINTER   ((pf->do_read64) ? INDEX_POINTER64 : INDEX_POINTER32)

Definition at line 43 of file libpst.c.

Referenced by pst_open().

#define INDEX_POINTER32   (int64_t)0xC4

Definition at line 29 of file libpst.c.

#define INDEX_POINTER64   (int64_t)0xF0

Definition at line 36 of file libpst.c.

#define INDEX_TYPE32   0x0E

Definition at line 22 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE32A   0x0F

Definition at line 23 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE64   0x17

Definition at line 24 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE64A   0x15

Definition at line 25 of file libpst.c.

Referenced by pst_open().

#define INDEX_TYPE_OFFSET   (int64_t)0x0A

Definition at line 26 of file libpst.c.

Referenced by pst_open().

#define ITEM_COUNT_OFFSET   (size_t)((pf->do_read64) ? ITEM_COUNT_OFFSET64 : ITEM_COUNT_OFFSET32)

Definition at line 827 of file libpst.c.

Referenced by pst_build_desc_ptr(), and pst_build_id_ptr().

#define ITEM_COUNT_OFFSET32   0x1f0

Definition at line 809 of file libpst.c.

#define ITEM_COUNT_OFFSET64   0x1e8

Definition at line 817 of file libpst.c.

#define ITEM_SIZE   (size_t)((pf->do_read64) ? ITEM_SIZE64 : ITEM_SIZE32)

Definition at line 830 of file libpst.c.

#define ITEM_SIZE32   12

Definition at line 812 of file libpst.c.

Referenced by pst_build_desc_ptr(), and pst_build_id_ptr().

#define ITEM_SIZE64   24

Definition at line 820 of file libpst.c.

#define LEVEL_INDICATOR_OFFSET   (size_t)((pf->do_read64) ? LEVEL_INDICATOR_OFFSET64 : LEVEL_INDICATOR_OFFSET32)

Definition at line 828 of file libpst.c.

Referenced by pst_build_desc_ptr(), and pst_build_id_ptr().

#define LEVEL_INDICATOR_OFFSET32   0x1f3

Definition at line 810 of file libpst.c.

#define LEVEL_INDICATOR_OFFSET64   0x1eb

Definition at line 818 of file libpst.c.

#define LIST_COPY ( targ,
type   ) 
Value:
{                                    \
    targ = type pst_realloc(targ, list->elements[x]->size+1);      \
    memcpy(targ, list->elements[x]->data, list->elements[x]->size);\
    memset(((char*)targ)+list->elements[x]->size, 0, (size_t)1);   \
}

Definition at line 1864 of file libpst.c.

#define LIST_COPY_APPT_BIN ( label,
targ   ) 
Value:
{           \
    MALLOC_APPOINTMENT(item);                       \
    LIST_COPY_BIN(targ);                            \
    DEBUG_INFO((label"\n"));                        \
    DEBUG_HEXDUMP(targ.data, targ.size);            \
}

Definition at line 2096 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_APPT_BOOL ( label,
targ   ) 
Value:
{                      \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_BOOL(label, targ)                                 \
}

Definition at line 1908 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_APPT_ENUM ( label,
targ,
delta,
count,
...   ) 
Value:
{   \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_ENUM(label, targ, delta, count, __VA_ARGS__);     \
}

Definition at line 1976 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_APPT_INT32 ( label,
targ   ) 
Value:
{                     \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_INT32(label, targ);                               \
}

Definition at line 1946 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_APPT_STR ( label,
targ   ) 
Value:
{                       \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_STR(label, targ);                                 \
}

Definition at line 2032 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_APPT_TIME ( label,
targ   ) 
Value:
{                      \
    MALLOC_APPOINTMENT(item);                                   \
    LIST_COPY_TIME(label, targ);                                \
}

Definition at line 2068 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_BIN ( targ   ) 
Value:
{                                       \
    targ.size = list->elements[x]->size;                            \
    if (targ.size) {                                                \
        targ.data = (char*)pst_realloc(targ.data, targ.size);       \
        memcpy(targ.data, list->elements[x]->data, targ.size);      \
    }                                                               \
    else {                                                          \
        SAFE_FREE_BIN(targ);                                        \
        targ.data = NULL;                                           \
    }                                                               \
}

Definition at line 2079 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_BOOL ( label,
targ   ) 
Value:
{                                       \
    if (list->elements[x]->type != 0x0b) {                                  \
        DEBUG_WARN(("src not 0x0b for boolean dst\n"));                     \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    if (*(int16_t*)list->elements[x]->data) {                               \
        DEBUG_INFO((label" - True\n"));                                     \
        targ = 1;                                                           \
    } else {                                                                \
        DEBUG_INFO((label" - False\n"));                                    \
        targ = 0;                                                           \
    }                                                                       \
}

Definition at line 1884 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_CONTACT_BOOL ( label,
targ   ) 
Value:
{                   \
    MALLOC_CONTACT(item);                                       \
    LIST_COPY_BOOL(label, targ)                                 \
}

Definition at line 1903 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_CONTACT_ENUM16 ( label,
targ,
delta,
count,
...   ) 
Value:
{  \
    MALLOC_CONTACT(item);                                           \
    LIST_COPY_ENUM16(label, targ, delta, count, __VA_ARGS__);       \
}

Definition at line 1991 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_CONTACT_STR ( label,
targ   ) 
Value:
{                    \
    MALLOC_CONTACT(item);                                       \
    LIST_COPY_STR(label, targ);                                 \
}

Definition at line 2027 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_CONTACT_TIME ( label,
targ   ) 
Value:
{                   \
    MALLOC_CONTACT(item);                                       \
    LIST_COPY_TIME(label, targ);                                \
}

Definition at line 2063 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_CSTR ( targ   ) 
Value:
{                                              \
    if ((list->elements[x]->type == 0x1f) ||                                \
        (list->elements[x]->type == 0x1e) ||                                \
        (list->elements[x]->type == 0x102)) {                               \
        LIST_COPY(targ, (char*))                                            \
    }                                                                       \
    else {                                                                  \
        DEBUG_WARN(("src not 0x1e or 0x1f or 0x102 for string dst\n"));     \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
        SAFE_FREE(targ);                                                    \
        targ = NULL;                                                        \
    }                                                                       \
}

Definition at line 1870 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_EMAIL_BIN ( label,
targ   ) 
Value:
{          \
    MALLOC_EMAIL(item);                             \
    LIST_COPY_BIN(targ);                            \
    DEBUG_INFO((label"\n"));                        \
}

Definition at line 2091 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_EMAIL_BOOL ( label,
targ   ) 
Value:
{                     \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_BOOL(label, targ)                                 \
}

Definition at line 1898 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_EMAIL_ENTRYID ( label,
targ   ) 
Value:
{                  \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_ENTRYID(label, targ);                             \
}

Definition at line 2003 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_EMAIL_ENUM ( label,
targ,
delta,
count,
...   ) 
Value:
{  \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_ENUM(label, targ, delta, count, __VA_ARGS__);     \
}

Definition at line 1971 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_EMAIL_INT32 ( label,
targ   ) 
Value:
{                    \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_INT32(label, targ);                               \
}

Definition at line 1941 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_EMAIL_STR ( label,
targ   ) 
Value:
{                      \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_STR(label, targ);                                 \
}

Definition at line 2022 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_EMAIL_TIME ( label,
targ   ) 
Value:
{                     \
    MALLOC_EMAIL(item);                                         \
    LIST_COPY_TIME(label, targ);                                \
}

Definition at line 2058 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_ENTRYID ( label,
targ   ) 
Value:
{                        \
    LIST_COPY(targ, (pst_entryid*));                            \
    LE32_CPU(targ->u1);                                         \
    LE32_CPU(targ->id);                                         \
    DEBUG_INFO((label" u1=%#x, id=%#x\n", targ->u1, targ->id)); \
}

Definition at line 1996 of file libpst.c.

#define LIST_COPY_ENUM ( label,
targ,
delta,
count,
...   ) 
Value:
{        \
    char *tlabels[] = {__VA_ARGS__};                            \
    LIST_COPY_INT32_N(targ);                                    \
    targ += delta;                                              \
    DEBUG_INFO((label" - %s [%i]\n",                            \
        (((int)targ < 0) || ((int)targ >= count))               \
            ? "**invalid"                                       \
            : tlabels[(int)targ], (int)targ));                  \
}

Definition at line 1961 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_ENUM16 ( label,
targ,
delta,
count,
...   ) 
Value:
{      \
    char *tlabels[] = {__VA_ARGS__};                            \
    LIST_COPY_INT16_N(targ);                                    \
    targ += delta;                                              \
    DEBUG_INFO((label" - %s [%i]\n",                            \
        (((int)targ < 0) || ((int)targ >= count))               \
            ? "**invalid"                                       \
            : tlabels[(int)targ], (int)targ));                  \
}

Definition at line 1981 of file libpst.c.

#define LIST_COPY_FOLDER_INT32 ( label,
targ   ) 
Value:
{                   \
    MALLOC_FOLDER(item);                                        \
    LIST_COPY_INT32(label, targ);                               \
}

Definition at line 1951 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_INT16 ( label,
targ   ) 
Value:
{                          \
    LIST_COPY_INT16_N(targ);                                    \
    DEBUG_INFO((label" - %i %#x\n", (int)targ, (int)targ));     \
}

Definition at line 1922 of file libpst.c.

#define LIST_COPY_INT16_N ( targ   ) 
Value:
{                                           \
    if (list->elements[x]->type != 0x02) {                                  \
        DEBUG_WARN(("src not 0x02 for int16 dst\n"));                       \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    memcpy(&(targ), list->elements[x]->data, sizeof(targ));                 \
    LE16_CPU(targ);                                                         \
}

Definition at line 1913 of file libpst.c.

#define LIST_COPY_INT32 ( label,
targ   ) 
Value:
{                          \
    LIST_COPY_INT32_N(targ);                                    \
    DEBUG_INFO((label" - %i %#x\n", (int)targ, (int)targ));     \
}

Definition at line 1936 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_INT32_N ( targ   ) 
Value:
{                                           \
    if (list->elements[x]->type != 0x03) {                                  \
        DEBUG_WARN(("src not 0x03 for int32 dst\n"));                       \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    memcpy(&(targ), list->elements[x]->data, sizeof(targ));                 \
    LE32_CPU(targ);                                                         \
}

Definition at line 1927 of file libpst.c.

#define LIST_COPY_JOURNAL_STR ( label,
targ   ) 
Value:
{                    \
    MALLOC_JOURNAL(item);                                       \
    LIST_COPY_STR(label, targ);                                 \
}

Definition at line 2037 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_JOURNAL_TIME ( label,
targ   ) 
Value:
{                   \
    MALLOC_JOURNAL(item);                                       \
    LIST_COPY_TIME(label, targ);                                \
}

Definition at line 2073 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_STORE_ENTRYID ( label,
targ   ) 
Value:
{                  \
    MALLOC_MESSAGESTORE(item);                                  \
    LIST_COPY_ENTRYID(label, targ);                             \
}

Definition at line 2008 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_STORE_INT32 ( label,
targ   ) 
Value:
{                    \
    MALLOC_MESSAGESTORE(item);                                  \
    LIST_COPY_INT32(label, targ);                               \
}

Definition at line 1956 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_STR ( label,
targ   ) 
Value:
{                                    \
    LIST_COPY_CSTR(targ.str);                                           \
    targ.is_utf8 = (list->elements[x]->type == 0x1f) ? 1 : 0;           \
    DEBUG_INFO((label" - unicode %d - %s\n", targ.is_utf8, targ.str));  \
}

Definition at line 2016 of file libpst.c.

Referenced by pst_process().

#define LIST_COPY_TIME ( label,
targ   ) 
Value:
{                                       \
    if ((list->elements[x]->type != 0x40) ||                                \
        (list->elements[x]->size != sizeof(FILETIME))) {                    \
        DEBUG_WARN(("src not 0x40 or wrong length for filetime dst\n"));    \
        DEBUG_HEXDUMP(list->elements[x]->data, list->elements[x]->size);    \
    }                                                                       \
    else {                                                                  \
        targ = (FILETIME*) pst_realloc(targ, sizeof(FILETIME));             \
        memcpy(targ, list->elements[x]->data, sizeof(FILETIME));            \
        LE32_CPU(targ->dwLowDateTime);                                      \
        LE32_CPU(targ->dwHighDateTime);                                     \
        DEBUG_INFO((label" - %s", pst_fileTimeToAscii(targ, time_buffer))); \
    }                                                                       \
}

Definition at line 2043 of file libpst.c.

Referenced by pst_process().

#define MALLOC_APPOINTMENT (  )     { if (!x->appointment) { x->appointment = (pst_item_appointment*) pst_malloc(sizeof(pst_item_appointment)); memset(x->appointment, 0, sizeof(pst_item_appointment) );} }

Definition at line 1861 of file libpst.c.

#define MALLOC_CONTACT (  )     { if (!x->contact) { x->contact = (pst_item_contact*) pst_malloc(sizeof(pst_item_contact)); memset(x->contact, 0, sizeof(pst_item_contact) );} }

Definition at line 1858 of file libpst.c.

#define MALLOC_EMAIL (  )     { if (!x->email) { x->email = (pst_item_email*) pst_malloc(sizeof(pst_item_email)); memset(x->email, 0, sizeof(pst_item_email) );} }

Definition at line 1856 of file libpst.c.

#define MALLOC_FOLDER (  )     { if (!x->folder) { x->folder = (pst_item_folder*) pst_malloc(sizeof(pst_item_folder)); memset(x->folder, 0, sizeof(pst_item_folder) );} }

Definition at line 1857 of file libpst.c.

Referenced by pst_process().

#define MALLOC_JOURNAL (  )     { if (!x->journal) { x->journal = (pst_item_journal*) pst_malloc(sizeof(pst_item_journal)); memset(x->journal, 0, sizeof(pst_item_journal) );} }

Definition at line 1860 of file libpst.c.

#define MALLOC_MESSAGESTORE (  )     { if (!x->message_store) { x->message_store = (pst_item_message_store*) pst_malloc(sizeof(pst_item_message_store)); memset(x->message_store, 0, sizeof(pst_item_message_store));} }

Definition at line 1859 of file libpst.c.

#define NULL_CHECK (  )     { if (!x) { DEBUG_WARN(("NULL_CHECK: Null Found\n")); break;} }

Definition at line 2103 of file libpst.c.

Referenced by pst_process().

#define PST_SIGNATURE   0x4E444221

Definition at line 49 of file libpst.c.

Referenced by pst_open().

#define SAFE_FREE (  )     {if (x) free(x);}

Definition at line 1851 of file libpst.c.

Referenced by pst_freeItem().

#define SAFE_FREE_BIN (  )     SAFE_FREE(x.data)

Definition at line 1853 of file libpst.c.

Referenced by pst_free_attach(), and pst_freeItem().

#define SAFE_FREE_STR (  )     SAFE_FREE(x.str)

Definition at line 1852 of file libpst.c.

Referenced by pst_free_attach(), and pst_freeItem().

#define SECOND_BACK   ((pf->do_read64) ? SECOND_BACK64 : SECOND_BACK32)

Definition at line 46 of file libpst.c.

Referenced by pst_open().

#define SECOND_BACK32   (int64_t)0xB8

Definition at line 32 of file libpst.c.

#define SECOND_BACK64   (int64_t)0xD8

Definition at line 39 of file libpst.c.

#define SECOND_POINTER   ((pf->do_read64) ? SECOND_POINTER64 : SECOND_POINTER32)

Definition at line 45 of file libpst.c.

Referenced by pst_open().

#define SECOND_POINTER32   (int64_t)0xBC

Definition at line 31 of file libpst.c.

#define SECOND_POINTER64   (int64_t)0xE0

Definition at line 38 of file libpst.c.


Function Documentation

static void add_descriptor_to_list ( pst_desc_tree node,
pst_desc_tree **  head,
pst_desc_tree **  tail 
) [static]

add a pst descriptor node to a linked list of such nodes.

Parameters:
node pointer to the node to be added to the list
head pointer to the list head pointer
tail pointer to the list tail pointer

Definition at line 423 of file libpst.c.

References DEBUG_ENT, DEBUG_RET, pst_desc_tree::next, and pst_desc_tree::prev.

Referenced by record_descriptor().

static const char * codepage ( int  cp,
int  buflen,
char *  result 
) [static]

Convert a code page integer into a string suitable for iconv().

Parameters:
cp the code page integer used in the pst file
[in] buflen length of the output buffer
[out] result pointer to output buffer, must be at least 30 bytes
Returns:
pointer to a static buffer holding the string representation of the equivalent iconv character set

Definition at line 4314 of file libpst.c.

Referenced by pst_default_charset().

static pst_id2_tree * deep_copy ( pst_id2_tree head  )  [static]

make a deep copy of part of the id2 mapping tree, for use by an attachment containing an embedded rfc822 message.

Parameters:
head pointer to the subtree to be copied
Returns:
pointer to the new copy of the subtree

Definition at line 512 of file libpst.c.

References pst_id2_tree::child, pst_id2_tree::id, pst_id2_tree::id2, pst_id2_tree::next, and pst_malloc().

Referenced by pst_parse_item().

Here is the call graph for this function:

static size_t pst_append_holder ( pst_holder h,
size_t  size,
char **  buf,
size_t  z 
) [static]

append (buf,z) data to the output destination (h,size)

Parameters:
h specifies the output destination (buffer, file, encoding)
size number of bytes of data already sent to h
buf reference to a pointer to the buffer to be appended to the destination
z number of bytes in buf
Returns:
updated size of the output, buffer pointer possibly reallocated

Definition at line 4066 of file libpst.c.

References pst_holder::base64, pst_holder::base64_extra, pst_holder::base64_extra_chars, pst_holder::base64_line_count, pst_holder::buf, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_holder::fp, pst_base64_encode_multiple(), pst_fwrite(), and pst_realloc().

Referenced by pst_ff_compile_ID(), and pst_ff_getID2data().

Here is the call graph for this function:

size_t pst_attach_to_file ( pst_file pf,
pst_item_attach attach,
FILE *  fp 
)

Write a binary attachment to a file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
attach pointer to the attachment record
fp pointer to an open FILE.

Definition at line 580 of file libpst.c.

References pst_binary::data, pst_item_attach::data, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_item_attach::i_id, pst_ff_getID2data(), pst_fwrite(), pst_getID(), and pst_binary::size.

Referenced by write_msg_email(), and write_separate_attachment().

Here is the call graph for this function:

size_t pst_attach_to_file_base64 ( pst_file pf,
pst_item_attach attach,
FILE *  fp 
)

Write a binary attachment base64 encoded to a file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
attach pointer to the attachment record
fp pointer to an open FILE.

Definition at line 604 of file libpst.c.

References pst_binary::data, pst_item_attach::data, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_item_attach::i_id, pst_base64_encode(), pst_ff_getID2data(), pst_fwrite(), pst_getID(), and pst_binary::size.

Referenced by write_inline_attachment().

Here is the call graph for this function:

pst_binary pst_attach_to_mem ( pst_file pf,
pst_item_attach attach 
)

Assemble the binary attachment into a single buffer.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
attach pointer to the attachment record
Returns:
structure containing size of and pointer to the buffer. the caller must free this buffer.

Definition at line 556 of file libpst.c.

References pst_item_attach::data, pst_binary::data, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_item_attach::i_id, pst_ff_getID2data(), pst_getID(), and pst_binary::size.

Here is the call graph for this function:

static int pst_build_desc_ptr ( pst_file pf,
int64_t  offset,
int32_t  depth,
uint64_t  linku1,
uint64_t  start_val,
uint64_t  end_val 
) [static]

Process the index2 b-tree from the pst file and create the pf->d_head tree from it.

This tree holds descriptions of the higher level objects (email, contact, etc) in the pst file.

Definition at line 1090 of file libpst.c.

References pst_desc_tree::assoc_tree, BACKLINK_OFFSET, pst_desc_tree::d_id, DEBUG_ENT, DEBUG_HEXDUMPC, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_desc_tree::desc, DESC_BLOCK_SIZE, DESC_COUNT_MAX, DESC_SIZE32, INDEX_COUNT_MAX, ITEM_COUNT_OFFSET, ITEM_SIZE32, LEVEL_INDICATOR_OFFSET, pst_table_ptr_struct::offset, pst_desc_tree::parent_d_id, pst_decode_desc(), pst_decode_table(), pst_getID(), pst_getIntAt(), pst_malloc(), pst_read_block_size(), record_descriptor(), pst_table_ptr_struct::start, and pst_table_ptr_struct::u1.

Referenced by pst_load_index().

Here is the call graph for this function:

static pst_id2_tree * pst_build_id2 ( pst_file pf,
pst_index_ll list 
) [static]
static int pst_build_id_ptr ( pst_file pf,
int64_t  offset,
int32_t  depth,
uint64_t  linku1,
uint64_t  start_val,
uint64_t  end_val 
) [static]

Process the index1 b-tree from the pst file and create the pf->i_head linked list from it.

This tree holds the location (offset and size) of lower level objects (0xbcec descriptor blocks, etc) in the pst file.

Definition at line 989 of file libpst.c.

References BACKLINK_OFFSET, BLOCK_SIZE, DEBUG_ENT, DEBUG_HEXDUMPC, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_file::i_capacity, pst_file::i_count, pst_index_ll::i_id, pst_file::i_table, pst_index::id, INDEX_COUNT_MAX, ITEM_COUNT_OFFSET, ITEM_SIZE32, LEVEL_INDICATOR_OFFSET, pst_table_ptr_struct::offset, pst_index::offset, pst_decode_index(), pst_decode_table(), pst_getIntAt(), pst_read_block_size(), pst_realloc(), pst_index::size, pst_table_ptr_struct::start, pst_table_ptr_struct::u1, and pst_index::u1.

Referenced by pst_load_index().

Here is the call graph for this function:

static int pst_chr_count ( char *  str,
char  x 
) [static]

Definition at line 4258 of file libpst.c.

Referenced by pst_rfc2426_escape().

int pst_close ( pst_file pf  ) 

Close a pst file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().

Definition at line 394 of file libpst.c.

References pst_file::cwd, pst_file::d_head, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_file::fname, pst_file::fp, pst_file::i_table, pst_free_desc(), pst_free_xattrib(), and pst_file::x_head.

Referenced by main().

Here is the call graph for this function:

pst_recurrence* pst_convert_recurrence ( pst_item_appointment appt  ) 

Decode raw recurrence data into a better structure.

Parameters:
appt pointer to appointment structure
Returns:
pointer to decoded recurrence structure that must be free'd by the caller.

Definition at line 4497 of file libpst.c.

References pst_recurrence::bydaymask, pst_recurrence::count, pst_binary::data, pst_recurrence::dayofmonth, pst_recurrence::interval, pst_recurrence::monthofyear, pst_recurrence::parm1, pst_recurrence::parm2, pst_recurrence::parm4, pst_recurrence::parm5, pst_recurrence::position, PST_LE_GET_UINT32, PST_LE_GET_UINT8, pst_malloc(), pst_item_appointment::recurrence_data, pst_recurrence::signature, pst_binary::size, pst_recurrence::sub_type, pst_recurrence::termination, and pst_recurrence::type.

Referenced by write_appointment().

Here is the call graph for this function:

void pst_convert_utf8 ( pst_item item,
pst_string str 
)

Convert str to utf8 if possible; null strings are converted into empty strings.

Parameters:
item pointer to the containing mapi item
str pointer to the mapi string of interest

Definition at line 4457 of file libpst.c.

References pst_varbuf::b, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_string::is_utf8, pst_default_charset(), pst_vb_8bit2utf8(), pst_vballoc(), and pst_string::str.

Referenced by create_enter_dir(), process(), pst_convert_utf8_null(), pst_rfc2047(), and write_normal_email().

Here is the call graph for this function:

void pst_convert_utf8_null ( pst_item item,
pst_string str 
)

Convert str to utf8 if possible; null strings are preserved.

Parameters:
item pointer to the containing mapi item
str pointer to the mapi string of interest

Definition at line 4446 of file libpst.c.

References pst_convert_utf8(), and pst_string::str.

Referenced by process(), write_appointment(), write_journal(), write_normal_email(), and write_vcard().

Here is the call graph for this function:

static size_t pst_decode_assoc ( pst_file pf,
pst_id2_assoc assoc,
char *  buf 
) [static]
static size_t pst_decode_desc ( pst_file pf,
pst_desc desc,
char *  buf 
) [static]
static size_t pst_decode_index ( pst_file pf,
pst_index index,
char *  buf 
) [static]
static size_t pst_decode_table ( pst_file pf,
struct pst_table_ptr_struct table,
char *  buf 
) [static]
static size_t pst_decode_type3 ( pst_file pf,
pst_table3_rec table3_rec,
char *  buf 
) [static]
static int pst_decrypt ( uint64_t  i_id,
char *  buf,
size_t  size,
unsigned char  type 
) [static]

Decrypt a block of data from the pst file.

Parameters:
i_id identifier of this block, needed as part of the key for the enigma cipher
buf pointer to the buffer to be decrypted in place
size size of the buffer
type 
  • 0 PST_NO_ENCRYPT, none
  • 1 PST_COMP_ENCRYPT, simple byte substitution cipher with fixed key
  • 2 PST_ENCRYPT, german enigma 3 rotor cipher with fixed key
Returns:
0 if ok, -1 if error (NULL buffer or unknown encryption type)

Definition at line 3765 of file libpst.c.

References comp_enc, comp_high1, comp_high2, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, PST_COMP_ENCRYPT, and PST_ENCRYPT.

Referenced by pst_ff_compile_ID(), and pst_ff_getIDblock_dec().

const char* pst_default_charset ( pst_item item,
int  buflen,
char *  result 
)

Get the default character set for this item.

This is used to find the charset for pst_string elements that are not already in utf8 encoding.

Parameters:
item pointer to the mapi item of interest
[in] buflen length of the output buffer
[out] result pointer to output buffer, must be at least 30 bytes
Returns:
default character set as a string useable by iconv()

Definition at line 4362 of file libpst.c.

References pst_item::body_charset, pst_file::charset, codepage(), pst_item::internet_cpid, pst_item::message_codepage, pst_item::pf, and pst_string::str.

Referenced by pst_convert_utf8(), write_msg_email(), and write_normal_email().

Here is the call graph for this function:

static size_t pst_ff_compile_ID ( pst_file pf,
uint64_t  i_id,
pst_holder h,
size_t  size 
) [static]

find the actual data from an indirection i_id and send it to the destination specified by the pst_holder.

Parameters:
pf PST file structure
i_id ID of the block to read
h specifies the output destination (buffer, file, encoding)
size number of bytes of data already sent to h
Returns:
updated size of the output

Definition at line 3990 of file libpst.c.

References DEBUG_ENT, DEBUG_HEXDUMPC, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_file::encryption, pst_table3_rec::id, pst_block_hdr::index_offset, LE16_CPU, LE32_CPU, pst_block_hdr::offset, pst_append_holder(), pst_decode_type3(), pst_decrypt(), pst_ff_getIDblock(), pst_ff_getIDblock_dec(), and pst_block_hdr::type.

Referenced by pst_ff_getID2data().

Here is the call graph for this function:

static size_t pst_ff_getID2block ( pst_file pf,
uint64_t  id2,
pst_id2_tree id2_head,
char **  buf 
) [static]

Definition at line 3936 of file libpst.c.

References DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_id2_tree::id, pst_ff_getID2data(), and pst_getID2().

Referenced by pst_getBlockOffsetPointer(), and pst_parse_block().

Here is the call graph for this function:

static size_t pst_ff_getID2data ( pst_file pf,
pst_index_ll ptr,
pst_holder h 
) [static]

find the actual data from an i_id and send it to the destination specified by the pst_holder h.

h must be a new empty destination.

Parameters:
pf PST file structure
ptr 
h specifies the output destination (buffer, file, encoding)
Returns:
updated size of the output

Definition at line 3962 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_index_ll::i_id, pst_append_holder(), pst_ff_compile_ID(), pst_ff_getIDblock_dec(), and pst_finish_cleanup_holder().

Referenced by pst_attach_to_file(), pst_attach_to_file_base64(), pst_attach_to_mem(), and pst_ff_getID2block().

Here is the call graph for this function:

static size_t pst_ff_getIDblock ( pst_file pf,
uint64_t  i_id,
char **  buf 
) [static]

Read a block of data from file into memory.

Parameters:
pf PST file structure
i_id ID of block to read
buf reference to pointer to buffer that will contain the data block. If this pointer is non-NULL, it will first be free()d.
Returns:
size of block read into memory

Definition at line 3919 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_index_ll::offset, pst_getID(), pst_read_block_size(), and pst_index_ll::size.

Referenced by pst_ff_compile_ID(), and pst_ff_getIDblock_dec().

Here is the call graph for this function:

size_t pst_ff_getIDblock_dec ( pst_file pf,
uint64_t  i_id,
char **  buf 
)

Get an ID block from file using pst_ff_getIDblock() and decrypt if necessary.

Get an ID block from the file using pst_ff_getIDblock() and decrypt if necessary.

Parameters:
pf PST file structure
i_id ID of block to retrieve
buf reference to pointer to buffer that will contain the data block. If this pointer is non-NULL, it will first be free()d.
Returns:
Size of block read into memory

Definition at line 3896 of file libpst.c.

References DEBUG_ENT, DEBUG_HEXDUMPC, DEBUG_INFO, DEBUG_RET, pst_file::encryption, pst_decrypt(), and pst_ff_getIDblock().

Referenced by dumper(), main(), pst_ff_compile_ID(), pst_ff_getID2data(), and pst_parse_block().

Here is the call graph for this function:

static size_t pst_finish_cleanup_holder ( pst_holder h,
size_t  size 
) [static]

finish cleanup for base64 encoding to a file with extra bytes left over

Parameters:
h specifies the output destination (buffer, file, encoding)
size number of bytes of data already sent to h
Returns:
updated size of the output

Definition at line 4122 of file libpst.c.

References pst_holder::base64, pst_holder::base64_extra, pst_holder::base64_extra_chars, pst_holder::base64_line_count, DEBUG_ENT, DEBUG_RET, pst_holder::fp, pst_base64_encode_multiple(), and pst_fwrite().

Referenced by pst_ff_getID2data().

Here is the call graph for this function:

static void pst_free_attach ( pst_item_attach attach  )  [static]
static void pst_free_desc ( pst_desc_tree head  )  [static]

Definition at line 3212 of file libpst.c.

References pst_desc_tree::child, DEBUG_ENT, DEBUG_RET, and pst_desc_tree::next.

Referenced by pst_close().

static void pst_free_id2 ( pst_id2_tree head  )  [static]
static void pst_free_list ( pst_mapi_object list  )  [static]
void pst_free_recurrence ( pst_recurrence r  ) 

Free a recurrence structure.

Parameters:
r input pointer to be freed

Definition at line 4572 of file libpst.c.

Referenced by write_appointment().

static void pst_free_xattrib ( pst_x_attrib_ll x  )  [static]

Definition at line 3225 of file libpst.c.

References pst_x_attrib_ll::data, DEBUG_ENT, DEBUG_RET, and pst_x_attrib_ll::next.

Referenced by pst_close().

void pst_freeItem ( pst_item item  ) 

Free the item returned by pst_parse_item().

Parameters:
item pointer to item returned from pst_parse_item().

Definition at line 3323 of file libpst.c.

References pst_item_contact::account_name, pst_item_contact::address1, pst_item_contact::address1_desc, pst_item_contact::address1_transport, pst_item_contact::address1a, pst_item_contact::address2, pst_item_contact::address2_desc, pst_item_contact::address2_transport, pst_item_contact::address2a, pst_item_contact::address3, pst_item_contact::address3_desc, pst_item_contact::address3_transport, pst_item_contact::address3a, pst_item_appointment::alarm_filename, pst_item::appointment, pst_item_email::arrival_date, pst_item::ascii_type, pst_item_contact::assistant_name, pst_item_contact::assistant_phone, pst_item::attach, pst_item_email::bcc_address, pst_item_contact::billing_information, pst_item_contact::birthday, pst_item::body, pst_item::body_charset, pst_item_contact::business_address, pst_item_contact::business_city, pst_item_contact::business_country, pst_item_contact::business_fax, pst_item_contact::business_homepage, pst_item_contact::business_phone, pst_item_contact::business_phone2, pst_item_contact::business_po_box, pst_item_contact::business_postal_code, pst_item_contact::business_state, pst_item_contact::business_street, pst_item_contact::callback_phone, pst_item_contact::car_phone, pst_item_email::cc_address, pst_item::comment, pst_item_contact::common_name, pst_item_message_store::common_view_folder, pst_item_contact::company_main_phone, pst_item_contact::company_name, pst_item_contact::computer_name, pst_item::contact, pst_item_email::conversation_index, pst_item::create_date, pst_item_contact::customer_id, DEBUG_ENT, DEBUG_RET, pst_item_contact::def_postal_address, pst_item_message_store::default_outbox_folder, pst_item_message_store::deleted_items_folder, pst_item_contact::department, pst_item_contact::display_name_prefix, pst_item::email, pst_item_email::encrypted_body, pst_item_email::encrypted_htmlbody, pst_item_appointment::end, pst_item_journal::end, pst_item::extra_fields, pst_item_extra_field::field_name, pst_item::file_as, pst_item_contact::first_name, pst_item::folder, pst_item_contact::followup, pst_item_contact::free_busy_address, pst_item_contact::ftp_site, pst_item_contact::fullname, pst_item_contact::gov_id, pst_item_email::header, pst_item_contact::hobbies, pst_item_contact::home_address, pst_item_contact::home_city, pst_item_contact::home_country, pst_item_contact::home_fax, pst_item_contact::home_phone, pst_item_contact::home_phone2, pst_item_contact::home_po_box, pst_item_contact::home_postal_code, pst_item_contact::home_state, pst_item_contact::home_street, pst_item_email::htmlbody, pst_item_email::in_reply_to, pst_item_contact::initials, pst_item_contact::isdn_phone, pst_item_contact::job_title, pst_item::journal, pst_item_contact::keyword, pst_item_contact::language, pst_item_appointment::location, pst_item_contact::location, pst_item_contact::manager_name, pst_item::message_store, pst_item_email::messageid, pst_item_contact::middle_name, pst_item_contact::mileage, pst_item_contact::mobile_phone, pst_item::modify_date, pst_item_extra_field::next, pst_item_contact::nickname, pst_item_contact::office_loc, pst_item_contact::org_id, pst_item_email::original_bcc, pst_item_email::original_cc, pst_item_email::original_to, pst_item_contact::other_address, pst_item_contact::other_city, pst_item_contact::other_country, pst_item_contact::other_phone, pst_item_contact::other_po_box, pst_item_contact::other_postal_code, pst_item_contact::other_state, pst_item_contact::other_street, pst_item_email::outlook_normalized_subject, pst_item_email::outlook_received_name1, pst_item_email::outlook_recipient, pst_item_email::outlook_recipient2, pst_item_email::outlook_recipient_name, pst_item_email::outlook_search_key, pst_item_email::outlook_sender, pst_item_email::outlook_sender2, pst_item_email::outlook_sender_name, pst_item_email::outlook_sender_name2, pst_item::outlook_version, pst_item_contact::pager_phone, pst_item_contact::personal_homepage, pst_item::predecessor_change, pst_item_contact::pref_name, pst_item_contact::primary_fax, pst_item_contact::primary_phone, pst_item_email::processed_subject, pst_item_contact::profession, pst_free_attach(), pst_item_contact::radio_phone, pst_item_email::recip2_access, pst_item_email::recip2_address, pst_item_email::recip_access, pst_item_email::recip_address, pst_item::record_key, pst_item_appointment::recurrence_data, pst_item_appointment::recurrence_description, pst_item_appointment::recurrence_end, pst_item_appointment::recurrence_start, pst_item_appointment::reminder, pst_item_email::reply_to, pst_item_email::report_text, pst_item_email::report_time, pst_item_email::return_path_address, pst_item_email::rtf_body_tag, pst_item_email::rtf_compressed, SAFE_FREE, SAFE_FREE_BIN, SAFE_FREE_STR, pst_item_message_store::search_root_folder, pst_item_email::sender2_access, pst_item_email::sender2_address, pst_item_email::sender_access, pst_item_email::sender_address, pst_item_email::sent_date, pst_item_message_store::sent_items_folder, pst_item_email::sentmail_folder, pst_item_email::sentto_address, pst_item_contact::spouse_name, pst_item_appointment::start, pst_item_journal::start, pst_item::subject, pst_item_contact::suffix, pst_item_email::supplementary_info, pst_item_contact::surname, pst_item_contact::telex, pst_item_appointment::timezonestring, pst_item_message_store::top_of_folder, pst_item_message_store::top_of_personal_folder, pst_item_contact::transmittable_display_name, pst_item_contact::ttytdd_phone, pst_item_journal::type, pst_item_message_store::user_views_folder, pst_item_extra_field::value, pst_item_contact::wedding_anniversary, pst_item_contact::work_address_city, pst_item_contact::work_address_country, pst_item_contact::work_address_postalcode, pst_item_contact::work_address_postofficebox, pst_item_contact::work_address_state, and pst_item_contact::work_address_street.

Referenced by dumper(), main(), process(), pst_parse_item(), and write_embedded_message().

Here is the call graph for this function:

size_t pst_fwrite ( const void *  ptr,
size_t  size,
size_t  nmemb,
FILE *  stream 
)

fwrite with checking for null pointer.

Parameters:
ptr pointer to the buffer
size size of each item
nmemb number of items
stream output file
Returns:
number of bytes written, zero if ptr==NULL

Definition at line 4172 of file libpst.c.

References DEBUG_ENT, DEBUG_RET, and DEBUG_WARN.

Referenced by main(), print_pdf(), pst_append_holder(), pst_attach_to_file(), pst_attach_to_file_base64(), pst_finish_cleanup_holder(), and write_email_body().

static size_t pst_getAtPos ( pst_file pf,
int64_t  pos,
void *  buf,
size_t  size 
) [static]

Read part of the pst file.

Parameters:
pf PST file structure
pos offset of the data in the pst file
buf buffer to contain the data
size size of the buffer and the amount of data to be read
Returns:
actual read size, 0 if seek error

Definition at line 3853 of file libpst.c.

References DEBUG_ENT, DEBUG_RET, and pst_file::fp.

Referenced by pst_getIntAtPos(), pst_open(), and pst_read_block_size().

static int pst_getBlockOffset ( char *  buf,
size_t  read_size,
uint32_t  i_offset,
uint32_t  offset,
pst_block_offset p 
) [static]
static int pst_getBlockOffsetPointer ( pst_file pf,
pst_id2_tree i2_head,
pst_subblocks subblocks,
uint32_t  offset,
pst_block_offset_pointer p 
) [static]

The offset might be zero, in which case we have no data, so return a pair of null pointers.

Or, the offset might end in 0xf, so it is an id2 pointer, in which case we read the id2 block. Otherwise, the high order 16 bits of offset is the index into the subblocks, and the (low order 16 bits of offset)>>4 is an index into the table of offsets in the subblock.

Definition at line 3538 of file libpst.c.

References pst_subblock::buf, DEBUG_ENT, DEBUG_RET, DEBUG_WARN, pst_block_offset::from, pst_block_offset_pointer::from, pst_subblock::i_offset, pst_block_offset_pointer::needfree, pst_ff_getID2block(), pst_getBlockOffset(), pst_subblock::read_size, pst_subblocks::subs, pst_block_offset::to, and pst_block_offset_pointer::to.

Referenced by pst_parse_block().

Here is the call graph for this function:

static char* pst_getcwd ( void   )  [static]

Definition at line 290 of file libpst.c.

References pst_malloc().

Referenced by pst_open(), and pst_reopen().

Here is the call graph for this function:

static pst_desc_tree * pst_getDptr ( pst_file pf,
uint64_t  d_id 
) [static]

find the id in the descriptor tree rooted at pf->d_head

Parameters:
pf global pst file pointer
d_id the id we are looking for
Returns:
pointer to the pst_desc_tree node in the descriptor tree

Definition at line 3673 of file libpst.c.

References pst_desc_tree::child, pst_file::d_head, pst_desc_tree::d_id, DEBUG_ENT, DEBUG_RET, pst_desc_tree::next, and pst_desc_tree::parent.

Referenced by pst_getTopOfFolders(), pst_load_extended_attributes(), and record_descriptor().

pst_index_ll* pst_getID ( pst_file pf,
uint64_t  i_id 
)

Lookup the i_id in the index linked list, and return a pointer to the element.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
i_id key for the index linked list
Returns:
pointer to the element, or NULL if not found.

Definition at line 3618 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_file::i_count, pst_file::i_table, and pst_getID_compare().

Referenced by dumper(), pst_attach_to_file(), pst_attach_to_file_base64(), pst_attach_to_mem(), pst_build_desc_ptr(), pst_build_id2(), pst_ff_getIDblock(), write_embedded_message(), write_inline_attachment(), and write_separate_attachment().

Here is the call graph for this function:

static pst_id2_tree * pst_getID2 ( pst_id2_tree ptr,
uint64_t  id 
) [static]
static int pst_getID_compare ( const void *  key,
const void *  entry 
) [static]

Definition at line 3610 of file libpst.c.

Referenced by pst_getID().

static uint64_t pst_getIntAt ( pst_file pf,
char *  buf 
) [static]

Definition at line 3813 of file libpst.c.

References pst_file::do_read64, LE32_CPU, and LE64_CPU.

Referenced by pst_build_desc_ptr(), and pst_build_id_ptr().

static uint64_t pst_getIntAtPos ( pst_file pf,
int64_t  pos 
) [static]

Definition at line 3829 of file libpst.c.

References pst_file::do_read64, LE32_CPU, LE64_CPU, and pst_getAtPos().

Referenced by pst_open().

Here is the call graph for this function:

pst_desc_tree* pst_getNextDptr ( pst_desc_tree d  ) 

Walk the descriptor tree.

Parameters:
d pointer to the current item in the descriptor tree.
Returns:
pointer to the next item in the descriptor tree.

Definition at line 654 of file libpst.c.

References pst_desc_tree::child, DEBUG_ENT, DEBUG_RET, pst_desc_tree::next, and pst_desc_tree::parent.

Referenced by dumper().

pst_desc_tree* pst_getTopOfFolders ( pst_file pf,
const pst_item root 
)

Get the top of folders descriptor tree.

This is the main descriptor tree that needs to be walked to look at every item in the pst file.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
root root item, which can be obtained by pst_parse_item(pf, pf->d_head, NULL).

Definition at line 524 of file libpst.c.

References pst_desc_tree::assoc_tree, pst_desc_tree::d_id, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_desc_tree::desc, pst_entryid::id, pst_item::message_store, pst_desc_tree::parent_d_id, pst_getDptr(), pst_malloc(), record_descriptor(), and pst_item_message_store::top_of_personal_folder.

Referenced by main().

Here is the call graph for this function:

int pst_load_extended_attributes ( pst_file pf  ) 
int pst_load_index ( pst_file pf  ) 

Load the index entries from the pst file.

This loads both the i_id linked list, and the d_id tree, and should normally be the first call after pst_open().

Parameters:
pf pointer to the pst_file structure setup by pst_open().

Definition at line 632 of file libpst.c.

References pst_file::d_head, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_file::index1, pst_file::index1_back, pst_file::index2, pst_file::index2_back, pst_build_desc_ptr(), pst_build_id_ptr(), and pst_printDptr().

Referenced by main().

Here is the call graph for this function:

int pst_open ( pst_file pf,
const char *  name,
const char *  charset 
)

Open a pst file.

Parameters:
pf pointer to uninitialized pst_file structure. This structure will be filled in by this function.
name name of the file, suitable for fopen().
charset default charset for item with unspecified character sets
Returns:
0 if ok, -1 if error

Definition at line 302 of file libpst.c.

References pst_file::charset, pst_file::cwd, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_file::do_read64, ENC_TYPE, pst_file::encryption, FILE_SIZE_POINTER, pst_file::fname, pst_file::fp, pst_file::ind_type, pst_file::index1, pst_file::index1_back, pst_file::index2, pst_file::index2_back, INDEX_BACK, INDEX_POINTER, INDEX_TYPE32, INDEX_TYPE32A, INDEX_TYPE64, INDEX_TYPE64A, INDEX_TYPE_OFFSET, LE32_CPU, pst_getAtPos(), pst_getcwd(), pst_getIntAtPos(), PST_SIGNATURE, pst_unicode_init(), SECOND_BACK, SECOND_POINTER, pst_file::size, and WARN.

Referenced by main().

Here is the call graph for this function:

static pst_mapi_object * pst_parse_block ( pst_file pf,
uint64_t  block_id,
pst_id2_tree i2_head 
) [static]
pst_item* pst_parse_item ( pst_file pf,
pst_desc_tree d_ptr,
pst_id2_tree m_head 
)
static void pst_printDptr ( pst_file pf,
pst_desc_tree ptr 
) [static]
static void pst_printID2ptr ( pst_id2_tree ptr  )  [static]
static int pst_process ( uint64_t  block_id,
pst_mapi_object list,
pst_item item,
pst_item_attach attach 
) [static]

process the list of MAPI objects produced from parse_block()

Parameters:
block_id block number used by parse_block() to produce these MAPI objects
list pointer to the list of MAPI objects from parse_block()
item pointer to the high level item to be updated from the list. this item may be an email, contact or other sort of item. the type of this item is generally set by the MAPI elements from the list.
attach pointer to the list of attachment records. If this is non-null, the length of the this attachment list must be at least as large as the length of the MAPI objects list.
Returns:
0 for ok, -1 for error.

Definition at line 2121 of file libpst.c.

References pst_item_contact::account_name, pst_item_contact::address1, pst_item_contact::address1_desc, pst_item_contact::address1_transport, pst_item_contact::address1a, pst_item_contact::address2, pst_item_contact::address2_desc, pst_item_contact::address2_transport, pst_item_contact::address2a, pst_item_contact::address3, pst_item_contact::address3_desc, pst_item_contact::address3_transport, pst_item_contact::address3a, pst_item_appointment::alarm, pst_item_appointment::alarm_filename, pst_item_appointment::alarm_minutes, pst_item_appointment::all_day, pst_item::appointment, pst_item_email::arrival_date, pst_item::ascii_type, pst_item_contact::assistant_name, pst_item_contact::assistant_phone, pst_item_folder::assoc_count, pst_item_email::autoforward, pst_item_email::bcc_address, pst_item_contact::billing_information, pst_item_contact::birthday, pst_item::block_id, pst_item::body, pst_item::body_charset, pst_item_contact::business_address, pst_item_contact::business_city, pst_item_contact::business_country, pst_item_contact::business_fax, pst_item_contact::business_homepage, pst_item_contact::business_phone, pst_item_contact::business_phone2, pst_item_contact::business_po_box, pst_item_contact::business_postal_code, pst_item_contact::business_state, pst_item_contact::business_street, pst_item_contact::callback_phone, pst_item_contact::car_phone, pst_item_email::cc_address, pst_item::comment, pst_item_contact::common_name, pst_item_message_store::common_view_folder, pst_item_contact::company_main_phone, pst_item_contact::company_name, pst_item_contact::computer_name, pst_item::contact, pst_item_attach::content_id, pst_item_email::conversation_index, pst_item_email::conversion_prohibited, pst_mapi_object::count_elements, pst_item::create_date, pst_item_contact::customer_id, pst_item_attach::data, pst_binary::data, pst_mapi_element::data, DEBUG_ENT, DEBUG_HEXDUMP, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_item_contact::def_postal_address, pst_item_message_store::default_outbox_folder, pst_item_email::delete_after_submit, pst_item_message_store::deleted_items_folder, pst_item_email::delivery_report, pst_item_contact::department, pst_item_journal::description, pst_item_contact::display_name_prefix, pst_mapi_object::elements, pst_item::email, pst_item_email::encrypted_body, pst_item_email::encrypted_htmlbody, pst_item_journal::end, pst_item_appointment::end, pst_mapi_element::extra, pst_item::extra_fields, pst_item_extra_field::field_name, pst_item::file_as, pst_item_attach::filename1, pst_item_attach::filename2, pst_item_contact::first_name, pst_item::flags, pst_item::folder, pst_item_contact::followup, pst_item_contact::free_busy_address, pst_item_contact::ftp_site, pst_item_contact::fullname, pst_item_contact::gender, pst_item_contact::gov_id, pst_item_email::header, pst_item_contact::hobbies, pst_item_contact::home_address, pst_item_contact::home_city, pst_item_contact::home_country, pst_item_contact::home_fax, pst_item_contact::home_phone, pst_item_contact::home_phone2, pst_item_contact::home_po_box, pst_item_contact::home_postal_code, pst_item_contact::home_state, pst_item_contact::home_street, pst_item_email::htmlbody, pst_item_attach::id2_val, pst_item_email::importance, pst_item_email::in_reply_to, pst_item_contact::initials, pst_item::internet_cpid, pst_item_appointment::is_recurring, pst_string::is_utf8, pst_item_contact::isdn_phone, pst_item_folder::item_count, pst_item_contact::job_title, pst_item::journal, pst_item_contact::keyword, pst_item_appointment::label, pst_item_contact::language, LIST_COPY_APPT_BIN, LIST_COPY_APPT_BOOL, LIST_COPY_APPT_ENUM, LIST_COPY_APPT_INT32, LIST_COPY_APPT_STR, LIST_COPY_APPT_TIME, LIST_COPY_BIN, LIST_COPY_BOOL, LIST_COPY_CONTACT_BOOL, LIST_COPY_CONTACT_ENUM16, LIST_COPY_CONTACT_STR, LIST_COPY_CONTACT_TIME, LIST_COPY_CSTR, LIST_COPY_EMAIL_BIN, LIST_COPY_EMAIL_BOOL, LIST_COPY_EMAIL_ENTRYID, LIST_COPY_EMAIL_ENUM, LIST_COPY_EMAIL_INT32, LIST_COPY_EMAIL_STR, LIST_COPY_EMAIL_TIME, LIST_COPY_ENUM, LIST_COPY_FOLDER_INT32, LIST_COPY_INT32, LIST_COPY_JOURNAL_STR, LIST_COPY_JOURNAL_TIME, LIST_COPY_STORE_ENTRYID, LIST_COPY_STORE_INT32, LIST_COPY_STR, LIST_COPY_TIME, pst_item_appointment::location, pst_item_contact::location, pst_item_contact::mail_permission, MALLOC_FOLDER, pst_item_contact::manager_name, pst_mapi_element::mapi_id, pst_item_email::message_cc_me, pst_item::message_codepage, pst_item_email::message_recip_me, pst_item::message_size, pst_item::message_store, pst_item_email::message_to_me, pst_item_email::messageid, pst_item_attach::method, pst_item_contact::middle_name, pst_item_contact::mileage, pst_item_attach::mimetype, pst_item_contact::mobile_phone, pst_item::modify_date, pst_item_email::ndr_diag_code, pst_item_email::ndr_reason_code, pst_item_email::ndr_status_code, pst_item_attach::next, pst_mapi_object::next, pst_item_extra_field::next, pst_item_contact::nickname, NULL_CHECK, pst_item_contact::office_loc, pst_item_contact::org_id, pst_item_email::original_bcc, pst_item_email::original_cc, pst_item_email::original_sensitivity, pst_item_email::original_to, pst_item_contact::other_address, pst_item_contact::other_city, pst_item_contact::other_country, pst_item_contact::other_phone, pst_item_contact::other_po_box, pst_item_contact::other_postal_code, pst_item_contact::other_state, pst_item_contact::other_street, pst_item_email::outlook_normalized_subject, pst_item_email::outlook_received_name1, pst_item_email::outlook_recipient, pst_item_email::outlook_recipient2, pst_item_email::outlook_recipient_name, pst_item_email::outlook_search_key, pst_item_email::outlook_sender, pst_item_email::outlook_sender2, pst_item_email::outlook_sender_name, pst_item_email::outlook_sender_name2, pst_item::outlook_version, pst_item_contact::pager_phone, pst_item_contact::personal_homepage, pst_item_attach::position, pst_item::predecessor_change, pst_item_contact::pref_name, pst_item_contact::primary_fax, pst_item_contact::primary_phone, pst_item_email::priority, pst_item::private_member, pst_item_email::processed_subject, pst_item_contact::profession, PST_ATTRIB_HEADER, pst_fileTimeToAscii(), PST_LE_GET_INT32, pst_malloc(), pst_stricmp(), pst_strincmp(), PST_TYPE_APPOINTMENT, PST_TYPE_CONTACT, PST_TYPE_JOURNAL, PST_TYPE_NOTE, PST_TYPE_OTHER, PST_TYPE_REPORT, PST_TYPE_SCHEDULE, PST_TYPE_STICKYNOTE, PST_TYPE_TASK, pst_item_message_store::pwd_chksum, pst_item_contact::radio_phone, pst_item_email::read_receipt, pst_item_email::recip2_access, pst_item_email::recip2_address, pst_item_email::recip_access, pst_item_email::recip_address, pst_item::record_key, pst_item_appointment::recurrence_data, pst_item_appointment::recurrence_description, pst_item_appointment::recurrence_end, pst_item_appointment::recurrence_start, pst_item_appointment::recurrence_type, pst_item_appointment::reminder, pst_item_email::reply_requested, pst_item_email::reply_to, pst_item_email::report_text, pst_item_email::report_time, pst_item::response_requested, pst_item_email::return_path_address, pst_item_contact::rich_text, pst_item_email::rtf_body_char_count, pst_item_email::rtf_body_crc, pst_item_email::rtf_body_tag, pst_item_email::rtf_compressed, pst_item_email::rtf_in_sync, pst_item_email::rtf_ws_prefix_count, pst_item_email::rtf_ws_trailing_count, pst_item_message_store::search_root_folder, pst_item_email::sender2_access, pst_item_email::sender2_address, pst_item_email::sender_access, pst_item_email::sender_address, pst_item_email::sensitivity, pst_item_email::sent_date, pst_item_message_store::sent_items_folder, pst_item_email::sentmail_folder, pst_item_email::sentto_address, pst_item_attach::sequence, pst_item_appointment::showas, pst_binary::size, pst_mapi_element::size, pst_item_contact::spouse_name, pst_item_journal::start, pst_item_appointment::start, pst_string::str, pst_item_folder::subfolder, pst_item::subject, pst_item_contact::suffix, pst_item_email::supplementary_info, pst_item_contact::surname, pst_item_contact::telex, pst_item_appointment::timezonestring, pst_item_message_store::top_of_folder, pst_item_message_store::top_of_personal_folder, pst_item_contact::transmittable_display_name, pst_item_contact::ttytdd_phone, pst_item_journal::type, pst_item::type, pst_mapi_element::type, pst_item_folder::unseen_item_count, pst_item_message_store::user_views_folder, pst_item_message_store::valid_mask, pst_item_extra_field::value, pst_item_contact::wedding_anniversary, pst_item_contact::work_address_city, pst_item_contact::work_address_country, pst_item_contact::work_address_postalcode, pst_item_contact::work_address_postofficebox, pst_item_contact::work_address_state, and pst_item_contact::work_address_street.

Referenced by pst_parse_item().

Here is the call graph for this function:

static size_t pst_read_block_size ( pst_file pf,
int64_t  offset,
size_t  size,
char **  buf 
) [static]

Read a block of data from file into memory.

Parameters:
pf PST file
offset offset in the pst file of the data
size size of the block to be read
buf reference to pointer to buffer. If this pointer is non-NULL, it will first be free()d
Returns:
size of block read into memory

Definition at line 3727 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, DEBUG_RET, DEBUG_WARN, pst_file::fp, pst_getAtPos(), and pst_malloc().

Referenced by pst_build_desc_ptr(), pst_build_id2(), pst_build_id_ptr(), and pst_ff_getIDblock().

Here is the call graph for this function:

int pst_reopen ( pst_file pf  ) 

Reopen the pst file after a fork.

Parameters:
pf pointer to the pst_file structure setup by pst_open().
Returns:
0 if ok, -1 if error

Definition at line 379 of file libpst.c.

References pst_file::cwd, pst_file::fname, pst_file::fp, and pst_getcwd().

Referenced by try_fork().

Here is the call graph for this function:

void pst_rfc2047 ( pst_item item,
pst_string str,
int  needs_quote 
)

Convert str to rfc2047 encoding of str, possibly enclosed in quotes if it contains spaces.

Parameters:
item pointer to the containing mapi item
str pointer to the mapi string of interest
needs_quote true if strings containing spaces should be wrapped in quotes

Definition at line 4413 of file libpst.c.

References pst_base64_encode_single(), pst_convert_utf8(), pst_malloc(), and pst_string::str.

Referenced by write_normal_email().

Here is the call graph for this function:

void pst_rfc2231 ( pst_string str  ) 

Convert str to rfc2231 encoding of str.

Parameters:
str pointer to the mapi string of interest

Definition at line 4375 of file libpst.c.

References pst_malloc(), and pst_string::str.

Referenced by write_inline_attachment().

Here is the call graph for this function:

char* pst_rfc2425_datetime_format ( const FILETIME ft,
int  buflen,
char *  result 
)

Convert a FILETIME into rfc2425 date/time format 1953-10-15T23:10:00Z which is the same as one of the forms in the ISO3601 standard.

Parameters:
[in] ft time to be converted
[in] buflen length of the output buffer
[out] result pointer to output buffer, must be at least 30 bytes
Returns:
time in rfc2425 format

Definition at line 4268 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, DEBUG_RET, and pst_fileTimeToStructTM().

Referenced by write_vcard().

Here is the call graph for this function:

char* pst_rfc2426_escape ( char *  str,
char **  result,
size_t *  resultlen 
)

Add any necessary escape characters for rfc2426 vcard format.

Parameters:
[in] str pointer to input string
[in,out] result pointer to a char* pointer that may be realloc'ed if needed
[in,out] resultlen size of the result buffer
Returns:
pointer to output string, either the input pointer if there are no characters that need escapes, or a pointer to a possibly realloc'ed result buffer.

Definition at line 4204 of file libpst.c.

References DEBUG_ENT, DEBUG_RET, pst_chr_count(), and pst_realloc().

Referenced by process(), write_appointment(), write_extra_categories(), write_journal(), and write_vcard().

Here is the call graph for this function:

char* pst_rfc2445_datetime_format ( const FILETIME ft,
int  buflen,
char *  result 
)

Convert a FILETIME into rfc2445 date/time format 19531015T231000Z.

Parameters:
[in] ft time to be converted
[in] buflen length of the output buffer
[out] result pointer to output buffer, must be at least 30 bytes
Returns:
time in rfc2445 format

Definition at line 4280 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, DEBUG_RET, and pst_fileTimeToStructTM().

Referenced by process(), write_appointment(), and write_journal().

Here is the call graph for this function:

char* pst_rfc2445_datetime_format_now ( int  buflen,
char *  result 
)

Convert the current time rfc2445 date/time format 19531015T231000Z.

Parameters:
[in] buflen length of the output buffer
[out] result pointer to output buffer, must be at least 30 bytes
Returns:
time in rfc2445 format

Definition at line 4292 of file libpst.c.

References DEBUG_ENT, DEBUG_INFO, and DEBUG_RET.

Referenced by write_appointment(), and write_journal().

int pst_stricmp ( char *  a,
char *  b 
)

compare strings case-insensitive.

Returns:
-1 if a < b, 0 if a==b, 1 if a > b

Definition at line 4142 of file libpst.c.

Referenced by acceptable_ext(), and pst_process().

static int pst_strincmp ( char *  a,
char *  b,
size_t  x 
) [static]

Definition at line 4155 of file libpst.c.

Referenced by pst_process().

static char * pst_wide_to_single ( char *  wt,
size_t  size 
) [static]

Definition at line 4186 of file libpst.c.

References DEBUG_ENT, DEBUG_RET, and pst_malloc().

Referenced by pst_load_extended_attributes().

Here is the call graph for this function:

static void record_descriptor ( pst_file pf,
pst_desc_tree node 
) [static]

add a pst descriptor node into the global tree.

Parameters:
pf global pst file pointer
node pointer to the new node to be added to the tree

Definition at line 447 of file libpst.c.

References add_descriptor_to_list(), pst_desc_tree::child, pst_desc_tree::child_tail, pst_file::d_head, pst_desc_tree::d_id, pst_file::d_tail, DEBUG_ENT, DEBUG_INFO, DEBUG_RET, pst_desc_tree::next, pst_desc_tree::no_child, pst_desc_tree::parent, pst_desc_tree::parent_d_id, pst_desc_tree::prev, and pst_getDptr().

Referenced by pst_build_desc_ptr(), and pst_getTopOfFolders().

Here is the call graph for this function:


Variable Documentation

unsigned char comp_enc[] [static]
Initial value:
 {
    0x47, 0xf1, 0xb4, 0xe6, 0x0b, 0x6a, 0x72, 0x48, 0x85, 0x4e, 0x9e, 0xeb, 0xe2, 0xf8, 0x94, 0x53,
    0xe0, 0xbb, 0xa0, 0x02, 0xe8, 0x5a, 0x09, 0xab, 0xdb, 0xe3, 0xba, 0xc6, 0x7c, 0xc3, 0x10, 0xdd,
    0x39, 0x05, 0x96, 0x30, 0xf5, 0x37, 0x60, 0x82, 0x8c, 0xc9, 0x13, 0x4a, 0x6b, 0x1d, 0xf3, 0xfb,
    0x8f, 0x26, 0x97, 0xca, 0x91, 0x17, 0x01, 0xc4, 0x32, 0x2d, 0x6e, 0x31, 0x95, 0xff, 0xd9, 0x23,
    0xd1, 0x00, 0x5e, 0x79, 0xdc, 0x44, 0x3b, 0x1a, 0x28, 0xc5, 0x61, 0x57, 0x20, 0x90, 0x3d, 0x83,
    0xb9, 0x43, 0xbe, 0x67, 0xd2, 0x46, 0x42, 0x76, 0xc0, 0x6d, 0x5b, 0x7e, 0xb2, 0x0f, 0x16, 0x29,
    0x3c, 0xa9, 0x03, 0x54, 0x0d, 0xda, 0x5d, 0xdf, 0xf6, 0xb7, 0xc7, 0x62, 0xcd, 0x8d, 0x06, 0xd3,
    0x69, 0x5c, 0x86, 0xd6, 0x14, 0xf7, 0xa5, 0x66, 0x75, 0xac, 0xb1, 0xe9, 0x45, 0x21, 0x70, 0x0c,
    0x87, 0x9f, 0x74, 0xa4, 0x22, 0x4c, 0x6f, 0xbf, 0x1f, 0x56, 0xaa, 0x2e, 0xb3, 0x78, 0x33, 0x50,
    0xb0, 0xa3, 0x92, 0xbc, 0xcf, 0x19, 0x1c, 0xa7, 0x63, 0xcb, 0x1e, 0x4d, 0x3e, 0x4b, 0x1b, 0x9b,
    0x4f, 0xe7, 0xf0, 0xee, 0xad, 0x3a, 0xb5, 0x59, 0x04, 0xea, 0x40, 0x55, 0x25, 0x51, 0xe5, 0x7a,
    0x89, 0x38, 0x68, 0x52, 0x7b, 0xfc, 0x27, 0xae, 0xd7, 0xbd, 0xfa, 0x07, 0xf4, 0xcc, 0x8e, 0x5f,
    0xef, 0x35, 0x9c, 0x84, 0x2b, 0x15, 0xd5, 0x77, 0x34, 0x49, 0xb6, 0x12, 0x0a, 0x7f, 0x71, 0x88,
    0xfd, 0x9d, 0x18, 0x41, 0x7d, 0x93, 0xd8, 0x58, 0x2c, 0xce, 0xfe, 0x24, 0xaf, 0xde, 0xb8, 0x36,
    0xc8, 0xa1, 0x80, 0xa6, 0x99, 0x98, 0xa8, 0x2f, 0x0e, 0x81, 0x65, 0x73, 0xe4, 0xc2, 0xa2, 0x8a,
    0xd4, 0xe1, 0x11, 0xd0, 0x08, 0x8b, 0x2a, 0xf2, 0xed, 0x9a, 0x64, 0x3f, 0xc1, 0x6c, 0xf9, 0xec
}

for "compressible" encryption, just a simple substitution cipher, plaintext = comp_enc[ciphertext]; for "strong" encryption, this is the first rotor of an Enigma 3 rotor cipher.

Definition at line 197 of file libpst.c.

unsigned char comp_high1[] [static]
Initial value:
 {
    0x41, 0x36, 0x13, 0x62, 0xa8, 0x21, 0x6e, 0xbb, 0xf4, 0x16, 0xcc, 0x04, 0x7f, 0x64, 0xe8, 0x5d,
    0x1e, 0xf2, 0xcb, 0x2a, 0x74, 0xc5, 0x5e, 0x35, 0xd2, 0x95, 0x47, 0x9e, 0x96, 0x2d, 0x9a, 0x88,
    0x4c, 0x7d, 0x84, 0x3f, 0xdb, 0xac, 0x31, 0xb6, 0x48, 0x5f, 0xf6, 0xc4, 0xd8, 0x39, 0x8b, 0xe7,
    0x23, 0x3b, 0x38, 0x8e, 0xc8, 0xc1, 0xdf, 0x25, 0xb1, 0x20, 0xa5, 0x46, 0x60, 0x4e, 0x9c, 0xfb,
    0xaa, 0xd3, 0x56, 0x51, 0x45, 0x7c, 0x55, 0x00, 0x07, 0xc9, 0x2b, 0x9d, 0x85, 0x9b, 0x09, 0xa0,
    0x8f, 0xad, 0xb3, 0x0f, 0x63, 0xab, 0x89, 0x4b, 0xd7, 0xa7, 0x15, 0x5a, 0x71, 0x66, 0x42, 0xbf,
    0x26, 0x4a, 0x6b, 0x98, 0xfa, 0xea, 0x77, 0x53, 0xb2, 0x70, 0x05, 0x2c, 0xfd, 0x59, 0x3a, 0x86,
    0x7e, 0xce, 0x06, 0xeb, 0x82, 0x78, 0x57, 0xc7, 0x8d, 0x43, 0xaf, 0xb4, 0x1c, 0xd4, 0x5b, 0xcd,
    0xe2, 0xe9, 0x27, 0x4f, 0xc3, 0x08, 0x72, 0x80, 0xcf, 0xb0, 0xef, 0xf5, 0x28, 0x6d, 0xbe, 0x30,
    0x4d, 0x34, 0x92, 0xd5, 0x0e, 0x3c, 0x22, 0x32, 0xe5, 0xe4, 0xf9, 0x9f, 0xc2, 0xd1, 0x0a, 0x81,
    0x12, 0xe1, 0xee, 0x91, 0x83, 0x76, 0xe3, 0x97, 0xe6, 0x61, 0x8a, 0x17, 0x79, 0xa4, 0xb7, 0xdc,
    0x90, 0x7a, 0x5c, 0x8c, 0x02, 0xa6, 0xca, 0x69, 0xde, 0x50, 0x1a, 0x11, 0x93, 0xb9, 0x52, 0x87,
    0x58, 0xfc, 0xed, 0x1d, 0x37, 0x49, 0x1b, 0x6a, 0xe0, 0x29, 0x33, 0x99, 0xbd, 0x6c, 0xd9, 0x94,
    0xf3, 0x40, 0x54, 0x6f, 0xf0, 0xc6, 0x73, 0xb8, 0xd6, 0x3e, 0x65, 0x18, 0x44, 0x1f, 0xdd, 0x67,
    0x10, 0xf1, 0x0c, 0x19, 0xec, 0xae, 0x03, 0xa1, 0x14, 0x7b, 0xa9, 0x0b, 0xff, 0xf8, 0xa3, 0xc0,
    0xa2, 0x01, 0xf7, 0x2e, 0xbc, 0x24, 0x68, 0x75, 0x0d, 0xfe, 0xba, 0x2f, 0xb5, 0xd0, 0xda, 0x3d
}

for "strong" encryption, this is the second rotor of an Enigma 3 rotor cipher.

Definition at line 218 of file libpst.c.

Referenced by pst_decrypt().

unsigned char comp_high2[] [static]
Initial value:
 {
    0x14, 0x53, 0x0f, 0x56, 0xb3, 0xc8, 0x7a, 0x9c, 0xeb, 0x65, 0x48, 0x17, 0x16, 0x15, 0x9f, 0x02,
    0xcc, 0x54, 0x7c, 0x83, 0x00, 0x0d, 0x0c, 0x0b, 0xa2, 0x62, 0xa8, 0x76, 0xdb, 0xd9, 0xed, 0xc7,
    0xc5, 0xa4, 0xdc, 0xac, 0x85, 0x74, 0xd6, 0xd0, 0xa7, 0x9b, 0xae, 0x9a, 0x96, 0x71, 0x66, 0xc3,
    0x63, 0x99, 0xb8, 0xdd, 0x73, 0x92, 0x8e, 0x84, 0x7d, 0xa5, 0x5e, 0xd1, 0x5d, 0x93, 0xb1, 0x57,
    0x51, 0x50, 0x80, 0x89, 0x52, 0x94, 0x4f, 0x4e, 0x0a, 0x6b, 0xbc, 0x8d, 0x7f, 0x6e, 0x47, 0x46,
    0x41, 0x40, 0x44, 0x01, 0x11, 0xcb, 0x03, 0x3f, 0xf7, 0xf4, 0xe1, 0xa9, 0x8f, 0x3c, 0x3a, 0xf9,
    0xfb, 0xf0, 0x19, 0x30, 0x82, 0x09, 0x2e, 0xc9, 0x9d, 0xa0, 0x86, 0x49, 0xee, 0x6f, 0x4d, 0x6d,
    0xc4, 0x2d, 0x81, 0x34, 0x25, 0x87, 0x1b, 0x88, 0xaa, 0xfc, 0x06, 0xa1, 0x12, 0x38, 0xfd, 0x4c,
    0x42, 0x72, 0x64, 0x13, 0x37, 0x24, 0x6a, 0x75, 0x77, 0x43, 0xff, 0xe6, 0xb4, 0x4b, 0x36, 0x5c,
    0xe4, 0xd8, 0x35, 0x3d, 0x45, 0xb9, 0x2c, 0xec, 0xb7, 0x31, 0x2b, 0x29, 0x07, 0x68, 0xa3, 0x0e,
    0x69, 0x7b, 0x18, 0x9e, 0x21, 0x39, 0xbe, 0x28, 0x1a, 0x5b, 0x78, 0xf5, 0x23, 0xca, 0x2a, 0xb0,
    0xaf, 0x3e, 0xfe, 0x04, 0x8c, 0xe7, 0xe5, 0x98, 0x32, 0x95, 0xd3, 0xf6, 0x4a, 0xe8, 0xa6, 0xea,
    0xe9, 0xf3, 0xd5, 0x2f, 0x70, 0x20, 0xf2, 0x1f, 0x05, 0x67, 0xad, 0x55, 0x10, 0xce, 0xcd, 0xe3,
    0x27, 0x3b, 0xda, 0xba, 0xd7, 0xc2, 0x26, 0xd4, 0x91, 0x1d, 0xd2, 0x1c, 0x22, 0x33, 0xf8, 0xfa,
    0xf1, 0x5a, 0xef, 0xcf, 0x90, 0xb6, 0x8b, 0xb5, 0xbd, 0xc0, 0xbf, 0x08, 0x97, 0x1e, 0x6c, 0xe2,
    0x61, 0xe0, 0xc6, 0xc1, 0x59, 0xab, 0xbb, 0x58, 0xde, 0x5f, 0xdf, 0x60, 0x79, 0x7e, 0xb2, 0x8a
}

for "strong" encryption, this is the third rotor of an Enigma 3 rotor cipher.

Definition at line 239 of file libpst.c.

Referenced by pst_decrypt().


Generated on 6 Jul 2016 for 'LibPst' by  doxygen 1.6.1