Mercurial > hg > xemacs-beta
diff lib-src/insert-data-in-exec.c @ 2015:2364237fbc0f
[xemacs-hg @ 2004-04-15 20:56:17 by olivierg]
Moving the dump file inside the executable
author | olivierg |
---|---|
date | Thu, 15 Apr 2004 20:56:23 +0000 |
parents | |
children | d31a2df82ddb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib-src/insert-data-in-exec.c Thu Apr 15 20:56:23 2004 +0000 @@ -0,0 +1,199 @@ +/* Copies the dump file inside the xemacs executable */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static const unsigned char key[] = { + 255, + 6, + 1, + 2, + 3, + 4, + 255, + 3, + 9, + 62, + 255, + 10, + 4, + 61, + 255 +}; + +int main(int argc, char **argv) +{ + FILE *te, *xe, *dump; + unsigned char *xed, *p; + long size, size_dump, size1, i; + long max_size, offset; + + char msg[65536]; + + if(argc != 6 && (argc != 3 || strcmp(argv[1], "-s"))) { + fprintf(stderr, "Usage:\n%s temacs xemacs.dmp xemacs size offset\n%s -s xemacs.dmp\n", argv[0], argv[0]); + exit(1); + } + + if(argc == 3) { + sprintf(msg, "Opening %s failed", argv[2]); + dump = fopen(argv[2], "rb+"); + if(!dump) { + perror(msg); + exit(1); + } + + if(fseek(dump, 0, SEEK_END)) { + perror("fseek end dump"); + exit(1); + } + + size = ftell(dump); + if(size == -1) { + perror("ftell dump"); + exit(1); + } + + printf("%ld\n", size); + exit(0); + } + + + max_size = strtol(argv[4], 0, 10); + offset = strtol(argv[5], 0, 10); + + sprintf(msg, "Opening %s failed", argv[1]); + te = fopen(argv[1], "rb"); + if(!te) { + perror(msg); + exit(1); + } + + if(fseek(te, 0, SEEK_END)) { + perror("fseek end"); + exit(1); + } + + size = ftell(te); + if(size == -1) { + perror("ftell"); + exit(1); + } + + if(fseek(te, 0, SEEK_SET)) { + perror("fseek beginning"); + exit(1); + } + + xed = malloc(size); + if(!xed) { + perror("malloc"); + exit(1); + } + + size1 = fread(xed, 1, size, te); + if(size1 != size) { + if(ferror(te)) { + perror("fread temacs"); + exit(1); + } + fprintf(stderr, "Fread returned %ld, expected %ld ?\n", size1, size); + exit(1); + } + + if(fclose(te)) { + perror("fclose temacs"); + exit(1); + } + + p = xed; + for(i=0; i<size-(long)sizeof(key); i++) { + if(!memcmp(p, key, sizeof(key))) + goto found; + p++; + } + + fprintf(stderr, "dumped_data key not found in executable.\n"); + exit(1); + + found: + fprintf(stderr, "dumped_data found at offset 0x%lx, patching.\n", i); + + sprintf(msg, "Opening %s failed", argv[2]); + dump = fopen(argv[2], "r"); + if(!dump) { + perror(msg); + exit(1); + } + + if(fseek(dump, 0, SEEK_END)) { + perror("fseek end dump"); + exit(1); + } + + size_dump = ftell(dump); + if(size_dump == -1) { + perror("ftell dump"); + exit(1); + } + + if(size_dump > max_size) { + fprintf(stderr, "Dump file too big for available space (max=%ld, dump=%ld)\n", max_size, size); + exit(2); + } + + if(fseek(dump, 0, SEEK_SET)) { + perror("fseek beginning dump"); + exit(1); + } + + size1 = fread(xed+i+offset, 1, size_dump, dump); + if(size1 != size_dump) { + if(ferror(dump)) { + perror("fread dump"); + exit(1); + } + fprintf(stderr, "Fread dump returned %ld, expected %ld ?\n", size1, size_dump); + exit(1); + } + + if(fclose(dump)) { + perror("fclose dump"); + exit(1); + } + + memset(xed+i, 0, offset); + + xed[i ] = size_dump; + xed[i+1] = size_dump >> 8; + xed[i+2] = size_dump >> 16; + xed[i+3] = size_dump >> 24; + + fprintf(stderr, "dumped_data found at offset 0x%lx, patching.\n", i); + + sprintf(msg, "Opening %s failed", argv[3]); + xe = fopen(argv[3], "wb"); + if(!xe) { + perror(msg); + exit(1); + } + + size1 = fwrite(xed, 1, size, xe); + if(size1 != size) { + if(ferror(xe)) { + perror("fwrite xemacs"); + exit(1); + } + fprintf(stderr, "Fwrite xemacs returned %ld, expected %ld ?\n", size1, size); + exit(1); + } + + if(fclose(xe)) { + perror("fclose xemacs"); + exit(1); + } + + exit(0); +} +