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
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 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 }