Changeset 3191 in MondoRescue for branches/3.2/mondo/src/common/libmondo-files.c
- Timestamp:
- Sep 25, 2013, 8:55:45 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3.2/mondo/src/common/libmondo-files.c
r3150 r3191 47 47 /*@ buffers ***************************************************** */ 48 48 static char output[MAX_STR_LEN]; 49 char command[MAX_STR_LEN * 2]; 50 char tmp[MAX_STR_LEN]; 49 char *command = NULL; 51 50 52 51 /*@ pointers **************************************************** */ 53 char *p ;52 char *p = NULL; 54 53 char *q; 55 54 FILE *fin; … … 63 62 assert_string_is_neither_NULL_nor_zerolength(filename); 64 63 if (does_file_exist(filename)) { 65 sprintf(command, "md5sum \"%s\"", filename);64 mr_asprintf(command, "md5sum \"%s\"", filename); 66 65 fin = popen(command, "r"); 67 66 if (fin) { … … 73 72 paranoid_pclose(fin); 74 73 } 74 mr_free(command); 75 75 } else { 76 sprintf(tmp, "File '%s' not found; cannot calc checksum", 77 filename); 78 log_it(tmp); 76 log_it("File '%s' not found; cannot calc checksum", filename); 79 77 } 80 78 if (p) { … … 130 128 131 129 /*@ buffers ***************************************************** */ 132 char command[MAX_STR_LEN * 2]; 133 char incoming[MAX_STR_LEN]; 134 char tmp[MAX_STR_LEN]; 135 char *q; 130 char *command = NULL; 131 char *incoming = NULL; 136 132 137 133 /*@ long ******************************************************** */ … … 141 137 FILE *fin; 142 138 143 /*@ initialize [0] to null ******************************************** */144 incoming[0] = '\0';145 146 139 assert_string_is_neither_NULL_nor_zerolength(filename); 147 140 if (!does_file_exist(filename)) { 148 sprintf(tmp, 149 "%s does not exist, so I cannot found the number of lines in it", 150 filename); 151 log_it(tmp); 141 log_it("%s does not exist, so I cannot found the number of lines in it", filename); 152 142 return (0); 153 143 } 154 sprintf(command, "cat %s | wc -l", filename);144 mr_asprintf(command, "cat %s | wc -l", filename); 155 145 if (!does_file_exist(filename)) { 146 mr_free(command); 156 147 return (-1); 157 148 } 158 149 fin = popen(command, "r"); 150 mr_free(command); 151 159 152 if (fin) { 160 153 if (feof(fin)) { 161 154 noof_lines = 0; 162 155 } else { 163 q = fgets(incoming, MAX_STR_LEN - 1, fin); 164 if (!q) { 165 // FIXME 166 } 167 while (strlen(incoming) > 0 && (q != NULL) 168 && incoming[strlen(incoming) - 1] < 32) { 156 mr_getline(incoming, fin); 157 while (strlen(incoming) > 0 && incoming[strlen(incoming) - 1] < 32) { 169 158 incoming[strlen(incoming) - 1] = '\0'; 170 159 } 171 160 noof_lines = atol(incoming); 161 mr_free(incoming); 172 162 } 173 163 paranoid_pclose(fin); … … 215 205 void exclude_nonexistent_files(char *inout) 216 206 { 217 char infname[MAX_STR_LEN]; 218 char outfname[MAX_STR_LEN]; 219 char tmp[MAX_STR_LEN]; 220 char incoming[MAX_STR_LEN]; 221 char *q; 207 char *infname = NULL; 208 char *outfname = NULL; 209 char *tmp = NULL; 210 char *incoming = NULL; 222 211 223 212 /*@ int ********************************************************* */ … … 231 220 232 221 assert_string_is_neither_NULL_nor_zerolength(inout); 233 sprintf(infname, "%s.in", inout); 234 sprintf(outfname, "%s", inout); 235 sprintf(tmp, "cp -f %s %s", inout, infname); 222 mr_asprintf(infname, "%s.in", inout); 223 mr_asprintf(tmp, "cp -f %s %s", inout, infname); 236 224 run_program_and_log_output(tmp, FALSE); 225 mr_free(tmp); 226 237 227 if (!(fin = fopen(infname, "r"))) { 238 228 log_OS_error("Unable to openin infname"); 229 mr_free(infname); 239 230 return; 240 231 } 232 233 mr_asprintf(outfname, "%s", inout); 241 234 if (!(fout = fopen(outfname, "w"))) { 242 235 log_OS_error("Unable to openout outfname"); 236 mr_free(infname); 237 mr_free(outfname); 243 238 return; 244 239 } 245 for (q = fgets(incoming, MAX_STR_LEN, fin); !feof(fin) && (q != NULL); 246 q = fgets(incoming, MAX_STR_LEN, fin)) { 240 mr_free(outfname); 241 242 for (mr_getline(incoming, fin); !feof(fin); mr_getline(incoming, fin)) { 247 243 i = strlen(incoming) - 1; 248 244 if (i >= 0 && incoming[i] < 32) { … … 252 248 fprintf(fout, "%s\n", incoming); 253 249 } else { 254 sprintf(tmp, "Excluding '%s'-nonexistent\n", incoming); 255 log_it(tmp); 256 } 257 } 250 log_it("Excluding '%s'-nonexistent\n", incoming); 251 } 252 mr_free(incoming); 253 } 254 mr_free(incoming); 255 258 256 paranoid_fclose(fout); 259 257 paranoid_fclose(fin); 260 258 unlink(infname); 261 } 262 263 264 265 266 267 268 259 mr_free(infname); 260 } 269 261 270 262 … … 278 270 int figure_out_kernel_path_interactively_if_necessary(char *kernel) 279 271 { 280 char tmp[MAX_STR_LEN];281 char *command ;272 char *tmp = NULL; 273 char *command = NULL; 282 274 283 275 if (!kernel[0]) { 284 strcpy(kernel, 285 call_program_and_get_last_line_of_output 286 ("mindi --findkernel 2> /dev/null")); 276 strcpy(kernel, call_program_and_get_last_line_of_output("mindi --findkernel 2> /dev/null")); 287 277 } 288 278 // If we didn't get anything back, check whether mindi raised a fatal error 289 279 if (!kernel[0]) { 290 malloc_string(command); 291 strcpy(command, "grep 'Fatal error' /var/log/mindi.log"); 292 strcpy(tmp, call_program_and_get_last_line_of_output(command)); 280 mr_asprintf(command, "%s", "grep 'Fatal error' /var/log/mindi.log"); 281 mr_asprintf(tmp, "%s", call_program_and_get_last_line_of_output(command)); 293 282 if (strlen(tmp) > 1) { 294 283 popup_and_OK(tmp); 284 mr_free(tmp); 285 mr_free(command); 295 286 fatal_error("Mindi gave a fatal error. Please check '/var/log/mindi.log'."); 296 287 } 297 paranoid_free(command); 288 mr_free(tmp); 289 mr_free(command); 298 290 } 299 291 log_it("Calling Mindi with kernel path of '%s'", kernel); … … 310 302 ("Kernel not found. Please specify with the '-k' flag."); 311 303 } 312 sprintf(tmp, "User says kernel is at %s", kernel); 313 log_it(tmp); 304 log_it("User says kernel is at %s", kernel); 314 305 } 315 306 return (0); 316 307 } 317 318 319 320 321 308 322 309 … … 334 321 /*@ buffers ********************* */ 335 322 static char output[MAX_STR_LEN]; 336 char *incoming; 337 char *command; 338 339 malloc_string(incoming); 340 malloc_string(command); 341 incoming[0] = '\0'; 323 char *incoming = NULL; 324 char *command = NULL; 325 342 326 /*@******************************* */ 343 327 344 328 assert_string_is_neither_NULL_nor_zerolength(fname); 345 sprintf(command, "which %s 2> /dev/null", fname); 346 strcpy(incoming, call_program_and_get_last_line_of_output(command)); 329 mr_asprintf(command, "which %s 2> /dev/null", fname); 330 mr_asprintf(incoming, call_program_and_get_last_line_of_output(command)); 331 mr_free(command); 332 347 333 if (incoming[0] == '\0') { 348 334 if (system("which file > /dev/null 2> /dev/null")) { 349 paranoid_free(incoming); 350 paranoid_free(command); 335 mr_free(incoming); 351 336 output[0] = '\0'; 352 337 return (NULL); // forget it :) 353 338 } 354 sprintf(command, 355 "file %s 2> /dev/null | cut -d':' -f1 2> /dev/null", 356 incoming); 357 strcpy(incoming, 358 call_program_and_get_last_line_of_output(command)); 359 } 360 if (incoming[0] == '\0') // yes, it is == '\0' twice, not once :) 361 { 362 sprintf(command, "dirname %s 2> /dev/null", incoming); 363 strcpy(incoming, 364 call_program_and_get_last_line_of_output(command)); 339 mr_asprintf(command, "file %s 2> /dev/null | cut -d':' -f1 2> /dev/null", incoming); 340 mr_free(incomig); 341 342 mr_asprintf(incoming, "%s", call_program_and_get_last_line_of_output(command)); 343 mr_free(command); 344 } 345 if (incoming[0] == '\0') { 346 mr_asprintf(command, "dirname %s 2> /dev/null", incoming); 347 mr_free(incoming); 348 349 mr_asprintf(incoming, "%s", call_program_and_get_last_line_of_output(command)); 350 mr_free(command); 365 351 } 366 352 strcpy(output, incoming); 367 353 if (output[0] != '\0' && does_file_exist(output)) { 368 log_msg(4, "find_home_of_exe () --- Found %s at %s", fname, 369 incoming); 354 log_msg(4, "find_home_of_exe () --- Found %s at %s", fname, incoming); 370 355 } else { 371 356 output[0] = '\0'; 372 357 log_msg(4, "find_home_of_exe() --- Could not find %s", fname); 373 358 } 374 paranoid_free(incoming); 375 paranoid_free(command); 359 mr_free(incoming); 376 360 if (!output[0]) { 377 361 return (NULL); … … 382 366 383 367 384 385 386 387 388 389 390 368 /** 391 369 * Get the last sequence of digits surrounded by non-digits in the first 32k of … … 421 399 for (; len > 0 && isdigit(datablock[len - 1]); len--); 422 400 trackno = atoi(datablock + len); 423 /*424 sprintf(tmp,"datablock=%s; trackno=%d",datablock+len, trackno);425 log_it(tmp);426 */427 401 return (trackno); 428 402 } … … 444 418 445 419 /*@ buffers ***************************************************** */ 446 char tmp[MAX_STR_LEN]; 447 char lastline[MAX_STR_LEN]; 448 char command[MAX_STR_LEN]; 420 char *lastline = NULL; 421 char *command = NULL; 449 422 /*@ pointers **************************************************** */ 450 char *p ;423 char *p = NULL; 451 424 452 425 /*@ int's ******************************************************* */ 453 int i; 454 455 for (i = NOOF_ERR_LINES - 1; 456 i >= 0 && !strstr(err_log_lines[i], "% Done") 457 && !strstr(err_log_lines[i], "% done"); i--); 426 int i = 0; 427 428 for (i = NOOF_ERR_LINES - 1; i >= 0 && !strstr(err_log_lines[i], "% Done") && !strstr(err_log_lines[i], "% done"); i--); 458 429 if (i < 0) { 459 sprintf(command, 460 "tail -n3 %s | grep -Fi \"%c\" | tail -n1 | awk '{print $0;}'", 461 filename, '%'); 462 strcpy(lastline, 463 call_program_and_get_last_line_of_output(command)); 430 mr_asprintf(command, "tail -n3 %s | grep -Fi \"%c\" | tail -n1 | awk '{print $0;}'", filename, '%'); 431 mr_asprintf(lastline, "%s", call_program_and_get_last_line_of_output(command)); 432 mr_free(command); 464 433 if (!lastline[0]) { 434 mr_free(lastline); 465 435 return (0); 466 436 } 467 437 } else { 468 strcpy(lastline, err_log_lines[i]);438 mr_asprintf(lastline, "%s", err_log_lines[i]); 469 439 } 470 440 … … 472 442 if (p) { 473 443 *p = '\0'; 474 } 475 // log_msg(2, "lastline='%s', ", p, lastline); 476 if (!p) { 444 } else { 445 mr_free(lastline); 477 446 return (0); 478 447 } 479 *p = '\0'; 480 for (p--; *p != ' '&& p != lastline; p--);448 449 for (p--; isdigit(*p) && p != lastline; p--); 481 450 if (p != lastline) { 482 451 p++; 483 452 } 484 453 i = atoi(p); 485 486 sprintf(tmp, "'%s' --> %d", p, i); 487 // log_to_screen(tmp); 488 454 mr_free(lastline); 489 455 return (i); 490 456 } … … 504 470 /*@ buffers ***************************************************** */ 505 471 static char output[MAX_STR_LEN]; 506 static char command[MAX_STR_LEN * 2]; 507 static char tmp[MAX_STR_LEN]; 508 char *p = NULL; 472 char *command = NULL; 509 473 510 474 /*@ pointers **************************************************** */ … … 514 478 515 479 if (!does_file_exist(filename)) { 516 sprintf(tmp, "Tring to get last line of nonexistent file (%s)", 517 filename); 518 log_it(tmp); 480 log_it("Tring to get last line of nonexistent file (%s)", filename); 519 481 output[0] = '\0'; 520 482 return (output); 521 483 } 522 sprintf(command, "tail -n1 %s", filename);484 mr_asprintf(command, "tail -n1 %s", filename); 523 485 fin = popen(command, "r"); 486 mr_free(command); 524 487 p = fgets(output, MAX_STR_LEN, fin); 525 488 if (p == NULL) { … … 564 527 * @bug I don't know what this function does. However, it seems orphaned, so it should probably be removed. 565 528 */ 566 int 567 make_checksum_list_file(char *filelist, char *cksumlist, char *comppath) 568 { 529 int make_checksum_list_file(char *filelist, char *cksumlist, char *comppath) { 569 530 /*@ pointers **************************************************** */ 570 531 FILE *fin; … … 577 538 578 539 /*@ buffer ****************************************************** */ 579 char stub_fname[1000]; 580 char curr_fname[1000]; 581 char curr_cksum[1000]; 582 char tmp[1000]; 583 char *q; 540 char *stub_fname = NULL; 541 char *curr_fname = NULL; 542 char *curr_cksum = NULL; 543 char *tmp = NULL; 584 544 585 545 /*@ long [long] ************************************************* */ … … 595 555 start_time = get_time(); 596 556 filelist_length = length_of_file(filelist); 597 sprintf(tmp,"filelist = %s; cksumlist = %s", filelist, cksumlist);598 log_it(tmp); 557 log_it("filelist = %s; cksumlist = %s", filelist, cksumlist); 558 599 559 fin = fopen(filelist, "r"); 600 560 if (fin == NULL) { … … 610 570 return (1); 611 571 } 612 for (q = fgets(stub_fname, 999, fin); !feof(fin) && (q != NULL); 613 q = fgets(stub_fname, 999, fin)) { 572 for (mr_getline(stub_fname, fin); !feof(fin); mr_getline(stub_fname, fin)) { 614 573 if (stub_fname[(i = strlen(stub_fname) - 1)] < 32) { 615 574 stub_fname[i] = '\0'; 616 575 } 617 sprintf(tmp, "%s%s", comppath, stub_fname); 618 strcpy(curr_fname, tmp + 1); 619 strcpy(curr_cksum, calc_file_ugly_minichecksum(curr_fname)); 576 mr_asprintf(tmp, "%s%s", comppath, stub_fname); 577 mr_free(stub_fname); 578 579 mr_asprintf(curr_fname, "%s", tmp + 1); 580 mr_free(tmp); 581 582 mr_asprintf(curr_cksum, "%s", calc_file_ugly_minichecksum(curr_fname)); 620 583 fprintf(fout, "%s\t%s\n", curr_fname, curr_cksum); 584 mr_free(curr_cksum); 585 621 586 if (counter++ > 12) { 622 587 current_time = get_time(); 623 588 counter = 0; 589 /* BERLIOS: 37 really ? */ 624 590 curr_fname[37] = '\0'; 625 591 curr_pos = ftello(fin) / 1024; 626 592 percentage = (int) (curr_pos * 100 / filelist_length); 627 593 time_taken = current_time - start_time; 628 if (percentage == 0) { 629 /* printf("%0d%% done \r",percentage); */ 630 } else { 631 time_remaining = 632 time_taken * 100 / (long) (percentage) - time_taken; 633 sprintf(tmp, 634 "%02d%% done %02d:%02d taken %02d:%02d remaining %-37s\r", 635 percentage, (int) (time_taken / 60), 636 (int) (time_taken % 60), 637 (int) (time_remaining / 60), 638 (int) (time_remaining % 60), curr_fname); 639 log_to_screen(tmp); 594 if (percentage != 0) { 595 time_remaining = time_taken * 100 / (long) (percentage) - time_taken; 596 log_to_screen("%02d%% done %02d:%02d taken %02d:%02d remaining %-37s\r", percentage, (int) (time_taken / 60), (int) (time_taken % 60), (int) (time_remaining / 60), (int) (time_remaining % 60), curr_fname); 640 597 } 641 598 sync(); 642 599 } 643 } 600 mr_free(curr_fname); 601 } 602 mr_free(stub_fname); 603 644 604 paranoid_fclose(fout); 645 605 paranoid_fclose(fin); … … 654 614 * @return The return value of @c mkdir. 655 615 */ 656 int make_hole_for_dir(c har *outdir_fname)657 { 658 char tmp[MAX_STR_LEN * 2];616 int make_hole_for_dir(const char *outdir_fname) 617 { 618 char *tmp = NULL; 659 619 int res = 0; 660 620 661 621 assert_string_is_neither_NULL_nor_zerolength(outdir_fname); 662 sprintf(tmp, "mkdir -p %s", outdir_fname);622 mr_asprintf(tmp, "mkdir -p %s", outdir_fname); 663 623 res = system(tmp); 624 mr_free(tmp); 664 625 return (res); 665 626 } … … 675 636 { 676 637 /*@ buffer ****************************************************** */ 677 char command[MAX_STR_LEN * 2];638 char *command = NULL; 678 639 679 640 /*@ int ******************************************************** */ … … 685 646 assert(!strstr(outfile_fname, MNT_CDROM)); 686 647 assert(!strstr(outfile_fname, "/dev/cdrom")); 687 sprintf(command, "mkdir -p \"%s\" 2> /dev/null", outfile_fname);648 mr_asprintf(command, "mkdir -p \"%s\" 2> /dev/null", outfile_fname); 688 649 res += system(command); 689 sprintf(command, "rmdir \"%s\" 2> /dev/null", outfile_fname); 650 mr_free(command); 651 652 mr_asprintf(command, "rmdir \"%s\" 2> /dev/null", outfile_fname); 690 653 res += system(command); 691 sprintf(command, "rm -f \"%s\" 2> /dev/null", outfile_fname); 654 mr_free(command); 655 656 mr_asprintf(command, "rm -f \"%s\" 2> /dev/null", outfile_fname); 692 657 res += system(command); 658 mr_free(command); 659 693 660 unlink(outfile_fname); 694 661 return (0); 695 662 } 696 697 698 663 699 664 … … 713 678 714 679 /*@ buffers **************************************************** */ 715 char incoming[MAX_STR_LEN]; 716 char *p = NULL; 680 char *incoming = NULL; 717 681 718 682 /*@ end vars *************************************************** */ … … 725 689 return (0); 726 690 } 727 p = fgets(incoming, MAX_STR_LEN - 1, fin);728 while (!feof(fin) && (p != NULL)) {691 mr_getline(incoming, fin); 692 while (!feof(fin)) { 729 693 if (strstr(incoming, wildcard)) { 730 694 matches++; 731 695 } 732 p = fgets(incoming, MAX_STR_LEN - 1, fin); 733 } 696 mr_free(incoming); 697 mr_getline(incoming, fin); 698 } 699 mr_free(incoming); 734 700 paranoid_fclose(fin); 735 701 return (matches); … … 746 712 long size_of_partition_in_mountlist_K(char *tmpdir, char *dev) 747 713 { 748 char command[MAX_STR_LEN];749 char mountlist[MAX_STR_LEN];750 char sz_res[MAX_STR_LEN];714 char *command = NULL; 715 char *mountlist = NULL; 716 char *sz_res = NULL; 751 717 long file_len_K; 752 718 753 sprintf(mountlist, "%s/mountlist.txt", tmpdir);754 sprintf(command,755 "grep \"%s \" %s/mountlist.txt | head -n1 | awk '{print $4}'",756 dev, tmpdir); 719 mr_asprintf(mountlist, "%s/mountlist.txt", tmpdir); 720 mr_asprintf(command, "grep \"%s \" %s/mountlist.txt | head -n1 | awk '{print $4}'", dev, tmpdir); 721 mr_free(mountlist); 722 757 723 log_it(command); 758 strcpy(sz_res, call_program_and_get_last_line_of_output(command));724 mr_asprintf(sz_res, "%s", call_program_and_get_last_line_of_output(command)); 759 725 file_len_K = atol(sz_res); 760 726 log_msg(4, "%s --> %s --> %ld", command, sz_res, file_len_K); 727 mr_free(sz_res); 728 mr_free(command); 729 761 730 return (file_len_K); 762 731 } … … 770 739 { 771 740 /*@ buffers ***************************************************** */ 772 char *fname; 773 char *biggielist; 774 char *comment; 775 char *tmp; 776 char *q; 777 char *command; 741 char *fname = NULL; 742 char *biggielist = NULL; 743 char *tmp = NULL; 744 char *command = NULL; 778 745 779 746 /*@ long ******************************************************** */ … … 786 753 /*@ end vars *************************************************** */ 787 754 788 malloc_string(fname);789 malloc_string(biggielist);790 malloc_string(comment);791 malloc_string(tmp);792 malloc_string(command);793 755 log_it("Calculating size of all biggiefiles (in total)"); 794 sprintf(biggielist, "%s/biggielist.txt", bkpinfo->tmpdir);756 mr_asprintf(biggielist, "%s/biggielist.txt", bkpinfo->tmpdir); 795 757 log_it("biggielist = %s", biggielist); 796 if (!(fin = fopen(biggielist, "r"))) { 797 log_OS_error 798 ("Cannot open biggielist. OK, so estimate is based on filesets only."); 758 fin = fopen(biggielist, "r"); 759 mr_free(biggielist); 760 761 if (!(fin)) { 762 log_OS_error("Cannot open biggielist. OK, so estimate is based on filesets only."); 799 763 } else { 800 764 log_msg(4, "Reading it..."); 801 for (q = fgets(fname, MAX_STR_LEN, fin); !feof(fin) && (q != NULL); 802 q = fgets(fname, MAX_STR_LEN, fin)) { 765 for (mr_getline(fname, fin); !feof(fin); mr_getline(fname, fin)) { 803 766 if (fname[strlen(fname) - 1] <= 32) { 804 767 fname[strlen(fname) - 1] = '\0'; … … 807 770 if (is_dev_an_NTFS_dev(fname)) { 808 771 if ( !find_home_of_exe("ntfsresize")) { 772 mr_free(tmp); 773 mr_free(fname); 809 774 fatal_error("ntfsresize not found"); 810 775 } 811 sprintf(command, "ntfsresize --force --info %s|grep '^You might resize at '|cut -d' ' -f5", fname); 776 mr_free(tmp); 777 778 mr_asprintf(command, "ntfsresize --force --info %s|grep '^You might resize at '|cut -d' ' -f5", fname); 812 779 log_it("command = %s", command); 813 strcpy (tmp, call_program_and_get_last_line_of_output(command)); 780 mr_asprintf(tmp, "%s", call_program_and_get_last_line_of_output(command)); 781 mr_free(command); 782 814 783 log_it("res of it = %s", tmp); 815 784 file_len_K = atoll(tmp) / 1024L; 785 mr_free(tmp); 816 786 } else { 817 787 file_len_K = get_phys_size_of_drive(fname) * 1024L; … … 825 795 log_msg(4, "%s --> %ld K", fname, file_len_K); 826 796 } 827 sprintf(comment, 828 "After adding %s, scratchL+%ld now equals %ld", fname, 829 file_len_K, scratchL); 830 log_msg(4, comment); 797 log_msg(4, "After adding %s, scratchL+%ld now equals %ld", fname, file_len_K, scratchL); 831 798 if (feof(fin)) { 832 799 break; 833 800 } 834 } 801 mr_free(fname); 802 } 803 mr_free(fname); 835 804 } 836 805 log_it("Closing..."); 837 806 paranoid_fclose(fin); 838 807 log_it("Finished calculating total size of all biggiefiles"); 839 paranoid_free(fname);840 paranoid_free(biggielist);841 paranoid_free(comment);842 paranoid_free(tmp);843 paranoid_free(command);844 808 return (scratchL); 845 809 } … … 854 818 { 855 819 /*@ buffer ****************************************************** */ 856 char tmp[MAX_STR_LEN];857 char command[MAX_STR_LEN * 2];820 char *tmp = NULL; 821 char *command = NULL; 858 822 long long llres; 859 823 /*@ pointers **************************************************** */ … … 863 827 /*@ end vars *************************************************** */ 864 828 865 sprintf(command, "du -sk %s", mountpt);829 mr_asprintf(command, "du -sk %s", mountpt); 866 830 errno = 0; 867 831 fin = popen(command, "r"); … … 870 834 llres = 0; 871 835 } else { 872 p = fgets(tmp, MAX_STR_LEN, fin);836 mr_getline(tmp, fin); 873 837 paranoid_pclose(fin); 874 838 p = strchr(tmp, '\t'); … … 880 844 llres += (int) (*p - '0'); 881 845 } 882 } 846 mr_free(tmp); 847 } 848 mr_free(command); 883 849 884 850 return (llres); … … 928 894 { 929 895 /*@ buffers *** */ 930 char command[MAX_STR_LEN * 2]; 931 char errorstr[MAX_STR_LEN]; 932 933 934 sprintf(command, "which %s > /dev/null 2> /dev/null", fname); 935 sprintf(errorstr, 936 "Please install '%s'. I cannot find it on your system.", 937 fname); 938 if (system(command)) { 939 log_to_screen(errorstr); 940 log_to_screen 941 ("There may be hyperlink at http://www.mondorescue.org/downloads.shtml which"); 896 char *command = NULL; 897 int res = 0; 898 899 mr_asprintf(command, "which %s > /dev/null 2> /dev/null", fname); 900 res = system(command); 901 mr_free(command); 902 903 if (res) { 904 log_to_screen("Please install '%s'. I cannot find it on your system.", fname); 905 log_to_screen("There may be hyperlink at http://www.mondorescue.org which"); 942 906 log_to_screen("will take you to the relevant (missing) package."); 943 907 return (1); … … 1038 1002 { 1039 1003 /*@ Char buffers ** */ 1040 char command[MAX_STR_LEN * 2];1041 char tmp[MAX_STR_LEN];1004 char *command = NULL; 1005 char *tmp = NULL; 1042 1006 char old_pwd[MAX_STR_LEN]; 1043 1044 mvaddstr_and_log_it(g_currentY, 0, 1045 1007 int res = 0; 1008 1009 mvaddstr_and_log_it(g_currentY, 0, "Copying Mondo's core files to the scratch directory"); 1046 1010 1047 1011 log_msg(4, "g_mondo_home='%s'", g_mondo_home); … … 1049 1013 find_and_store_mondoarchives_home(g_mondo_home); 1050 1014 } 1051 sprintf(command, CP_BIN " --parents -pRdf %s %s", g_mondo_home, 1052 bkpinfo->scratchdir); 1015 mr_asprintf(command, CP_BIN " --parents -pRdf %s %s", g_mondo_home, bkpinfo->scratchdir); 1053 1016 1054 1017 log_msg(4, "command = %s", command); 1055 if (run_program_and_log_output(command, 1)) { 1018 res = run_program_and_log_output(command, 1); 1019 mr_free(command); 1020 1021 if (res) { 1056 1022 fatal_error("Failed to copy Mondo's stuff to scratchdir"); 1057 1023 } 1058 1024 1059 sprintf(tmp, "%s/payload.tgz", g_mondo_home);1025 mr_asprintf(tmp, "%s/payload.tgz", g_mondo_home); 1060 1026 if (does_file_exist(tmp)) { 1061 log_it("Untarring payload %s to scratchdir %s", tmp, 1062 bkpinfo->scratchdir); 1027 log_it("Untarring payload %s to scratchdir %s", tmp, bkpinfo->scratchdir); 1063 1028 if (getcwd(old_pwd, MAX_STR_LEN - 1)) { 1064 1029 // FIXME … … 1067 1032 // FIXME 1068 1033 } 1069 sprintf(command, "tar -zxvf %s", tmp); 1070 if (run_program_and_log_output(command, FALSE)) { 1034 mr_asprintf(command, "tar -zxvf %s", tmp); 1035 res = run_program_and_log_output(command, FALSE); 1036 if (res) { 1037 mr_free(command); 1038 mr_free(tmp); 1071 1039 fatal_error("Failed to untar payload"); 1072 1040 } 1041 mr_free(command); 1073 1042 if (chdir(old_pwd)) { 1074 1043 // FIXME 1075 1044 } 1076 1045 } 1077 1078 sprintf(command, "cp -f %s/LAST-FILELIST-NUMBER %s", bkpinfo->tmpdir, 1079 1046 mr_free(tmp); 1047 1048 mr_asprintf(command, "cp -f %s/LAST-FILELIST-NUMBER %s", bkpinfo->tmpdir, bkpinfo->scratchdir); 1080 1049 1081 1050 if (run_program_and_log_output(command, FALSE)) { 1082 1051 fatal_error("Failed to copy LAST-FILELIST-NUMBER to scratchdir"); 1083 1052 } 1084 1085 strcpy(tmp, 1086 1053 mr_free(command); 1054 1055 mr_asprintf(tmp, "%s", call_program_and_get_last_line_of_output("which mondorestore")); 1087 1056 if (!tmp[0]) { 1088 fatal_error 1089 ("'which mondorestore' returned null. Where's your mondorestore? `which` can't find it. That's odd. Did you install mondorestore?"); 1090 } 1091 sprintf(command, "cp -f %s %s", tmp, bkpinfo->tmpdir); 1092 if (run_program_and_log_output(command, FALSE)) { 1057 mr_free(tmp); 1058 fatal_error("'which mondorestore' returned null. Where's your mondorestore? `which` can't find it. That's odd. Did you install mondorestore?"); 1059 } 1060 1061 mr_asprintf(command, "cp -f %s %s", tmp, bkpinfo->tmpdir); 1062 mr_free(tmp); 1063 res = run_program_and_log_output(command, FALSE); 1064 if (res) { 1065 mr_free(command); 1093 1066 fatal_error("Failed to copy mondorestore to tmpdir"); 1094 1067 } 1095 1096 sprintf(command, "hostname > %s/HOSTNAME", bkpinfo->scratchdir); 1068 mr_free(command); 1069 1070 mr_asprintf(command, "hostname > %s/HOSTNAME", bkpinfo->scratchdir); 1097 1071 paranoid_system(command); 1072 mr_free(command); 1098 1073 1099 1074 if (bkpinfo->postnuke_tarball[0]) { 1100 sprintf(command, "cp -f %s %s/post-nuke.tgz", 1101 bkpinfo->postnuke_tarball, bkpinfo->tmpdir); 1102 if (run_program_and_log_output(command, FALSE)) { 1075 mr_asprintf(command, "cp -f %s %s/post-nuke.tgz", bkpinfo->postnuke_tarball, bkpinfo->tmpdir); 1076 res = run_program_and_log_output(command, FALSE); 1077 mr_free(command); 1078 1079 if (res) { 1103 1080 fatal_error("Unable to copy post-nuke tarball to tmpdir"); 1104 1081 } 1105 1082 } 1106 1107 1083 1108 1084 mvaddstr_and_log_it(g_currentY++, 74, "Done."); … … 1125 1101 1126 1102 /*@ buffers ******** */ 1127 char netfs_dev[MAX_STR_LEN];1128 char netfs_mount[MAX_STR_LEN];1129 char netfs_client_hwaddr[MAX_STR_LEN];1130 char netfs_client_ipaddr[MAX_STR_LEN];1131 char netfs_client_netmask[MAX_STR_LEN];1132 char netfs_client_broadcast[MAX_STR_LEN];1133 char netfs_client_defgw[MAX_STR_LEN];1134 char netfs_server_ipaddr[MAX_STR_LEN];1135 char tmp[MAX_STR_LEN];1136 char command[MAX_STR_LEN * 2];1103 char *netfs_dev = NULL; 1104 char *netfs_client_hwaddr = NULL; 1105 char *netfs_mount = NULL; 1106 char *netfs_client_ipaddr = NULL; 1107 char *netfs_client_netmask = NULL; 1108 char *netfs_client_broadcast = NULL; 1109 char *netfs_client_defgw = NULL; 1110 char *netfs_server_ipaddr = NULL; 1111 char *tmp = NULL; 1112 char *command = NULL; 1137 1113 1138 1114 /*@ pointers ***** */ 1139 1115 char *p; 1140 1116 1117 if (! bkpinfo->netfs_mount) { 1118 fatal_error("No netfs_mount found !"); 1119 } 1120 1141 1121 log_it("Storing Network configuration"); 1142 strcpy(tmp, bkpinfo->netfs_mount);1122 mr_asprintf(tmp, "%s", bkpinfo->netfs_mount); 1143 1123 p = strchr(tmp, ':'); 1144 1124 if (!p) { 1145 fatal_error 1146 ("Network mount doesn't have a colon in it, e.g. 192.168.1.4:/home/nfs"); 1125 fatal_error("Network mount doesn't have a colon in it, e.g. 192.168.1.4:/home/nfs"); 1147 1126 } 1148 1127 *(p++) = '\0'; 1149 strcpy(netfs_server_ipaddr, tmp); 1150 strcpy(netfs_mount, p); 1128 mr_asprintf(netfs_server_ipaddr, "%s", tmp); 1129 mr_asprintf(netfs_mount, "%s", p); 1130 mr_free(tmp); 1151 1131 1152 1132 /* BERLIOS : there is a bug #67 here as it only considers the first NIC */ 1153 sprintf(command,1154 "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\n' | head -n1 | cut -d' ' -f1");1155 strcpy(netfs_dev, call_program_and_get_last_line_of_output(command));1156 sprintf(command, 1157 "ifconfig %s | head -1 | awk '{print $5}'", netfs_dev);1158 strcpy(netfs_client_hwaddr, call_program_and_get_last_line_of_output(command));1159 sprintf(command,1160 "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\\n' | head -n1 | tr -s '\t' ' ' | cut -d' ' -f7 | cut -d':' -f2"); 1161 strcpy(netfs_client_ipaddr,1162 1163 sprintf(command,1164 "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\\n' | head -n1 | tr -s '\t' ' ' | cut -d' ' -f9 | cut -d':' -f2"); 1165 strcpy(netfs_client_netmask,1166 1167 sprintf(command,1168 "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\\n' | head -n1 | tr -s '\t' ' ' | cut -d' ' -f8 | cut -d':' -f2"); 1169 strcpy(netfs_client_broadcast,1170 1171 sprintf(command,1172 "route -n | grep '^0.0.0.0' | awk '{print $2}'"); 1173 strcpy(netfs_client_defgw,1174 1175 sprintf(tmp,1176 "netfs_client_hwaddr=%s; netfs_client_ipaddr=%s; netfs_server_ipaddr=%s; netfs_mount=%s", 1177 1133 mr_asprintf(command, "%s", "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\n' | head -n1 | cut -d' ' -f1"); 1134 mr_asprintf(netfs_dev, "%s", call_program_and_get_last_line_of_output(command)); 1135 mr_free(command); 1136 1137 mr_asprintf(command, "%s", "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\\n' | head -n1 | tr -s '\t' ' ' | cut -d' ' -f7 | cut -d':' -f2"); 1138 mr_asprintf(netfs_client_ipaddr, "%s", call_program_and_get_last_line_of_output(command)); 1139 mr_free(command); 1140 1141 mr_asprintf(command, "%s", "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\\n' | head -n1 | tr -s '\t' ' ' | cut -d' ' -f9 | cut -d':' -f2"); 1142 mr_asprintf(netfs_client_netmask, "%s", call_program_and_get_last_line_of_output(command)); 1143 mr_free(command); 1144 1145 mr_asprintf(command, "%s", "ifconfig | tr '\n' '#' | sed s/##// | tr '#' ' ' | tr '' '\\n' | head -n1 | tr -s '\t' ' ' | cut -d' ' -f8 | cut -d':' -f2"); 1146 mr_asprintf(netfs_client_broadcast, "%s", call_program_and_get_last_line_of_output(command)); 1147 mr_free(command); 1148 1149 mr_asprintf(command, "%s", "route -n | grep '^0.0.0.0' | awk '{print $2}'"); 1150 mr_asprintf(netfs_client_defgw, "%s", call_program_and_get_last_line_of_output(command)); 1151 mr_free(command); 1152 1153 mr_asprintf(command, "ifconfig %s | head -1 | awk '{print $5}'", netfs_dev); 1154 mr_asprintf(netfs_client_hwaddr, "%s" call_program_and_get_last_line_of_output(command)); 1155 mr_free(command); 1156 1157 log_it("netfs_client_hwaddr=%s; netfs_client_ipaddr=%s; netfs_server_ipaddr=%s; netfs_mount=%s", netfs_client_hwaddr, netfs_client_ipaddr, netfs_server_ipaddr, netfs_mount); 1178 1158 if (strlen(netfs_dev) < 2) { 1179 fatal_error 1180 ("Unable to find ethN (eth0, eth1, ...) adapter via Network mount you specified.");1181 } 1159 fatal_error("Unable to find ethN (eth0, eth1, ...) adapter via Network mount you specified."); 1160 } 1161 1182 1162 /******** 1183 * If the Network device thatfound above is a bonded device,1163 * If the Network device found above is a bonded device, 1184 1164 * we need to replace it with an ethN device or the 1185 1165 * networking will not start during an Network restore. … … 1191 1171 if (!strncmp(netfs_dev, "bond", 4) || !strncmp(netfs_dev, "alb", 3) || !strncmp(netfs_dev, "aft", 3)) { 1192 1172 log_to_screen("Found bonding device %s; looking for corresponding ethN slave device\n", netfs_dev); 1193 sprintf(command,1194 "ifconfig | grep -E '%s' | grep -v '%s' | head -n1 | cut -d' ' -f1",netfs_client_hwaddr,netfs_dev);1195 strcpy(netfs_dev, call_program_and_get_last_line_of_output(command));1173 mr_asprintf(command, "ifconfig | grep -E '%s' | grep -v '%s' | head -n1 | cut -d' ' -f1",netfs_client_hwaddr,netfs_dev); 1174 mr_asprintf(netfs_dev, "%s", call_program_and_get_last_line_of_output(command)); 1175 mr_free(command); 1196 1176 log_to_screen("Replacing it with %s\n", netfs_dev); 1197 1177 } 1198 1178 1199 sprintf(tmp, "%s/NETFS-DEV", bkpinfo->tmpdir);1179 mr_asprintf(tmp, "%s/NETFS-DEV", bkpinfo->tmpdir); 1200 1180 write_one_liner_data_file(tmp, netfs_dev); 1181 mr_free(netfs_dev); 1182 mr_free(tmp); 1183 1184 mr_asprintf(tmp, "%s/NETFS-CLIENT-HWADDR", bkpinfo->tmpdir); 1185 write_one_liner_data_file(tmp, netfs_client_hwaddr); 1186 mr_free(netfs_client_hwaddr); 1187 mr_free(tmp); 1188 1189 mr_asprintf(tmp, "%s/NETFS-CLIENT-IPADDR", bkpinfo->tmpdir); 1190 write_one_liner_data_file(tmp, netfs_client_ipaddr); 1191 mr_free(netfs_client_ipaddr); 1192 mr_free(tmp); 1193 1194 mr_asprintf(tmp, "%s/NETFS-CLIENT-NETMASK", bkpinfo->tmpdir); 1195 write_one_liner_data_file(tmp, netfs_client_netmask); 1196 mr_free(netfs_client_netmask); 1197 mr_free(tmp); 1198 1199 mr_asprintf(tmp, "%s/NETFS-CLIENT-BROADCAST", bkpinfo->tmpdir); 1200 write_one_liner_data_file(tmp, netfs_client_broadcast); 1201 mr_free(netfs_client_broadcast); 1202 mr_free(tmp); 1203 1204 mr_asprintf(tmp, "%s/NETFS-CLIENT-DEFGW", bkpinfo->tmpdir); 1205 write_one_liner_data_file(tmp, netfs_client_defgw); 1206 mr_free(netfs_client_defgw); 1207 mr_free(tmp); 1208 1209 mr_asprintf(tmp, "%s/NETFS-SERVER-IPADDR", bkpinfo->tmpdir); 1210 write_one_liner_data_file(tmp, netfs_server_ipaddr); 1211 mr_free(netfs_server_ipaddr); 1212 mr_free(tmp); 1213 1214 mr_asprintf(tmp, "%s/NETFS-SERVER-MOUNT", bkpinfo->tmpdir); 1215 write_one_liner_data_file(tmp, bkpinfo->netfs_mount); 1216 mr_free(tmp); 1217 1218 if (bkpinfo->netfs_user) { 1219 mr_asprintf(tmp, "%s/NETFS-SERVER-USER", bkpinfo->tmpdir); 1220 write_one_liner_data_file(tmp, bkpinfo->netfs_user); 1221 mr_free(tmp); 1222 } 1223 mr_asprintf(tmp, "%s/NETFS-SERVER-PATH", bkpinfo->tmpdir); 1224 write_one_liner_data_file(tmp, bkpinfo->netfs_remote_dir); 1225 mr_free(tmp); 1226 1227 mr_asprintf(tmp, "%s/ISO-PREFIX", bkpinfo->tmpdir); 1228 write_one_liner_data_file(tmp, bkpinfo->prefix); 1229 mr_free(tmp); 1201 1230 1202 1231 sprintf(tmp, "%s/NETFS-PROTO", bkpinfo->tmpdir); 1203 1232 write_one_liner_data_file(tmp, bkpinfo->netfs_proto); 1204 1205 sprintf(tmp, "%s/NETFS-CLIENT-HWADDR", bkpinfo->tmpdir); 1206 write_one_liner_data_file(tmp, netfs_client_hwaddr); 1207 sprintf(tmp, "%s/NETFS-CLIENT-IPADDR", bkpinfo->tmpdir); 1208 write_one_liner_data_file(tmp, netfs_client_ipaddr); 1209 sprintf(tmp, "%s/NETFS-CLIENT-NETMASK", bkpinfo->tmpdir); 1210 write_one_liner_data_file(tmp, netfs_client_netmask); 1211 sprintf(tmp, "%s/NETFS-CLIENT-BROADCAST", bkpinfo->tmpdir); 1212 write_one_liner_data_file(tmp, netfs_client_broadcast); 1213 sprintf(tmp, "%s/NETFS-CLIENT-DEFGW", bkpinfo->tmpdir); 1214 write_one_liner_data_file(tmp, netfs_client_defgw); 1215 sprintf(tmp, "%s/NETFS-SERVER-IPADDR", bkpinfo->tmpdir); 1216 write_one_liner_data_file(tmp, netfs_server_ipaddr); 1217 sprintf(tmp, "%s/NETFS-SERVER-MOUNT", bkpinfo->tmpdir); 1218 write_one_liner_data_file(tmp, bkpinfo->netfs_mount); 1219 if (bkpinfo->netfs_user) { 1220 sprintf(tmp, "%s/NETFS-SERVER-USER", bkpinfo->tmpdir); 1221 write_one_liner_data_file(tmp, bkpinfo->netfs_user); 1222 } 1223 sprintf(tmp, "%s/NETFS-SERVER-PATH", bkpinfo->tmpdir); 1224 write_one_liner_data_file(tmp, bkpinfo->netfs_remote_dir); 1225 sprintf(tmp, "%s/ISO-PREFIX", bkpinfo->tmpdir); 1226 write_one_liner_data_file(tmp, bkpinfo->prefix); 1233 mr_free(tmp); 1234 1235 1227 1236 log_it("Finished storing Network configuration"); 1228 1237 } 1229 1230 1231 1232 1233 1238 1234 1239 … … 1253 1258 { 1254 1259 /*@ buffers *************** */ 1255 char tmp[MAX_STR_LEN];1260 char *tmp = NULL; 1256 1261 char *mds = NULL; 1257 1262 … … 1265 1270 1266 1271 log_it("Estimating number of media required..."); 1267 scratchLL = 1268 (long long) (noof_sets) * (long long) (bkpinfo->optimal_set_size) 1269 + (long long) (size_of_all_biggiefiles_K()); 1272 scratchLL = (long long) (noof_sets) * (long long) (bkpinfo->optimal_set_size) + (long long) (size_of_all_biggiefiles_K()); 1270 1273 scratchLL = (scratchLL / 1024) / bkpinfo->media_size; 1271 1274 scratchLL++; … … 1274 1277 } else if (bkpinfo->use_gzip) { 1275 1278 scratchLL = (scratchLL * 2) / 3; 1279 } else if (bkpinfo->use_lzma) { 1280 scratchLL = (scratchLL * 2) / 3; 1276 1281 } else { 1277 1282 scratchLL = scratchLL / 2; … … 1282 1287 if (scratchLL <= 1) { 1283 1288 mds = media_descriptor_string(bkpinfo->backup_media_type); 1284 sprintf(tmp, 1285 "Your backup will probably occupy a single %s. Maybe two.", mds); 1289 mr_asprintf(tmp, "Your backup will probably occupy a single %s. Maybe two.", mds); 1286 1290 mr_free(mds); 1287 1291 } else if (scratchLL > 4) { 1288 sprintf(tmp, 1289 "Your backup will occupy one meeeeellion media! (maybe %s)", 1290 number_to_text((int) (scratchLL + 1))); 1292 mr_asprintf(tmp, "Your backup will occupy one meeeeellion media! (maybe %s)", number_to_text((int) (scratchLL + 1))); 1291 1293 } else { 1292 sprintf(tmp, "Your backup will occupy approximately %s media.", 1293 number_to_text((int) (scratchLL + 1))); 1294 } 1295 if (!bkpinfo->image_devs[0] && (scratchLL < 50)) { 1294 mr_asprintf(tmp, "Your backup will occupy approximately %s media.", number_to_text((int) (scratchLL + 1))); 1295 } 1296 if (scratchLL < 50) { 1296 1297 log_to_screen(tmp); 1297 1298 } 1298 } 1299 1300 1301 /** 1302 * Get the last suffix of @p instr. 1303 * If @p instr was "httpd.log.gz", we would return "gz". 1304 * @param instr The filename to get the suffix of. 1305 * @return The suffix (without a dot), or "" if none. 1306 * @note The returned string points to static storage that will be overwritten with each call. 1307 */ 1308 char *sz_last_suffix(char *instr) 1309 { 1310 static char outstr[MAX_STR_LEN]; 1311 char *p; 1312 1313 p = strrchr(instr, '.'); 1314 if (!p) { 1315 outstr[0] = '\0'; 1316 } else { 1317 strcpy(outstr, p); 1318 } 1319 return (outstr); 1299 mr_free(tmp); 1320 1300 } 1321 1301 … … 1329 1309 bool is_this_file_compressed(char *filename) 1330 1310 { 1331 char do_not_compress_these[MAX_STR_LEN];1332 char tmp[MAX_STR_LEN];1311 char *do_not_compress_these = NULL; 1312 char *tmp = NULL; 1333 1313 char *p; 1334 1314 char *q = NULL; … … 1339 1319 } 1340 1320 1341 sprintf(tmp, "%s/do-not-compress-these", g_mondo_home);1321 mr_asprintf(tmp, "%s/do-not-compress-these", g_mondo_home); 1342 1322 if (!does_file_exist(tmp)) { 1323 mr_free(tmp); 1343 1324 return (FALSE); 1344 1325 } 1345 1326 /* BERLIOS: This is just plain WRONG !! */ 1346 strcpy(do_not_compress_these,last_line_of_file(tmp)); 1327 mr_asprintf(do_not_compress_these,"%s", last_line_of_file(tmp)); 1328 mr_free(tmp); 1347 1329 1348 1330 for (p = do_not_compress_these; p != NULL; p++) { 1349 strcpy(tmp, p);1331 mr_asprintf(tmp, "%s", p); 1350 1332 if (strchr(tmp, ' ')) { 1351 1333 *(strchr(tmp, ' ')) = '\0'; 1352 1334 } 1353 1335 if (!strcmp(q, tmp)) { 1336 mr_free(tmp); 1337 mr_free(do_not_compress_these); 1354 1338 return (TRUE); 1355 1339 } … … 1357 1341 break; 1358 1342 } 1359 } 1343 mr_free(tmp); 1344 } 1345 mr_free(do_not_compress_these); 1360 1346 return (FALSE); 1361 1347 }
Note:
See TracChangeset
for help on using the changeset viewer.