[PATCH] implemented hardlink option in DAV module

Alexey V. Karagodov kav at karagodov.name
Mon Oct 15 12:23:13 UTC 2012


всё остальное в личке ... 
аудитория заскучала ... 

On 15.10.2012, at 16:09, arut at qip.ru wrote:

> On 10/15/2012 04:03 PM, Alexey V. Karagodov wrote:
>> "извините, не узнаю Вас в гриме" :) кстати, а допиливание модуля будет? или плохо со временем? 
> Допиливание там возможно лишь в направлении поддержки локов.
> Основное я уже сделал (бранч locks), но не тестил толком.
> Помимо времени, основная причина в том, что у меня нет мака,
> клиент на котором и есть основной источник и любитель локов.
> Надо искать рабочий хакинтош (под AMD) , ставить.. В общем дело
> долгое. Но, вполне вероятно, я таки заставялю себя это сделать.
> 
>>> Не вижу никаких проблем. Патч касается всего лишь одной
>>> низкоуровневой операции, Внешне ничего не меняется.
>> ок
>> спасибо
>> 
>>> On 10/15/2012 03:46 PM, Alexey V. Karagodov wrote:
>>>> а как оно будет жить вместе со сторонним модулем WebDAV дополняющим функционал штатного?
>>>> https://github.com/arut/nginx-dav-ext-module
>>>> 
>>>> On 15.10.2012, at 15:40, Roman Arutyunyan <arut at qip.ru> wrote:
>>>> 
>>>>> Модуль 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 at nginx.org
>>>>> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>>>> _______________________________________________
>>>> nginx-ru mailing list
>>>> nginx-ru at nginx.org
>>>> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>>> _______________________________________________
>>> nginx-ru mailing list
>>> nginx-ru at nginx.org
>>> http://mailman.nginx.org/mailman/listinfo/nginx-ru
>> _______________________________________________
>> nginx-ru mailing list
>> nginx-ru at nginx.org
>> http://mailman.nginx.org/mailman/listinfo/nginx-ru
> 
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru



Подробная информация о списке рассылки nginx-ru