FreeCalypso > hg > tcs211-patches
annotate tool/archive.c @ 4:e33380b5bd46
tool/archive.c: preparation for making some vars global
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Sat, 06 Jun 2015 03:14:02 +0000 |
parents | 058d377fc299 |
children | 5ba13fd0e737 |
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 char member_name[17]; |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
15 unsigned member_size; |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
16 u_char *member_body; |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
17 |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
18 process_archive() |
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 FILE *inf, *outf; |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
21 char ar_signature_buf[SARMAG], *cp; |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
22 |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
23 inf = fopen(lib_in_filename, "r"); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
24 if (!inf) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
25 perror(lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
26 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
27 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
28 if (fread(ar_signature_buf, 1, SARMAG, inf) != SARMAG || |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
29 strncmp(ar_signature_buf, ARMAG, SARMAG)) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
30 fprintf(stderr, "error: %s is not an archive\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
31 lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
32 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
33 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
34 outf = fopen(lib_out_filename, "w"); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
35 if (!outf) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
36 perror(lib_out_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
37 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
38 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
39 fwrite(ar_signature_buf, 1, SARMAG, outf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
40 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
|
41 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
|
42 fprintf(stderr, "error parsing %s: bad ar_fmag\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
43 lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
44 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
45 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
46 bcopy(ar_hdr.ar_name, member_name, 16); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
47 member_name[16] = '\0'; |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
48 cp = index(member_name, '/'); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
49 if (!cp) { |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
50 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
51 "error parsing %s: no \'/\' in ar_name[]\n", |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
52 lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
53 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
54 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
55 *cp = '\0'; |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
56 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
|
57 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
|
58 if (!member_body) { |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
59 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
60 "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
|
61 member_name); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
62 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
63 } |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
64 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
|
65 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
66 "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
|
67 member_name, lib_in_filename); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
68 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
69 } |
4
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
70 if (member_size & 1 && getc(inf) != '\n') { |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
71 fprintf(stderr, |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
72 "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
|
73 lib_in_filename, member_name); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
74 exit(1); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
75 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
76 /* the patch hook will go here */ |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
77 /* write it out */ |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
78 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
|
79 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
|
80 free(member_body); |
e33380b5bd46
tool/archive.c: preparation for making some vars global
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
2
diff
changeset
|
81 if (member_size & 1) |
2
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
82 putc('\n', outf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
83 } |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
84 fclose(inf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
85 fclose(outf); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
86 return(0); |
058d377fc299
ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff
changeset
|
87 } |