- Timestamp:
- Nov 15, 2005, 12:01:12 AM (19 years ago)
- Location:
- trunk/mondo/mondo/common
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/mondo/mondo/common/X-specific.h
r89 r122 1 1 /* X-specific.h */ 2 3 #include <config.h>4 2 5 3 #ifdef __cplusplus -
trunk/mondo/mondo/common/libmondo-devices.c
r89 r122 1829 1829 malloc_string(command); 1830 1830 malloc_string(comment); 1831 malloc_string(prompt);1832 1831 assert(bkpinfo != NULL); 1833 1832 sz_size[0] = '\0'; -
trunk/mondo/mondo/common/libmondo-stream.c
r59 r122 1 /* libmondo-stream.c 2 $Id$ 1 /* $Id$ 3 2 4 3 ...tools for talking to tapes, Monitas streams, etc. 5 6 7 07/108 - added ACL and XATTR support9 10 04/1711 - added bkpinfo->internal_tape_block_size12 - fixed bug in set_tape_block_size_with_mt()13 14 03/2515 - call 'mt' when opening tape in/out, to set block size to 32K16 17 02/06/200418 - only eject_device() at end of closein_tape() --- not closeout_tape()19 20 10/26/200321 - call eject_device() at end of closein_tape() and closeout_tape()22 23 09/2524 - added docu-header to each subroutine25 26 09/2027 - working on multi-tape code28 - friendlier message in insist_on_this_tape_number()29 - delay is now 5s30 31 09/1032 - adding multi-tape support33 - adding 'back catalog' of previous archives, so that we may resume34 from point of end-of-tape (approx.)35 36 09/0837 - cleaned up insist_on_this_tape_number() --- 10s delay for same tape now38 39 08/2740 - improved find_tape_device_and_size() --- tries /dev/osst*41 42 05/0543 - added Joshua Oreman's FreeBSD patches44 45 04/2446 - added lots of assert()'s and log_OS_error()'s47 48 04/06/200349 - use find_home_of_exe() instead of which50 51 12/13/200252 - cdrecord -scanbus call was missing 2> /dev/null53 54 11/2455 - disabled fatal_error("Bad marker")56 57 10/2958 - replaced convoluted grep wih wc (KP)59 60 09/0761 - removed g_end_of_tape_reached62 - lots of multitape-related fixes63 64 08/01 - 08/3165 - write 16MB of zeroes to end of tape when closing(out)66 - compensate for 'buffer' and its distortion of speed of writing/reading67 when writing/reading data disks at start of tape68 - rewrote lots of multitape stuff69 - wrote workaround to allow >2GB of archives w/buffering70 - do not close/reopen tape when starting to read/write from71 new tape: no need! 'buffer' handles all that; we're writing72 to/reading from a FIFO, so no need to close/reopen when new tape73 - write 8MB of zeroes at end of tape, just in case74 - re-enable various calls to *_evalcall_form75 - added g_end_of_tape_reached76 - fixed bugs in start_to_[read|write]_[to|from]_next_tape77 - added internal buffering, replacing the external 'buffer' exe78 - wait 10 seconds (after user inserts new tape), to79 let tape stabilize in drive80 - added insist_on_this_tape_number()81 - worked on find_tape_device_and_size()82 - cleaned up some log_it() calls83 - added find_tape_device_and_size()84 - replaced using_cdstream with backup_media_type85 - replace *_from_tape with *_from_stream86 - replace *_to_stream with *_to_stream87 88 07/01 - 07/3189 - leave 32MB at end of tape, to avoid overrunning90 - started [07/24/2002]91 4 */ 92 5 93 94 /**6 /* 7 * 95 8 * @file 96 9 * Functions for writing data to/reading data from streams (tape, CD stream, etc.) … … 185 98 int ctrl_chr = '\0'; 186 99 187 /*@ buffers ***************************************************** */188 char fname[MAX_STR_LEN];189 190 100 /*@ long long's ************************************************* */ 191 101 long long size; … … 196 106 197 107 log_it("closein_tape() -- entering"); 198 res = read_header_block_from_stream(&size, fname, &ctrl_chr);108 res = read_header_block_from_stream(&size, NULL, &ctrl_chr); 199 109 retval += res; 200 110 if (ctrl_chr != BLK_END_OF_BACKUP) { 201 111 wrong_marker(BLK_END_OF_BACKUP, ctrl_chr); 202 112 } 203 res = read_header_block_from_stream(&size, fname, &ctrl_chr);113 res = read_header_block_from_stream(&size, NULL, &ctrl_chr); 204 114 retval += res; 205 115 if (ctrl_chr != BLK_END_OF_TAPE) { … … 214 124 paranoid_pclose(g_tape_stream); 215 125 log_it("closein_tape() -- leaving"); 216 /*217 for(i=0; i < g_tapecatalog->entries; i++)218 {219 log_it("i=%d type=%s num=%d aux=%ld", i, (g_tapecatalog->el[i].type==fileset)?"fileset":"bigslice", g_tapecatalog->el[i].number, g_tapecatalog->el[i].aux);220 }221 */222 126 if (!bkpinfo->please_dont_eject) { 223 127 eject_device(bkpinfo->media_device); … … 241 145 /*@ int's ******************************************************* */ 242 146 int retval = 0; 243 // int res = 0;244 // int ctrl_chr = '\0';245 246 /*@ buffers ***************************************************** */247 // char fname[MAX_STR_LEN];248 147 249 148 /*@ long long's ************************************************* */ 250 // long long size;251 149 int i; 252 150 char *blk; … … 262 160 BLK_END_OF_BACKUP); 263 161 retval += write_header_block_to_stream(0, "end-of-tape", BLK_END_OF_TAPE); /* just in case */ 264 /* write 1MB of crap */162 /* write 1MB of crap */ 265 163 for (i = 0; i < 256 * 1024; i++) { 266 164 blk[i] = (int) (random() & 0xFF); … … 273 171 } 274 172 } 275 /* write 1MB of zeroes */276 /*277 for (i = 0; i < 256*1024; i++)278 {279 blk[i] = 0;280 }281 for (i = 0; i < 4; i++)282 {283 fwrite (blk, 1, 256*1024, g_tape_stream);284 if (should_we_write_to_next_tape (bkpinfo->media_size[g_current_media_number], 256*1024))285 {286 start_to_write_to_next_tape (bkpinfo);287 }288 }289 */290 173 sleep(2); 291 174 paranoid_pclose(g_tape_stream); … … 298 181 g_tapecatalog->el[i].tape_posK); 299 182 } 300 // if (!bkpinfo->please_dont_eject)301 // { eject_device(bkpinfo->media_device); }302 183 paranoid_free(blk); 303 184 paranoid_free(g_tapecatalog); … … 312 193 int res; 313 194 314 malloc_string(command); 315 sprintf(command, "mt -f %s status", dev); 195 asprintf(&command, "mt -f %s status", dev); 316 196 res = run_program_and_log_output(command, 1); 317 197 paranoid_free(command); … … 334 214 int find_tape_device_and_size(char *dev, char *siz) 335 215 { 336 char tmp[MAX_STR_LEN]; 337 char command[MAX_STR_LEN * 2]; 338 char cdr_exe[MAX_STR_LEN]; 339 // char tape_description_[MAX_STR_LEN]; 340 // char tape_manufacturer_cdr[MAX_STR_LEN]; 341 // FILE*fin; 216 char *tmp; 217 char *command; 218 char *cdr_exe; 342 219 int res; 343 220 … … 345 222 dev[0] = siz[0] = '\0'; 346 223 if (find_home_of_exe("cdrecord")) { 347 strcpy(cdr_exe, "cdrecord");348 } else { 349 strcpy(cdr_exe, "dvdrecord");350 } 351 sprintf(command, "%s -scanbus 2> /dev/null | grep -i tape | wc -l",224 asprintf(&cdr_exe, "cdrecord"); 225 } else { 226 asprintf(&cdr_exe, "dvdrecord"); 227 } 228 asprintf(&command, "%s -scanbus 2> /dev/null | grep -i tape | wc -l", 352 229 cdr_exe); 353 strcpy(tmp, call_program_and_get_last_line_of_output(command)); 230 asprintf(&tmp, call_program_and_get_last_line_of_output(command)); 231 paranoid_free(command); 232 354 233 if (atoi(tmp) != 1) { 355 234 log_it … … 358 237 return 1; 359 238 } 360 sprintf(command, 239 paranoid_free(tmp); 240 241 asprintf(&command, 361 242 "%s -scanbus 2> /dev/null | tr -s '\t' ' ' | grep \"[0-9]*,[0-9]*,[0-9]*\" | grep -v \"[0-9]*) \\*\" | grep -i TAPE | cut -d' ' -f2 | head -n1", 362 243 cdr_exe); 363 strcpy(tmp, call_program_and_get_last_line_of_output(command)); 244 asprintf(&tmp, call_program_and_get_last_line_of_output(command)); 245 paranoid_free(command); 364 246 if (strlen(tmp) < 2) { 365 247 log_it("Could not find tape device"); 366 248 return 1; 367 249 } 368 sprintf(command, 250 paranoid_free(tmp); 251 252 asprintf(&command, 369 253 "%s -scanbus 2> /dev/null | tr -s '\t' ' ' | grep \"[0-9]*,[0-9]*,[0-9]*\" | grep -v \"[0-9]*) \\*\" | grep -i TAPE | cut -d' ' -f3 | cut -d')' -f1 | head -n1", 370 254 cdr_exe); 371 strcpy(tmp, call_program_and_get_last_line_of_output(command)); 255 paranoid_free(cdr_exe); 256 257 asprintf(&tmp, call_program_and_get_last_line_of_output(command)); 258 paranoid_free(command); 372 259 strcpy(dev, VANILLA_SCSI_TAPE); 373 260 dev[strlen(dev) - 1] = '\0'; 374 261 strcat(dev, tmp); // e.g. '/dev/st0' becomes '/dev/stN' 262 paranoid_free(tmp); 263 375 264 res = 0; 376 265 if (!mt_says_tape_exists(dev)) { … … 393 282 log_it("At this point, dev = %s and res = %d", dev, res); 394 283 395 strcpy(tmp, call_program_and_get_last_line_of_output("\284 asprintf(&tmp, call_program_and_get_last_line_of_output("\ 396 285 cdrecord -scanbus 2> /dev/null | tr -s '\t' ' ' | \ 397 286 grep \"[0-9]*,[0-9]*,[0-9]*\" | grep -v \"[0-9]*) \\*\" | grep -i TAPE | \ … … 402 291 } else { 403 292 log_it("Turning %s", dev); 404 strcpy(tmp, (strrchr(dev, '/') != NULL) ? strrchr(dev, '/') : dev); 293 paranoid_free(tmp); 294 asprintf(&tmp, (strrchr(dev, '/') != NULL) ? strrchr(dev, '/') : dev); 405 295 sprintf(dev, "/dev/os%s", tmp); 406 296 log_it("...into %s", dev); … … 427 317 return (0); 428 318 } 429 } 430 431 432 433 434 319 paranoid_free(tmp); 320 } 435 321 436 322 int read_EXAT_files_from_tape(struct s_bkpinfo *bkpinfo, … … 441 327 int res = 0; 442 328 int retval = 0; 329 char *fname = &res; /* Should NOT be NULL */ 443 330 444 331 // xattr 445 res = read_header_block_from_stream(ptmp_size, tmp_fname, pctrl_chr);332 res = read_header_block_from_stream(ptmp_size, fname, pctrl_chr); 446 333 if (*pctrl_chr != BLK_START_EXAT_FILE) { 447 334 wrong_marker(BLK_START_EXAT_FILE, *pctrl_chr); 448 335 } 449 if (!strstr( tmp_fname, "xattr")) {336 if (!strstr(fname, "xattr")) { 450 337 fatal_error("Wrong order, sunshine."); 451 338 } 339 paranoid_free(fname); 340 fname = &res; 452 341 read_file_from_stream_to_file(bkpinfo, xattr_fname, *ptmp_size); 453 res = read_header_block_from_stream(ptmp_size, tmp_fname, pctrl_chr);342 res = read_header_block_from_stream(ptmp_size, NULL, pctrl_chr); 454 343 if (*pctrl_chr != BLK_STOP_EXAT_FILE) { 455 344 wrong_marker(BLK_STOP_EXAT_FILE, *pctrl_chr); 456 345 } 457 // acl458 res = read_header_block_from_stream(ptmp_size, tmp_fname, pctrl_chr);459 if (!strstr( tmp_fname, "acl")) {346 // acl 347 res = read_header_block_from_stream(ptmp_size, fname, pctrl_chr); 348 if (!strstr(fname, "acl")) { 460 349 fatal_error("Wrong order, sunshine."); 461 350 } 351 paranoid_free(fname); 352 fname = &res; 462 353 if (*pctrl_chr != BLK_START_EXAT_FILE) { 463 354 wrong_marker(BLK_START_EXAT_FILE, *pctrl_chr); 464 355 } 465 356 read_file_from_stream_to_file(bkpinfo, acl_fname, *ptmp_size); 466 res = read_header_block_from_stream(ptmp_size, tmp_fname, pctrl_chr);357 res = read_header_block_from_stream(ptmp_size, NULL, pctrl_chr); 467 358 if (*pctrl_chr != BLK_STOP_EXAT_FILE) { 468 359 wrong_marker(BLK_STOP_EXAT_FILE, *pctrl_chr); 469 360 } 470 res = read_header_block_from_stream(ptmp_size, tmp_fname, pctrl_chr);361 res = read_header_block_from_stream(ptmp_size, NULL, pctrl_chr); 471 362 if (*pctrl_chr != BLK_STOP_EXTENDED_ATTRIBUTES) { 472 363 wrong_marker(BLK_STOP_EXTENDED_ATTRIBUTES, *pctrl_chr); 473 364 } 474 // tarball itself475 res = read_header_block_from_stream(ptmp_size, tmp_fname, pctrl_chr);365 // tarball itself 366 res = read_header_block_from_stream(ptmp_size, fname, pctrl_chr); 476 367 log_msg(1, "Got xattr and acl; now looking for afioball"); 368 tmp_fname = fname; 477 369 return (retval); 478 370 } … … 483 375 { 484 376 int res = 0; 485 // EXATs377 // EXATs 486 378 write_header_block_to_stream(length_of_file(xattr_fname), xattr_fname, 487 379 BLK_START_EXTENDED_ATTRIBUTES); 488 // xattr380 // xattr 489 381 write_header_block_to_stream(length_of_file(xattr_fname), xattr_fname, 490 382 BLK_START_EXAT_FILE); … … 513 405 { 514 406 int i; 515 char tmp[MAX_STR_LEN];407 char *tmp; 516 408 517 409 log_it("Insisting on tape #%d", tapeno); 518 410 if (g_current_media_number != tapeno) { 519 411 // log_it("g_current_media_number = %d", g_current_media_number); 520 sprintf(tmp,412 asprintf(&tmp, 521 413 "When the tape drive goes quiet, please insert volume %d in this series.", 522 414 tapeno); 523 415 popup_and_OK(tmp); 416 paranoid_free(tmp); 524 417 open_evalcall_form("Waiting while the tape drive settles"); 525 418 } else { … … 540 433 541 434 542 543 544 435 /** 545 436 * Debugging aid - log the offset we're at on the tape (reading or writing). … … 547 438 void log_tape_pos(void) 548 439 { 549 /*@ buffers ***************************************************** */550 551 552 /*@ end vars *************************************************** */553 554 440 log_it("Tape position -- %ld KB (%ld MB)", (long) g_tape_posK, 555 441 (long) g_tape_posK >> 10); … … 576 462 int last, curr, i; 577 463 t_archtype type = other; 578 char command[MAX_STR_LEN];579 char tmpdir[MAX_STR_LEN];580 char old_fname[MAX_STR_LEN];464 char *command; 465 char *tmpdir; 466 char *old_fname; 581 467 char *p; 468 /* BERLIOS: useless 582 469 char suffix[16]; 470 */ 583 471 584 472 bufsize_K = (long long) (1024LL * (1 + g_tape_buffer_size_MB)); 585 sprintf(tmpdir, "%s/tmpfs/backcatalog", td); 473 asprintf(&tmpdir, "%s/tmpfs/backcatalog", td); 474 /* BERLIOS: useless 586 475 if ((p = strrchr(latest_fname, '.'))) { 587 476 strcpy(suffix, ++p); … … 589 478 suffix[0] = '\0'; 590 479 } 480 */ 591 481 if (strstr(latest_fname, ".afio.") || strstr(latest_fname, ".star.")) { 592 482 type = fileset; … … 599 489 } 600 490 mkdir(tmpdir, 0x700); 601 sprintf(command, "cp -f %s %s", latest_fname, tmpdir);491 asprintf(&command, "cp -f %s %s", latest_fname, tmpdir); 602 492 if (run_program_and_log_output(command, 6)) { 603 493 log_it("Warning - failed to copy %s to backcatalog at %s", 604 494 latest_fname, tmpdir); 605 495 } 496 paranoid_free(command); 497 606 498 last = g_tapecatalog->entries - 1; 607 499 if (last <= 0) { … … 626 518 627 519 for (i = curr - 1; i >= 0 && curr - i < 10; i--) { 628 sprintf(old_fname, "%s/%s", tmpdir, g_tapecatalog->el[i].fname);520 asprintf(&old_fname, "%s/%s", tmpdir, g_tapecatalog->el[i].fname); 629 521 unlink(old_fname); 630 } 522 paranoid_free(old_fname); 523 } 524 paranoid_free(tmpdir); 631 525 return (0); 632 526 } 633 634 635 527 636 528 … … 646 538 } 647 539 540 648 541 /** 649 542 * FIFO used to read/write to the tape device. … … 651 544 */ 652 545 char g_tape_fifo[MAX_STR_LEN]; 653 654 655 546 656 547 int set_tape_block_size_with_mt(char *tapedev, … … 665 556 return (0); 666 557 } 667 malloc_string(tmp); 668 sprintf(tmp, "mt -f %s setblk %ld", tapedev, internal_tape_block_size); 558 asprintf(&tmp, "mt -f %s setblk %ld", tapedev, internal_tape_block_size); 669 559 res = run_program_and_log_output(tmp, 3); 670 560 paranoid_free(tmp); 671 561 return (res); 672 562 } 673 674 563 675 564 … … 685 574 { 686 575 /*@ buffer ***************************************************** */ 687 char fname[MAX_STR_LEN];688 576 char *datablock; 689 char tmp[MAX_STR_LEN];577 char *tmp; 690 578 char old_cwd[MAX_STR_LEN]; 691 char outfname[MAX_STR_LEN];579 char *outfname; 692 580 /*@ int ******************************************************* */ 693 581 int i; … … 718 606 } 719 607 insist_on_this_tape_number(1); 720 sprintf(outfname, "%s/tmp/all.tar.gz", bkpinfo->tmpdir);608 asprintf(&outfname, "%s/tmp/all.tar.gz", bkpinfo->tmpdir); 721 609 make_hole_for_file(outfname); 722 610 … … 765 653 paranoid_fclose(fout); 766 654 paranoid_free(datablock); 767 /* find initial blocks */768 res = read_header_block_from_stream(&size, fname, &ctrl_chr);655 /* find initial blocks */ 656 res = read_header_block_from_stream(&size, NULL, &ctrl_chr); 769 657 retval += res; 770 658 if (ctrl_chr != BLK_START_OF_TAPE) { 771 659 wrong_marker(BLK_START_OF_TAPE, ctrl_chr); 772 660 } 773 res = read_header_block_from_stream(&size, fname, &ctrl_chr);661 res = read_header_block_from_stream(&size, NULL, &ctrl_chr); 774 662 retval += res; 775 663 if (ctrl_chr != BLK_START_OF_BACKUP) { … … 780 668 (void) getcwd(old_cwd, MAX_STR_LEN); 781 669 chdir(bkpinfo->tmpdir); 782 sprintf(tmp, "tar -zxf %s tmp/mondo-restore.cfg 2> /dev/null",670 asprintf(&tmp, "tar -zxf %s tmp/mondo-restore.cfg 2> /dev/null", 783 671 outfname); 784 672 paranoid_system(tmp); 673 paranoid_free(tmp); 785 674 paranoid_system("cp -f tmp/mondo-restore.cfg . 2> /dev/null"); 786 675 chdir(old_cwd); 787 676 unlink(outfname); 677 paranoid_free(outfname); 788 678 return (retval); 789 679 } … … 800 690 { 801 691 /*@ buffers ***************************************************** */ 802 char command [MAX_STR_LEN * 2];692 char command; 803 693 804 694 /*@ end vars *************************************************** */ 805 695 806 /* add 'dummy' if testing */807 sprintf(command,696 /* add 'dummy' if testing */ 697 asprintf(&command, 808 698 "cdrecord -eject dev=%s speed=%d fs=24m -waiti - >> %s 2>> %s", 809 699 cddev, speed, MONDO_LOGFILE, MONDO_LOGFILE); 810 /* initialise the catalog */700 /* initialise the catalog */ 811 701 g_current_media_number = 1; 812 702 if (!(g_tapecatalog = malloc(sizeof(struct s_tapecatalog)))) { … … 814 704 } 815 705 g_tapecatalog->entries = 0; 816 /* log stuff */706 /* log stuff */ 817 707 log_it("Opening OUT cdstream with the command"); 818 708 log_it(command); 819 /* log_it("Let's see what happens, shall we?"); */709 /* log_it("Let's see what happens, shall we?"); */ 820 710 g_tape_stream = popen(command, "w"); 711 paranoid_free(command); 821 712 if (g_tape_stream) { 822 713 return (0); … … 827 718 } 828 719 720 829 721 /** 830 722 * Start writing to a tape device for the backup. … … 836 728 int openout_tape(char *tapedev, long internal_tape_block_size) 837 729 { 838 // char sz_call_to_buffer[MAX_STR_LEN];839 840 730 g_current_media_number = 1; 841 731 if (g_tape_stream) { … … 862 752 863 753 864 865 866 754 /** 867 755 * Copy a file from the opened stream (CD or tape) to @p outfile. … … 885 773 return (res); 886 774 } 887 888 775 889 776 … … 907 794 908 795 res = read_file_from_stream_FULL(bkpinfo, NULL, fout, size); 909 /* fflush(g_tape_stream);910 fflush(fout);*/911 796 return (res); 912 797 } 913 914 798 915 799 … … 933 817 char *tmp; 934 818 char *datablock; 935 char *temp_fname ;936 char *temp_cksum ;819 char *temp_fname = bkpinfo; /* Should NOT be NULL */ 820 char *temp_cksum = bkpinfo; /* Should NOT be NULL */ 937 821 char *actual_cksum; 938 // char *pA, *pB;939 822 940 823 /*@ int ********************************************************* */ … … 950 833 951 834 /*@ long ***************************************************** */ 952 long bytes_to_write = 0 /*,i */ ; 953 // long bytes_successfully_read_in_this_time = 0; 835 long bytes_to_write = 0; 954 836 955 837 /*@ long long *************************************************** */ … … 959 841 long long where_I_was_before_tape_change = 0; 960 842 /*@ unsigned int ************************************************ */ 961 /* unsigned int ch; */962 843 unsigned int crc16; 963 844 unsigned int crctt; … … 966 847 967 848 /*@ init ******************************************************* */ 968 malloc_string(tmp);969 malloc_string(temp_fname);970 malloc_string(temp_cksum);971 malloc_string(actual_cksum);972 849 datablock = malloc(TAPE_BLOCK_SIZE); 973 850 crc16 = 0; … … 979 856 res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr); 980 857 if (orig_size != temp_size && orig_size != -1) { 981 sprintf(tmp,858 asprintf(&tmp, 982 859 "output file's size should be %ld K but is apparently %ld K", 983 860 (long) size >> 10, (long) temp_size >> 10); 984 861 log_to_screen(tmp); 862 paranoid_free(tmp); 985 863 } 986 864 if (ctrl_chr != BLK_START_FILE) { … … 988 866 return (1); 989 867 } 990 sprintf(tmp, "Reading file from tape; writing to '%s'; %ld KB",868 asprintf(&tmp, "Reading file from tape; writing to '%s'; %ld KB", 991 869 outfname, (long) size >> 10); 870 log_to_screen(tmp); 871 paranoid_free(tmp); 992 872 993 873 if (foutstream) { … … 1045 925 log_msg(6, ".......................... Should be %lld", orig_size); 1046 926 g_tape_posK += total_read_from_tape_for_this_file / 1024; 1047 sprintf(actual_cksum, "%04x%04x", crc16, crctt);927 asprintf(&actual_cksum, "%04x%04x", crc16, crctt); 1048 928 if (foutstream) { /*log_it("Finished writing to foutstream"); */ 1049 929 } else { … … 1056 936 } 1057 937 if (strcmp(temp_cksum, actual_cksum)) { 1058 sprintf(tmp, "actual cksum=%s; recorded cksum=%s", actual_cksum,938 asprintf(&tmp, "actual cksum=%s; recorded cksum=%s", actual_cksum, 1059 939 temp_cksum); 1060 940 log_to_screen(tmp); 1061 sprintf(tmp, "%s (%ld K) is corrupt on tape", temp_fname, 941 paranoid_free(tmp); 942 943 asprintf(&tmp, "%s (%ld K) is corrupt on tape", temp_fname, 1062 944 (long) orig_size >> 10); 1063 945 log_to_screen(tmp); 946 paranoid_free(tmp); 1064 947 retval++; 1065 } else { 1066 sprintf(tmp, "%s is GOOD on tape", temp_fname); 1067 /* log_it(tmp); */ 1068 } 948 } 949 paranoid_free(actual_cksum); 1069 950 paranoid_free(datablock); 1070 paranoid_free(tmp);1071 951 paranoid_free(temp_fname); 1072 952 paranoid_free(temp_cksum); 1073 paranoid_free(actual_cksum);1074 953 return (retval); 1075 954 } 1076 1077 955 1078 956 … … 1110 988 g_tape_stream) / 1024; 1111 989 } 1112 /* memcpy((char*)plength_of_incoming_file,(char*)tempblock+7001,sizeof(long long)); */1113 /* for(*plen=0,i=7;i>=0;i--) {*plen<<=8; *plen |= tempblock[7001+i];} */1114 990 memcpy((char *) plen, tempblock + 7001, sizeof(long long)); 1115 991 if (strcmp(tempblock + 6000 + *pcontrol_char, "Mondolicious, baby")) { 1116 992 log_it("Bad header block at %ld K", (long) g_tape_posK); 1117 993 } 1118 strcpy(filename, tempblock + 1000);1119 /* strcpy(cksum,tempblock+5555);*/ 1120 /* log_it( "%s (reading) fname=%s, filesize=%ld K", 1121 marker_to_string (*pcontrol_char), filename,1122 (long) ((*plen) >> 10));1123 */ 994 /* the caller manages whether we should allocate or not 995 * by setting the value to NULL (do not allocate) or 996 * something (allocate) */ 997 if (filename != NULL) { 998 asprintf(&filename, tempblock + 1000); 999 } 1124 1000 if (*pcontrol_char == BLK_ABORTED_BACKUP) { 1125 1001 log_to_screen("I can't verify an aborted backup."); … … 1140 1016 return (retval); 1141 1017 } 1142 1143 1018 1144 1019 … … 1186 1061 1187 1062 1188 1189 1190 1063 /** 1191 1064 * Decide whether we should start a new tape. This is TRUE if we've run out of tape … … 1237 1110 int res; 1238 1111 int ctrl_chr; 1239 char *temp_fname ;1112 char *temp_fname = &res; /* should NOT be NULL */ 1240 1113 char *datablock; 1241 1114 long long temp_size, size; … … 1243 1116 1244 1117 datablock = malloc(TAPE_BLOCK_SIZE); 1245 malloc_string(temp_fname);1246 1118 pB = strrchr(the_file_I_was_reading, '/'); 1247 1119 if (pB) { … … 1263 1135 wrong_marker(BLK_START_AN_AFIO_OR_SLICE, ctrl_chr); 1264 1136 log_msg(3, "Still trying to re-sync w/ tape"); 1137 paranoid_free(temp_fname); 1138 temp_fname = &res; 1265 1139 } 1266 1140 while (ctrl_chr != BLK_START_FILE) { … … 1274 1148 wrong_marker(BLK_START_FILE, ctrl_chr); 1275 1149 log_msg(3, "Still trying to re-sync w/ tape"); 1150 /* Do not desallocate when the while condition is met */ 1151 if (ctrl_chr != BLK_START_FILE) { 1152 paranoid_free(temp_fname); 1153 temp_fname = &res; 1154 } 1276 1155 } 1277 1156 pA = strrchr(temp_fname, '/'); … … 1296 1175 fread(datablock, 1, (size_t) TAPE_BLOCK_SIZE, g_tape_stream); 1297 1176 } 1177 1178 paranoid_free(temp_fname); 1179 temp_fname = &res; 1298 1180 res = 1299 read_header_block_from_stream(&temp_size, temp_fname,1181 read_header_block_from_stream(&temp_size, NULL, 1300 1182 &ctrl_chr); 1301 1183 if (ctrl_chr != BLK_STOP_FILE) { … … 1303 1185 } 1304 1186 res = 1305 read_header_block_from_stream(&temp_size, temp_fname,1187 read_header_block_from_stream(&temp_size, NULL, 1306 1188 &ctrl_chr); 1307 1189 if (ctrl_chr != BLK_STOP_AN_AFIO_OR_SLICE) { … … 1309 1191 } 1310 1192 res = 1311 read_header_block_from_stream(&temp_size, temp_fname,1193 read_header_block_from_stream(&temp_size, NULL, 1312 1194 &ctrl_chr); 1313 1195 if (ctrl_chr != BLK_START_AN_AFIO_OR_SLICE) { … … 1326 1208 pA = temp_fname; 1327 1209 } 1210 /* BERLIOS: useless ? 1328 1211 pB = strrchr(the_file_I_was_reading, '/'); 1329 1212 if (pB) { … … 1332 1215 pB = the_file_I_was_reading; 1333 1216 } 1217 */ 1334 1218 } 1335 1219 log_msg(2, "Reading %s (it matches %s)", temp_fname, … … 1350 1234 /*@ int ********************************************************* */ 1351 1235 int res = 0; 1352 char *sz_msg;1353 1236 int ctrlchr; 1354 1237 long long temp_size; 1355 malloc_string(sz_msg);1356 1238 /*@ end vars *************************************************** */ 1357 1239 … … 1373 1255 g_tape_posK = 0; 1374 1256 g_sigpipe = FALSE; 1375 res += read_header_block_from_stream(&temp_size, sz_msg, &ctrlchr); /* just in case */1257 res += read_header_block_from_stream(&temp_size, NULL, &ctrlchr); /* just in case */ 1376 1258 if (ctrlchr != BLK_START_OF_TAPE) { 1377 1259 wrong_marker(BLK_START_OF_TAPE, ctrlchr); 1378 1260 } 1379 res += read_header_block_from_stream(&temp_size, sz_msg, &ctrlchr); /* just in case */1261 res += read_header_block_from_stream(&temp_size, NULL, &ctrlchr); /* just in case */ 1380 1262 if (ctrlchr != BLK_START_OF_BACKUP) { 1381 1263 wrong_marker(BLK_START_OF_BACKUP, ctrlchr); … … 1383 1265 log_msg(3, "Next tape opened OK. Whoopee!"); 1384 1266 } 1385 paranoid_free(sz_msg);1386 1267 return (res); 1387 1268 } 1388 1389 1269 1390 1270 … … 1397 1277 { 1398 1278 int res = 0; 1399 char command[MAX_STR_LEN * 2]; 1279 char *command; 1280 1400 1281 paranoid_pclose(g_tape_stream); 1401 1282 system("sync"); … … 1409 1290 } 1410 1291 if (bkpinfo->backup_media_type == cdstream) { 1411 sprintf(command,1292 asprintf(&command, 1412 1293 "cdrecord -eject dev=%s speed=%d fs=24m -waiti - >> %s 2>> %s", 1413 1294 bkpinfo->media_device, bkpinfo->cdrw_speed, MONDO_LOGFILE, … … 1417 1298 log_it("Let's see what happens, shall we?"); 1418 1299 g_tape_stream = popen(command, "w"); 1300 paranoid_free(command); 1419 1301 if (!g_tape_stream) { 1420 1302 log_to_screen("Failed to openout to cdstream (fifo)"); … … 1438 1320 return (res); 1439 1321 } 1440 1441 1442 1322 1443 1323 … … 1460 1340 1461 1341 log_msg(2, "I am now writing back catalog to tape"); 1462 malloc_string(fname);1463 1342 last = g_tapecatalog->entries - 1; 1464 1343 for (i = 0; i <= last; i++) { 1465 sprintf(fname, "%s/tmpfs/backcatalog/%s", bkpinfo->tmpdir,1344 asprintf(&fname, "%s/tmpfs/backcatalog/%s", bkpinfo->tmpdir, 1466 1345 g_tapecatalog->el[i].fname); 1467 1346 if (!does_file_exist(fname)) { … … 1482 1361 } 1483 1362 } 1484 }1485 paranoid_free(fname);1363 paranoid_free(fname); 1364 } 1486 1365 log_msg(2, "Finished writing back catalog to tape"); 1487 1366 return (res); … … 1489 1368 1490 1369 1491 1492 1370 /** 1493 1371 * Write all.tar.gz (produced by Mindi) to the first 32M of the first tape. … … 1499 1377 /*@ pointers *************************************************** */ 1500 1378 FILE *fin; 1501 char tmp[MAX_STR_LEN];1379 char *tmp; 1502 1380 1503 1381 /*@ long ******************************************************* */ … … 1517 1395 log_it("Data disks = %s", fname); 1518 1396 if (!does_file_exist(fname)) { 1519 sprintf(tmp, "Cannot find %s", fname);1397 asprintf(&tmp, "Cannot find %s", fname); 1520 1398 log_to_screen(tmp); 1399 paranoid_free(tmp); 1521 1400 return (1); 1522 1401 } … … 1550 1429 1551 1430 1552 1553 1554 1431 /** 1555 1432 * Copy @p infile to the opened stream (CD or tape). … … 1561 1438 { 1562 1439 /*@ buffers **************************************************** */ 1563 char tmp[MAX_STR_LEN];1440 char *tmp; 1564 1441 char datablock[TAPE_BLOCK_SIZE]; 1565 char checksum[MAX_STR_LEN];1442 char *checksum; 1566 1443 char *infile_basename; 1567 1444 … … 1592 1469 crc16 = 0; 1593 1470 crctt = 0; 1594 1595 1596 1471 1597 1472 /*@ end vars *************************************************** */ … … 1615 1490 p++; 1616 1491 } 1617 sprintf(tmp, "Writing file '%s' to tape (%ld KB)", p,1492 asprintf(&tmp, "Writing file '%s' to tape (%ld KB)", p, 1618 1493 (long) filesize >> 10); 1619 1494 log_it(tmp); 1495 paranoid_free(tmp); 1496 1620 1497 write_header_block_to_stream(filesize, infile_basename, 1621 1498 BLK_START_FILE); … … 1656 1533 } 1657 1534 paranoid_fclose(fin); 1658 sprintf(checksum, "%04x%04x", crc16, crctt);1535 asprintf(&checksum, "%04x%04x", crc16, crctt); 1659 1536 write_header_block_to_stream(g_current_media_number, checksum, 1660 1537 BLK_STOP_FILE); 1538 paranoid_free(checksum); 1661 1539 // log_it("File '%s' written to tape.", infile); 1662 1540 return (retval); 1663 1541 } 1664 1665 1666 1667 1542 1668 1543 … … 1684 1559 /*@ buffers **************************************************** */ 1685 1560 char tempblock[TAPE_BLOCK_SIZE]; 1686 char tmp[MAX_STR_LEN];1561 char *tmp; 1687 1562 char *p; 1688 1563 … … 1713 1588 sprintf(tempblock + 6000 + control_char, "Mondolicious, baby"); 1714 1589 tempblock[7000] = control_char; 1715 /* for(i=0;i<8;i++) {tempblock[7001+i]=olen&0xff; olen>>=8;} */1716 1590 memcpy(tempblock + 7001, (char *) &olen, sizeof(long long)); 1717 /* if (length_of_incoming_file) {memcpy(tempblock+7001,(char*)&length_of_incoming_file,sizeof(long long));} */1718 1591 strcpy(tempblock + 1000, filename); 1719 /* strcpy(tempblock+5555,cksum); */1720 1592 g_tape_posK += 1721 1593 fwrite(tempblock, 1, (size_t) TAPE_BLOCK_SIZE, 1722 1594 g_tape_stream) / 1024; 1723 sprintf(tmp, "%s (fname=%s, size=%ld K)",1595 asprintf(&tmp, "%s (fname=%s, size=%ld K)", 1724 1596 marker_to_string(control_char), p, 1725 1597 (long) length_of_incoming_file >> 10); 1726 1598 log_msg(6, tmp); 1727 /* log_tape_pos(); */ 1599 paranoid_free(tmp); 1728 1600 return (0); 1729 1601 } 1730 1731 1732 1733 1734 1735 1736 1737 1738 1602 1739 1603 … … 1746 1610 { 1747 1611 /*@ buffer ***************************************************** */ 1748 char tmp[MAX_STR_LEN];1612 char *tmp; 1749 1613 1750 1614 1751 1615 /*@ end vars *************************************************** */ 1752 sprintf(tmp, "Wrong marker! (Should be %s, ", 1753 marker_to_string(should_be)); 1754 sprintf(tmp + strlen(tmp), "is actually %s)", marker_to_string(it_is)); 1616 asprintf(&tmp, "Wrong marker! (Should be %s, is actually %s)", 1617 marker_to_string(should_be), marker_to_string(it_is)); 1755 1618 log_to_screen(tmp); 1619 paranoid_free(tmp); 1756 1620 } 1757 1621 -
trunk/mondo/mondo/common/libmondo-string.c
r121 r122 1062 1062 1063 1063 /* BERLIOS There is a bug here I can't solve for the moment. If you 1064 * replace %% in the asprintfbelow by 'percent' it just works, but1064 * replace %% in the format below by 'percent' it just works, but 1065 1065 * like this it creates a huge number. Memory pb somewhere */ 1066 1066 /* -
trunk/mondo/mondo/common/libmondo-verify.c
r120 r122 608 608 char *orig_cksum; 609 609 char *tmp; 610 char *slice_fnam ;610 char *slice_fnam = (char *)&res; 611 611 612 612 /*@ pointers ******************************************************** */ … … 616 616 long long slice_siz; 617 617 618 malloc_string(slice_fnam);619 618 assert(bkpinfo != NULL); 620 619 assert_string_is_neither_NULL_nor_zerolength(biggie_fname); … … 627 626 } 628 627 asprintf(&test_file, "%s/temporary-%s", bkpinfo->tmpdir, p); 629 /* BERLIOS: useless 630 asprintf(&tmp, 631 "Temporarily copying biggiefile %s's slices from tape to '%s'", 632 p, test_file); 633 log_it(tmp); 634 paranoid_free(tmp); 635 */ 628 asprintf(&tmp, 629 "Temporarily copying biggiefile %s's slices from tape to '%s'", 630 p, test_file); 631 log_it(tmp); 632 paranoid_free(tmp); 636 633 for (res = 637 634 read_header_block_from_stream(&slice_siz, slice_fnam, &ctrl_chr); … … 645 642 res = read_file_from_stream_to_file(bkpinfo, test_file, slice_siz); 646 643 unlink(test_file); 644 paranoid_free(slice_fnam); 645 slice_fnam = (char *)&res; 647 646 res = 648 647 read_header_block_from_stream(&slice_siz, slice_fnam, … … 654 653 current_slice_number++; 655 654 retval += res; 655 paranoid_free(slice_fnam); 656 slice_fnam = (char *)&res; 656 657 } 657 658 paranoid_free(test_file); … … 705 706 /*@ buffers ***************************************************** */ 706 707 char *tmp; 707 char *fname ;708 char *fname = (char *)&res; /* Should NOT be NULL */ 708 709 char *curr_xattr_list_fname; 709 710 char *curr_acl_list_fname; … … 713 714 714 715 assert(bkpinfo != NULL); 715 malloc_string(fname);716 716 717 717 asprintf(&curr_xattr_list_fname, XATTR_BIGGLST_FNAME_RAW_SZ, … … 725 725 "Please wait. This may take a couple of hours.", "", 726 726 total_afioballs); 727 res = read_header_block_from_stream(&size, fname, &ctrl_chr);727 res = read_header_block_from_stream(&size, NULL, &ctrl_chr); 728 728 if (ctrl_chr != BLK_START_AFIOBALLS) { 729 729 iamhere("YOU SHOULD NOT GET HERE"); … … 731 731 if (ctrl_chr == BLK_START_EXTENDED_ATTRIBUTES) { 732 732 res = 733 read_EXAT_files_from_tape(bkpinfo, &size, fname, &ctrl_chr,733 read_EXAT_files_from_tape(bkpinfo, &size, NULL, &ctrl_chr, 734 734 curr_xattr_list_fname, 735 735 curr_acl_list_fname); … … 744 744 for (res = read_header_block_from_stream(&size, fname, &ctrl_chr); 745 745 ctrl_chr != BLK_STOP_AFIOBALLS; 746 res = read_header_block_from_stream(&size, fname, &ctrl_chr)) { 746 res = 747 read_header_block_from_stream(&size, fname, &ctrl_chr)) { 747 748 asprintf(&curr_xattr_list_fname, XATTR_LIST_FNAME_RAW_SZ, 748 749 bkpinfo->tmpdir, current_afioball_number); … … 751 752 if (ctrl_chr == BLK_START_EXTENDED_ATTRIBUTES) { 752 753 iamhere("Reading EXAT files from tape"); 754 paranoid_free(fname); 755 fname = (char *)&res; 753 756 res = 754 757 read_EXAT_files_from_tape(bkpinfo, &size, fname, &ctrl_chr, … … 777 780 current_afioball_number++; 778 781 g_current_progress++; 782 paranoid_free(fname); 783 fname = (char *)&res; 779 784 res = read_header_block_from_stream(&size, fname, &ctrl_chr); 780 785 if (ctrl_chr != BLK_STOP_AN_AFIO_OR_SLICE) { 781 786 wrong_marker(BLK_STOP_AN_AFIO_OR_SLICE, ctrl_chr); 782 787 } 788 paranoid_free(fname); 789 fname = (char *)&res; 783 790 } 784 791 log_msg(1, "All done with afioballs"); … … 810 817 811 818 /*@ buffers ******************************************************** */ 812 char *orig_fname, *logical_fname; 819 char *orig_fname = (char *)&ctrl_chr; /* Should NOT be NULL */ 820 char *logical_fname; 813 821 char *comment; 814 822 char *curr_xattr_list_fname; … … 821 829 822 830 assert(bkpinfo != NULL); 823 malloc_string(orig_fname);824 831 825 832 asprintf(&curr_xattr_list_fname, XATTR_BIGGLST_FNAME_RAW_SZ, … … 829 836 asprintf(&comment, "Verifying all bigfiles."); 830 837 log_to_screen(comment); 831 /*832 asprintf(&tmp, "%s/biggielist.txt", bkpinfo->tmpdir);833 noof_biggiefiles = count_lines_in_file (tmp); // pointless834 paranoid_free(tmp);835 */836 838 res = read_header_block_from_stream(&size, orig_fname, &ctrl_chr); 837 839 if (ctrl_chr != BLK_START_BIGGIEFILES) { 838 840 if (ctrl_chr == BLK_START_EXTENDED_ATTRIBUTES) { 839 841 iamhere("Grabbing the EXAT biggiefiles"); 842 paranoid_free(orig_fname); 843 orig_fname = (char *)&ctrl_chr; 840 844 res = 841 845 read_EXAT_files_from_tape(bkpinfo, &size, orig_fname, … … 846 850 paranoid_free(curr_xattr_list_fname); 847 851 paranoid_free(curr_acl_list_fname); 852 paranoid_free(orig_fname); 853 orig_fname = (char *)&ctrl_chr; 848 854 849 855 if (ctrl_chr != BLK_START_BIGGIEFILES) { … … 884 890 current_biggiefile_number++; 885 891 g_current_progress++; 892 paranoid_free(orig_fname); 893 orig_fname = (char *)&ctrl_chr; 886 894 } 887 895 close_progress_form(); 888 paranoid_free(orig_fname);889 896 return (retval); 890 897 } -
trunk/mondo/mondo/common/mondostructures.h
r59 r122 18 18 19 19 20 /* *20 /* 21 21 * @file 22 22 * The header file defining all of Mondo's structures. … … 24 24 25 25 26 /* *@def MAX_NOOF_MEDIA The maximum number of media that can be used in any one backup. */27 28 / //* So we can override it in config.h: */26 /* @def MAX_NOOF_MEDIA The maximum number of media that can be used in any one backup. */ 27 28 /* So we can override it in config.h: */ 29 29 //#ifndef MAX_NOOF_MEDIA 30 30 #define MAX_NOOF_MEDIA 50 -
trunk/mondo/mondo/common/my-stuff.h
r89 r122 17 17 #define _MY_STUFF_H_ 18 18 19 /* Required for the use of asprintf*/19 /* Required for the use of getline, ... */ 20 20 #define __USE_GNU 21 21
Note:
See TracChangeset
for help on using the changeset viewer.