Changeset 3147 in MondoRescue for branches/3.1/mondo/src/common


Ignore:
Timestamp:
Jun 19, 2013, 8:34:46 AM (11 years ago)
Author:
Bruno Cornec
Message:
  • First pass on svn merge -r 2935:3146 ../3.0
Location:
branches/3.1/mondo/src/common
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • branches/3.1/mondo/src/common/libmondo-archive.c

    r2937 r3147  
    213213    paranoid_free(tmp);
    214214
    215     mr_asprintf(command, "star H=exustar list=%s -c " STAR_ACL_SZ " file=%s", filelist, fname);
     215    mr_asprintf(command, "star H=exustar list=%s -c -sparse " STAR_ACL_SZ " file=%s", filelist, fname);
    216216    if (bkpinfo->use_lzo) {
    217217        mr_free(command);
     
    511511    char *use_star_sz = NULL;
    512512    char *bootldr_str = NULL;
     513    char *bootldr_ver = NULL;
    513514    char *tape_device = NULL;
    514515    char *broken_bios_sz = NULL;
     
    682683            run_program_and_log_output("ln -sf /boot/grub/grub.conf /boot/grub/menu.lst", 5);
    683684        }
    684         if ((!does_file_exist("/boot/grub/menu.lst")) && (!does_file_exist("/boot/grub/grub.cfg"))) {
    685             fatal_error("The de facto standard location for your boot loader's config file is /boot/grub/menu.lst or /boot/grub/grub.cfg but I cannot find it there. What is wrong with your Linux distribution?");
    686         }
     685        if ((!does_file_exist("/boot/grub/menu.lst")) && (!does_file_exist("/boot/grub/grub.cfg")) && (!does_file_exist("/boot/grub2/grub.cfg"))) {
     686            fatal_error("The de facto standard location for your boot loader's config file is /boot/grub/menu.lst, /boot/grub/grub.cfg, or /boot/grub2/grub.cfg but I cannot find it there. What is wrong with your Linux distribution?");
     687        }
     688        mr_asprintf(&bootldr_ver, "%s", call_program_and_get_last_line_of_output("grub --version"));
    687689    } else if (bkpinfo->boot_loader == 'E') {
    688690        mr_asprintf(bootldr_str, "ELILO");
     
    719721    }
    720722    log_to_screen("Your boot loader is %s and it boots from %s", bootldr_str, bkpinfo->boot_device);
     723    if (bootldr_ver != NULL) {
     724        mr_asprintf(&tmp, "Boot loader version string: %s", bootldr_ver);
     725        log_to_screen(tmp);
     726        mr_free(tmp);
     727    }
    721728
    722729    mr_asprintf(tmp, "%s/BOOTLOADER.DEVICE", bkpinfo->tmpdir);
     
    927934    char *curr_acl_list_fname = NULL;
    928935
    929     struct s_bkpinfo *bkpinfo_bis;
    930936    char *tmp = NULL;
    931937    int res = 0, retval = 0;
     
    940946    p_next_set_to_archive = (int *) (inbuf + 8);
    941947    p_list_of_fileset_flags = (char *) (inbuf + 12);
    942     bkpinfo_bis = (struct s_bkpinfo *) (inbuf + BKPINFO_LOC_OFFSET);
    943948
    944949    mr_asprintf(archiving_filelist_fname, FILELIST_FNAME_RAW_SZ, bkpinfo->tmpdir, 0L);
     
    14741479
    14751480    log_msg(2, "make_usb_fs --- scratchdir=%s", bkpinfo->scratchdir);
    1476     (void) getcwd(old_pwd, MAX_STR_LEN - 1);
     1481    tmp1 = getcwd(old_pwd, MAX_STR_LEN - 1);
    14771482    mr_asprintf(tmp, "chmod 700 %s", bkpinfo->scratchdir);
    14781483    run_program_and_log_output(tmp, FALSE);
    14791484    mr_free(tmp);
    1480     (void)chdir(bkpinfo->scratchdir);
     1485    if (chdir(bkpinfo->scratchdir)) {
     1486        // FIXME
     1487    }
    14811488
    14821489    mds = media_descriptor_string(bkpinfo->backup_media_type);
     
    15421549    }
    15431550
    1544     (void)chdir(old_pwd);
     1551    if (chdir(old_pwd)) {
     1552        // FIXME
     1553    }
    15451554    if (retval) {
    15461555        log_msg(1, "WARNING - make_usb_fs returned an error");
     
    15991608
    16001609    log_msg(2, "make_iso_fs --- scratchdir=%s --- destfile=%s", bkpinfo->scratchdir, destfile);
    1601     (void) getcwd(old_pwd, MAX_STR_LEN - 1);
     1610    tmp2 = getcwd(old_pwd, MAX_STR_LEN - 1);
    16021611    mr_asprintf(tmp, "chmod 700 %s", bkpinfo->scratchdir);
    16031612    run_program_and_log_output(tmp, FALSE);
    16041613    mr_free(tmp);
    16051614
    1606     chdir(bkpinfo->scratchdir);
     1615    if (chdir(bkpinfo->scratchdir)) {
     1616        // FIXME
     1617    }
    16071618
    16081619    if (bkpinfo->call_before_iso) {
     
    18131824    }
    18141825
    1815     chdir(old_pwd);
     1826    if (chdir(old_pwd)) {
     1827        // FIXME
     1828    }
    18161829    if (retval) {
    18171830        log_msg(1, "WARNING - make_iso_fs returned an error");
     
    18661879    /*@ pointers ******************************************* */
    18671880    FILE *fin = NULL;
     1881    char *q;
    18681882
    18691883    /*@ buffers ******************************************** */
     
    24112425    /*@ long long ****************************************************** */
    24122426    off_t length_of_incoming_file = (off_t)0;
    2413     t_archtype type;
    24142427    va_list ap;
    24152428
     
    24332446        write_header_block_to_stream(length_of_incoming_file, curr_file,
    24342447                                     start_chr);
    2435         if (strstr(curr_file, ".afio.") || strstr(curr_file, ".star.")) {
    2436             type = fileset;
    2437         } else if (strstr(curr_file, "slice")) {
    2438             type = biggieslice;
    2439         } else {
    2440             type = other;
    2441         }
    24422448        res = write_file_to_stream_from_file(curr_file);
    24432449        retval += res;
     
    27982804    mr_free(tmp);
    27992805
    2800     (void) fwrite((void *) &biggiestruct, 1, sizeof(biggiestruct), fout);
    2801     fclose(fout);
    2802 
     2806    res = fwrite((void *) &biggiestruct, 1, sizeof(biggiestruct), fout);
     2807    if (fout != NULL) {
     2808        paranoid_fclose(fout);
     2809    }
    28032810    log_msg(1, "Opening in %s; slicing it and writing to CD/tape", file_to_openin);
    28042811    if (!(fin = fopen(file_to_openin, "r"))) {
     
    28392846                if (blksize > 0) {
    28402847                    totalread = totalread + blksize;
    2841                     (void) fwrite(tempblock, 1, blksize, fout);
     2848                    res = fwrite(tempblock, 1, blksize, fout);
    28422849                } else {
    28432850                    break;
     
    31313138            log_to_screen("Please reboot from the 1st %s in Compare Mode, as a precaution.", mds);
    31323139            mr_free(mds);
    3133             chdir("/");
     3140            if (chdir("/")) {
     3141                // FIXME
     3142            }
    31343143            log_it("Before calling verification of image()");
    31353144            if (bkpinfo->backup_media_type == usb) {
     
    32093218    assert(bkpinfo != NULL);
    32103219    if (IS_THIS_A_STREAMING_BACKUP(bkpinfo->backup_media_type)) {
    3211         chdir("/");
     3220        if (chdir("/")) {
     3221            // FIXME
     3222        }
    32123223        mvaddstr_and_log_it(g_currentY, 0,
    32133224                            "Verifying archives against live filesystem");
     
    32323243            bkpinfo->media_device = find_cdrom_device(FALSE);   // replace 0,0,0 with /dev/cdrom
    32333244        }
    3234         chdir("/");
     3245        if (chdir("/")) {
     3246            // FIXME
     3247        }
    32353248        for (cdno = 1; cdno < 99 && bkpinfo->verify_data; cdno++) {
    32363249            if (cdno != g_current_media_number) {
     
    32533266        }
    32543267        mr_asprintf(tmp, "grep 'afio: ' %s | sed 's/afio: //' | grep -vE '^/dev/.*$' >> %s/changed.files", MONDO_LOGFILE, MONDO_CACHE);
    3255         (void)system(tmp);
     3268        res = system(tmp);
    32563269        mr_free(tmp);
    32573270
    32583271        mr_asprintf(tmp, "grep 'star: ' %s | sed 's/star: //' | grep -vE '^/dev/.*$' >> %s/changed.files", MONDO_LOGFILE, MONDO_CACHE);
    3259         (void)system(tmp);
     3272        res = system(tmp);
    32603273        mr_free(tmp);
    32613274        run_program_and_log_output("umount " MNT_CDROM, FALSE);
  • branches/3.1/mondo/src/common/libmondo-cli.c

    r2937 r3147  
    2020extern int g_loglevel;
    2121extern bool g_text_mode;
     22extern bool g_fail_immediately;
    2223extern char g_startdir[MAX_STR_LEN];    ///< ????? @bug ?????
    2324extern char *MONDO_OPTIONS;
     
    5354
    5455extern void free_MR_global_filenames(void);
     56
     57long g_max_biggie_size = BIGGIEMAXSIZE;
    5558
    5659/**
     
    101104    mr_free(tmp);
    102105
     106    /*  Before erasing dirs go into a safe place */
     107    if (chdir("/tmp")) {
     108        // FIXME
     109    }
     110    mr_asprintf(tmp, "rm -Rf %s/tmp.mondo.*", bkpinfo->tmpdir);
     111    paranoid_system(tmp);
     112    mr_free(tmp);
     113
    103114    mr_asprintf(tmp, "mkdir -p %s", bkpinfo->scratchdir);
    104115    paranoid_system(tmp);
     
    162173    int i = 0;
    163174    int retval = 0;
    164     int percent = 0;
    165     int lastpos = 0;
    166175
    167176    /*@ buffers ** */
     
    355364        mr_free(p);
    356365        log_to_screen("You didn't specify a tape streamer device. I'm assuming %s", flag_val['d']);
    357         percent = 0;
    358366    }
    359367
     
    498506                if (strstr(bkpinfo->netfs_proto, "sshfs")) {
    499507                    mr_asprintf(tmp1, "sshfs %s@%s", bkpinfo->netfs_user, bkpinfo->netfs_mount);
     508                } else if (strstr(bkpinfo->netfs_proto, "smbfs")) {
     509                    sprintf(tmp, "mount -t cifs %s -o user=%s", bkpinfo->netfs_mount, bkpinfo->netfs_user);
    500510                } else if (strstr(bkpinfo->netfs_proto, "nfs")) {
    501511                    mr_asprintf(tmp1, "mount %s@%s", bkpinfo->netfs_user, bkpinfo->netfs_mount);
     
    507517                if (strstr(bkpinfo->netfs_proto, "sshfs")) {
    508518                    mr_asprintf(tmp1, "sshfs %s", bkpinfo->netfs_mount);
     519                } else if (strstr(bkpinfo->netfs_proto, "smbfs")) {
     520                    sprintf(tmp, "mount -t cifs %s", bkpinfo->netfs_mount);
    509521                } else if (strstr(bkpinfo->netfs_proto, "nfs")) {
    510522                    mr_asprintf(tmp1, "mount %s", bkpinfo->netfs_mount);
     
    629641        }
    630642        mr_free(tmp1);
    631         lastpos = 0;
    632643
    633644        mr_make_devlist_from_pathlist(flag_val['E'], 'E');
     
    637648    if (flag_set['e']) {
    638649        bkpinfo->please_dont_eject = TRUE;
     650    }
     651
     652    if (flag_set['M']) {
     653        g_max_biggie_size = atol(flag_val['M']);
     654        log_msg(1, "Max size for biggie file is now %ld KB", g_max_biggie_size);
    639655    }
    640656
     
    778794        /* Before changing remove old ones if any */
    779795        if (bkpinfo->scratchdir) {
    780             chdir("/tmp");
     796            if (chdir("/tmp")) {
     797                // FIXME
     798            }
    781799            mr_asprintf(tmp1, "rm -Rf %s", bkpinfo->scratchdir);
    782800            paranoid_system(tmp1);
     
    859877            log_to_screen("Please install LZOP. You can't use '-L' until you do.\n");
    860878        }
     879    }
     880
     881    if (flag_set['F']) {
     882        log_msg(3, "-F means we will fail immediately at the first interaction request");
     883        g_fail_immediately = TRUE;
    861884    }
    862885
  • branches/3.1/mondo/src/common/libmondo-devices.c

    r2937 r3147  
    331331    char *searchstr = NULL;
    332332    char *tmp = NULL;
     333    char *p;
    333334
    334335    /*@ ints ******************************************************* */
     
    816817    }
    817818
    818     mr_asprintf(command, "%s -scanbus | grep \"[0-9],[0-9],[0-9]\" | grep \"[D|C][V|D]\" | grep -n \"\" | grep \"%s\" | cut -d':' -f2", cdr_exe, g_cdrw_drive_is_here);
     819    mr_asprintf(command, "%s -scanbus | grep \"[0-9],[0-9],[0-9]\" | grep -E \"[D|C][V|D]\" | grep -n \"\" | grep \"%s\" | cut -d':' -f2", cdr_exe, g_cdrw_drive_is_here);
    819820    mr_free(cdr_exe);
    820821
     
    848849    }
    849850
    850     tmp = call_program_and_get_last_line_of_output("dvdrecord -scanbus 2> /dev/null | grep \") '\" | grep -n \"\" | grep -E '[D|C][V|D]' | cut -d':' -f1",TRUE);
     851    tmp = call_program_and_get_last_line_of_output("dvdrecord -scanbus 2> /dev/null | grep -E '\)\ \'' | grep -n '' | grep -E '[D|C][V|D]' | cut -d':' -f1",TRUE);
    851852    log_msg(5, "tmp = '%s'", tmp);
    852853    if (!tmp[0])
    853854        mr_free(tmp);
    854         tmp = call_program_and_get_last_line_of_output("cdrecord -scanbus 2> /dev/null | grep \") '\" | grep -n \"\" | grep -E '[D|C][V|D]' | cut -d':' -f1",TRUE);
     855        tmp = call_program_and_get_last_line_of_output("cdrecord -scanbus 2> /dev/null | grep \)\ \' | grep -n '' | grep -E '[D|C][V|D]' | cut -d':' -f1",TRUE);
    855856    if (tmp[0]) {
    856857        devno = atoi(tmp) - 1;
     
    886887#if linux
    887888    unsigned long long s = 0;
    888     int fileid, cylinders = 0, cylindersleft = 0;
     889    int fileid, cylinders = 0;
    889890    int cylindersize = 0;
    890891    int gotgeo = 0;
     
    935936            if (ioctl(fileid, HDIO_GETGEO, &hdgeo) != -1) {
    936937                if (hdgeo.cylinders && hdgeo.heads && hdgeo.sectors) {
    937                     cylindersleft = cylinders = hdgeo.cylinders;
    938938                    cylindersize = hdgeo.heads * hdgeo.sectors / 2;
    939939                    outvalA = cylindersize * cylinders / 1024;
     
    983983    char *command = NULL;
    984984    char *format_sz = NULL;
     985    char *p;
    985986
    986987    FILE *pin;
     
    18221823
    18231824        /* Check for LVM */
    1824         mr_asprintf(command, "pvdisplay -c %s | grep '%s:' 2> /dev/null", partitions[i], partitions[i]);
     1825        mr_asprintf(command, "pvdisplay -c %s 2> /dev/null", partitions[i]);
    18251826        log_msg(5, "  Running: %s", command);
    18261827        tmp = call_program_and_get_last_line_of_output(command,TRUE);
     
    26382639    char *p = NULL;
    26392640    char *q = NULL;
     2641    char *tmpro = NULL;
     2642    char *tmp1 = NULL;
    26402643    char *mds = NULL;
    26412644    char *sz_size = NULL;
     
    28732876            bkpinfo->media_size[i] = bkpinfo->media_size[0];
    28742877        }
     2878        bkpinfo->use_obdr = ask_me_yes_or_no
     2879            ("Do you want to activate OBDR support for your tapes ?");
     2880        if (bkpinfo->use_obdr) {
     2881            log_msg(4, "obdr mode = TRUE");
     2882        } else {
     2883            log_msg(4, "obdr mode = FALSE");
     2884        }
    28752885        if (archiving_to_media) {
    28762886            if ((compression_type = which_compression_type()) == NULL) {
     
    29682978        if (bkpinfo->disaster_recovery) {
    29692979            mr_asprintf(command ,"umount %s/isodir 2> /dev/null", bkpinfo->tmpdir);
    2970             (void)system(command);
     2980            paranoid_system(command);
    29712981            mr_free(command);
    29722982
    29732983        }
    2974         p = popup_and_get_string("Network protocol", "Which Network protocol should I use?", bkpinfo->netfs_proto);
     2984<<<<<<< .courant
     2985        p = popup_and_get_string("Network protocol", "Which Network protocol should I use (nfs/sshfs/smbfs) ?", bkpinfo->netfs_proto);
    29752986        if (p == NULL) {
    29762987            log_to_screen("User has chosen not to backup the PC");
     
    30163027
    30173028            if (bkpinfo->restore_data) {
     3029                /*  mount th FS read-only in restore mode to avoid any erase of whatever */
     3030                mr_asprintf(tmpro, "-o ro");
     3031            } else {
     3032                mr_asprintf(tmpro, "");
     3033            }
     3034
     3035            /*  Build the mount string */
     3036            if (strstr(bkpinfo->netfs_proto, "smbfs")) {
     3037                mr_asprintf(tmp, "mount -t cifs %s %s %s",bkpinfo->netfs_mount, bkpinfo->isodir,tmpro);
     3038                if (bkpinfo->netfs_user) {
     3039                    mr_strcat(tmp, " -o user=%s", bkpinfo->netfs_user);
     3040                }
     3041            else {
    30183042                if (strstr(bkpinfo->netfs_proto, "sshfs")) {
    3019                     mr_asprintf(tmp, "sshfs -o ro");
     3043                    mr_asprintf(tmp, "sshfs %s ",tmpro);
    30203044                } else {
    3021                     mr_asprintf(tmp, "mount -t %s -o nolock,ro", bkpinfo->netfs_proto);
     3045                    mr_asprintf(tmp, "mount -t %s -o nolock %s ", bkpinfo->netfs_proto,tmpro);
    30223046                }
    3023             } else {
    3024                 if (strstr(bkpinfo->netfs_proto, "sshfs")) {
    3025                     mr_asprintf(tmp, "sshfs");
    3026                 } else {
    3027                     mr_asprintf(tmp, "mount -t %s -o nolock", bkpinfo->netfs_proto);
     3047                if (bkpinfo->netfs_user) {
     3048                    mr_strcat(tmp, "%s@", bkpinfo->netfs_user);
    30283049                }
    3029             }
    3030             if (bkpinfo->netfs_user) {
    3031                 mr_strcat(tmp, "%s@", bkpinfo->netfs_user);
    3032             }
    3033             mr_strcat(tmp, "%s %s", bkpinfo->netfs_mount, bkpinfo->isodir);
     3050                mr_strcat(tmp, "%s %s", bkpinfo->netfs_mount, bkpinfo->isodir);
     3051            }
    30343052            run_program_and_log_output(tmp, 3);
    30353053            mr_free(tmp);
     
    30373055            malloc_string(g_selfmounted_isodir);
    30383056            strcpy(g_selfmounted_isodir, bkpinfo->isodir);
     3057            }
    30393058        }
    30403059        if (!is_this_device_mounted(bkpinfo->netfs_mount)) {
     
    31933212        }
    31943213
    3195 
    31963214        p = popup_and_get_string("Exclude paths", "Please enter paths which you do NOT want to backup. Separate them with '|'. NB: /tmp and /proc are always excluded. :-) Just hit 'Enter' if you want to do a full system backup.", bkpinfo->exclude_paths);
    31973215        if (p == NULL) {
  • branches/3.1/mondo/src/common/libmondo-filelist.c

    r2937 r3147  
    3030
    3131extern char *MONDO_LOGFILE;
     32
     33extern long g_max_biggie_size;
    3234
    3335/* Reference to global bkpinfo */
     
    195197/*@ long ****************************************/
    196198    long lino = 0;
    197     long max_sane_size_for_a_file;
     199    // A big file has more than 64 MB of real content
    198200    long curr_set_size;
    199201    long noof_lines;
     
    221223    assert_string_is_neither_NULL_nor_zerolength(filelist);
    222224    assert(maxsetsizeK > 0);
    223 
    224     max_sane_size_for_a_file = 64L * 1024L;
    225 // max_sane_size_for_a_file = maxsetsizeK*2;
    226 //  if (max_sane_size_for_a_file > 32*1024)
    227 //    { max_sane_size_for_a_file = 32*1024; }
    228225
    229226    log_it("filelist=%s;", filelist);
     
    269266            siz = 0;
    270267        } else {
    271             siz = (long) (buf.st_size >> 10);
    272         }
    273         if (siz > max_sane_size_for_a_file) {
    274             log_msg(10, "Adding %s to big files\n", incoming);
     268            // blocks are 512 bytes long - cf man 2 stat - Pass to the previous unit (MB => kB e.g.)
     269            // use blocks instead of size to allow sparse file correct handling as much as possible
     270            siz = (long) ((buf.st_blocks*512) >> 10);
     271        }
     272        if (siz > g_max_biggie_size) {
     273            log_msg(10, "Adding %s to big files (size = %ld)\n", incoming, siz);
    275274            fprintf(fbig, "%s\n", incoming);
    276275        } else {
    277276            curr_set_size += siz;
    278             log_msg(10, "Adding %s to filelist %d\n", incoming, curr_set_no);
     277            log_msg(10, "Adding %s to filelist %d (size = %ld)\n", incoming, curr_set_no, siz);
    279278            fprintf(fout, "%s\n", incoming);
    280279            if (curr_set_size > maxsetsizeK) {
     
    400399    char *tmp = NULL;
    401400
     401    char *p;
     402
    402403    pattr = popen(syscall, "r");
    403404    if (!pattr) {
     
    431432    char *strtmp = NULL;
    432433    char *tmp = NULL;
     434    char *p = NULL;
    433435    int i;
    434436
     
    517519    int retval = 0;
    518520    int i;
    519     char *p, *q;
     521    char *p, *q, *r;
    520522    char *tmp = NULL;
    521523    FILE *pin, *pout, *faclin;
     
    13231325    char *skip_these = NULL;
    13241326    char *new_with_pipe;
    1325     char *strtmp;
    1326     char *token;
     1327    char *strtmp = NULL;
     1328    char *token = NULL;
    13271329    char *find_excludes = NULL;
    13281330    char *name_of_evalcall_form = NULL;
     
    13741376
    13751377        log_msg(5, "find command = %s", strtmp);
    1376         (void)system(strtmp);
     1378        paranoid_system(strtmp);
    13771379        mr_free(strtmp);
    13781380
     
    15101512    char *sz_filelist;
    15111513    char *exclude_paths = NULL;
    1512     int i;
    15131514    FILE *fout;
    15141515    char *command = NULL;
     
    15971598            fatal_error("Cannot openout to sz_filelist");
    15981599        }
    1599         i = 0;
    16001600        if ((!include_paths) || (strlen(include_paths) == 0)) {
    16011601            log_msg(1, "Including only '/' in %s", sz_filelist);
     
    16971697{
    16981698    /*@ int ******************************************************** */
    1699     int noof_chars;
    17001699    static int depth = 0;
    17011700    static char original_string[MAX_STR_LEN];
     
    17151714    assert(startnode != NULL);
    17161715    assert(string_to_find != NULL);
    1717 
    1718     noof_chars = strlen(string_to_find) + 1;    /* we include the '\0' */
    17191716
    17201717    log_msg(7, "starting --- str=%s", string_to_find);
  • branches/3.1/mondo/src/common/libmondo-files.c

    r2937 r3147  
    5151    /*@ pointers **************************************************** */
    5252    char *p = NULL;
     53    char *q;
    5354    FILE *fin;
    5455
     
    126127    char *command = NULL;
    127128    char *incoming = NULL;
     129    char *q;
    128130
    129131    /*@ long ******************************************************** */
     
    204206    char *tmp = NULL;
    205207    char *incoming = NULL;
     208    char *q;
    206209
    207210    /*@ int ********************************************************* */
     
    471474    char *output = NULL;
    472475    char *command = NULL;
     476    char *p = NULL;
    473477
    474478    /*@ pointers **************************************************** */
     
    540544    char *curr_cksum = NULL;
    541545    char *tmp = NULL;
     546    char *q;
    542547
    543548    /*@ long [long] ************************************************* */
     
    679684    /*@ buffers **************************************************** */
    680685    char *incoming = NULL;
     686    char *p = NULL;
    681687
    682688    /*@ end vars *************************************************** */
     
    743749    char *tmp = NULL;
    744750    char *command = NULL;
     751    char *comment;
    745752
    746753    /*@ long ******************************************************** */
     
    972979        return (1);
    973980    }
    974     fscanf(fin, "%s\n", contents);
     981    res = fscanf(fin, "%s\n", contents);
    975982    i = strlen(contents);
    976983    if (i > 0 && contents[i - 1] < 32) {
     
    978985    }
    979986    paranoid_fclose(fin);
     987    res = 0;
    980988    return (res);
    981989}
     
    10201028    if (res) {
    10211029        fatal_error("Failed to copy Mondo's stuff to scratchdir");
     1030    }
     1031
     1032    mr_asprintf(command, "cp -f %s/LAST-FILELIST-NUMBER %s", bkpinfo->tmpdir, bkpinfo->scratchdir);
     1033
     1034    if (run_program_and_log_output(command, FALSE)) {
     1035        fatal_error("Failed to copy LAST-FILELIST-NUMBER to scratchdir");
    10221036    }
    10231037
  • branches/3.1/mondo/src/common/libmondo-fork.c

    r2937 r3147  
    4242    char *newcall = NULL;
    4343    char *tmp = NULL;
     44    char *p;
    4445
    4546    /*@ pointers **************************************************** */
     
    258259    FILE *fin;
    259260    char *p;
     261    char *q;
    260262
    261263    /*@ end vars *************************************************** */
     
    300302    fin = fopen(tmp1, "r");
    301303    if (fin) {
    302         for (fgets(incoming, MAX_STR_LEN, fin); !feof(fin); fgets(incoming, MAX_STR_LEN, fin)) {
     304        for (q = fgets(incoming, MAX_STR_LEN, fin); !feof(fin) && (q != NULL); q = fgets(incoming, MAX_STR_LEN, fin)) {
    303305            p = incoming;
    304306            while (p && *p) {
     
    545547                log_msg(1, "bytes_read_in = %ld", bytes_read_in);
    546548
    547                 fwrite(tmp1, 1, bytes_read_in, ftmp);
    548                 fread(tmp1, 1, tmpcap, fin);
    549                 log_msg(0, "tmp1 = '%s'", tmp1);
    550                 fwrite(tmp1, 1, tmpcap, ftmp);
     549                if (fwrite(tmp, 1, bytes_read_in, ftmp)) {
     550                    fatal_error("Can't fwrite here");
     551                }
     552
     553                sprintf(tmp, "I am here - %lld", (long long)ftello(fin));
     554                if (fread(tmp, 1, tmpcap, fin)) {
     555                    fatal_error("Can't fread here");
     556                }
     557                log_msg(0, "tmp = '%s'", tmp);
     558                if (fwrite(tmp, 1, tmpcap, ftmp)) {
     559                    fatal_error("Can't fwrite there");
     560                }
    551561                fclose(ftmp);
    552562                mr_free(tmp1);
  • branches/3.1/mondo/src/common/libmondo-mountlist.c

    r2937 r3147  
    5050    int pos = 0, npos = 0;
    5151    int res = 0;
    52     int mountpoint_copies = 0;
    5352    int device_copies = 0;
    5453    int i = 0;
     
    112111            }
    113112            /* does partition /dev/adXsYZ exist more than once in the mountlist? */
    114             for (i = 0, mountpoint_copies = 0, device_copies = 0;
     113            for (i = 0, device_copies = 0;
    115114                 i < mountlist->entries; i++) {
    116115                if (!strcmp(device, mountlist->el[i].device)) {
     
    214213            }
    215214            /* does partition /dev/adXsY exist more than once in the mountlist? */
    216             for (i = 0, mountpoint_copies = 0, device_copies = 0;
     215            for (i = 0, device_copies = 0;
    217216                 i < mountlist->entries; i++) {
    218217                if (!strcmp(device, mountlist->el[i].device)) {
     
    277276                }
    278277                /* does partition /dev/adXsYZ exist more than once in the mountlist? */
    279                 for (i = 0, mountpoint_copies = 0, device_copies = 0;
     278                for (i = 0, device_copies = 0;
    280279                     i < mountlist->entries; i++) {
    281280                    if (!strcmp(device, mountlist->el[i].device)) {
     
    384383    int pos = 0;
    385384    int res = 0;
    386     int mountpoint_copies = 0;
    387385    int device_copies = 0;
    388386    int i = 0;
     
    461459
    462460        /* does partition /dev/hdNX exist more than once in the mountlist? */
    463         for (i = 0, mountpoint_copies = 0, device_copies = 0;
     461        for (i = 0, device_copies = 0;
    464462             i < mountlist->entries; i++) {
    465463            if (!strcmp(device, mountlist->el[i].device)) {
     
    807805    char *tmp = NULL;
    808806    char *p = NULL;
     807    char *q = NULL;
    809808
    810809    int items = 0;
     
    926925    }
    927926    paranoid_fclose(fout);
     927    if (!(fout = fopen(MONDO_MNTLISTCHG, "w"))) {
     928        log_OS_error("WMTD - Cannot openout "MONDO_MNTLISTCHG);
     929        return (1);
     930    }
     931    fprintf(fout, "the mountlist was changed by mondorestore\n");
     932    paranoid_fclose(fout);
    928933    return (0);
    929934}
  • branches/3.1/mondo/src/common/libmondo-raid-EXT.h

    r558 r3147  
    5353#endif
    5454
    55 extern int parse_mdstat(struct raidlist_itself *raidlist, char *device_prefix);
    56 extern int create_raidtab_from_mdstat(char *raidtab_fname);
     55extern int parse_mdstat(char *mdstat_fname, struct raidlist_itself *raidlist, char *device_prefix);
     56extern int create_raidtab_from_mdstat(char *mdstat_fname, char *raidtab_fname);
  • branches/3.1/mondo/src/common/libmondo-raid.c

    r2937 r3147  
    1515#include "libmondo-tools-EXT.h"
    1616#include "libmondo-string-EXT.h"
     17#include "libmondo-fork-EXT.h"
    1718#include "lib-common-externs.h"
    1819#include "libmondo-raid.h"
     
    429430    char *incoming = NULL;
    430431    char *p;
     432    char *q;
    431433
    432434    assert(fin != NULL);
     
    604606        return (1);
    605607    }
     608    malloc_string(label);
     609    malloc_string(value);
    606610    items = 0;
    607611    log_it("Loading raidtab...");
     
    615619            strcpy(raidlist->el[items].additional_vars.el[v].label, label);
    616620            strcpy(raidlist->el[items].additional_vars.el[v].value, value);
     621            log_msg(2,"Found raidtab entry Label: %s Value: %s",raidlist->el[items].additional_vars.el[v].label,raidlist->el[items].additional_vars.el[v].value);
    617622            v++;
    618623            mr_free(label);
     
    690695            raidrec->raid_level = atoi(value);
    691696        }
     697        log_msg(4,"Found raid level %d",raidrec->raid_level);
    692698    } else if (!strcmp(label, "nr-raid-disks")) {   /* ignore it */
    693699    } else if (!strcmp(label, "nr-spare-disks")) {  /* ignore it */
     
    710716            log_msg(1, "Unknown RAID parity algorithm '%s'\n.", value);
    711717        }
     718        log_msg(4,"Found raid parity %d",raidrec->parity);
    712719    } else if (!strcmp(label, "device")) {
    713720        get_next_raidtab_line(fin, &labelB, &valueB);
     
    735742        strcpy(raidrec->additional_vars.el[v].label, label);
    736743        strcpy(raidrec->additional_vars.el[v].value, value);
    737         raidrec->additional_vars.entries = ++v;
     744        log_msg(4,"Found additional raid pair #%d: %s / %s",v,raidrec->additional_vars.el[v].label,raidrec->additional_vars.el[v].value);
     745        v++;
     746        raidrec->additional_vars.entries = v;
    738747    }
    739748}
     
    950959
    951960
    952 int parse_mdstat(struct raidlist_itself *raidlist, char *device_prefix) {
    953 
    954   const char delims[] = " ";
    955 
    956   FILE   *fin;
    957   int    res = 0, row, i, index_min;
    958   int lastpos = 0;
    959   size_t len = 0;
    960   char   *token;
    961   char *string = NULL;
    962   char *pos;
    963   char type;
    964   char *strtmp;
     961int parse_mdstat(char *mdstat_fname, struct raidlist_itself *raidlist, char *device_prefix) {
     962
     963const char delims[] = " ";
     964
     965FILE *fin = NULL;
     966int res = 0, row, i, index_min;
     967int v = 0;
     968int lastpos = 0;
     969size_t len = 0;
     970char *token = NULL;
     971char *string = NULL;
     972char *cmd = NULL;
     973char *pos = NULL;
     974char type;
     975char *strtmp = NULL;
     976char *strtmp2 = NULL;
    965977
    966978  // open file
     
    10441056      raidlist->el[raidlist->entries].raid_level = 10;
    10451057    } else {
    1046       log_msg(1, "Unknown RAID level '%s'.\n", token);
    1047       paranoid_free(string);
    1048       paranoid_free(token);
    1049       return 1;
    1050     }
    1051     mr_free(token);
     1058        switch (row) {
     1059        case 1:  // device information
     1060            // check whether last line of record and if so skip
     1061            log_msg(8, "This is the device line\n");
     1062            pos = strcasestr(string, "unused devices: ");
     1063            if (pos != NULL) {
     1064                break;
     1065            }
     1066            // tokenise string
     1067            token = mr_strtok(string, delims, &lastpos);
     1068            if (token == NULL) {
     1069                // should not happen !
     1070                break;
     1071            }
     1072            // get RAID device name
     1073            mr_asprintf(&strtmp,"%s%s", device_prefix, token);
     1074            strncpy(raidlist->el[raidlist->entries].raid_device, strtmp, 63);
     1075            raidlist->el[raidlist->entries].raid_device[63] = '\0';
     1076            mr_free(strtmp);
     1077            mr_free(token);
     1078            // store the UUID value in the additional_vars structure
     1079            v = raidlist->el[raidlist->entries].additional_vars.entries;
     1080            strcpy(raidlist->el[raidlist->entries].additional_vars.el[v].label, "UUID");
     1081            mr_asprintf(&cmd,"mdadm --detail %s | grep UUID | cut -d: -f2- | sed 's/^ *//'", raidlist->el[raidlist->entries].raid_device);
     1082            mr_asprintf(&strtmp, "%s", call_program_and_get_last_line_of_output(cmd));
     1083            strcpy(raidlist->el[raidlist->entries].additional_vars.el[v].value, strtmp);
     1084            mr_free(strtmp);
     1085            v++;
     1086            // store the Version value in the additional_vars structure
     1087            strcpy(raidlist->el[raidlist->entries].additional_vars.el[v].label, "Version");
     1088            mr_asprintf(&cmd,"mdadm --detail %s | grep Version | cut -d: -f2- | sed 's/^ *//'", raidlist->el[raidlist->entries].raid_device);
     1089            mr_asprintf(&strtmp, "%s", call_program_and_get_last_line_of_output(cmd));
     1090            strcpy(raidlist->el[raidlist->entries].additional_vars.el[v].value, strtmp);
     1091            mr_free(strtmp);
     1092            v++;
     1093            raidlist->el[raidlist->entries].additional_vars.entries = v;
     1094            // skip ':' and status
     1095            token = mr_strtok (string, delims, &lastpos);
     1096            if (token == NULL) {
     1097                // should not happen !
     1098                break;
     1099            }
     1100            mr_free(token);
     1101            token = mr_strtok (string, delims, &lastpos);
     1102            if (token == NULL) {
     1103                // should not happen !
     1104                break;
     1105            }
     1106            if (!strcmp(token, "inactive")) {
     1107                log_msg(1, "RAID device '%s' inactive.\n",
     1108                raidlist->el[raidlist->entries].raid_device);
     1109                mr_free(string);
     1110                mr_free(token);
     1111                return 1;
     1112            }
     1113            mr_free(token);
    10521114
    10531115    // get RAID devices (type, index, device)
     
    10971159    }
    10981160
     1161    // get RAID devices (type, index, device)
     1162    // Note: parity disk for RAID4 is last normal disk, there is no '(P)'
     1163    raidlist->el[raidlist->entries].data_disks.entries = 0;
     1164    raidlist->el[raidlist->entries].spare_disks.entries = 0;
     1165    raidlist->el[raidlist->entries].failed_disks.entries = 0;
     1166    while((token = mr_strtok (string, delims, &lastpos))) {
     1167        if ((pos = strstr(token, "("))) {
     1168                type = *(pos+1);
     1169        } else {
     1170                type = ' ';
     1171        }
     1172        pos = strstr(token, "[");
     1173        *pos = '\0';
     1174        switch(type) {
     1175        case ' ': // normal data disks
     1176                raidlist->el[raidlist->entries].data_disks.el[raidlist->el[raidlist->entries].data_disks.entries].index = atoi(pos + 1);
     1177                mr_asprintf(&strtmp,"%s%s", device_prefix, token);
     1178                strcpy(raidlist->el[raidlist->entries].data_disks.el[raidlist->el[raidlist->entries].data_disks.entries].device, strtmp);
     1179                mr_free(strtmp);
     1180                raidlist->el[raidlist->entries].data_disks.entries++;
     1181                break;
     1182        case 'S': // spare disks
     1183                raidlist->el[raidlist->entries].spare_disks.el[raidlist->el[raidlist->entries].spare_disks.entries].index = atoi(pos + 1);
     1184                mr_asprintf(&strtmp,"%s%s", device_prefix, token);
     1185                strcpy(raidlist->el[raidlist->entries].spare_disks.el[raidlist->el[raidlist->entries].spare_disks.entries].device, strtmp);
     1186                mr_free(strtmp);
     1187                raidlist->el[raidlist->entries].spare_disks.entries++;
     1188                break;
     1189        case 'F': // failed disks
     1190                raidlist->el[raidlist->entries].failed_disks.el[raidlist->el[raidlist->entries].failed_disks.entries].index = atoi(pos + 1);
     1191                mr_asprintf(&strtmp,"%s%s", device_prefix, token);
     1192                strcpy(raidlist->el[raidlist->entries].failed_disks.el[raidlist->el[raidlist->entries].failed_disks.entries].device, strtmp);
     1193                mr_free(strtmp);
     1194                raidlist->el[raidlist->entries].failed_disks.entries++;
     1195                log_it("At least one failed disk found in RAID array.\n");
     1196                break;
     1197        default: // error
     1198                log_msg(1, "Unknown device type '%c'\n", type);
     1199                mr_free(string);
     1200                mr_free(token);
     1201                return 1;
     1202                break;
     1203        }
     1204        mr_free(token);
     1205    }
     1206
    10991207    // adjust index for each device so that it starts with 0 for every type
    11001208    index_min = 99;
    11011209    for (i=0; i<raidlist->el[raidlist->entries].data_disks.entries;i++) {
    1102       if (raidlist->el[raidlist->entries].data_disks.el[i].index < index_min) {
    1103         index_min = raidlist->el[raidlist->entries].data_disks.el[i].index;
    1104       }
     1210        if (raidlist->el[raidlist->entries].data_disks.el[i].index < index_min) {
     1211            index_min = raidlist->el[raidlist->entries].data_disks.el[i].index;
     1212        }
    11051213    }
    11061214    if (index_min > 0) {
    1107       for (i=0; i<raidlist->el[raidlist->entries].data_disks.entries;i++) {
    1108         raidlist->el[raidlist->entries].data_disks.el[i].index = raidlist->el[raidlist->entries].data_disks.el[i].index - index_min;   
    1109       }
     1215        for (i=0; i<raidlist->el[raidlist->entries].data_disks.entries;i++) {
     1216                raidlist->el[raidlist->entries].data_disks.el[i].index = raidlist->el[raidlist->entries].data_disks.el[i].index - index_min;   
     1217        }
    11101218    }
    11111219    index_min = 99;
    11121220    for (i=0; i<raidlist->el[raidlist->entries].spare_disks.entries;i++) {
    1113       if (raidlist->el[raidlist->entries].spare_disks.el[i].index < index_min) {
    1114         index_min = raidlist->el[raidlist->entries].spare_disks.el[i].index;
    1115       }
     1221        if (raidlist->el[raidlist->entries].spare_disks.el[i].index < index_min) {
     1222                index_min = raidlist->el[raidlist->entries].spare_disks.el[i].index;
     1223        }
    11161224    }
    11171225    if (index_min > 0) {
    1118       for (i=0; i<raidlist->el[raidlist->entries].spare_disks.entries;i++) {
    1119         raidlist->el[raidlist->entries].spare_disks.el[i].index = raidlist->el[raidlist->entries].spare_disks.el[i].index - index_min; 
    1120       }
     1226        for (i=0; i<raidlist->el[raidlist->entries].spare_disks.entries;i++) {
     1227                raidlist->el[raidlist->entries].spare_disks.el[i].index = raidlist->el[raidlist->entries].spare_disks.el[i].index - index_min; 
     1228        }
    11211229    }
    11221230    index_min = 99;
    11231231    for (i=0; i<raidlist->el[raidlist->entries].failed_disks.entries;i++) {
    1124       if (raidlist->el[raidlist->entries].failed_disks.el[i].index < index_min) {
    1125         index_min = raidlist->el[raidlist->entries].failed_disks.el[i].index;
    1126       }
     1232        if (raidlist->el[raidlist->entries].failed_disks.el[i].index < index_min) {
     1233                index_min = raidlist->el[raidlist->entries].failed_disks.el[i].index;
     1234        }
    11271235    }
    11281236    if (index_min > 0) {
    1129       for (i=0; i<raidlist->el[raidlist->entries].failed_disks.entries;i++) {
    1130         raidlist->el[raidlist->entries].failed_disks.el[i].index = raidlist->el[raidlist->entries].failed_disks.el[i].index - index_min;   
    1131       }
     1237        for (i=0; i<raidlist->el[raidlist->entries].failed_disks.entries;i++) {
     1238                raidlist->el[raidlist->entries].failed_disks.el[i].index = raidlist->el[raidlist->entries].failed_disks.el[i].index - index_min;   
     1239        }
    11321240    }
    11331241    break;
    1134       case 2:  // config information
     1242case 2:  // config information
    11351243    // check for persistent super block
    11361244    if (strcasestr(string, "super non-persistent")) {
    1137       raidlist->el[raidlist->entries].persistent_superblock = 0;
    1138     } else {
    1139       raidlist->el[raidlist->entries].persistent_superblock = 1;
    1140     }
    1141     // extract chunk size
    1142     if (!(pos = strcasestr(string, "k chunk"))) {
    1143       raidlist->el[raidlist->entries].chunk_size = -1;
    1144     } else {
    1145       while (*pos != ' ') {
    1146         pos -= 1;
    1147         if (pos < string) {
    1148           log_it("String underflow!\n");
    1149           paranoid_free(string);
    1150           return 1;
    1151         }
    1152       }
    1153       raidlist->el[raidlist->entries].chunk_size = atoi(pos + 1);
    1154     }
    1155     // extract parity if present
    1156     if ((pos = strcasestr(string, "algorithm"))) {
    1157       raidlist->el[raidlist->entries].parity = atoi(pos + 9);
    1158     } else {
    1159       raidlist->el[raidlist->entries].parity = -1;
    1160     }
    1161     break;
    1162       case 3:  // optional build status information
    1163     if (!(pos = strchr(string, '\%'))) {
    1164       if (strcasestr(string, "delayed")) {
    1165         raidlist->el[raidlist->entries].progress = -1;  // delayed (therefore, stuck at 0%)
    1166       } else {
    1167         raidlist->el[raidlist->entries].progress = 999; // not found
    1168       }
    1169     } else {
    1170       while (*pos != ' ') {
    1171         pos -= 1;
    1172         if (pos < string) {
    1173           printf("ERROR: String underflow!\n");
    1174           paranoid_free(string);
    1175           return 1;
    1176         }
    1177       }
    1178       raidlist->el[raidlist->entries].progress = atoi(pos);
    1179     }
    1180     break;
    1181       default: // error or IN PROGRESS
    1182     if (raidlist->el[raidlist->entries].progress != -1 &&
    1183         raidlist->el[raidlist->entries].progress != 999) {
    1184         log_msg(1, "Row %d should not occur in record!\n", row);
    1185     }
    1186     break;
    1187       }
    1188       row++;
    1189     }
    1190   }
    1191   // close file
    1192   fclose(fin);
    1193   // free string
    1194   paranoid_free(string);
    1195   // return success
    1196   return 0;
    1197 
    1198 }
    1199 
    1200 
    1201 
    1202 
    1203 int create_raidtab_from_mdstat(char *raidtab_fname)
     1245                raidlist->el[raidlist->entries].persistent_superblock = 0;
     1246            } else {
     1247                raidlist->el[raidlist->entries].persistent_superblock = 1;
     1248            }
     1249            // extract chunk size
     1250            if (!(pos = strcasestr(string, "k chunk"))) {
     1251                raidlist->el[raidlist->entries].chunk_size = -1;
     1252            } else {
     1253                while (*pos != ' ') {
     1254                    pos -= 1;
     1255                    if (pos < string) {
     1256                            log_it("String underflow!\n");
     1257                            mr_free(string);
     1258                            return 1;
     1259                    }
     1260                }
     1261                raidlist->el[raidlist->entries].chunk_size = atoi(pos + 1);
     1262            }
     1263            // extract parity if present
     1264            if ((pos = strcasestr(string, "algorithm"))) {
     1265                raidlist->el[raidlist->entries].parity = atoi(pos + 9);
     1266            } else {
     1267                raidlist->el[raidlist->entries].parity = -1;
     1268            }
     1269            break;
     1270        case 3:  // optional build status information
     1271            if (!(pos = strchr(string, '\%'))) {
     1272                if (strcasestr(string, "delayed")) {
     1273                    raidlist->el[raidlist->entries].progress = -1;  // delayed (therefore, stuck at 0%)
     1274                } else {
     1275                    raidlist->el[raidlist->entries].progress = 999; // not found
     1276                }
     1277            } else {
     1278                while (*pos != ' ') {
     1279                    pos -= 1;
     1280                    if (pos < string) {
     1281                        printf("ERROR: String underflow!\n");
     1282                            mr_free(string);
     1283                            return 1;
     1284                    }
     1285                }
     1286                raidlist->el[raidlist->entries].progress = atoi(pos);
     1287            }
     1288            break;
     1289        default: // error or IN PROGRESS
     1290            if (raidlist->el[raidlist->entries].progress != -1 &&
     1291                raidlist->el[raidlist->entries].progress != 999) {
     1292                log_msg(1, "Row %d should not occur in record!\n", row);
     1293            }
     1294            break;
     1295        }
     1296        row++;
     1297    }
     1298    // free string
     1299    mr_free(string);
     1300}
     1301// close file
     1302fclose(fin);
     1303// return success
     1304return 0;
     1305
     1306}
     1307
     1308
     1309
     1310
     1311int create_raidtab_from_mdstat(char *mdstat_fname,char *raidtab_fname)
    12041312{
    12051313    struct raidlist_itself *raidlist;
     
    12091317
    12101318    // FIXME: Prefix '/dev/' should really be dynamic!
    1211     if (parse_mdstat(raidlist, "/dev/")) {
    1212         log_to_screen("Sorry, cannot read %s", MDSTAT_FILE);
     1319    if (parse_mdstat(mdstat_fname,raidlist, "/dev/")) {
     1320        log_to_screen("Sorry, cannot read %s", mdstat_fname);
    12131321        return (1);
    12141322    }
  • branches/3.1/mondo/src/common/libmondo-raid.h

    r558 r3147  
    4343#endif
    4444
    45 int create_raidtab_from_mdstat(char *raidtab_fname);
    46 int parse_mdstat(struct raidlist_itself *raidlist, char *device_prefix);
     45int create_raidtab_from_mdstat(char *mdstat_fname, char *raidtab_fname);
     46int parse_mdstat(char *mdstat_fname, struct raidlist_itself *raidlist, char *device_prefix);
  • branches/3.1/mondo/src/common/libmondo-stream.c

    r2937 r3147  
    116116    char *blk;
    117117    int i;
     118    int j;
    118119
    119120    blk = (char *) malloc(256 * 1024);
     
    131132    }
    132133    for (i = 0; i < 8 && !feof(g_tape_stream); i++) {
    133         (void) fread(blk, 1, 256 * 1024, g_tape_stream);
     134        j = fread(blk, 1, 256 * 1024, g_tape_stream);
     135        if (j) {
     136            // FIXME
     137        }
    134138    }
    135139    sleep(1);
     
    185189    }
    186190    for (i = 0; i < 4 * 8; i++) {
    187         (void) fwrite(blk, 1, 256 * 1024, g_tape_stream);
     191        if (fwrite(blk, 1, 256 * 1024, g_tape_stream)) {
     192            //FIXME
     193        }
    188194        if (should_we_write_to_next_tape
    189195            (bkpinfo->media_size[g_current_media_number], (off_t)256 * 1024)) {
     
    362368{
    363369    int res = 0;
    364     char *fname = (char *)&res;                 /* Should NOT be NULL */
     370    char fname_buf[PATH_MAX];
     371    char *fname = (char *)fname_buf;        /* Should NOT be NULL */
    365372    char *tmp = NULL;
    366373
     
    419426    res = read_header_block_from_stream(ptmp_size, tmp_fname, pctrl_chr);
    420427    log_msg(1, "End of extended attributes, now looking for afioball");
    421     return (0);
     428    return (res);
    422429}
    423430
     
    521528{
    522529    long long final_alleged_writeK, final_projected_certain_writeK,
    523         final_actually_certain_writeK = 0, cposK, bufsize_K;
     530        cposK, bufsize_K;
    524531    int last, curr, i;
    525     t_archtype type = other;
    526532    char *command = NULL;
    527533    char *tmpdir = NULL;
     
    557563        cposK = g_tapecatalog->el[curr].tape_posK;
    558564        if (cposK < final_projected_certain_writeK) {
    559             final_actually_certain_writeK = cposK;
    560565            break;
    561566        }
     
    835840                          g_tape_stream);
    836841            }
    837             (void) fwrite(datablock, 1, (size_t) length, fout);
     842            if (fwrite(datablock, 1, (size_t) length, fout)) {
     843                // FIXME
     844            }
    838845            g_tape_posK += length / 1024;
    839846        }
     
    860867    close_evalcall_form();
    861868    log_it("Saved all.tar.gz to '%s'", outfname);
    862     (void) getcwd(old_cwd, MAX_STR_LEN);
    863     chdir(bkpinfo->tmpdir);
     869    if (getcwd(old_cwd, MAX_STR_LEN)) {
     870        // FIXME
     871    }
     872    if (chdir(bkpinfo->tmpdir)) {
     873        // FIXME
     874    }
    864875    mr_asprintf(tmp, "tar -zxf %s ."MINDI_CACHE"/mondorestore.cfg 2> /dev/null", outfname);
    865876    paranoid_system(tmp);
     
    867878
    868879    paranoid_system("cp -f ."MINDI_CACHE"/mondorestore.cfg . 2> /dev/null");
    869     chdir(old_cwd);
     880    if (chdir(old_cwd)) {
     881        // FIXME
     882    }
    870883    unlink(outfname);
    871884    mr_free(outfname);
     
    10491062    unsigned int crctt;
    10501063
    1051     bool had_to_resync = FALSE;
    1052 
    10531064    /*@ init  ******************************************************* */
    10541065    malloc_string(temp_fname);
     
    10621073
    10631074    res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1075    if (res) {
     1076        // FIXME
     1077    }
    10641078    if (orig_size != temp_size && orig_size != -1) {
    10651079        log_to_screen("output file's size should be %ld K but is apparently %ld K", (long) size >> 10, (long) temp_size >> 10);
     
    11001114            for (size = orig_size; size > where_I_was_before_tape_change;
    11011115                 size -= bytes_to_write) {
    1102                 bytes_read =
    1103                     fread(datablock, 1, bytes_to_read, g_tape_stream);
     1116                bytes_read = fread(datablock, 1, bytes_to_read, g_tape_stream);
    11041117            }
    11051118            log_msg(4, "'size' is now %lld (should be %lld)", size,
    11061119                    where_I_was_before_tape_change);
    11071120            log_to_screen("Successfully re-sync'd tape");
    1108             had_to_resync = TRUE;
    11091121            bytes_read = fread(datablock, 1, bytes_to_read, g_tape_stream);
    11101122        }
    11111123
    1112         (void) fwrite(datablock, 1, (size_t) bytes_to_write, fout); // for blocking reasons, bytes_successfully_read_in isn't necessarily the same as bytes_to_write
     1124        if (fwrite(datablock, 1, (size_t) bytes_to_write, fout)) {  // for blocking reasons, bytes_successfully_read_in isn't necessarily the same as bytes_to_write
     1125            // FIXME
     1126        }
    11131127
    11141128#ifdef EXTRA_TAPE_CHECKSUMS
     
    11771191    }
    11781192    while (!(*pcontrol_char = tempblock[7000])) {
    1179         g_tape_posK +=
    1180             fread(tempblock, 1, (size_t) TAPE_BLOCK_SIZE,
    1181                   g_tape_stream) / 1024;
     1193        g_tape_posK += fread(tempblock, 1, (size_t) TAPE_BLOCK_SIZE, g_tape_stream) / 1024;
    11821194    }
    11831195    memcpy((char *) plen, tempblock + 7001, sizeof(long long));
     
    13201332    ctrl_chr = -1;
    13211333    while (ctrl_chr != BLK_START_AN_AFIO_OR_SLICE) {
    1322         res =
    1323             read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1334        res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
    13241335        if (ctrl_chr == BLK_START_AN_AFIO_OR_SLICE) {
    13251336            break;
     
    13301341    }
    13311342    while (ctrl_chr != BLK_START_FILE) {
    1332         res =
    1333             read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1343        res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
    13341344        if (ctrl_chr == BLK_START_FILE) {
    13351345            break;
     
    13561366            bytes_to_write =
    13571367                (size < TAPE_BLOCK_SIZE) ? (long) size : TAPE_BLOCK_SIZE;
    1358             // FIXME - needs error-checking and -catching
    1359             fread(datablock, 1, (size_t) TAPE_BLOCK_SIZE, g_tape_stream);
    1360         }
    1361         res =
    1362             read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1368            if (fread(datablock, 1, (size_t) TAPE_BLOCK_SIZE, g_tape_stream)) {
     1369                // FIXME - needs error-checking and -catching
     1370            }
     1371        }
     1372        res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
    13631373        if (ctrl_chr != BLK_STOP_FILE) {
    13641374            wrong_marker(BLK_STOP_FILE, ctrl_chr);
    13651375        }
    1366         res =
    1367             read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1376        res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
    13681377        if (ctrl_chr != BLK_STOP_AN_AFIO_OR_SLICE) {
    13691378            wrong_marker(BLK_STOP_AN_AFIO_OR_SLICE, ctrl_chr);
    13701379        }
    1371         res =
    1372             read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1380        res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
    13731381        if (ctrl_chr != BLK_START_AN_AFIO_OR_SLICE) {
    13741382            wrong_marker(BLK_START_AN_AFIO_OR_SLICE, ctrl_chr);
    13751383        }
    1376         res =
    1377             read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
     1384        res = read_header_block_from_stream(&temp_size, temp_fname, &ctrl_chr);
    13781385        if (ctrl_chr != BLK_START_FILE) {
    13791386            wrong_marker(BLK_START_FILE, ctrl_chr);
     
    16891696            bytes_to_read = TAPE_BLOCK_SIZE;
    16901697        }
    1691         (void) fread(datablock, 1, (size_t) bytes_to_read, fin);
     1698        if (fread(datablock, 1, (size_t) bytes_to_read, fin)) {
     1699            // FIXME
     1700        }
    16921701        g_tape_posK +=
    16931702            fwrite(datablock, 1, /*bytes_to_read */
  • branches/3.1/mondo/src/common/libmondo-string-EXT.h

    r2508 r3147  
    2323extern void strip_spaces(char *in_out);
    2424extern char *trim_empty_quotes(char *incoming);
    25 extern char *truncate_to_drive_name(char *partition);
     25extern char *truncate_to_drive_name(const char *partition);
    2626extern char *turn_raid_level_number_to_string(int raid_level);
    2727
  • branches/3.1/mondo/src/common/libmondo-string.c

    r2508 r3147  
    665665 */
    666666void strip_spaces(char *in_out)
     667{
     668    /*@ buffers ***************************************************** */
     669    char *tmp = NULL;
     670
     671    /*@ int ******************************************************** */
     672    int i;
     673
     674    /*@ end vars *************************************************** */
     675
     676    assert(in_out != NULL);
     677    malloc_string(tmp);
     678    for (i = 0; in_out[i] <= ' ' && i < (int) strlen(in_out) -1; i++);
     679    strcpy(tmp, in_out + i);
     680    for (i = (int) strlen(tmp) -1; i >= 0 && tmp[i] <= ' '; i--);
     681    i++;
     682    tmp[i] = '\0';
     683
     684    // Now tmp contains the stripped string
     685    strcpy(in_out,tmp);
     686    paranoid_free(tmp);
     687}
     688
     689/**
     690 * Remove all characters whose ASCII value is less than or equal to 32
     691 * (spaces and control characters) from both sides of @p in_out.
     692 * @param in_out The string to strip spaces/control characters from (modified).
     693 */
     694void strip_spaces2(char *in_out)
    667695{
    668696    /*@ buffers ***************************************************** */
     
    752780 * @return @p partition.
    753781 */
    754 char *truncate_to_drive_name(char *partition)
     782char *truncate_to_drive_name(const char *partition)
    755783{
    756784    int i = strlen(partition) - 1;
  • branches/3.1/mondo/src/common/libmondo-string.h

    r2508 r3147  
    2121void strip_spaces(char *in_out);
    2222char *trim_empty_quotes(char *incoming);
    23 char *truncate_to_drive_name(char *partition);
     23char *truncate_to_drive_name(const char *partition);
    2424char *turn_raid_level_number_to_string(int raid_level);
    2525void printf_silly_message(void);
  • branches/3.1/mondo/src/common/libmondo-tools.c

    r2937 r3147  
    304304{
    305305#ifdef __FreeBSD__
    306     system("kldstat | grep msdosfs || kldload msdosfs 2> /dev/null");
    307     system("kldstat | grep ext2fs  || kldload ext2fs 2> /dev/null");
     306    paranoid_system("kldstat | grep msdosfs || kldload msdosfs 2> /dev/null");
     307    paranoid_system("kldstat | grep ext2fs  || kldload ext2fs 2> /dev/null");
    308308#else
    309     system("modprobe -a msdos vfat loop &> /dev/null");
     309    paranoid_system("modprobe -a msdos vfat loop &> /dev/null");
    310310#endif
    311311}
     
    643643                colon++;
    644644                hent = gethostbyname(colon);
    645                 mr_asprintf(bkpinfo->netfs_user,"%s", hostname);
     645                mr_asprintf(&(bkpinfo->netfs_user),"%s", hostname);
    646646            } else {
    647647                hent = gethostbyname(hostname);
     
    713713}
    714714
     715/*  From busybox under GPLv2 */
     716#ifndef HAVE_MKDTEMP
     717/* This is now actually part of POSIX.1, but was only added in 2008 */
     718char* mkdtemp(char *template)
     719{
     720    if (mktemp(template) == NULL || mkdir(template, 0700) != 0)
     721        return NULL;
     722    return template;
     723}
     724#endif
     725
    715726void setup_tmpdir(char *path) {
    716727
     
    721732        /* purging a potential old tmpdir */
    722733        log_it("Purging old tmpdir %s", bkpinfo->tmpdir);
    723         chdir("/tmp");
     734        if (chdir("/tmp")) {
     735            // FIXME
     736        }
    724737        mr_asprintf(tmp,"rm -Rf %s",bkpinfo->tmpdir);
    725738        mr_free(bkpinfo->tmpdir);
    726         (void)system(tmp);
     739        paranoid_system(tmp);
    727740        mr_free(tmp);
    728741    }
     
    10321045    mr_free(tmp);
    10331046
    1034     if (!run_program_and_log_output("parted2fdisk -l | grep -i raid", 1)
     1047    if (!run_program_and_log_output("parted2fdisk -l 2>/dev/null | grep -i raid", 1)
    10351048        && !does_file_exist("/etc/raidtab")) {
    10361049        log_to_screen
    10371050            ("You have RAID partitions but no /etc/raidtab - creating one from /proc/mdstat");
    1038         create_raidtab_from_mdstat("/etc/raidtab");
     1051        create_raidtab_from_mdstat(MDSTAT_FILE,"/etc/raidtab");
    10391052    }
    10401053
  • branches/3.1/mondo/src/common/libmondo-verify.c

    r2937 r3147  
    412412    char *outlog = NULL;
    413413    char *tmp = NULL;
     414    char *p = NULL;
    414415
    415416    /*@ pointers ******************************************************* */
     
    477478        bkpinfo->use_star = TRUE;
    478479        if (strstr(tarball_fname, ".bz2"))
    479             mr_asprintf(command, "star -diff diffopts=mode,size,data file=%s %s >> %s 2>> %s", tarball_fname, (strstr(tarball_fname, ".bz2")) ? "-bz" : " ", outlog, outlog);
     480            mr_asprintf(command, "star -sparse -diff diffopts=mode,size,data file=%s %s >> %s 2>> %s", tarball_fname, (strstr(tarball_fname, ".bz2")) ? "-bz" : " ", outlog, outlog);
    480481    } else {
    481482        bkpinfo->use_star = FALSE;
     
    681682
    682683            mr_asprintf(tmp, "echo \"%s\" >> %s/biggies.changed", biggie_fname, bkpinfo->tmpdir);
    683             system(tmp);
     684            paranoid_system(tmp);
    684685            mr_free(tmp);
    685686        }
     
    738739        log_it("Grabbing the EXAT files");
    739740        if (ctrl_chr == BLK_START_EXTENDED_ATTRIBUTES) {
    740             res =
    741                 read_EXAT_files_from_tape(&size, fname, &ctrl_chr,
     741            res = read_EXAT_files_from_tape(&size, fname, &ctrl_chr,
    742742                                          curr_xattr_list_fname,
    743743                                          curr_acl_list_fname);
     
    765765        if (ctrl_chr == BLK_START_EXTENDED_ATTRIBUTES) {
    766766            log_it("Reading EXAT files from tape");
    767             res =
    768                 read_EXAT_files_from_tape(&size, fname, &ctrl_chr,
     767            res = read_EXAT_files_from_tape(&size, fname, &ctrl_chr,
    769768                                          curr_xattr_list_fname,
    770769                                          curr_acl_list_fname);
     
    848847        if (ctrl_chr == BLK_START_EXTENDED_ATTRIBUTES) {
    849848            log_it("Grabbing the EXAT biggiefiles");
    850             res =
    851                 read_EXAT_files_from_tape(&size, orig_fname,
     849            res = read_EXAT_files_from_tape(&size, orig_fname,
    852850                                          &ctrl_chr, curr_xattr_list_fname,
    853851                                          curr_acl_list_fname);
  • branches/3.1/mondo/src/common/mondostructures.h

    r2816 r3147  
    191191 * A type of file in the catalog of recent archives.
    192192 */
    193 typedef enum { other,           ///< Some other kind of file.
     193typedef enum {
     194    other,                      ///< Some other kind of file.
    194195    fileset,                    ///< An afioball (fileset), optionally compressed.
    195196    biggieslice                 ///< A slice of a biggiefile, optionally compressed.
     
    201202typedef enum {
    202203    nuke = 0,                   /// Nuke mode
    203     interactive,                /// Interactive mode
     204    interactive,                    /// Interactive mode
    204205    compare,                    /// Compare mode
    205206    mbr,                        /// MBR mode
  • branches/3.1/mondo/src/common/newt-specific.c

    r2937 r3147  
    5757 */
    5858    bool g_exiting = FALSE;
     59
     60// Decide whether we should continue to ask questions or exit (cron use case)
     61extern bool g_fail_immediately;
    5962
    6063/**
     
    122125        char *tmp;
    123126
    124          assert_string_is_neither_NULL_nor_zerolength(prompt);
    125 
     127        assert_string_is_neither_NULL_nor_zerolength(prompt);
     128
     129        if (g_fail_immediately) {
     130            // We consider the user aborted by using the -F option
     131            log_msg(3, "Exiting at first interaction request due to -F");
     132            finish(1);
     133        }
    126134        if (g_text_mode) {
    127135            while (1) {
     
    163171        /*@ buffer *********************************************************** */
    164172        char *tmp = NULL;
     173        char *p;
    165174        int i;
    166175
    167         assert_string_is_neither_NULL_nor_zerolength(prompt);
     176        if (g_fail_immediately) {
     177            // We consider the user aborted by using the -F option
     178            log_msg(3, "Exiting at first interaction request due to -F");
     179            finish(1);
     180        }
    168181
    169182        if (g_text_mode) {
     
    318331        sync();
    319332
    320         chdir("/");
     333        if (chdir("/")) {
     334            // FIXME
     335        }
    321336        if (g_selfmounted_isodir) {
    322337            mr_asprintf(command, "umount -d %s", g_selfmounted_isodir);
     
    369384
    370385        /*  Before removing dir, make sure we're out of them */
    371         chdir("/tmp");
     386        if (chdir("/tmp")) {
     387            // FIXME
     388        }
    372389        run_program_and_log_output("umount -d " MNT_CDROM, FALSE);
    373390        if (g_selfmounted_isodir) {
     
    385402                log_msg(8,"erasing tempdir %s",bkpinfo->tmpdir);
    386403                mr_asprintf(command, "rm -Rf %s", bkpinfo->tmpdir);
    387                 system(command);
     404                paranoid_system(command);
    388405                mr_free(command);
    389406            }
     
    394411                log_msg(8,"erasing scratchdir %s",bkpinfo->scratchdir);
    395412                mr_asprintf(command, "rm -Rf %s", bkpinfo->scratchdir);
    396                 system(command);
     413                paranoid_system(command);
    397414                mr_free(command);
    398415            }
     
    424441        char *command = NULL;
    425442        char *tmp = NULL;
     443        char *p = NULL;
    426444
    427445        /*@ pointers ********************************************************* */
     
    763781        /*@ buffers *********************************************************** */
    764782        char *prompt = NULL;
     783        char *q;
    765784
    766785        /*@ newt ************************************************************** */
     
    11301149        static char *possible_responses[] = { "none", "cdr", "cdrw", "dvd", "tape", "cdstream", "udev", "netfs", "iso", NULL };
    11311150        char *outstr = NULL;
     1151        char *p;
    11321152        t_bkptype backup_type;
    11331153        int i;
     
    12861306        newtPushHelpLine("   Please specify the level of compression that you want.");
    12871307        newtCenteredWindow(34, 13, "How much compression?");
    1288         b1 = newtButton(4, 1, "Maximum");
    1289         b2 = newtButton(18, 1, "Average");
    1290         b3 = newtButton(4, 5, "Minimum");
    1291         b4 = newtButton(18, 5, " None ");
     1308        b1 = newtButton(4, 1, "Maximum (9)");
     1309        b2 = newtButton(18, 1, "Average (4)");
     1310        b3 = newtButton(4, 5, "Minimum (1)");
     1311        b4 = newtButton(18, 5, " None (0) ");
    12921312        b5 = newtButton(4, 9, "         Exit        ");
    12931313        myForm = newtForm(NULL, NULL, 0);
     
    13271347        bool done;
    13281348        char *tmp = NULL;
     1349        char *p;
    13291350        char *tmp1 = NULL;
    13301351        FILE *fin, *fout;
     
    15631584}                               /* extern "C" */
    15641585#endif
    1565 
    1566 
    1567 void wait_until_software_raids_are_prepped(char *mdstat_file, int wait_for_percentage);
Note: See TracChangeset for help on using the changeset viewer.