.. | .. |
---|
258 | 258 | char *file; |
---|
259 | 259 | unsigned long i, len; |
---|
260 | 260 | |
---|
261 | | - file = grab_file(fname, &len); |
---|
262 | | - if (!file) |
---|
263 | | - return 0; |
---|
| 261 | + file = read_text_file(fname); |
---|
| 262 | + len = strlen(file); |
---|
264 | 263 | |
---|
265 | 264 | for (i = 0; i < len; i++) { |
---|
266 | 265 | /* Collapse and ignore \ and CR. */ |
---|
.. | .. |
---|
287 | 286 | |
---|
288 | 287 | add_char(file[i], md); |
---|
289 | 288 | } |
---|
290 | | - release_file(file, len); |
---|
| 289 | + free(file); |
---|
291 | 290 | return 1; |
---|
292 | 291 | } |
---|
293 | 292 | /* Check whether the file is a static library or not */ |
---|
.. | .. |
---|
304 | 303 | * to figure out source files. */ |
---|
305 | 304 | static int parse_source_files(const char *objfile, struct md4_ctx *md) |
---|
306 | 305 | { |
---|
307 | | - char *cmd, *file, *line, *dir; |
---|
| 306 | + char *cmd, *file, *line, *dir, *pos; |
---|
308 | 307 | const char *base; |
---|
309 | | - unsigned long flen, pos = 0; |
---|
310 | 308 | int dirlen, ret = 0, check_files = 0; |
---|
311 | 309 | |
---|
312 | 310 | cmd = NOFAIL(malloc(strlen(objfile) + sizeof("..cmd"))); |
---|
.. | .. |
---|
324 | 322 | strncpy(dir, objfile, dirlen); |
---|
325 | 323 | dir[dirlen] = '\0'; |
---|
326 | 324 | |
---|
327 | | - file = grab_file(cmd, &flen); |
---|
328 | | - if (!file) { |
---|
329 | | - warn("could not find %s for %s\n", cmd, objfile); |
---|
330 | | - goto out; |
---|
331 | | - } |
---|
| 325 | + file = read_text_file(cmd); |
---|
| 326 | + |
---|
| 327 | + pos = file; |
---|
332 | 328 | |
---|
333 | 329 | /* Sum all files in the same dir or subdirs. */ |
---|
334 | | - while ((line = get_next_line(&pos, file, flen)) != NULL) { |
---|
| 330 | + while ((line = get_line(&pos))) { |
---|
335 | 331 | char* p = line; |
---|
336 | 332 | |
---|
337 | 333 | if (strncmp(line, "source_", sizeof("source_")-1) == 0) { |
---|
.. | .. |
---|
382 | 378 | /* Everyone parsed OK */ |
---|
383 | 379 | ret = 1; |
---|
384 | 380 | out_file: |
---|
385 | | - release_file(file, flen); |
---|
386 | | -out: |
---|
| 381 | + free(file); |
---|
387 | 382 | free(dir); |
---|
388 | 383 | free(cmd); |
---|
389 | 384 | return ret; |
---|
.. | .. |
---|
392 | 387 | /* Calc and record src checksum. */ |
---|
393 | 388 | void get_src_version(const char *modname, char sum[], unsigned sumlen) |
---|
394 | 389 | { |
---|
395 | | - void *file; |
---|
396 | | - unsigned long len; |
---|
| 390 | + char *buf, *pos, *firstline; |
---|
397 | 391 | struct md4_ctx md; |
---|
398 | | - char *sources, *end, *fname; |
---|
399 | | - const char *basename; |
---|
| 392 | + char *fname; |
---|
400 | 393 | char filelist[PATH_MAX + 1]; |
---|
401 | | - char *modverdir = getenv("MODVERDIR"); |
---|
| 394 | + int postfix_len = 1; |
---|
402 | 395 | |
---|
403 | | - if (!modverdir) |
---|
404 | | - modverdir = "."; |
---|
| 396 | + if (strends(modname, ".lto.o")) |
---|
| 397 | + postfix_len = 5; |
---|
405 | 398 | |
---|
406 | | - /* Source files for module are in .tmp_versions/modname.mod, |
---|
407 | | - after the first line. */ |
---|
408 | | - if (strrchr(modname, '/')) |
---|
409 | | - basename = strrchr(modname, '/') + 1; |
---|
410 | | - else |
---|
411 | | - basename = modname; |
---|
412 | | - snprintf(filelist, sizeof(filelist), "%s/%.*s.mod", modverdir, |
---|
413 | | - (int) strlen(basename) - 2, basename); |
---|
| 399 | + /* objects for a module are listed in the first line of *.mod file. */ |
---|
| 400 | + snprintf(filelist, sizeof(filelist), "%.*smod", |
---|
| 401 | + (int)strlen(modname) - postfix_len, modname); |
---|
414 | 402 | |
---|
415 | | - file = grab_file(filelist, &len); |
---|
416 | | - if (!file) |
---|
417 | | - /* not a module or .mod file missing - ignore */ |
---|
418 | | - return; |
---|
| 403 | + buf = read_text_file(filelist); |
---|
419 | 404 | |
---|
420 | | - sources = strchr(file, '\n'); |
---|
421 | | - if (!sources) { |
---|
422 | | - warn("malformed versions file for %s\n", modname); |
---|
423 | | - goto release; |
---|
424 | | - } |
---|
425 | | - |
---|
426 | | - sources++; |
---|
427 | | - end = strchr(sources, '\n'); |
---|
428 | | - if (!end) { |
---|
| 405 | + pos = buf; |
---|
| 406 | + firstline = get_line(&pos); |
---|
| 407 | + if (!firstline) { |
---|
429 | 408 | warn("bad ending versions file for %s\n", modname); |
---|
430 | | - goto release; |
---|
| 409 | + goto free; |
---|
431 | 410 | } |
---|
432 | | - *end = '\0'; |
---|
433 | 411 | |
---|
434 | 412 | md4_init(&md); |
---|
435 | | - while ((fname = strsep(&sources, " ")) != NULL) { |
---|
| 413 | + while ((fname = strsep(&firstline, " "))) { |
---|
436 | 414 | if (!*fname) |
---|
437 | 415 | continue; |
---|
438 | 416 | if (!(is_static_library(fname)) && |
---|
439 | 417 | !parse_source_files(fname, &md)) |
---|
440 | | - goto release; |
---|
| 418 | + goto free; |
---|
441 | 419 | } |
---|
442 | 420 | |
---|
443 | 421 | md4_final_ascii(&md, sum, sumlen); |
---|
444 | | -release: |
---|
445 | | - release_file(file, len); |
---|
446 | | -} |
---|
447 | | - |
---|
448 | | -static void write_version(const char *filename, const char *sum, |
---|
449 | | - unsigned long offset) |
---|
450 | | -{ |
---|
451 | | - int fd; |
---|
452 | | - |
---|
453 | | - fd = open(filename, O_RDWR); |
---|
454 | | - if (fd < 0) { |
---|
455 | | - warn("changing sum in %s failed: %s\n", |
---|
456 | | - filename, strerror(errno)); |
---|
457 | | - return; |
---|
458 | | - } |
---|
459 | | - |
---|
460 | | - if (lseek(fd, offset, SEEK_SET) == (off_t)-1) { |
---|
461 | | - warn("changing sum in %s:%lu failed: %s\n", |
---|
462 | | - filename, offset, strerror(errno)); |
---|
463 | | - goto out; |
---|
464 | | - } |
---|
465 | | - |
---|
466 | | - if (write(fd, sum, strlen(sum)+1) != strlen(sum)+1) { |
---|
467 | | - warn("writing sum in %s failed: %s\n", |
---|
468 | | - filename, strerror(errno)); |
---|
469 | | - goto out; |
---|
470 | | - } |
---|
471 | | -out: |
---|
472 | | - close(fd); |
---|
473 | | -} |
---|
474 | | - |
---|
475 | | -static int strip_rcs_crap(char *version) |
---|
476 | | -{ |
---|
477 | | - unsigned int len, full_len; |
---|
478 | | - |
---|
479 | | - if (strncmp(version, "$Revision", strlen("$Revision")) != 0) |
---|
480 | | - return 0; |
---|
481 | | - |
---|
482 | | - /* Space for version string follows. */ |
---|
483 | | - full_len = strlen(version) + strlen(version + strlen(version) + 1) + 2; |
---|
484 | | - |
---|
485 | | - /* Move string to start with version number: prefix will be |
---|
486 | | - * $Revision$ or $Revision: */ |
---|
487 | | - len = strlen("$Revision"); |
---|
488 | | - if (version[len] == ':' || version[len] == '$') |
---|
489 | | - len++; |
---|
490 | | - while (isspace(version[len])) |
---|
491 | | - len++; |
---|
492 | | - memmove(version, version+len, full_len-len); |
---|
493 | | - full_len -= len; |
---|
494 | | - |
---|
495 | | - /* Preserve up to next whitespace. */ |
---|
496 | | - len = 0; |
---|
497 | | - while (version[len] && !isspace(version[len])) |
---|
498 | | - len++; |
---|
499 | | - memmove(version + len, version + strlen(version), |
---|
500 | | - full_len - strlen(version)); |
---|
501 | | - return 1; |
---|
502 | | -} |
---|
503 | | - |
---|
504 | | -/* Clean up RCS-style version numbers. */ |
---|
505 | | -void maybe_frob_rcs_version(const char *modfilename, |
---|
506 | | - char *version, |
---|
507 | | - void *modinfo, |
---|
508 | | - unsigned long version_offset) |
---|
509 | | -{ |
---|
510 | | - if (strip_rcs_crap(version)) |
---|
511 | | - write_version(modfilename, version, version_offset); |
---|
| 422 | +free: |
---|
| 423 | + free(buf); |
---|
512 | 424 | } |
---|