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