view src/core/ngx_file.h @ 9230:e14debe728b0 radix_with_skip

Closed the radix_with_skip branch. The radix_with_skip branch is an archive of an experiment did in 2008, and it is no longer relevant. It is now closed to avoid cluttering of the branches list. If needed, closed branches still can be seen with "hg branches --closed".
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 23 Mar 2024 04:30:45 +0300
parents 8564129d49b6
children dbe746851b31
line wrap: on
line source


/*
 * Copyright (C) Igor Sysoev
 */


#ifndef _NGX_FILE_H_INCLUDED_
#define _NGX_FILE_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>

typedef struct ngx_path_s  ngx_path_t;

#include <ngx_garbage_collector.h>


struct ngx_file_s {
    ngx_fd_t            fd;
    ngx_str_t           name;
    ngx_file_info_t     info;

    off_t               offset;
    off_t               sys_offset;

    ngx_log_t          *log;

    unsigned            valid_info:1;
    unsigned            directio:1;
};

#define NGX_MAX_PATH_LEVEL  3

struct ngx_path_s {
    ngx_str_t           name;
    size_t              len;
    size_t              level[3];
    ngx_gc_handler_pt   cleaner;

    u_char             *conf_file;
    ngx_uint_t          line;
};


typedef struct {
    ngx_file_t          file;
    off_t               offset;
    ngx_path_t         *path;
    ngx_pool_t         *pool;
    char               *warn;

    ngx_uint_t          access;

    unsigned            log_level:8;
    unsigned            persistent:1;
    unsigned            clean:1;
} ngx_temp_file_t;


typedef struct {
    ngx_uint_t          access;
    time_t              time;
    ngx_fd_t            fd;

    unsigned            create_path:1;
    unsigned            delete_file:1;

    ngx_log_t          *log;
} ngx_ext_rename_file_t;


typedef struct ngx_tree_ctx_s  ngx_tree_ctx_t;

typedef ngx_int_t (*ngx_tree_init_handler_pt) (void *ctx, void *prev);
typedef ngx_int_t (*ngx_tree_handler_pt) (ngx_tree_ctx_t *ctx, ngx_str_t *name);

struct ngx_tree_ctx_s {
    off_t                      size;
    ngx_uint_t                 access;
    time_t                     mtime;

    ngx_tree_init_handler_pt   init_handler;
    ngx_tree_handler_pt        file_handler;
    ngx_tree_handler_pt        pre_tree_handler;
    ngx_tree_handler_pt        post_tree_handler;
    ngx_tree_handler_pt        spec_handler;

    void                      *data;
    size_t                     alloc;

    ngx_log_t                 *log;
};


ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain);
ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path,
    ngx_pool_t *pool, ngx_uint_t persistent, ngx_uint_t clean,
    ngx_uint_t access);
void ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len);
ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path);
ngx_err_t ngx_create_full_path(u_char *dir, ngx_uint_t access);
ngx_int_t ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot);
ngx_int_t ngx_create_pathes(ngx_cycle_t *cycle, ngx_uid_t user);
ngx_int_t ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to,
    ngx_ext_rename_file_t *ext);
ngx_int_t ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree);

void ngx_init_temp_number(void);
ngx_atomic_uint_t ngx_next_temp_number(ngx_uint_t collision);

char *ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
char *ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);


#define ngx_conf_merge_path_value(curr, prev, path, l1, l2, l3, clean, cf)    \
    if (curr == NULL) {                                                       \
        if (prev == NULL) {                                                   \
            curr = ngx_palloc(cf->pool, sizeof(ngx_path_t));                  \
            if (curr == NULL) {                                               \
                return NGX_CONF_ERROR;                                        \
            }                                                                 \
                                                                              \
            curr->name.len = sizeof(path) - 1;                                \
            curr->name.data = (u_char *) path;                                \
                                                                              \
            if (ngx_conf_full_name(cf->cycle, &curr->name, 0) == NGX_ERROR) { \
                return NGX_CONF_ERROR;                                        \
            }                                                                 \
                                                                              \
            curr->level[0] = l1;                                              \
            curr->level[1] = l2;                                              \
            curr->level[2] = l3;                                              \
            curr->len = l1 + l2 + l3 + (l1 ? 1:0) + (l2 ? 1:0) + (l3 ? 1:0);  \
            curr->cleaner = clean;                                            \
            curr->conf_file = NULL;                                           \
                                                                              \
            if (ngx_add_path(cf, &curr) == NGX_ERROR) {                       \
                return NGX_CONF_ERROR;                                        \
            }                                                                 \
                                                                              \
        } else {                                                              \
            curr = prev;                                                      \
        }                                                                     \
    }



#endif /* _NGX_FILE_H_INCLUDED_ */