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