FreeCalypso > hg > tcs211-patches
annotate tool/archive.c @ 17:1fffae285c85
main-pirelli.patch created
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Tue, 08 Sep 2015 01:56:42 +0000 |
parents | 87e9f30f5f86 |
children |
rev | line source |
---|---|
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
1 /* |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
2 * This module implements archive processing for ti-libpatch. |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
3 */ |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
4 |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
5 #include <sys/types.h> |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
6 #include <stdio.h> |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
7 #include <stdlib.h> |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
8 #include <string.h> |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
9 #include <strings.h> |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
10 #include "ar.h" |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
11 #include "globals.h" |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
12 |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
13 struct ar_hdr ar_hdr; |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
14 |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
15 process_archive() |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
16 { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
17 FILE *inf, *outf; |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
18 char ar_signature_buf[SARMAG], *cp; |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
19 |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
20 inf = fopen(lib_in_filename, "r"); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
21 if (!inf) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
22 perror(lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
23 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
24 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
25 if (fread(ar_signature_buf, 1, SARMAG, inf) != SARMAG || |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
26 strncmp(ar_signature_buf, ARMAG, SARMAG)) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
27 fprintf(stderr, "error: %s is not an archive\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
28 lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
29 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
30 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
31 outf = fopen(lib_out_filename, "w"); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
32 if (!outf) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
33 perror(lib_out_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
34 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
35 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
36 fwrite(ar_signature_buf, 1, SARMAG, outf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
37 while (fread(&ar_hdr, sizeof(struct ar_hdr), 1, inf)) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
38 if (strncmp(ar_hdr.ar_fmag, ARFMAG, sizeof(ar_hdr.ar_fmag))) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
39 fprintf(stderr, "error parsing %s: bad ar_fmag\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
40 lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
41 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
42 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
43 bcopy(ar_hdr.ar_name, member_name, 16); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
44 member_name[16] = '\0'; |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
45 cp = index(member_name, '/'); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
46 if (!cp) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
47 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
48 "error parsing %s: no \'/\' in ar_name[]\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
49 lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
50 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
51 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
52 *cp = '\0'; |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
53 member_size = strtoul(ar_hdr.ar_size, 0, 10); |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
54 member_body = malloc(member_size); |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
55 if (!member_body) { |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
56 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
57 "error: unable to malloc buffer for archive member \"%s\"\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
58 member_name); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
59 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
60 } |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
61 if (fread(member_body, 1, member_size, inf) != member_size) { |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
62 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
63 "error reading the body of member \"%s\" from %s\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
64 member_name, lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
65 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
66 } |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
67 if (member_size & 1 && getc(inf) != '\n') { |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
68 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
69 "error parsing %s: no \\n after odd-sized member \"%s\"\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
70 lib_in_filename, member_name); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
71 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
72 } |
6
87e9f30f5f86
ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
5
diff
changeset
|
73 patch_hook(); |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
74 /* write it out */ |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
75 fwrite(&ar_hdr, sizeof(struct ar_hdr), 1, outf); |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
76 fwrite(member_body, 1, member_size, outf); |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
77 free(member_body); |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
78 if (member_size & 1) |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
79 putc('\n', outf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
80 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
81 fclose(inf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
82 fclose(outf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
83 return(0); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
84 } |