annotate src/getidblock.c @ 48:f66078abed38

more fixes for 64 bit format
author carl
date Fri, 18 Jan 2008 15:07:12 -0800
parents b2a7f2e0926a
children 034641c26ab9
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;
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
24 unsigned char *buf = NULL;
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));
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
64 if (pst_open(&pstfile, fname, "r")!=0) {
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 }