FreeCalypso > hg > freecalypso-tools
comparison ffstools/tiffs-mkfs/output.c @ 708:e2e4aed24522
tiffs-mkfs: malloc file chunk buffer only once
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 23 May 2020 02:50:06 +0000 |
parents | 805885936f62 |
children | 178ed445021d |
comparison
equal
deleted
inserted
replaced
707:805885936f62 | 708:e2e4aed24522 |
---|---|
35 memset(data_block, 0xFF, ffs_sector_size); | 35 memset(data_block, 0xFF, ffs_sector_size); |
36 bcopy(tiffs_header, data_block, 6); | 36 bcopy(tiffs_header, data_block, 6); |
37 data_block[8] = 0xBD; | 37 data_block[8] = 0xBD; |
38 data_fill_level = 0x10; | 38 data_fill_level = 0x10; |
39 objects_in_block = 0; | 39 objects_in_block = 0; |
40 | |
41 chunk_buffer = malloc(chunk_size_max); | |
42 if (!chunk_buffer) { | |
43 perror("malloc of file chunk buffer"); | |
44 exit(1); | |
45 } | |
40 } | 46 } |
41 | 47 |
42 void | 48 void |
43 open_output_file() | 49 open_output_file() |
44 { | 50 { |
135 | 141 |
136 create_file_object(to) | 142 create_file_object(to) |
137 struct tree_object *to; | 143 struct tree_object *to; |
138 { | 144 { |
139 int fd, cc; | 145 int fd, cc; |
140 u_char *data; | |
141 int head, seg; | 146 int head, seg; |
142 struct tiffs_inode *inp; | 147 struct tiffs_inode *inp; |
143 | 148 |
144 fd = open(to->u.f.host_pathname, O_RDONLY); | 149 fd = open(to->u.f.host_pathname, O_RDONLY); |
145 if (fd < 0) { | 150 if (fd < 0) { |
146 perror(to->u.f.host_pathname); | 151 perror(to->u.f.host_pathname); |
147 exit(1); | 152 exit(1); |
148 } | 153 } |
149 data = malloc(chunk_size_max); | 154 cc = read(fd, chunk_buffer, chunk_size_max); |
150 if (!data) { | |
151 perror("malloc of file chunk buffer"); | |
152 exit(1); | |
153 } | |
154 cc = read(fd, data, chunk_size_max); | |
155 if (cc < 0) { | 155 if (cc < 0) { |
156 read_err: perror("error reading file content"); | 156 read_err: perror("error reading file content"); |
157 exit(1); | 157 exit(1); |
158 } | 158 } |
159 if (cc == 0) { | 159 if (cc == 0) { |
160 /* zero length file */ | 160 /* zero length file */ |
161 close(fd); | 161 close(fd); |
162 free(data); | |
163 return create_object(to->name, OBJTYPE_FILE, (u_char *) 0, 0); | 162 return create_object(to->name, OBJTYPE_FILE, (u_char *) 0, 0); |
164 } | 163 } |
165 head = create_object(to->name, OBJTYPE_FILE, data, cc); | 164 head = create_object(to->name, OBJTYPE_FILE, chunk_buffer, cc); |
166 inp = inode_array + head; | 165 inp = inode_array + head; |
167 for (;;) { | 166 for (;;) { |
168 cc = read(fd, data, chunk_size_max); | 167 cc = read(fd, chunk_buffer, chunk_size_max); |
169 if (cc < 0) | 168 if (cc < 0) |
170 goto read_err; | 169 goto read_err; |
171 if (cc == 0) | 170 if (cc == 0) |
172 break; | 171 break; |
173 seg = create_object((char *) 0, OBJTYPE_SEGMENT, data, cc); | 172 seg = create_object((char *) 0, OBJTYPE_SEGMENT, chunk_buffer, |
173 cc); | |
174 inp->child = htole16(seg); | 174 inp->child = htole16(seg); |
175 inp = inode_array + seg; | 175 inp = inode_array + seg; |
176 } | 176 } |
177 close(fd); | 177 close(fd); |
178 free(data); | |
179 return head; | 178 return head; |
180 } | 179 } |
181 | 180 |
182 create_subdir(to) | 181 create_subdir(to) |
183 struct tree_object *to; | 182 struct tree_object *to; |