Hi,

this patch adds an ability to seek in linear files before the first read
operation. It is achieved by postponing the actual opening to
linear_read() call. The main reason of this is to make ftpfs' reget
function work again.

Modification for fish to work with this change, and a minor fix of the
ftpfs copy status display is included.

Regards,
-- 
Jindrich Makovicka
Index: vfs/direntry.c
===================================================================
RCS file: /cvsroot/mc/mc/vfs/direntry.c,v
retrieving revision 1.116
diff -u -r1.116 direntry.c
--- vfs/direntry.c      22 Feb 2005 18:35:23 -0000      1.116
+++ vfs/direntry.c      14 May 2005 18:19:39 -0000
@@ -779,10 +779,7 @@
     if (IS_LINEAR (flags)) {
        if (MEDATA->linear_start) {
            print_vfs_message (_("Starting linear transfer..."));
-           if (!MEDATA->linear_start (me, fh, 0)) {
-               g_free (fh);
-               return NULL;
-           }
+           fh->linear = LS_LINEAR_PREOPEN;
        }
     } else if ((MEDATA->fh_open)
               && (MEDATA->fh_open (me, fh, flags, mode))) {
@@ -811,6 +808,13 @@
     int n;
     struct vfs_class *me = FH_SUPER->me;
 
+    if (FH->linear == LS_LINEAR_PREOPEN) {
+       if (!MEDATA->linear_start) return -1;
+       if (!MEDATA->linear_start (me, FH, FH->pos)) {
+           return -1;
+       }
+    }
+
     if (FH->linear == LS_LINEAR_CLOSED)
         vfs_die ("linear_start() did not set linear_state!");
 
@@ -852,6 +856,9 @@
 {
     off_t size = FH->ino->st.st_size;
 
+    if (FH->linear == LS_LINEAR_OPEN)
+        vfs_die ("cannot lseek() after linear_read!");
+
     if (FH->handle != -1){     /* If we have local file opened, we want to 
work with it */
        int retval = lseek (FH->handle, offset, whence);
        if (retval == -1)
Index: vfs/fish.c
===================================================================
RCS file: /cvsroot/mc/mc/vfs/fish.c,v
retrieving revision 1.103
diff -u -r1.103 fish.c
--- vfs/fish.c  22 Feb 2005 18:38:58 -0000      1.103
+++ vfs/fish.c  14 May 2005 18:19:39 -0000
@@ -682,7 +682,7 @@
 
                if (!FH->linear)
                    vfs_die ("You may not do this");
-               if (FH->linear == LS_LINEAR_CLOSED)
+               if (FH->linear == LS_LINEAR_CLOSED || FH->linear == 
LS_LINEAR_PREOPEN)
                    return 0;
 
                v = vfs_s_select_on_two (FH_SUPER->u.fish.sockr, 0);
Index: vfs/ftpfs.c
===================================================================
RCS file: /cvsroot/mc/mc/vfs/ftpfs.c,v
retrieving revision 1.177
diff -u -r1.177 ftpfs.c
--- vfs/ftpfs.c 13 May 2005 20:32:10 -0000      1.177
+++ vfs/ftpfs.c 14 May 2005 18:19:39 -0000
@@ -1444,7 +1444,7 @@
                
                if (!FH->linear)
                    vfs_die ("You may not do this");
-               if (FH->linear == LS_LINEAR_CLOSED)
+               if (FH->linear == LS_LINEAR_CLOSED || FH->linear == 
LS_LINEAR_PREOPEN)
                    return 0;
 
                v = vfs_s_select_on_two (FH->u.ftp.sock, 0);
Index: vfs/xdirentry.h
===================================================================
RCS file: /cvsroot/mc/mc/vfs/xdirentry.h,v
retrieving revision 1.51
diff -u -r1.51 xdirentry.h
--- vfs/xdirentry.h     18 Feb 2005 21:15:37 -0000      1.51
+++ vfs/xdirentry.h     14 May 2005 18:19:39 -0000
@@ -202,6 +202,7 @@
 
 #define LS_NOT_LINEAR 0
 #define LS_LINEAR_CLOSED 1
-#define LS_LINEAR_OPEN 2
+#define LS_LINEAR_PREOPEN 2
+#define LS_LINEAR_OPEN 3
 
 #endif
Index: src/file.c
===================================================================
RCS file: /cvsroot/mc/mc/src/file.c,v
retrieving revision 1.140
diff -u -r1.140 file.c
--- src/file.c  11 May 2005 01:16:59 -0000      1.140
+++ src/file.c  14 May 2005 18:19:39 -0000
@@ -737,10 +737,10 @@
 
            file_progress_set_stalled_label (ctx, stalled_msg);
            return_status = file_progress_show_bytes (ctx, *progress_bytes +
-                   n_read_total, ctx->progress_bytes);
+                   n_read_total + ctx->do_reget, ctx->progress_bytes);
            if (return_status == FILE_CONT) {
                return_status =
-                   file_progress_show (ctx, n_read_total, file_size);
+                   file_progress_show (ctx, n_read_total + ctx->do_reget, 
file_size);
            }
            mc_refresh ();
            if (return_status != FILE_CONT)
_______________________________________________
Mc-devel mailing list
http://mail.gnome.org/mailman/listinfo/mc-devel

Reply via email to