Ticket #2829: fix_nospace.patch

File fix_nospace.patch, 2.8 KB (added by onlyjob, 12 years ago)

patch for 4.8.3

  • src/filemanager/file.c

    Last-Update: 2012-06-24
    Applied-Upstream: 4.8.4
    Bug-MC: https://www.midnight-commander.org/ticket/2829
    Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=677038
    Description: backported fix for 'Loss of data on copy to full partition'
    
    a b  
    14041404    int open_flags; 
    14051405    gboolean is_first_time = TRUE; 
    14061406    vfs_path_t *src_vpath = NULL, *dst_vpath = NULL; 
     1407    gboolean write_errno_nospace = FALSE; 
    14071408 
    14081409    /* FIXME: We should not be using global variables! */ 
    14091410    ctx->do_reget = 0; 
     
    17261727                gettimeofday (&tv_last_input, NULL); 
    17271728 
    17281729                /* dst_write */ 
    1729                 while ((n_written = mc_write (dest_desc, t, n_read)) < n_read && !ctx->skip_all) 
     1730                while ((n_written = mc_write (dest_desc, t, n_read)) < n_read) 
    17301731                { 
    17311732                    if (n_written > 0) 
    17321733                    { 
     
    17341735                        t += n_written; 
    17351736                        continue; 
    17361737                    } 
    1737                     return_status = file_error (_("Cannot write target file \"%s\"\n%s"), dst_path); 
     1738 
     1739                    write_errno_nospace = (n_written < 0 && errno == ENOSPC); 
     1740 
     1741                    if (ctx->skip_all) 
     1742                        return_status = FILE_SKIPALL; 
     1743                    else 
     1744                        return_status = 
     1745                            file_error (_("Cannot write target file \"%s\"\n%s"), dst_path); 
     1746 
    17381747                    if (return_status == FILE_SKIP) 
     1748                    { 
     1749                        if (write_errno_nospace) 
     1750                            goto ret; 
    17391751                        break; 
     1752                    } 
    17401753                    if (return_status == FILE_SKIPALL) 
     1754                    { 
    17411755                        ctx->skip_all = TRUE; 
     1756                        if (write_errno_nospace) 
     1757                            goto ret; 
     1758                    } 
    17421759                    if (return_status != FILE_RETRY) 
    17431760                        goto ret; 
    17441761                } 
     
    18191836    if (dst_status == DEST_SHORT) 
    18201837    { 
    18211838        /* Remove short file */ 
    1822         int result; 
     1839        int result = 0; 
    18231840 
    1824         result = query_dialog (Q_ ("DialogTitle|Copy"), 
    1825                                _("Incomplete file was retrieved. Keep it?"), 
    1826                                D_ERROR, 2, _("&Delete"), _("&Keep")); 
     1841        /* In case of copy/move to full partition, keep source file 
     1842         * and remove incomplete destination one */ 
     1843        if (!write_errno_nospace) 
     1844            result = query_dialog (Q_ ("DialogTitle|Copy"), 
     1845                                   _("Incomplete file was retrieved. Keep it?"), 
     1846                                   D_ERROR, 2, _("&Delete"), _("&Keep")); 
    18271847        if (result == 0) 
    18281848            mc_unlink (dst_vpath); 
    18291849    }