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