annotate src/getidblock.c @ 59:7d5c637aaafb

General cleanup and code fixes. Use autoscan to cleanup our autoconf system. Use autoconf to detect when we need to use our XGetopt files and other header files. Decode BCC field. Fix missing LE32_CPU byte swapping for FILETIME types.
author Carl Byington <carl@five-ten-sg.com>
date Thu, 14 Feb 2008 14:55:32 -0800
parents 034641c26ab9
children 3cb02cb1e6cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
48
f66078abed38 more fixes for 64 bit format
carl
parents: 46
diff changeset
1 #include "define.h"
f66078abed38 more fixes for 64 bit format
carl
parents: 46
diff changeset
2
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
3 #include <stdio.h>
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
4 #include <string.h>
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
5
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
6 #ifndef __GNUC__
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
7 # include "XGetopt.h"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
8 #endif
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
9
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
10 #ifndef _WIN32
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
11 # include <unistd.h>
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
12 #endif
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
13
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
14 #include "libpst.h"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
15
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
16 static void usage();
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
17
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
18 int main(int argc, char ** argv) {
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
19 // pass the id number to display on the command line
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
20 char *fname, *sid;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
21 pst_file pstfile;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
22 unsigned int id;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
23 int decrypt = 0, process = 0, binary = 0, c;
52
034641c26ab9 code cleanup
carl
parents: 48
diff changeset
24 char *buf = NULL;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
25 size_t readSize;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
26 pst_item *item;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
27 pst_desc_ll* ptr;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
28
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
29 DEBUG_INIT("getidblock.log");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
30 DEBUG_REGISTER_CLOSE();
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
31 DEBUG_ENT("main");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
32
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
33 while ((c = getopt(argc, argv, "bdp")) != -1) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
34 switch (c) {
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
35 case 'b':
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
36 // enable binary output
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
37 binary = 1;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
38 break;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
39 case 'd':
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
40 //enable decrypt
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
41 decrypt = 1;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
42 break;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
43 case 'p':
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
44 // enable procesing of block
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
45 process = 1;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
46 break;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
47 default:
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
48 usage();
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
49 exit(EXIT_FAILURE);
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
50 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
51 }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
52
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
53 if (optind+1 >= argc) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
54 // no more items on the cmd
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
55 usage();
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
56 exit(EXIT_FAILURE);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
57 }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
58 fname = argv[optind];
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
59 sid = argv[optind+1];
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
60 id = (unsigned int)strtol(sid, NULL, 0);
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
61
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
62 DEBUG_MAIN(("Opening file\n"));
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
63 memset(&pstfile, 0, sizeof(pstfile));
59
7d5c637aaafb General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents: 52
diff changeset
64 if (pst_open(&pstfile, fname)) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
65 DIE(("Error opening file\n"));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
66 }
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
67
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
68 DEBUG_MAIN(("Loading Index\n"));
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
69 if (pst_load_index(&pstfile) != 0) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
70 DIE(("Error loading file index\n"));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
71 }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
72
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
73 // if ((ptr = pst_getID(&pstfile, id)) == NULL) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
74 // DIE(("id not found [%#x]\n", id));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
75 // }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
76
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
77 DEBUG_MAIN(("Loading block\n"));
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
78
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
79 if ((readSize = pst_ff_getIDblock(&pstfile, id, &buf)) <= 0 || buf == NULL) {
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
80 // if ((readSize = pst_read_block_size(&pstfile, ptr->offset, ptr->size, &buf, 1, 1)) < ptr->size) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
81 DIE(("Error loading block\n"));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
82 }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
83 if (binary==0) printf("Block %#x, size %#x[%i]\n",id, (unsigned int)readSize, (int) readSize);
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
84
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
85 if (decrypt!=0)
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
86 if (pst_decrypt(buf, readSize, (int)pstfile.encryption) != 0) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
87 DIE(("Error decrypting block\n"));
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
88 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
89
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
90 DEBUG_MAIN(("Printing block... [id %#x, size %#x]\n", id, readSize));
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
91 if (binary==0) {
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
92 pst_debug_hexdumper(stdout, buf, readSize, 0x10, 0);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
93 } else {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
94 if (fwrite(buf, 1, readSize, stdout) != 0) {
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
95 DIE(("Error occured during writing of buf to stdout\n"));
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
96 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
97 }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
98 free(buf);
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
99
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
100 if (process!=0) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
101 DEBUG_MAIN(("Parsing block...\n"));
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
102 ptr = pstfile.d_head;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
103 while(ptr != NULL) {
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
104 if (ptr->list_index != NULL && ptr->list_index->id == id)
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
105 break;
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
106 if (ptr->desc != NULL && ptr->desc->id == id)
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
107 break;
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
108 ptr = pst_getNextDptr(ptr);
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
109 }
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
110 if (ptr == NULL) {
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
111 ptr = (pst_desc_ll*)xmalloc(sizeof(pst_desc_ll));
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
112 ptr->desc = pst_getID(&pstfile, id);
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
113 ptr->list_index = NULL;
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
114 }
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
115 if (ptr != NULL) {
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
116 if ((item = pst_parse_item(&pstfile, ptr)) != NULL)
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 34
diff changeset
117 pst_freeItem(item);
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
118 } else {
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
119 DEBUG_MAIN(("item not found with this ID\n"));
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
120 printf("Cannot find the owning Record of this ID. Cannot parse\n");
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
121 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
122 }
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
123
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
124 if(pst_close(&pstfile)!=0) {
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 16
diff changeset
125 DIE(("pst_close failed\n"));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
126 }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
127
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
128 DEBUG_RET();
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
129 return 0;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
130 }
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
131
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
132 void usage() {
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
133 printf("usage: getidblock [options] filename id\n");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
134 printf("\tfilename - name of the file to access\n");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
135 printf("\tid - ID of the block to fetch - can begin with 0x for hex\n");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
136 printf("\toptions\n");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
137 printf("\t\t-d\tDecrypt the block before printing\n");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
138 printf("\t\t-p\tProcess the block before finishing.\n");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
139 printf("\t\t\tView the debug log for information\n");
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
140 }