annotate tool/coff.c @ 10:8604a725d883

bootloader-disable.patch implemented
author Space Falcon <falcon@ivan.Harhan.ORG>
date Sat, 06 Jun 2015 07:52:36 +0000
parents 87e9f30f5f86
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
1 /*
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
2 * This C module implements COFF operations for ti-libpatch.
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
3 */
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
4
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
5 #include <sys/types.h>
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
6 #include <stdio.h>
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
7 #include <stdlib.h>
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
8 #include <string.h>
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
9 #include <strings.h>
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
10 #include "coffstruct.h"
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
11 #include "patchinfo.h"
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
12 #include "globals.h"
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
13
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
14 struct external_scnhdr *sections_raw;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
15 unsigned nsections;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
16 unsigned strtab_offset;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
17
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
18 static unsigned
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
19 get_u16(ptr)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
20 u_char *ptr;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
21 {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
22 return ptr[0] | ptr[1] << 8;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
23 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
24
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
25 static unsigned
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
26 get_u32(ptr)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
27 u_char *ptr;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
28 {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
29 return ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
30 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
31
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
32 parse_coff_hdr()
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
33 {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
34 struct external_filehdr *filehdr_struct;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
35 unsigned symtab_offset;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
36 unsigned nsymtab;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
37
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
38 filehdr_struct = (struct external_filehdr *) member_body;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
39 if (get_u16(filehdr_struct->f_magic) != 0xC2) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
40 fprintf(stderr,
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
41 "error: member \"%s\" is not a TI COFF2 object\n",
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
42 member_name);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
43 exit(1);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
44 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
45 if (get_u16(filehdr_struct->f_target_id) != 0x97) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
46 fprintf(stderr, "error: member \"%s\" is not a TMS470 object\n",
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
47 member_name);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
48 exit(1);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
49 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
50 if (get_u16(filehdr_struct->f_opthdr)) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
51 fprintf(stderr,
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
52 "error: member \"%s\" has the \"optional\" header present\n",
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
53 member_name);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
54 exit(1);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
55 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
56 sections_raw = (struct external_scnhdr *)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
57 (member_body + sizeof(struct external_filehdr));
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
58 nsections = get_u16(filehdr_struct->f_nscns);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
59 symtab_offset = get_u32(filehdr_struct->f_symptr);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
60 nsymtab = get_u32(filehdr_struct->f_nsyms);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
61 strtab_offset = symtab_offset +
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
62 sizeof(struct external_syment) * nsymtab;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
63 return(0);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
64 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
65
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
66 static struct external_scnhdr *
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
67 find_section_shortname(soughtname)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
68 char *soughtname;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
69 {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
70 unsigned i;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
71 struct external_scnhdr *scnhdr;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
72
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
73 for (i = 0; i < nsections; i++) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
74 scnhdr = sections_raw + i;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
75 if (!strncmp(scnhdr->s_name, soughtname, 8))
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
76 return(scnhdr);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
77 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
78 return(0);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
79 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
80
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
81 static struct external_scnhdr *
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
82 find_section_longname(soughtname)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
83 char *soughtname;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
84 {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
85 unsigned i;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
86 struct external_scnhdr *scnhdr;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
87 u_char *np, *longname;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
88
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
89 for (i = 0; i < nsections; i++) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
90 scnhdr = sections_raw + i;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
91 np = scnhdr->s_name;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
92 if (np[0] || np[1] || np[2] || np[3])
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
93 continue;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
94 longname = member_body + strtab_offset + get_u32(np + 4);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
95 if (!strcmp(longname, soughtname))
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
96 return(scnhdr);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
97 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
98 return(0);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
99 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
100
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
101 static struct external_scnhdr *
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
102 find_section(soughtname)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
103 char *soughtname;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
104 {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
105 if (strlen(soughtname) <= 8)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
106 return find_section_shortname(soughtname);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
107 else
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
108 return find_section_longname(soughtname);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
109 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
110
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
111 apply_patch(patch)
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
112 struct patch_desc *patch;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
113 {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
114 struct external_scnhdr *scnhdr;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
115 unsigned data_offset, section_size;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
116
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
117 scnhdr = find_section(patch->section);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
118 if (!scnhdr) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
119 fprintf(stderr,
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
120 "error: could not find section \"%s\" in member \"%s\"\n",
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
121 patch->section, member_name);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
122 exit(1);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
123 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
124 data_offset = get_u32(scnhdr->s_scnptr);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
125 section_size = get_u32(scnhdr->s_size);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
126 if (data_offset + section_size > member_size) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
127 fprintf(stderr,
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
128 "error: section \"%s\" in member \"%s\" exceeds member size\n",
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
129 patch->section, member_name);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
130 exit(1);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
131 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
132 if (patch->offset >= section_size) {
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
133 fprintf(stderr,
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
134 "error: patch offset 0x%x in section \"%s\" exceeds section size\n",
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
135 patch->offset, patch->section);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
136 exit(1);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
137 }
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
138 /* do it! */
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
139 member_body[data_offset + patch->offset] = patch->new_byte;
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
140 return(0);
87e9f30f5f86 ti-libpatch: patching implemented
Space Falcon <falcon@ivan.Harhan.ORG>
parents:
diff changeset
141 }