Mercurial > hg > xemacs-beta
annotate lib-src/insert-data-in-exec.c @ 5705:9c9b07d40f20
Update references to repository to reflect current reality.
author | Stephen J. Turnbull <stephen@xemacs.org> |
---|---|
date | Fri, 28 Dec 2012 13:03:15 +0900 |
parents | dfc9fe46c294 |
children | 86d33ddc7fd6 |
rev | line source |
---|---|
4722
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
1 /* Copies the dump file inside the xemacs executable. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
2 Copyright (C) 2003-2004 Olivier Galibert. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
3 Copyright (C) 2003 Larry McVoy. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
4 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
5 Redistribution and use in source and binary forms, with or without |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
6 modification, are permitted provided that the following conditions are met: |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
7 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
8 1. Redistributions of source code must retain the above copyright notice, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
9 this list of conditions and the following disclaimer. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
10 2. Redistributions in binary form must reproduce the above copyright notice, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
11 this list of conditions and the following disclaimer in the documentation |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
12 and/or other materials provided with the distribution. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
13 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
14 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
15 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
16 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LARRY |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
17 MCVOY, THE XEMACS PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
18 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
19 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
20 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
21 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
22 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
23 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
24 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
25 The views and conclusions contained in the software and documentation are those |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
26 of the authors and should not be interpreted as representing official policies, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
27 either expressed or implied, of the XEmacs Project. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
28 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
29 The "key" array is the work of Larry McVoy. See |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
30 http://lkml.org/lkml/2003/7/11/141 for more information. */ |
2015 | 31 |
32 #include <stdio.h> | |
33 #include <stdlib.h> | |
34 #include <string.h> | |
35 | |
36 static const unsigned char key[] = { | |
37 255, | |
38 6, | |
39 1, | |
40 2, | |
41 3, | |
42 4, | |
43 255, | |
44 3, | |
45 9, | |
46 62, | |
47 255, | |
48 10, | |
49 4, | |
50 61, | |
51 255 | |
52 }; | |
53 | |
54 int main(int argc, char **argv) | |
55 { | |
56 FILE *te, *xe, *dump; | |
57 unsigned char *xed, *p; | |
58 long size, size_dump, size1, i; | |
59 long max_size, offset; | |
60 | |
61 char msg[65536]; | |
62 | |
63 if(argc != 6 && (argc != 3 || strcmp(argv[1], "-s"))) { | |
64 fprintf(stderr, "Usage:\n%s temacs xemacs.dmp xemacs size offset\n%s -s xemacs.dmp\n", argv[0], argv[0]); | |
65 exit(1); | |
66 } | |
67 | |
68 if(argc == 3) { | |
69 sprintf(msg, "Opening %s failed", argv[2]); | |
70 dump = fopen(argv[2], "rb+"); | |
71 if(!dump) { | |
72 perror(msg); | |
73 exit(1); | |
74 } | |
75 | |
76 if(fseek(dump, 0, SEEK_END)) { | |
77 perror("fseek end dump"); | |
78 exit(1); | |
79 } | |
80 | |
81 size = ftell(dump); | |
82 if(size == -1) { | |
83 perror("ftell dump"); | |
84 exit(1); | |
85 } | |
86 | |
87 printf("%ld\n", size); | |
88 exit(0); | |
89 } | |
90 | |
91 | |
92 max_size = strtol(argv[4], 0, 10); | |
93 offset = strtol(argv[5], 0, 10); | |
94 | |
95 sprintf(msg, "Opening %s failed", argv[1]); | |
96 te = fopen(argv[1], "rb"); | |
97 if(!te) { | |
98 perror(msg); | |
99 exit(1); | |
100 } | |
101 | |
102 if(fseek(te, 0, SEEK_END)) { | |
103 perror("fseek end"); | |
104 exit(1); | |
105 } | |
106 | |
107 size = ftell(te); | |
108 if(size == -1) { | |
109 perror("ftell"); | |
110 exit(1); | |
111 } | |
112 | |
113 if(fseek(te, 0, SEEK_SET)) { | |
114 perror("fseek beginning"); | |
115 exit(1); | |
116 } | |
117 | |
118 xed = malloc(size); | |
119 if(!xed) { | |
120 perror("malloc"); | |
121 exit(1); | |
122 } | |
123 | |
124 size1 = fread(xed, 1, size, te); | |
125 if(size1 != size) { | |
126 if(ferror(te)) { | |
127 perror("fread temacs"); | |
128 exit(1); | |
129 } | |
130 fprintf(stderr, "Fread returned %ld, expected %ld ?\n", size1, size); | |
131 exit(1); | |
132 } | |
133 | |
134 if(fclose(te)) { | |
135 perror("fclose temacs"); | |
136 exit(1); | |
137 } | |
138 | |
139 p = xed; | |
140 for(i=0; i<size-(long)sizeof(key); i++) { | |
141 if(!memcmp(p, key, sizeof(key))) | |
142 goto found; | |
143 p++; | |
144 } | |
145 | |
146 fprintf(stderr, "dumped_data key not found in executable.\n"); | |
147 exit(1); | |
148 | |
149 found: | |
150 fprintf(stderr, "dumped_data found at offset 0x%lx, patching.\n", i); | |
151 | |
152 sprintf(msg, "Opening %s failed", argv[2]); | |
2502 | 153 dump = fopen(argv[2], "rb"); |
2015 | 154 if(!dump) { |
155 perror(msg); | |
156 exit(1); | |
157 } | |
158 | |
159 if(fseek(dump, 0, SEEK_END)) { | |
160 perror("fseek end dump"); | |
161 exit(1); | |
162 } | |
163 | |
164 size_dump = ftell(dump); | |
165 if(size_dump == -1) { | |
166 perror("ftell dump"); | |
167 exit(1); | |
168 } | |
169 | |
170 if(size_dump > max_size) { | |
2022 | 171 fprintf(stderr, "Dump file too big for available space (max=%ld, dump=%ld)\n", max_size, size_dump); |
2015 | 172 exit(2); |
173 } | |
174 | |
175 if(fseek(dump, 0, SEEK_SET)) { | |
176 perror("fseek beginning dump"); | |
177 exit(1); | |
178 } | |
179 | |
180 size1 = fread(xed+i+offset, 1, size_dump, dump); | |
181 if(size1 != size_dump) { | |
182 if(ferror(dump)) { | |
183 perror("fread dump"); | |
184 exit(1); | |
185 } | |
186 fprintf(stderr, "Fread dump returned %ld, expected %ld ?\n", size1, size_dump); | |
187 exit(1); | |
188 } | |
189 | |
190 if(fclose(dump)) { | |
191 perror("fclose dump"); | |
192 exit(1); | |
193 } | |
194 | |
195 memset(xed+i, 0, offset); | |
196 | |
197 xed[i ] = size_dump; | |
198 xed[i+1] = size_dump >> 8; | |
199 xed[i+2] = size_dump >> 16; | |
200 xed[i+3] = size_dump >> 24; | |
201 | |
202 fprintf(stderr, "dumped_data found at offset 0x%lx, patching.\n", i); | |
203 | |
204 sprintf(msg, "Opening %s failed", argv[3]); | |
205 xe = fopen(argv[3], "wb"); | |
206 if(!xe) { | |
207 perror(msg); | |
208 exit(1); | |
209 } | |
210 | |
211 size1 = fwrite(xed, 1, size, xe); | |
212 if(size1 != size) { | |
213 if(ferror(xe)) { | |
214 perror("fwrite xemacs"); | |
215 exit(1); | |
216 } | |
217 fprintf(stderr, "Fwrite xemacs returned %ld, expected %ld ?\n", size1, size); | |
218 exit(1); | |
219 } | |
220 | |
221 if(fclose(xe)) { | |
222 perror("fclose xemacs"); | |
223 exit(1); | |
224 } | |
225 | |
226 exit(0); | |
227 } | |
228 |