Ticket #71: mc-4.7.0.8-skipall.diff

File mc-4.7.0.8-skipall.diff, 10.4 KB (added by ZlatkO, 14 years ago)

updated patch for 4.7.0.8

  • src/file.c

    diff -pruN mc-4.7.0.8-orig/src/file.c mc-4.7.0.8/src/file.c
    old new copy_file_file (FileOpContext *ctx, cons 
    511511                S_ISSOCK (sb.st_mode)) { 
    512512            while (mc_mknod (dst_path, sb.st_mode & ctx->umask_kill, 
    513513                    sb.st_rdev) < 0) { 
     514                if ( ctx->skip_all ) 
     515                    break; 
    514516                return_status = file_error ( 
    515517                    _(" Cannot create special file \"%s\" \n %s "), dst_path); 
    516518                if (return_status == FILE_RETRY) 
    517519                    continue; 
     520                if (return_status == FILE_SKIPALL) 
     521                    ctx->skip_all = 1; 
     522                if (return_status == FILE_SKIP); 
    518523                return return_status; 
    519524            } 
    520525            /* Success */ 
    521526 
    522527            while (ctx->preserve_uidgid 
    523528                   && mc_chown (dst_path, sb.st_uid, sb.st_gid)) { 
     529                if ( ctx->skip_all ) 
     530                    break; 
    524531                temp_status = file_error ( 
    525532                        _(" Cannot chown target file \"%s\" \n %s "), dst_path); 
     533                if (temp_status == FILE_SKIPALL) 
     534                    ctx->skip_all = 1; 
     535                if (temp_status == FILE_SKIP) 
     536                    break; 
    526537                if (temp_status == FILE_RETRY) 
    527538                    continue; 
    528539                return temp_status; 
    529540            } 
    530541            while (ctx->preserve && 
    531542                   mc_chmod (dst_path, sb.st_mode & ctx->umask_kill)) { 
     543                if ( ctx->skip_all ) 
     544                    break; 
    532545                temp_status = file_error ( 
    533546                        _(" Cannot chmod target file \"%s\" \n %s "), dst_path); 
     547                if (temp_status == FILE_SKIPALL) 
     548                    ctx->skip_all = 1; 
     549                if (temp_status == FILE_SKIP) 
     550                    break; 
    534551                if (temp_status == FILE_RETRY) 
    535552                    continue; 
    536553                return temp_status; 
    copy_file_file (FileOpContext *ctx, cons 
    542559    gettimeofday (&tv_transfer_start, (struct timezone *) NULL); 
    543560 
    544561    while ((src_desc = mc_open (src_path, O_RDONLY | O_LINEAR)) < 0) { 
     562        if ( ctx->skip_all ) 
     563            break; 
    545564        return_status = file_error ( 
    546565                _(" Cannot open source file \"%s\" \n %s "), src_path); 
    547566        if (return_status == FILE_RETRY) 
    548567            continue; 
     568        if (return_status == FILE_SKIPALL) 
     569            ctx->skip_all = 1; 
     570        if (return_status == FILE_SKIP) 
     571            break; 
    549572        ctx->do_append = 0; 
    550573        return return_status; 
    551574    } 
    copy_file_file (FileOpContext *ctx, cons 
    559582    } 
    560583 
    561584    while (mc_fstat (src_desc, &sb)) { 
     585        if ( ctx->skip_all ) 
     586            goto ret; 
    562587        return_status = file_error ( 
    563588                _(" Cannot fstat source file \"%s\" \n %s "), src_path); 
    564589        if (return_status == FILE_RETRY) 
    565590            continue; 
     591        if (return_status == FILE_SKIPALL) 
     592            ctx->skip_all = 1; 
     593        if (return_status == FILE_SKIP); 
    566594        ctx->do_append = 0; 
    567595        goto ret; 
    568596    } 
    copy_file_file (FileOpContext *ctx, cons 
    586614        if (errno == EEXIST) { 
    587615            goto ret; 
    588616        } 
     617        if ( ctx->skip_all ) 
     618            goto ret; 
    589619        return_status = file_error ( 
    590620                _(" Cannot create target file \"%s\" \n %s "), dst_path); 
    591621        if (return_status == FILE_RETRY) 
    592622            continue; 
     623        if (return_status == FILE_SKIPALL) 
     624            ctx->skip_all = 1; 
     625        if (return_status == FILE_SKIP); 
    593626        ctx->do_append = 0; 
    594627        goto ret; 
    595628    } 
    copy_file_file (FileOpContext *ctx, cons 
    600633 
    601634    /* Find out the optimal buffer size.  */ 
    602635    while (mc_fstat (dest_desc, &sb)) { 
     636        if ( ctx->skip_all ) 
     637            goto ret; 
    603638        return_status = file_error ( 
    604639                _(" Cannot fstat target file \"%s\" \n %s "), dst_path); 
    605640        if (return_status == FILE_RETRY) 
    606641            continue; 
     642        if (return_status == FILE_SKIPALL) 
     643            ctx->skip_all = 1; 
     644        if (return_status == FILE_SKIP); 
    607645        goto ret; 
    608646    } 
    609647    buf = g_malloc (buf_size); 
    copy_file_file (FileOpContext *ctx, cons 
    632670                n_read = -1; 
    633671            else 
    634672                while ((n_read = mc_read (src_desc, buf, buf_size)) < 0) { 
     673                    if ( ctx->skip_all ) 
     674                        goto ret; 
    635675                    return_status = file_error ( 
    636676                        _(" Cannot read source file \"%s\" \n %s "), src_path); 
    637677                    if (return_status == FILE_RETRY) 
    638678                        continue; 
     679                    if (return_status == FILE_SKIPALL) 
     680                        ctx->skip_all = 1; 
     681                    if (return_status == FILE_SKIP); 
    639682                    goto ret; 
    640683                } 
    641684            if (n_read == 0) 
    copy_file_file (FileOpContext *ctx, cons 
    658701                /* dst_write */ 
    659702                while ((n_written = 
    660703                        mc_write (dest_desc, t, n_read)) < n_read) { 
     704                    if ( ctx->skip_all ) 
     705                        break; 
    661706                    if (n_written > 0) { 
    662707                        n_read -= n_written; 
    663708                        t += n_written; 
    copy_file_file (FileOpContext *ctx, cons 
    668713                                dst_path); 
    669714                    if (return_status != FILE_RETRY) 
    670715                        goto ret; 
     716                    if (return_status == FILE_SKIPALL) 
     717                        ctx->skip_all = 1; 
     718                    if (return_status == FILE_SKIP) 
     719                        break; 
    671720                } 
    672721            } 
    673722 
    copy_file_file (FileOpContext *ctx, cons 
    725774    g_free (buf); 
    726775 
    727776    while (src_desc != -1 && mc_close (src_desc) < 0) { 
     777        if ( ctx->skip_all ) 
     778            break; 
    728779        temp_status = file_error ( 
    729780                _(" Cannot close source file \"%s\" \n %s "), src_path); 
    730781        if (temp_status == FILE_RETRY) 
    731782            continue; 
    732783        if (temp_status == FILE_ABORT) 
    733784            return_status = temp_status; 
     785        if (temp_status == FILE_SKIPALL) 
     786            ctx->skip_all = 1; 
     787        if (temp_status == FILE_SKIP); 
    734788        break; 
    735789    } 
    736790 
    737791    while (dest_desc != -1 && mc_close (dest_desc) < 0) { 
     792        if ( ctx->skip_all ) 
     793            break; 
    738794        temp_status = file_error ( 
    739795                _(" Cannot close target file \"%s\" \n %s "), dst_path); 
    740796        if (temp_status == FILE_RETRY) 
    741797            continue; 
     798        if (temp_status == FILE_SKIPALL) 
     799            ctx->skip_all = 1; 
     800        if (temp_status == FILE_SKIP); 
    742801        return_status = temp_status; 
    743802        break; 
    744803    } 
    copy_file_file (FileOpContext *ctx, cons 
    755814        /* Copy has succeeded */ 
    756815        if (!appending && ctx->preserve_uidgid) { 
    757816            while (mc_chown (dst_path, src_uid, src_gid)) { 
     817                if ( ctx->skip_all ) 
     818                    break; 
    758819                temp_status = file_error ( 
    759820                        _(" Cannot chown target file \"%s\" \n %s "), dst_path); 
    760821                if (temp_status == FILE_RETRY) 
    761822                    continue; 
    762                 return_status = temp_status; 
     823                if (temp_status == FILE_SKIPALL) { 
     824                    ctx->skip_all = 1; 
     825                    return_status = FILE_CONT; 
     826                } 
     827                if (temp_status == FILE_SKIP) 
     828                    return_status = FILE_CONT; 
    763829                break; 
    764830            } 
    765831        } 
    copy_file_file (FileOpContext *ctx, cons 
    767833        if (!appending) { 
    768834            if (ctx->preserve){ 
    769835                while (mc_chmod (dst_path, (src_mode & ctx->umask_kill))) { 
     836                if ( ctx->skip_all ) 
     837                    break; 
    770838                    temp_status = file_error ( 
    771839                        _(" Cannot chmod target file \"%s\" \n %s "), dst_path); 
    772                     if (temp_status != FILE_RETRY) { 
    773                         return_status = temp_status; 
    774                         break; 
    775                     } 
     840                if (temp_status == FILE_RETRY) 
     841                    continue; 
     842                if (temp_status == FILE_SKIPALL){ 
     843                    ctx->skip_all = 1; 
     844                    return_status = FILE_CONT; 
     845                } 
     846                if (temp_status == FILE_SKIP) 
     847                    return_status = FILE_CONT; 
     848                break; 
    776849                } 
    777850            } else { 
    778851                src_mode = umask(-1); 
    erase_file (FileOpContext *ctx, const ch 
    12561329    } 
    12571330 
    12581331    while (mc_unlink (s)) { 
     1332        if ( ctx->skip_all ) 
     1333            break; 
    12591334        return_status = 
    12601335            file_error (_(" Cannot delete file \"%s\" \n %s "), s); 
    1261         if (return_status != FILE_RETRY) 
     1336        if (return_status == FILE_ABORT) 
    12621337            return return_status; 
     1338        if (return_status == FILE_RETRY) 
     1339            continue; 
     1340        if (return_status == FILE_SKIPALL)  
     1341            ctx->skip_all = 1; 
     1342        if (return_status == FILE_SKIP); 
     1343        break; 
    12631344    } 
    12641345 
    12651346    if (progress_count) 
    erase_file (FileOpContext *ctx, const ch 
    12691350        return FILE_CONT; 
    12701351} 
    12711352 
     1353/* recursive remove of files 
     1354  abort->cancel stack 
     1355  skip ->warn every level, gets default 
     1356  skipall->remove as much as possible 
     1357 */ 
    12721358static FileProgressStatus 
    12731359recursive_erase (FileOpContext *ctx, const char *s, off_t *progress_count, 
    12741360                 double *progress_bytes) 
    recursive_erase (FileOpContext *ctx, con 
    12871373    if (!reading) 
    12881374        return FILE_RETRY; 
    12891375 
    1290     while ((next = mc_readdir (reading)) && return_status == FILE_CONT) { 
     1376    while ((next = mc_readdir (reading)) && !(return_status == FILE_ABORT) ) { 
    12911377        if (!strcmp (next->d_name, ".")) 
    12921378            continue; 
    12931379        if (!strcmp (next->d_name, "..")) 
    recursive_erase (FileOpContext *ctx, con 
    13001386        } 
    13011387        if (S_ISDIR (buf.st_mode)) 
    13021388            return_status = 
    1303                 (recursive_erase 
    1304                  (ctx, path, progress_count, progress_bytes) 
    1305                  != FILE_CONT) ? FILE_RETRY : FILE_CONT; 
     1389            recursive_erase(ctx, path, progress_count, progress_bytes); 
    13061390        else 
    13071391            return_status = 
    13081392                erase_file (ctx, path, progress_count, progress_bytes, 0); 
    13091393        g_free (path); 
    13101394    } 
    13111395    mc_closedir (reading); 
    1312     if (return_status != FILE_CONT) 
     1396    if (return_status == FILE_ABORT) 
    13131397        return return_status; 
    13141398    if (file_progress_show_deleting (ctx, s) == FILE_ABORT) 
    13151399        return FILE_ABORT; 
    13161400    mc_refresh (); 
    13171401 
    13181402    while (my_rmdir (s)) { 
     1403        if ( ctx->skip_all ) 
     1404            break; 
    13191405        return_status = 
    13201406            file_error (_(" Cannot remove directory \"%s\" \n %s "), s); 
    1321         if (return_status != FILE_RETRY) 
     1407        if (return_status == FILE_RETRY) 
     1408            continue; 
     1409        if (return_status == FILE_ABORT) 
    13221410            return return_status; 
     1411        if (return_status == FILE_SKIPALL) 
     1412            ctx->skip_all = 1; 
     1413        if (return_status == FILE_SKIP); 
     1414        break; 
    13231415    } 
    13241416 
    13251417    return FILE_CONT; 
    real_do_file_error (enum OperationMode m 
    22522344 
    22532345    msg = mode == Foreground ? MSG_ERROR : _(" Background process error "); 
    22542346    result = 
    2255         query_dialog (msg, error, D_ERROR, 3, _("&Skip"), _("&Retry"), 
     2347        query_dialog (msg, error, D_ERROR, 3, _("&Skip"),("Ski&p All"), _("&Retry"), 
    22562348                      _("&Abort")); 
    22572349 
    22582350    switch (result) { 
    real_do_file_error (enum OperationMode m 
    22622354 
    22632355    case 1: 
    22642356        do_refresh (); 
    2265         return FILE_RETRY; 
     2357        return FILE_SKIPALL; 
    22662358 
    22672359    case 2: 
     2360        do_refresh (); 
     2361        return FILE_RETRY; 
     2362 
     2363    case 3: 
    22682364    default: 
    22692365        return FILE_ABORT; 
    22702366    } 
  • src/fileopctx.c

    diff -pruN mc-4.7.0.8-orig/src/fileopctx.c mc-4.7.0.8/src/fileopctx.c
    old new file_op_context_new (FileOperation op) 
    6161    ctx->preserve_uidgid = (geteuid () == 0) ? TRUE : FALSE; 
    6262    ctx->umask_kill = 0777777; 
    6363    ctx->erase_at_end = TRUE; 
    64  
     64    ctx->skip_all = 0; 
    6565    return ctx; 
    6666} 
    6767 
  • src/fileopctx.h

    diff -pruN mc-4.7.0.8-orig/src/fileopctx.h mc-4.7.0.8/src/fileopctx.h
    old new typedef struct FileOpContext { 
    107107 
    108108        /* PID of the child for background operations */ 
    109109        pid_t pid; 
     110         
     111        /* toggle if all errors should be ignored */ 
     112        int skip_all; 
    110113 
    111114        /* User interface data goes here */ 
    112115 
    void file_op_context_destroy (FileOpCont 
    121124extern const char *op_names [3]; 
    122125 
    123126typedef enum { 
    124         FILE_CONT  = 0, 
    125         FILE_RETRY = 1, 
    126         FILE_SKIP  = 2, 
    127         FILE_ABORT = 3 
     127        FILE_CONT    = 0, 
     128        FILE_RETRY   = 1, 
     129        FILE_SKIP    = 2, 
     130        FILE_ABORT   = 3, 
     131        FILE_SKIPALL = 4 
    128132} FileProgressStatus; 
    129133 
    130134typedef enum {