Mercurial > libpst
comparison getidblock.c @ 0:6b1b602514db libpst_0_5
Initial revision
author | carl |
---|---|
date | Fri, 09 Jul 2004 07:26:16 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:6b1b602514db |
---|---|
1 #include <stdio.h> | |
2 #include <string.h> | |
3 | |
4 #ifndef __GNUC__ | |
5 # include "XGetopt.h" | |
6 #endif | |
7 | |
8 #ifndef _WIN32 | |
9 # include <unistd.h> | |
10 #endif | |
11 | |
12 #include "define.h" | |
13 #include "libpst.h" | |
14 | |
15 static void usage(); | |
16 | |
17 int main(int argc, char ** argv) { | |
18 // pass the id number to display on the command line | |
19 char *fname, *sid; | |
20 pst_file pstfile; | |
21 unsigned int id; | |
22 int decrypt = 0, process = 0, binary = 0, c; | |
23 unsigned char *buf = NULL; | |
24 size_t readSize; | |
25 pst_item *item; | |
26 pst_desc_ll* ptr; | |
27 | |
28 DEBUG_INIT("getidblock.log"); | |
29 DEBUG_REGISTER_CLOSE(); | |
30 DEBUG_ENT("main"); | |
31 | |
32 while ((c = getopt(argc, argv, "bdp")) != -1) { | |
33 switch (c) { | |
34 case 'b': | |
35 // enable binary output | |
36 binary = 1; | |
37 break; | |
38 case 'd': | |
39 //enable decrypt | |
40 decrypt = 1; | |
41 break; | |
42 case 'p': | |
43 // enable procesing of block | |
44 process = 1; | |
45 break; | |
46 default: | |
47 usage(); | |
48 exit(EXIT_FAILURE); | |
49 } | |
50 } | |
51 | |
52 if (optind+1 >= argc) { | |
53 // no more items on the cmd | |
54 usage(); | |
55 exit(EXIT_FAILURE); | |
56 } | |
57 fname = argv[optind]; | |
58 sid = argv[optind+1]; | |
59 id = (unsigned int)strtol(sid, NULL, 0); | |
60 | |
61 DEBUG_MAIN(("Opening file\n")); | |
62 memset(&pstfile, 0, sizeof(pstfile)); | |
63 if (pst_open(&pstfile, fname, "r")!=0) { | |
64 DIE(("Error opening file\n")); | |
65 } | |
66 | |
67 DEBUG_MAIN(("Loading Index\n")); | |
68 if (pst_load_index(&pstfile) != 0) { | |
69 DIE(("Error loading file index\n")); | |
70 } | |
71 | |
72 // if ((ptr = _pst_getID(&pstfile, id)) == NULL) { | |
73 // DIE(("id not found [%#x]\n", id)); | |
74 // } | |
75 | |
76 DEBUG_MAIN(("Loading block\n")); | |
77 | |
78 if ((readSize = _pst_ff_getIDblock(&pstfile, id, &buf)) <= 0 || buf == NULL) { | |
79 // if ((readSize = _pst_read_block_size(&pstfile, ptr->offset, ptr->size, &buf, 1, 1)) < ptr->size) { | |
80 DIE(("Error loading block\n")); | |
81 } | |
82 if (binary==0) printf("Block %#x, size %#x[%i]\n",id, (unsigned int)readSize, (int) readSize); | |
83 | |
84 if (decrypt!=0) | |
85 if (_pst_decrypt(buf, readSize, (int)pstfile.encryption) != 0) { | |
86 DIE(("Error decrypting block\n")); | |
87 } | |
88 | |
89 DEBUG_MAIN(("Printing block... [id %#x, size %#x]\n", id, readSize)); | |
90 if (binary==0) { | |
91 _pst_debug_hexdump(stdout, buf, readSize, 0x10); | |
92 } else { | |
93 if (fwrite(buf, 1, readSize, stdout) != 0) { | |
94 DIE(("Error occured during writing of buf to stdout\n")); | |
95 } | |
96 } | |
97 free(buf); | |
98 | |
99 if (process!=0) { | |
100 DEBUG_MAIN(("Parsing block...\n")); | |
101 ptr = pstfile.d_head; | |
102 while(ptr != NULL) { | |
103 if (ptr->list_index != NULL && ptr->list_index->id == id) | |
104 break; | |
105 if (ptr->desc != NULL && ptr->desc->id == id) | |
106 break; | |
107 ptr = pst_getNextDptr(ptr); | |
108 } | |
109 if (ptr == NULL) { | |
110 ptr = (pst_desc_ll*)xmalloc(sizeof(pst_desc_ll)); | |
111 ptr->desc = _pst_getID(&pstfile, id); | |
112 ptr->list_index = NULL; | |
113 } | |
114 if (ptr != NULL) { | |
115 if ((item = _pst_parse_item(&pstfile, ptr)) != NULL) | |
116 _pst_freeItem(item); | |
117 } else { | |
118 DEBUG_MAIN(("item not found with this ID\n")); | |
119 printf("Cannot find the owning Record of this ID. Cannot parse\n"); | |
120 } | |
121 } | |
122 | |
123 if(pst_close(&pstfile)!=0) { | |
124 DIE(("pst_close failed\n")); | |
125 } | |
126 | |
127 DEBUG_RET(); | |
128 return 0; | |
129 } | |
130 | |
131 void usage() { | |
132 printf("usage: getidblock [options] filename id\n"); | |
133 printf("\tfilename - name of the file to access\n"); | |
134 printf("\tid - ID of the block to fetch - can begin with 0x for hex\n"); | |
135 printf("\toptions\n"); | |
136 printf("\t\t-d\tDecrypt the block before printing\n"); | |
137 printf("\t\t-p\tProcess the block before finishing.\n"); | |
138 printf("\t\t\tView the debug log for information\n"); | |
139 } |