Changeset 27473
- Timestamp:
- 2011-07-06T10:04:50+02:00 (7 years ago)
- Location:
- trunk/tools/firmware-utils/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/firmware-utils/src/buffalo-lib.h
r27050 r27473 44 44 uint32_t base2; 45 45 uint32_t data_len; 46 uint8_t flag; 47 uint8_t unknown2[3]; 48 } __attribute ((packed)); 49 50 struct buffalo_tag2 { 51 unsigned char product[TAG_PRODUCT_LEN]; 52 unsigned char brand[TAG_BRAND_LEN]; 53 unsigned char ver_major[TAG_VERSION_LEN]; 54 unsigned char ver_minor[TAG_VERSION_LEN]; 55 unsigned char region_code[2]; 56 uint32_t region_mask; 57 unsigned char unknown0[2]; 58 unsigned char language[TAG_LANGUAGE_LEN]; 59 unsigned char platform[TAG_PLATFORM_LEN]; 60 unsigned char hwv[TAG_HWVER_LEN]; 61 unsigned char hwv_val[TAG_HWVER_VAL_LEN]; 62 uint8_t unknown1[24]; 63 64 uint32_t total_len; 65 uint32_t crc; 66 uint32_t len1; 67 uint32_t len2; 46 68 uint8_t flag; 47 69 uint8_t unknown2[3]; -
trunk/tools/firmware-utils/src/buffalo-tag.c
r27472 r27473 28 28 }; 29 29 30 #define MAX_INPUT_FILES 2 31 30 32 static char *progname; 31 static char *ifname; 33 static char *ifname[MAX_INPUT_FILES]; 34 static ssize_t fsize[MAX_INPUT_FILES]; 35 static int num_files; 32 36 static char *ofname; 33 37 static char *product; … … 90 94 } while (0) 91 95 92 CHECKSTR(ifname, "input file", 0); 96 if (num_files == 0) 97 ERR("no input files specified"); 98 93 99 CHECKSTR(ofname, "output file", 0); 94 100 CHECKSTR(brand, "brand", TAG_BRAND_LEN); … … 140 146 } 141 147 142 static void fixup_tag(unsigned char *buf, ssize_t buflen, ssize_t datalen) 148 static int process_ifname(char *name) 149 { 150 if (num_files >= ARRAY_SIZE(ifname)) { 151 ERR("too many input files specified"); 152 return -1; 153 } 154 155 ifname[num_files++] = name; 156 return 0; 157 } 158 159 static void fixup_tag(unsigned char *buf, ssize_t buflen) 143 160 { 144 161 struct buffalo_tag *tag = (struct buffalo_tag *) buf; … … 162 179 163 180 tag->len = htonl(buflen); 164 tag->data_len = htonl( datalen);181 tag->data_len = htonl(fsize[0]); 165 182 tag->base1 = htonl(base1); 166 183 tag->base2 = htonl(base2); … … 176 193 } 177 194 195 static void fixup_tag2(unsigned char *buf, ssize_t buflen) 196 { 197 struct buffalo_tag2 *tag = (struct buffalo_tag2 *) buf; 198 199 memset(tag, '\0', sizeof(*tag)); 200 201 memcpy(tag->brand, brand, strlen(brand)); 202 memcpy(tag->product, product, strlen(product)); 203 memcpy(tag->platform, platform, strlen(platform)); 204 memcpy(tag->ver_major, major, strlen(major)); 205 memcpy(tag->ver_minor, minor, strlen(minor)); 206 memcpy(tag->language, language, strlen(language)); 207 208 if (num_regions > 1) { 209 tag->region_code[0] = 'M'; 210 tag->region_code[1] = '_'; 211 tag->region_mask = htonl(region_mask); 212 } else { 213 memcpy(tag->region_code, region_code, 2); 214 } 215 216 tag->total_len = htonl(buflen); 217 tag->len1 = htonl(fsize[0]); 218 tag->len2 = htonl(fsize[1]); 219 tag->flag = flag; 220 221 if (hwver) { 222 memcpy(tag->hwv, "hwv", 3); 223 memcpy(tag->hwv_val, hwver, strlen(hwver)); 224 } 225 226 if (!skipcrc) 227 tag->crc = htonl(buffalo_crc(buf, buflen)); 228 } 229 178 230 static int tag_file(void) 179 231 { 180 232 unsigned char *buf; 181 ssize_t fsize; 233 ssize_t offset; 234 ssize_t hdrlen; 182 235 ssize_t buflen; 183 236 int err; 184 237 int ret = -1; 185 186 fsize = get_file_size(ifname); 187 if (fsize < 0) { 188 ERR("unable to get size of '%s'", ifname); 189 goto out; 190 } 191 192 buflen = fsize + sizeof(struct buffalo_tag); 238 int i; 239 240 if (num_files == 1) 241 hdrlen = sizeof(struct buffalo_tag); 242 else 243 hdrlen = sizeof(struct buffalo_tag2); 244 245 buflen = hdrlen; 246 247 for (i = 0; i < num_files; i++) { 248 fsize[i] = get_file_size(ifname[i]); 249 if (fsize[i] < 0) { 250 ERR("unable to get size of '%s'", ifname[i]); 251 goto out; 252 } 253 buflen += fsize[i]; 254 } 255 193 256 buf = malloc(buflen); 194 257 if (!buf) { … … 197 260 } 198 261 199 err = read_file_to_buf(ifname, buf + sizeof(struct buffalo_tag), 200 fsize); 201 if (err) { 202 ERR("unable to read from file '%s'", ifname); 203 goto free_buf; 204 } 205 206 fixup_tag(buf, buflen, fsize); 262 offset = hdrlen; 263 for (i = 0; i < num_files; i++) { 264 err = read_file_to_buf(ifname[i], buf + offset, fsize[i]); 265 if (err) { 266 ERR("unable to read from file '%s'", ifname[i]); 267 goto free_buf; 268 } 269 270 offset += fsize[i]; 271 } 272 273 if (num_files == 1) 274 fixup_tag(buf, buflen); 275 else 276 fixup_tag2(buf, buflen); 207 277 208 278 err = write_buf_to_file(ofname, buf, buflen); … … 251 321 break; 252 322 case 'i': 253 ifname = optarg; 323 err = process_ifname(optarg); 324 if (err) 325 goto out; 254 326 break; 255 327 case 'l':
Note: See TracChangeset
for help on using the changeset viewer.