ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] implemented hardlink option in DAV module


  • To: nginx-ru@xxxxxxxxx
  • Subject: [PATCH] implemented hardlink option in DAV module
  • From: Roman Arutyunyan <arut@xxxxxx>
  • Date: Mon, 15 Oct 2012 15:40:44 +0400
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=qip.ru; s=dkim; h=Content-Type:Message-Id:Date:Subject:Cc:To:From; bh=ln7qLIzcDCSLGUL+FHxSDdpJdKp++WOzN1L+llRUlTM=; b=HjN1uszktiiyxP6jQp5cgExuD1ps+URq8xWdeISc6TAzt7X7YXz0E8KyfYRGNiThFKP0OJnzUqL0PXfkxkdh9Jsl1rlPweYJ41x+c6BfBXK6GG3sUjrFP9kF8o5xGfLT;

Модуль WebDAV на текущий момент не поддерживает хардлинки.
Я реализовал эту поддержку, патч прилагается. Буду очень признателен,
если патч будет включен в следующие версии nginx.

Добавлена директива 'hardlink on|off', по умолчанию off.
Когда опция включена, делается попытка создать хардлинк при копировании
файла. В случае ошибки выполняется обычное копирование.

Роман Арутюнян

---
 src/http/modules/ngx_http_dav_module.c |   20 ++++++++++++++++++++
 src/os/unix/ngx_files.h                |    4 ++++
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/src/http/modules/ngx_http_dav_module.c 
b/src/http/modules/ngx_http_dav_module.c
index dbb17ac..e9e0623 100644
--- a/src/http/modules/ngx_http_dav_module.c
+++ b/src/http/modules/ngx_http_dav_module.c
@@ -25,6 +25,7 @@ typedef struct {
     ngx_uint_t  access;
     ngx_uint_t  min_delete_depth;
     ngx_flag_t  create_full_put_path;
+    ngx_flag_t  hardlink;
 } ngx_http_dav_loc_conf_t;
 
 
@@ -106,6 +107,13 @@ static ngx_command_t  ngx_http_dav_commands[] = {
       offsetof(ngx_http_dav_loc_conf_t, access),
       NULL },
 
+    { ngx_string("hardlink"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_dav_loc_conf_t, hardlink),
+      NULL },
+
       ngx_null_command
 };
 
@@ -813,6 +821,15 @@ overwrite_done:
 
         dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module);
 
+        if (dlcf->hardlink) {
+            if (ngx_hardlink_file(path.data, copy.path.data) == NGX_OK) {
+                return NGX_HTTP_NO_CONTENT;
+            }
+
+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, ngx_errno,
+                           "hardlink error: \"%s\"", copy.path.data);
+        }
+
         cf.size = ngx_file_size(&fi);
         cf.buf_size = 0;
         cf.access = dlcf->access;
@@ -1096,6 +1113,7 @@ ngx_http_dav_create_loc_conf(ngx_conf_t *cf)
     conf->min_delete_depth = NGX_CONF_UNSET_UINT;
     conf->access = NGX_CONF_UNSET_UINT;
     conf->create_full_put_path = NGX_CONF_UNSET;
+    conf->hardlink = NGX_CONF_UNSET;
 
     return conf;
 }
@@ -1118,6 +1136,8 @@ ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, void *parent, 
void *child)
     ngx_conf_merge_value(conf->create_full_put_path,
                          prev->create_full_put_path, 0);
 
+    ngx_conf_merge_value(conf->hardlink, prev->hardlink, 0);
+
     return NGX_CONF_OK;
 }
 
diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h
index 9c97e2b..826960b 100644
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -157,6 +157,10 @@ ngx_write_fd(ngx_fd_t fd, void *buf, size_t n)
 #define ngx_rename_file_n        "rename()"
 
 
+#define ngx_hardlink_file(o, n)  link((const char *) o, (const char *) n)
+#define ngx_hardlink_file_n      "link()"
+
+
 #define ngx_change_file_access(n, a) chmod((const char *) n, a)
 #define ngx_change_file_access_n "chmod()"
 
-- 
1.7.1

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.