Hello,

I reworked ftpfs uploading patch and now I invite you to test it
hardly.  There are 3 changed files and one new field (linear) in
vfs_s_super structure.  This flag inform ftpfs_fh_open about ordered
linear transfer in this ftp connection.  Now temporary file is used
only if file is copied over ftpfs from ftp server to the same ftp
server.  I think it is not good idea to open new control connection.


Also this version will be uploaded to

http://www.linux.zp.ua/mc/ftpfs.upload.patch

soon.

In final version I think add some more comments.
Your comments and suggestions are greatly appreshiated.

Regards,
Andrew.
Index: xdirentry.h
===================================================================
RCS file: /cvs/gnome/mc/vfs/xdirentry.h,v
retrieving revision 1.15
diff -u -p -u -p -r1.15 xdirentry.h
--- xdirentry.h 3 Aug 2001 10:15:17 -0000       1.15
+++ xdirentry.h 15 Mar 2002 14:51:13 -0000
@@ -81,6 +81,7 @@ typedef struct vfs_s_super {
     int fd_usage;      /* Number of open files */
     int ino_usage;     /* Usage count of this superblock */
     int want_stale;    /* If set, we do not flush cache properly */
+    int linear;                /* linear transfer is processed now */
 
     union {
        struct {
Index: direntry.c
===================================================================
RCS file: /cvs/gnome/mc/vfs/direntry.c,v
retrieving revision 1.40
diff -u -p -u -p -r1.40 direntry.c
--- direntry.c  6 Mar 2002 08:46:35 -0000       1.40
+++ direntry.c  15 Mar 2002 14:51:18 -0000
@@ -788,6 +788,7 @@ vfs_s_open (vfs *me, char *file, int fla
 
     if (IS_LINEAR(flags)) {
        fh->linear = LS_LINEAR_CLOSED;
+       FH_SUPER->linear = 1;
     } else if ((MEDATA->fh_open) && (MEDATA->fh_open (me, fh, flags, mode))){
            g_free(fh);
            return NULL;
@@ -816,8 +817,10 @@ vfs_s_read (void *fh, char *buffer, int 
     
     if (FH->linear == LS_LINEAR_CLOSED){
         print_vfs_message (_("Starting linear transfer..."));
-       if (!MEDATA->linear_start (me, FH, 0))
+       if (!MEDATA->linear_start (me, FH, 0)){
+           FH_SUPER->linear = 0;
            return -1;
+       }
     }
 
     if (FH->linear == LS_LINEAR_CLOSED)
@@ -906,8 +909,10 @@ vfs_s_close (void *fh)
         vfs_add_noncurrent_stamps (me, (vfsid) (FH_SUPER), parent);
        vfs_rm_parents (parent);
     }
-    if (FH->linear == LS_LINEAR_OPEN)
+    if (FH->linear == LS_LINEAR_OPEN){
        MEDATA->linear_close (me, fh);
+       FH_SUPER->linear = 0;
+    }
     if (MEDATA->fh_close)
        res = MEDATA->fh_close (me, fh);
     if (FH->changed && MEDATA->file_store){
Index: ftpfs.c
===================================================================
RCS file: /cvs/gnome/mc/vfs/ftpfs.c,v
retrieving revision 1.89
diff -u -p -u -p -r1.89 ftpfs.c
--- ftpfs.c     8 Feb 2002 09:42:38 -0000       1.89
+++ ftpfs.c     15 Mar 2002 14:51:54 -0000
@@ -1683,6 +1685,38 @@ static void my_forget (char *file)
 
 static int ftpfs_fh_open (vfs *me, vfs_s_fh *fh, int flags, int mode)
 {
+    if (((flags & O_WRONLY) == O_WRONLY) && !(flags & (O_RDONLY|O_RDWR))){
+#ifdef HAVE_STRUCT_LINGER
+       struct linger li;
+#else
+       int li = 1;
+#endif
+       char * name;
+
+       if (FH_SUPER->linear)
+           return 0;
+       name = vfs_s_fullpath (me, fh->ino);
+       if (!name)
+           return -1;
+       fh->handle = open_data_connection(me, fh->ino->super,
+                   (flags & O_APPEND) ? "APPE" : "STOR", name, TYPE_BINARY, 0);
+       g_free (name);
+
+       if (fh->handle < 0)
+           return -1;
+#ifdef HAVE_STRUCT_LINGER
+       li.l_onoff = 1;
+       li.l_linger = 120;
+#endif
+       setsockopt(fh->handle, SOL_SOCKET, SO_LINGER, &li, sizeof(li));
+
+       if (fh->ino->localname){
+           unlink (fh->ino->localname);
+           g_free (fh->ino->localname);
+           fh->ino->localname = NULL;
+       }
+       return 0;
+    }
     if (!fh->ino->localname)
        if (vfs_s_retrieve_file (me, fh->ino)==-1)
            return -1;
@@ -1691,6 +1725,18 @@ static int ftpfs_fh_open (vfs *me, vfs_s
     return 0;
 }
 
+static int ftpfs_fh_close (vfs *me, vfs_s_fh *fh)
+{
+    if (fh->handle != -1 && !fh->ino->localname){
+       close (fh->handle);
+       fh->handle = -1;
+       fh->changed = 0;
+       if (get_reply (me, fh->ino->SUP.sock, NULL, 0) != COMPLETE)
+           ERRNOR (EIO, -1);
+    }
+    return 0;
+}
+
 static struct vfs_s_data ftp_data = {
     NULL,
     0,
@@ -1707,7 +1753,7 @@ static struct vfs_s_data ftp_data = {
     free_archive,
 
     ftpfs_fh_open, /* fh_open */
-    NULL, /* fh_close */
+    ftpfs_fh_close, /* fh_close */
 
     vfs_s_find_entry_linear,
     dir_load,

Reply via email to