Changeset 3188 in MondoRescue for branches/3.0/mondo/src/common/libmondo-stream.c
- Timestamp:
- Sep 25, 2013, 8:55:39 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3.0/mondo/src/common/libmondo-stream.c
r3185 r3188 138 138 } 139 139 sleep(1); 140 paranoid_system("sync");140 sync(); 141 141 sleep(1); 142 142 paranoid_pclose(g_tape_stream); 143 143 log_it("closein_tape() -- leaving"); 144 /*145 for(i=0; i < g_tapecatalog->entries; i++)146 {147 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);148 }149 */150 144 if (!bkpinfo->please_dont_eject) { 151 145 eject_device(bkpinfo->media_device); … … 183 177 184 178 sleep(1); 185 paranoid_system("sync");179 sync(); 186 180 sleep(1); 187 181 log_it("closeout_tape() -- entering"); … … 228 222 g_tapecatalog->el[i].tape_posK); 229 223 } 230 // if (!bkpinfo->please_dont_eject)231 // { eject_device(bkpinfo->media_device); }232 224 paranoid_free(blk); 233 225 paranoid_free(g_tapecatalog); … … 266 258 char tmp[MAX_STR_LEN]; 267 259 char *command = NULL; 268 char cdr_exe[MAX_STR_LEN];260 char *cdr_exe = NULL; 269 261 int res; 270 262 … … 272 264 dev[0] = siz[0] = '\0'; 273 265 if (find_home_of_exe("cdrecord")) { 274 strcpy(cdr_exe, "cdrecord"); 275 } else { 276 strcpy(cdr_exe, "dvdrecord"); 277 } 278 mr_asprintf(command, "%s -scanbus 2> /dev/null | grep -i tape | wc -l", 279 cdr_exe); 280 strcpy(tmp, call_program_and_get_last_line_of_output(command)); 266 mr_asprintf(cdr_exe, "cdrecord"); 267 } else { 268 mr_asprintf(cdr_exe, "dvdrecord"); 269 } 270 mr_asprintf(command, "%s -scanbus 2> /dev/null | grep -i tape | wc -l", cdr_exe); 271 mr_asprintf(tmp, "%s", call_program_and_get_last_line_of_output(command)); 281 272 mr_free(command); 282 273 283 274 if (atoi(tmp) != 1) { 284 log_it 285 ("Either too few or too many tape streamers for me to detect..."); 275 log_it("Either too few or too many tape streamers for me to detect..."); 286 276 strcpy(dev, VANILLA_SCSI_TAPE); 277 mr_free(tmp); 278 mr_free(cdr_exe); 287 279 return 1; 288 280 } 289 mr_ asprintf(command,290 "%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", 291 292 strcpy(tmp, call_program_and_get_last_line_of_output(command));281 mr_free(tmp); 282 283 mr_asprintf(command, "%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", cdr_exe); 284 mr_asprintf(tmp, "%s", all_program_and_get_last_line_of_output(command)); 293 285 mr_free(command); 294 286 295 287 if (strlen(tmp) < 2) { 296 288 log_it("Could not find tape device"); 289 mr_free(cdr_exe); 290 mr_free(tmp); 297 291 return 1; 298 292 } 299 mr_asprintf(command, 300 "%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",301 cdr_exe); 302 strcpy(tmp, call_program_and_get_last_line_of_output(command));293 mr_asprintf(command, "%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", cdr_exe); 294 mr_free(cdr_exe); 295 296 mr_asprintf(tmp, "%s", call_program_and_get_last_line_of_output(command)); 303 297 mr_free(command); 304 298 … … 306 300 dev[strlen(dev) - 1] = '\0'; 307 301 strcat(dev, tmp); // e.g. '/dev/st0' becomes '/dev/stN' 302 mr_free(tmp); 303 308 304 res = 0; 309 305 if (!mt_says_tape_exists(dev)) { … … 324 320 } 325 321 326 log_it("At this point, dev = %s and res = %d", dev, res); 327 328 strcpy(tmp, call_program_and_get_last_line_of_output("\ 329 cdrecord -scanbus 2> /dev/null | tr -s '\t' ' ' | \ 330 grep \"[0-9]*,[0-9]*,[0-9]*\" | grep -v \"[0-9]*) \\*\" | grep -i TAPE | \ 331 awk '{for(i=1; i<NF; i++) { if (index($i, \"GB\")>0) { print $i;};};};'")); 322 if (dev) { 323 log_it("At this point, dev = %s and res = %d", dev, res); 324 } else { 325 log_it("At this point, dev is NULL and res = %d", dev, res); 326 } 327 328 mr_asprintf(tmp, "%s", call_program_and_get_last_line_of_output("cdrecord -scanbus 2> /dev/null | tr -s '\t' ' ' | grep \"[0-9]*,[0-9]*,[0-9]*\" | grep -v \"[0-9]*) \\*\" | grep -i TAPE | awk '{for(i=1; i<NF; i++) { if (index($i, \"GB\")>0) { print $i;};};};'")); 332 329 333 330 if (mt_says_tape_exists(dev)) { … … 335 332 } else { 336 333 log_it("Turning %s", dev); 337 strcpy(tmp, (strrchr(dev, '/') != NULL) ? strrchr(dev, '/') : dev); 334 mr_free(tmp); 335 mr_asprintf(tmp, "%s", (strrchr(dev, '/') != NULL) ? strrchr(dev, '/') : dev); 338 336 sprintf(dev, "/dev/os%s", tmp); 339 337 log_it("...into %s", dev); … … 355 353 siz[0] = '\0'; 356 354 log_it("Warning - size of tape unknown"); 357 return (0);358 355 } else { 359 356 strcpy(siz, tmp); 360 return (0); 361 } 362 } 363 364 365 366 357 } 358 mr_free(tmp); 359 return (0); 360 } 367 361 368 362 … … 479 473 log_it("Insisting on tape #%d", tapeno); 480 474 if (g_current_media_number != tapeno) { 481 mr_asprintf(tmp, 482 "When the tape drive goes quiet, please insert volume %d in this series.", 483 tapeno); 475 mr_asprintf(tmp, "When the tape drive goes quiet, please insert volume %d in this series.", tapeno); 484 476 popup_and_OK(tmp); 485 477 mr_free(tmp); … … 614 606 int res; 615 607 608 if (bkpinfo->media_device == NULL) { 609 return(1); 610 } 611 616 612 if (strncmp(bkpinfo->media_device, "/dev/", 5)) { 617 log_msg(1, 618 "Not using 'mt setblk'. This isn't an actual /dev entry."); 613 log_msg(1, "Not using 'mt setblk'. This isn't an actual /dev entry."); 619 614 return (0); 620 615 } … … 687 682 int res = 0; 688 683 684 if (bkpinfo->media_device == NULL) { 685 return(1); 686 } 687 689 688 log_it("Skipping OBDR headers"); 690 689 mr_asprintf(command, "mt -f %s rewind",bkpinfo->media_device); … … 712 711 char *command = NULL; 713 712 int res = 0; 713 714 if (bkpinfo->media_device == NULL) { 715 return(1); 716 } 714 717 715 718 log_it("Creating OBDR headers"); … … 780 783 /*@ end vars *************************************************** */ 781 784 782 assert_string_is_neither_NULL_nor_zerolength(bkpinfo->media_device); 783 if (!(g_tapecatalog = malloc(sizeof(struct s_tapecatalog)))) { 784 fatal_error("Cannot alloc mem for tape catalog"); 785 } 785 g_tapecatalog = mr_malloc(sizeof(struct s_tapecatalog)); 786 786 g_tapecatalog->entries = 0; 787 787 g_tape_posK = 0; … … 800 800 if (bkpinfo->media_device == NULL) { 801 801 log_it("Not able to skip OBDR - Restore will have to be done manually"); 802 return (1); 802 803 } 803 804 set_tape_block_size_with_mt(bkpinfo->internal_tape_block_size); … … 808 809 make_hole_for_file(outfname); 809 810 810 // start_buffer_process( bkpinfo->media_device, g_tape_fifo, FALSE);811 811 log_it("Opening IN tape"); 812 if (! 813 (g_tape_stream = 814 open_device_via_buffer(bkpinfo->media_device, 'r', 815 bkpinfo->internal_tape_block_size))) { 812 if (!(g_tape_stream = open_device_via_buffer(bkpinfo->media_device, 'r', bkpinfo->internal_tape_block_size))) { 816 813 log_OS_error(g_tape_fifo); 817 814 log_to_screen("Cannot openin stream device"); … … 821 818 log_to_screen("Reading stream"); 822 819 log_it("stream device = '%s'", bkpinfo->media_device); 823 /* skip data disks */820 /* skip data disks */ 824 821 open_evalcall_form("Skipping data disks on stream"); 825 822 log_to_screen("Skipping data disks on stream"); … … 874 871 // FIXME 875 872 } 876 mr_asprintf(tmp, "tar -zxf %s ./tmp/mondo-restore.cfg 2> /dev/null", 877 outfname); 873 mr_asprintf(tmp, "tar -zxf %s ./tmp/mondo-restore.cfg 2> /dev/null", outfname); 878 874 paranoid_system(tmp); 879 875 mr_free(tmp); … … 903 899 /*@ end vars *************************************************** */ 904 900 901 if (cddev == NULL) { 902 log_to_screen("Failed to openout NULL cddev"); 903 return (1); 904 } 905 905 /* add 'dummy' if testing */ 906 906 mr_asprintf(command, "cdrecord -eject dev=%s speed=%d fs=24m -waiti - >> %s 2>> %s", cddev, speed, MONDO_LOGFILE, MONDO_LOGFILE); … … 942 942 return (0); 943 943 } 944 if (!(g_tapecatalog = malloc(sizeof(struct s_tapecatalog)))) { 945 fatal_error("Cannot alloc mem for tape catalog"); 946 } 944 if (bkpinfo->media_device == NULL) { 945 log_it("Unable to openout NULL device"); 946 return(1); 947 } 948 g_tapecatalog = mr_malloc(sizeof(struct s_tapecatalog)); 947 949 g_tapecatalog->entries = 0; 948 950 g_tape_posK = 0; … … 954 956 } 955 957 log_it("Opening OUT tape"); 956 if (! 957 (g_tape_stream = 958 open_device_via_buffer(bkpinfo->media_device, 'w', bkpinfo->internal_tape_block_size))) { 958 if (!(g_tape_stream = open_device_via_buffer(bkpinfo->media_device, 'w', bkpinfo->internal_tape_block_size))) { 959 959 log_OS_error(g_tape_fifo); 960 960 log_to_screen("Cannot openin stream device"); … … 969 969 /** 970 970 * Copy a file from the opened stream (CD or tape) to @p outfile. 971 * @param bkpinfo The backup information structure. @c bkpinfo->media_device is the only field used.972 971 * @param outfile The file to write to. 973 972 * @param size The size of the file in the input stream. … … 1031 1030 { 1032 1031 /*@ buffers ***************************************************** */ 1033 char *tmp = NULL;1034 1032 char *datablock; 1035 1033 char *temp_fname; 1036 1034 char *temp_cksum; 1037 1035 char *actual_cksum = NULL; 1038 // char *pA, *pB;1039 1036 1040 1037 /*@ int ********************************************************* */ … … 1078 1075 } 1079 1076 if (orig_size != temp_size && orig_size != -1) { 1080 mr_asprintf(tmp, "output file's size should be %ld K but is apparently %ld K", (long) size >> 10, (long) temp_size >> 10); 1081 log_to_screen(tmp); 1082 mr_free(tmp); 1077 log_to_screen("output file's size should be %ld K but is apparently %ld K", (long) size >> 10, (long) temp_size >> 10); 1083 1078 } 1084 1079 if (ctrl_chr != BLK_START_FILE) { … … 1151 1146 } 1152 1147 if (strcmp(temp_cksum, actual_cksum)) { 1153 mr_asprintf(tmp, "actual cksum=%s; recorded cksum=%s", actual_cksum, 1154 temp_cksum); 1155 log_to_screen(tmp); 1156 mr_free(tmp); 1157 1158 mr_asprintf(tmp, "%s (%ld K) is corrupt on tape", temp_fname, 1159 (long) orig_size >> 10); 1160 log_to_screen(tmp); 1161 mr_free(tmp); 1162 1148 log_to_screen("actual cksum=%s; recorded cksum=%s", actual_cksum, temp_cksum); 1149 log_to_screen("%s (%ld K) is corrupt on tape", temp_fname, (long) orig_size >> 10); 1163 1150 retval++; 1164 1151 } … … 1204 1191 g_tape_posK += fread(tempblock, 1, (size_t) TAPE_BLOCK_SIZE, g_tape_stream) / 1024; 1205 1192 } 1206 /* memcpy((char*)plength_of_incoming_file,(char*)tempblock+7001,sizeof(long long)); */1207 /* for(*plen=0,i=7;i>=0;i--) {*plen<<=8; *plen |= tempblock[7001+i];} */1208 1193 memcpy((char *) plen, tempblock + 7001, sizeof(long long)); 1209 1194 if (strcmp(tempblock + 6000 + *pcontrol_char, STR_HEADER)) { … … 1211 1196 } 1212 1197 strcpy(filename, tempblock + 1000); 1213 /* strcpy(cksum,tempblock+5555);*/1214 /* log_it( "%s (reading) fname=%s, filesize=%ld K",1215 marker_to_string (*pcontrol_char), filename,1216 (long) ((*plen) >> 10));1217 */1218 1198 if (*pcontrol_char == BLK_ABORTED_BACKUP) { 1219 1199 log_to_screen("I can't verify an aborted backup."); … … 1363 1343 while (ctrl_chr != BLK_START_FILE) { 1364 1344 res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr); 1345 if (res) { 1346 //FIXME 1347 } 1365 1348 if (ctrl_chr == BLK_START_FILE) { 1366 1349 break; … … 1383 1366 } 1384 1367 while (strcmp(pA, pB)) { 1385 log_msg(6, "Skipping %s (it's not %s)", temp_fname, 1386 the_file_I_was_reading); 1368 log_msg(6, "Skipping %s (it's not %s)", temp_fname, the_file_I_was_reading); 1387 1369 for (size = temp_size; size > 0; size -= bytes_to_write) { 1388 1370 bytes_to_write = … … 1421 1403 } 1422 1404 } 1423 log_msg(2, "Reading %s (it matches %s)", temp_fname, 1424 the_file_I_was_reading); 1405 log_msg(2, "Reading %s (it matches %s)", temp_fname, the_file_I_was_reading); 1425 1406 paranoid_free(temp_fname); 1426 1407 paranoid_free(datablock); … … 1444 1425 /*@ end vars *************************************************** */ 1445 1426 1427 if (bkpinfo->media_device == NULL) { 1428 log_it("Unable to open in from NULL device"); 1429 return (1); 1430 } 1431 1446 1432 paranoid_pclose(g_tape_stream); 1447 1433 sync(); … … 1451 1437 insist_on_this_tape_number(g_current_media_number + 1); // will increment it, too 1452 1438 log_it("Opening IN the next tape"); 1453 if (! 1454 (g_tape_stream = 1455 open_device_via_buffer(bkpinfo->media_device, 'r', 1456 bkpinfo->internal_tape_block_size))) { 1439 if (!(g_tape_stream = open_device_via_buffer(bkpinfo->media_device, 'r', bkpinfo->internal_tape_block_size))) { 1457 1440 log_OS_error(g_tape_fifo); 1458 1441 log_to_screen("Cannot openin stream device"); … … 1487 1470 char *command = NULL; 1488 1471 1472 if (bkpinfo->media_device == NULL) { 1473 log_it("Unable to open out from NULL device"); 1474 return (1); 1475 } 1476 1489 1477 paranoid_pclose(g_tape_stream); 1490 paranoid_system("sync");1491 paranoid_system("sync");1492 paranoid_system("sync");1478 sync(); 1479 sync(); 1480 sync(); 1493 1481 log_it("New tape requested."); 1494 1482 insist_on_this_tape_number(g_current_media_number + 1); // will increment g_current_media, too 1495 1483 if (bkpinfo->backup_media_type == cdstream) { 1496 mr_asprintf(command, 1497 "cdrecord -eject dev=%s speed=%d fs=24m -waiti - >> %s 2>> %s", 1498 bkpinfo->media_device, bkpinfo->cdrw_speed, MONDO_LOGFILE, 1499 MONDO_LOGFILE); 1484 mr_asprintf(command, "cdrecord -eject dev=%s speed=%d fs=24m -waiti - >> %s 2>> %s", bkpinfo->media_device, bkpinfo->cdrw_speed, MONDO_LOGFILE, MONDO_LOGFILE); 1500 1485 log_it("Opening OUT to next CD with the command"); 1501 1486 log_it(command); … … 1510 1495 } else { 1511 1496 log_it("Opening OUT to next tape"); 1512 if (! 1513 (g_tape_stream = 1514 open_device_via_buffer(bkpinfo->media_device, 'w', 1515 bkpinfo->internal_tape_block_size))) { 1497 if (!(g_tape_stream = open_device_via_buffer(bkpinfo->media_device, 'w', bkpinfo->internal_tape_block_size))) { 1516 1498 log_OS_error(g_tape_fifo); 1517 1499 log_to_screen("Cannot openin stream device"); … … 1584 1566 /*@ pointers *************************************************** */ 1585 1567 FILE *fin; 1586 char *tmp = NULL;1587 1568 1588 1569 /*@ long ******************************************************* */ … … 1602 1583 log_it("Data disks = %s", fname); 1603 1584 if (!does_file_exist(fname)) { 1604 mr_asprintf(tmp, "Cannot find %s", fname); 1605 log_to_screen(tmp); 1606 mr_free(tmp); 1585 log_to_screen("Cannot find %s", fname); 1607 1586 return (1); 1608 1587 } … … 1647 1626 { 1648 1627 /*@ buffers **************************************************** */ 1649 char *tmp = NULL;1650 1628 char datablock[TAPE_BLOCK_SIZE]; 1651 1629 char *checksum = NULL; … … 1700 1678 p++; 1701 1679 } 1702 mr_asprintf(tmp, "Writing file '%s' to tape (%ld KB)", p, 1703 (long) filesize >> 10); 1704 log_it(tmp); 1705 mr_free(tmp); 1680 log_it("Writing file '%s' to tape (%ld KB)", p, (long) filesize >> 10); 1706 1681 write_header_block_to_stream(filesize, infile_basename, 1707 1682 BLK_START_FILE); … … 1775 1750 /*@ buffers **************************************************** */ 1776 1751 char tempblock[TAPE_BLOCK_SIZE]; 1777 char *tmp = NULL;1778 1752 char *p; 1779 1753 … … 1794 1768 } 1795 1769 if (!g_tape_stream) { 1796 log_to_screen 1797 ("You're not backing up to tape. Why write a tape header?"); 1770 log_to_screen("You're not backing up to tape. Why write a tape header?"); 1798 1771 return (1); 1799 1772 } … … 1805 1778 memcpy(tempblock + 7001, (char *) &olen, sizeof(off_t)); 1806 1779 strcpy(tempblock + 1000, filename); 1807 g_tape_posK += 1808 fwrite(tempblock, 1, (size_t) TAPE_BLOCK_SIZE, 1809 g_tape_stream) / 1024; 1810 mr_asprintf(tmp, "%s (fname=%s, size=%ld K)", 1811 marker_to_string(control_char), p, 1812 (long) length_of_incoming_file >> 10); 1813 log_msg(6, tmp); 1814 mr_free(tmp); 1780 g_tape_posK += fwrite(tempblock, 1, (size_t) TAPE_BLOCK_SIZE, g_tape_stream) / 1024; 1781 log_msg(6, "%s (fname=%s, size=%ld K)", marker_to_string(control_char), p, (long) length_of_incoming_file >> 10); 1815 1782 return (0); 1816 1783 } … … 1832 1799 void wrong_marker(int should_be, int it_is) 1833 1800 { 1834 /*@ buffer ***************************************************** */ 1835 char *tmp = NULL; 1836 1837 1838 /*@ end vars *************************************************** */ 1839 mr_asprintf(tmp, "Wrong marker! (Should be %s, is actually %s)", marker_to_string(should_be), marker_to_string(it_is)); 1840 log_to_screen(tmp); 1841 mr_free(tmp); 1801 log_to_screen("Wrong marker! (Should be %s, is actually %s)", marker_to_string(should_be), marker_to_string(it_is)); 1842 1802 } 1843 1803
Note:
See TracChangeset
for help on using the changeset viewer.