Ignore:
Timestamp:
Sep 25, 2013, 8:55:45 AM (11 years ago)
Author:
Bruno Cornec
Message:
  • Lots of memory management backports from 3.1 to 3.2 - still not finished, nor working ATM. the common subdir was done during travel, so this is essentially a backup !
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3.2/mondo/src/common/libmondo-stream.c

    r3185 r3191  
    138138    }
    139139    sleep(1);
    140     paranoid_system("sync");
     140    sync();
    141141    sleep(1);
    142142    paranoid_pclose(g_tape_stream);
    143143    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 */
    150144    if (!bkpinfo->please_dont_eject) {
    151145        eject_device(bkpinfo->media_device);
     
    183177
    184178    sleep(1);
    185     paranoid_system("sync");
     179    sync();
    186180    sleep(1);
    187181    log_it("closeout_tape() -- entering");
     
    228222               g_tapecatalog->el[i].tape_posK);
    229223    }
    230     //  if (!bkpinfo->please_dont_eject)
    231     //    { eject_device(bkpinfo->media_device); }
    232224    paranoid_free(blk);
    233225    paranoid_free(g_tapecatalog);
     
    266258    char tmp[MAX_STR_LEN];
    267259    char *command = NULL;
    268     char cdr_exe[MAX_STR_LEN];
     260    char *cdr_exe = NULL;
    269261    int res;
    270262
     
    272264    dev[0] = siz[0] = '\0';
    273265    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));
    281272    mr_free(command);
    282273
    283274    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...");
    286276        strcpy(dev, VANILLA_SCSI_TAPE);
     277        mr_free(tmp);
     278        mr_free(cdr_exe);
    287279        return 1;
    288280    }
    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));
     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));
    293285    mr_free(command);
    294286
    295287    if (strlen(tmp) < 2) {
    296288        log_it("Could not find tape device");
     289        mr_free(cdr_exe);
     290        mr_free(tmp);
    297291        return 1;
    298292    }
    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));
    303297    mr_free(command);
    304298
     
    306300    dev[strlen(dev) - 1] = '\0';
    307301    strcat(dev, tmp);           // e.g. '/dev/st0' becomes '/dev/stN'
     302    mr_free(tmp);
     303
    308304    res = 0;
    309305    if (!mt_says_tape_exists(dev)) {
     
    324320    }
    325321
    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;};};};'"));
    332329
    333330    if (mt_says_tape_exists(dev)) {
     
    335332    } else {
    336333        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);
    338336        sprintf(dev, "/dev/os%s", tmp);
    339337        log_it("...into %s", dev);
     
    355353        siz[0] = '\0';
    356354        log_it("Warning - size of tape unknown");
    357         return (0);
    358355    } else {
    359356        strcpy(siz, tmp);
    360         return (0);
    361     }
    362 }
    363 
    364 
    365 
    366 
     357    }
     358    mr_free(tmp);
     359    return (0);
     360}
    367361
    368362
     
    479473    log_it("Insisting on tape #%d", tapeno);
    480474    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);
    484476        popup_and_OK(tmp);
    485477        mr_free(tmp);
     
    614606    int res;
    615607
     608    if (bkpinfo->media_device == NULL) {
     609        return(1);
     610    }
     611
    616612    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.");
    619614        return (0);
    620615    }
     
    687682    int res = 0;
    688683
     684    if (bkpinfo->media_device == NULL) {
     685        return(1);
     686    }
     687
    689688    log_it("Skipping OBDR headers");
    690689    mr_asprintf(command, "mt -f %s rewind",bkpinfo->media_device);
     
    712711    char *command = NULL;
    713712    int res = 0;
     713
     714    if (bkpinfo->media_device == NULL) {
     715        return(1);
     716    }
    714717
    715718    log_it("Creating OBDR headers");
     
    780783    /*@ end vars *************************************************** */
    781784
    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));
    786786    g_tapecatalog->entries = 0;
    787787    g_tape_posK = 0;
     
    800800        if (bkpinfo->media_device == NULL) {
    801801            log_it("Not able to skip OBDR - Restore will have to be done manually");
     802            return (1);
    802803        }
    803804        set_tape_block_size_with_mt(bkpinfo->internal_tape_block_size);
     
    808809    make_hole_for_file(outfname);
    809810
    810 //  start_buffer_process( bkpinfo->media_device, g_tape_fifo, FALSE);
    811811    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))) {
    816813        log_OS_error(g_tape_fifo);
    817814        log_to_screen("Cannot openin stream device");
     
    821818    log_to_screen("Reading stream");
    822819    log_it("stream device = '%s'", bkpinfo->media_device);
    823 /* skip data disks */
     820    /* skip data disks */
    824821    open_evalcall_form("Skipping data disks on stream");
    825822    log_to_screen("Skipping data disks on stream");
     
    874871        // FIXME
    875872    }
    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);
    878874    paranoid_system(tmp);
    879875    mr_free(tmp);
     
    903899    /*@ end vars *************************************************** */
    904900
     901    if (cddev == NULL) {
     902        log_to_screen("Failed to openout NULL cddev");
     903        return (1);
     904    }
    905905    /*  add 'dummy' if testing */
    906906    mr_asprintf(command, "cdrecord -eject dev=%s speed=%d fs=24m -waiti - >> %s 2>> %s", cddev, speed, MONDO_LOGFILE, MONDO_LOGFILE);
     
    942942    return (0);
    943943}
    944 if (!(g_tapecatalog = malloc(sizeof(struct s_tapecatalog)))) {
    945     fatal_error("Cannot alloc mem for tape catalog");
    946 }
     944if (bkpinfo->media_device == NULL) {
     945    log_it("Unable to openout NULL device");
     946    return(1);
     947}
     948g_tapecatalog = mr_malloc(sizeof(struct s_tapecatalog));
    947949g_tapecatalog->entries = 0;
    948950g_tape_posK = 0;
     
    954956}
    955957log_it("Opening OUT tape");
    956 if (!
    957     (g_tape_stream =
    958      open_device_via_buffer(bkpinfo->media_device, 'w', bkpinfo->internal_tape_block_size))) {
     958if (!(g_tape_stream = open_device_via_buffer(bkpinfo->media_device, 'w', bkpinfo->internal_tape_block_size))) {
    959959    log_OS_error(g_tape_fifo);
    960960    log_to_screen("Cannot openin stream device");
     
    969969/**
    970970 * 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.
    972971 * @param outfile The file to write to.
    973972 * @param size The size of the file in the input stream.
     
    10311030{
    10321031    /*@ buffers ***************************************************** */
    1033     char *tmp = NULL;
    10341032    char *datablock;
    10351033    char *temp_fname;
    10361034    char *temp_cksum;
    10371035    char *actual_cksum = NULL;
    1038 //  char *pA, *pB;
    10391036
    10401037    /*@ int ********************************************************* */
     
    10781075    }
    10791076    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);
    10831078    }
    10841079    if (ctrl_chr != BLK_START_FILE) {
     
    11511146    }
    11521147    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);
    11631150        retval++;
    11641151    }
     
    12041191        g_tape_posK += fread(tempblock, 1, (size_t) TAPE_BLOCK_SIZE, g_tape_stream) / 1024;
    12051192    }
    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];} */
    12081193    memcpy((char *) plen, tempblock + 7001, sizeof(long long));
    12091194    if (strcmp(tempblock + 6000 + *pcontrol_char, STR_HEADER)) {
     
    12111196    }
    12121197    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 */
    12181198    if (*pcontrol_char == BLK_ABORTED_BACKUP) {
    12191199        log_to_screen("I can't verify an aborted backup.");
     
    13631343    while (ctrl_chr != BLK_START_FILE) {
    13641344        res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1345        if (res) {
     1346            //FIXME
     1347        }
    13651348        if (ctrl_chr == BLK_START_FILE) {
    13661349            break;
     
    13831366    }
    13841367    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);
    13871369        for (size = temp_size; size > 0; size -= bytes_to_write) {
    13881370            bytes_to_write =
     
    14211403        }
    14221404    }
    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);
    14251406    paranoid_free(temp_fname);
    14261407    paranoid_free(datablock);
     
    14441425    /*@ end vars *************************************************** */
    14451426
     1427    if (bkpinfo->media_device == NULL) {
     1428        log_it("Unable to open in from NULL device");
     1429        return (1);
     1430    }
     1431
    14461432    paranoid_pclose(g_tape_stream);
    14471433    sync();
     
    14511437    insist_on_this_tape_number(g_current_media_number + 1); // will increment it, too
    14521438    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))) {
    14571440        log_OS_error(g_tape_fifo);
    14581441        log_to_screen("Cannot openin stream device");
     
    14871470    char *command = NULL;
    14881471
     1472    if (bkpinfo->media_device == NULL) {
     1473        log_it("Unable to open out from NULL device");
     1474        return (1);
     1475    }
     1476
    14891477    paranoid_pclose(g_tape_stream);
    1490     paranoid_system("sync");
    1491     paranoid_system("sync");
    1492     paranoid_system("sync");
     1478    sync();
     1479    sync();
     1480    sync();
    14931481    log_it("New tape requested.");
    14941482    insist_on_this_tape_number(g_current_media_number + 1); // will increment g_current_media, too
    14951483    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);
    15001485        log_it("Opening OUT to next CD with the command");
    15011486        log_it(command);
     
    15101495    } else {
    15111496        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))) {
    15161498            log_OS_error(g_tape_fifo);
    15171499            log_to_screen("Cannot openin stream device");
     
    15841566    /*@ pointers *************************************************** */
    15851567    FILE *fin;
    1586     char *tmp = NULL;
    15871568
    15881569    /*@ long ******************************************************* */
     
    16021583    log_it("Data disks = %s", fname);
    16031584    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);
    16071586        return (1);
    16081587    }
     
    16471626{
    16481627    /*@ buffers **************************************************** */
    1649     char *tmp = NULL;
    16501628    char datablock[TAPE_BLOCK_SIZE];
    16511629    char *checksum = NULL;
     
    17001678        p++;
    17011679    }
    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);
    17061681    write_header_block_to_stream(filesize, infile_basename,
    17071682                                 BLK_START_FILE);
     
    17751750    /*@ buffers **************************************************** */
    17761751    char tempblock[TAPE_BLOCK_SIZE];
    1777     char *tmp = NULL;
    17781752    char *p;
    17791753
     
    17941768    }
    17951769    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?");
    17981771        return (1);
    17991772    }
     
    18051778    memcpy(tempblock + 7001, (char *) &olen, sizeof(off_t));
    18061779    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);
    18151782    return (0);
    18161783}
     
    18321799void wrong_marker(int should_be, int it_is)
    18331800{
    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));
    18421802}
    18431803
Note: See TracChangeset for help on using the changeset viewer.