The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Патч pure-ftpd для обработки докачки после обрыва связи"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [ Отслеживать ]

"Патч pure-ftpd для обработки докачки после обрыва связи"  +/
Сообщение от pentarh email(ok) on 02-Июн-09, 19:29 
В сях не силен, но решения не было найдено, пришлось патчить. Кому интересно...

Патч добавляет опцию -7 к демону pure-ftpd, благодаря которой демон пишет контент передаваемого файла ПРЯМО в файл назначения, а не во временный файл типа ".pureftpd-upload.XXX.YYY.ZZZ". Так же он сохраняет обработку команды APPE.

Благодаря этому становится возможным докачка файла после обрыва связи.

Инструкции

1. Put the patch file into directory with source folder pure-ftpd-1.0.22
2. patch -p0 < pureftpd-1.0.22.patch
3. cd pure-ftpd-1.0.22; ./configure .... and so on

============= CUT pureftpd-1.0.22.patch ====
diff -bBu pure-ftpd-1.0.22/src/ftpd.c pure-ftpd-1.0.22.patched/src/ftpd.c
--- pure-ftpd-1.0.22/src/ftpd.c    2009-04-30 00:51:04.000000000 -0500
+++ pure-ftpd-1.0.22.patched/src/ftpd.c    2009-06-02 08:24:18.000000000 -0500
@@ -3731,7 +3731,9 @@
void delete_atomic_file(void)
{
     const char *atomic_file;
-
+    if ( no_atomic_file == 1 ) {
+    return;
+    }
     if ((atomic_file = get_atomic_file(NULL)) == NULL ||
         *atomic_file == 0) {
         return;
@@ -3757,7 +3759,9 @@
         /* ftruncate+unlink is overkill, but it reduces possible races */
         (void) ftruncate(f, (off_t) 0);
         (void) close(f);
+        if (no_atomic_file != 1) {
         unlink(atomic_file);
+        }
         ret = -1;
     } else {
         (void) close(f);
@@ -3859,17 +3863,28 @@
         goto end;
     }
     if (restartat > (off_t) 0 || (autorename == 0 && no_truncate == 0)) {
+    if (no_atomic_file != 1) {
         if (rename(name, atomic_file) != 0 && errno != ENOENT) {
             error(553, MSG_RENAME_FAILURE);
             atomic_file = NULL;
             goto end;
         }
     }
+    }
+    if (no_atomic_file == 1) {
+    atomic_file = NULL;
+    if ((f = open(name, O_CREAT | O_WRONLY,
+                  (mode_t) 0777 & ~u_mask)) == -1) {
+            error(553, MSG_OPEN_FAILURE2);
+            goto end;
+    }
+    } else {
     if ((f = open(atomic_file, O_CREAT | O_WRONLY,
                   (mode_t) 0777 & ~u_mask)) == -1) {
         error(553, MSG_OPEN_FAILURE2);
         goto end;
     }
+    }
     if (fstat(f, &st) < 0) {
         (void) close(f);
         error(553, MSG_STAT_FAILURE2);
@@ -4079,7 +4094,7 @@
#endif
                     closedata();
                     error(450, MSG_WRITE_FAILED);
-                    if (guest != 0) {
+                    if (guest != 0 && no_atomic_file != 1) {
                         unlinkret = unlink(atomic_file);
                         atomic_file = NULL;
                     }
@@ -4128,6 +4143,7 @@
     if (quota_exceeded == 0)
#endif
     {
+    if (no_atomic_file != 1) {
         if (autorename != 0 && restartat == (off_t) 0) {
             if (tryautorename(atomic_file, name) != 0) {
                 error(553, MSG_RENAME_FAILURE);
@@ -4141,6 +4157,7 @@
                 atomic_file = NULL;
             }
         }
+        }
         displayrate(MSG_UPLOADED, filesize - restartat, started, name, 1);
     }
    
@@ -4150,7 +4167,7 @@
#endif
     ALLOCA_FREE(buf);
     restartat = (off_t) 0;
-    if (atomic_file != NULL) {
+    if (atomic_file != NULL && no_atomic_file != 1) {
         if (rename(atomic_file, name) != 0) {
             error(553, MSG_RENAME_FAILURE);
             unlink(atomic_file);            
@@ -5268,6 +5285,10 @@
             no_ipv4 = 1;
             break;
         }
+        case '7': {
+            no_atomic_file = 1;
+            break;
+        }
#ifdef WITH_RFC2640
         case '8': {
             if ((charset_fs = strdup(optarg)) == NULL) {
diff -bBu pure-ftpd-1.0.22/src/ftpd_p.h pure-ftpd-1.0.22.patched/src/ftpd_p.h
--- pure-ftpd-1.0.22/src/ftpd_p.h    2009-04-30 00:51:04.000000000 -0500
+++ pure-ftpd-1.0.22.patched/src/ftpd_p.h    2009-06-02 09:07:18.000000000 -0500
@@ -60,7 +60,7 @@
};

static const char *GETOPT_OPTIONS =
-    "0146"
+    "01467"
#ifdef WITH_RFC2640
     "8:9:"
#endif
diff -bBu pure-ftpd-1.0.22/src/globals.h pure-ftpd-1.0.22.patched/src/globals.h
--- pure-ftpd-1.0.22/src/globals.h    2009-04-30 00:51:04.000000000 -0500
+++ pure-ftpd-1.0.22.patched/src/globals.h    2009-06-02 08:44:35.000000000 -0500
@@ -15,6 +15,8 @@
GLOBAL0(signed char anon_only);         /* allows only anonymous connections */
GLOBAL0(struct sockaddr_storage *trustedip);  /* IP address accepting non-anonymous connections */
GLOBAL0(volatile signed char logging);
+GLOBAL0(signed char no_atomic_file);   /* Disable upload to atomic file maps to -7 option */
+
#ifdef THROTTLING
GLOBAL0(unsigned long throttling_delay);
GLOBAL0(unsigned long throttling_bandwidth_ul);
@@ -118,6 +120,8 @@
GLOBAL0(char *scoreboardfile);
#endif

+GLOBAL0(signed char no_atomic_file);
+
#if defined(WITH_UPLOAD_SCRIPT)
GLOBAL0(signed char do_upload_script);
GLOBAL(int upload_pipe_fd, -1);
============================================

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Патч pure-ftpd для обработки докачки после обрыва связи"  +/
Сообщение от pentarh email(ok) on 02-Июн-09, 20:16 
Короче сделал нормальный патчер, работает и на линухах и для порта FreeBSD. Смотреть тут:

http://www.pentarh.com/wp/2009/06/02/pure-ftpd-resume-patch/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру