annotate tool/archive.c @ 5:5ba13fd0e737

ti-libpatch: archive member vars moved into globals.[ch]
author Space Falcon <falcon@ivan.Harhan.ORG>
date Sat, 06 Jun 2015 03:16:28 +0000
parents e33380b5bd46
children 87e9f30f5f86
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }
058d377fc299 ti-libpatch: archive processing implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
73 /* the patch hook will go here */
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 }