Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2003-11-17 00:49:42 +0300
committerIgor Sysoev <igor@sysoev.ru>2003-11-17 00:49:42 +0300
commitf2e676aa1585de170b39cf3e9d71b88db47e4b1b (patch)
tree3553b3481de51b2321b201ae34024f178af894c1 /src/core/ngx_garbage_collector.c
parent297c0487518d4b974a548dfd3d5d2f10c250177c (diff)
nginx-0.0.1-2003-11-17-00:49:42 import
Diffstat (limited to 'src/core/ngx_garbage_collector.c')
-rw-r--r--src/core/ngx_garbage_collector.c127
1 files changed, 77 insertions, 50 deletions
diff --git a/src/core/ngx_garbage_collector.c b/src/core/ngx_garbage_collector.c
index ae6fab420..087b0ad0c 100644
--- a/src/core/ngx_garbage_collector.c
+++ b/src/core/ngx_garbage_collector.c
@@ -6,7 +6,11 @@
typedef struct ngx_gc_s ngx_gc_t;
typedef int (*ngx_gc_handler_pt) (ngx_gc_t *ctx, ngx_str_t *name,
- ngx_file_info_t *fi);
+ ngx_dir_t *dir);
+
+
+static int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
+ ngx_dir_t *dir);
struct ngx_gc_s {
ngx_path_t *path;
@@ -78,6 +82,7 @@ void stub_init(ngx_log_t *log)
ctx->path = &path;
ctx->log = log;
+ ctx->handler = ngx_garbage_collector_temp_handler;
ngx_collect_garbage(ctx, &path.name, 0);
}
@@ -85,76 +90,85 @@ void stub_init(ngx_log_t *log)
static int ngx_collect_garbage(ngx_gc_t *ctx, ngx_str_t *dname, int level)
{
- int nlen;
- char *last;
- ngx_str_t fname;
- ngx_dir_t *dir;
- ngx_dirent_t *de;
- ngx_file_info_t fi;
-
- fname.len = 0;
+ int rc, len;
+ char *last;
+ ngx_err_t err;
+ ngx_str_t fname, buf;
+ ngx_dir_t dir;
-ngx_log_debug(ctx->log, "dir %s" _ dname->data);
+ buf.len = 0;
- dir = ngx_open_dir(dname->data);
+ngx_log_debug(ctx->log, "dir '%s':%d" _ dname->data _ dname->len);
- if (dir == NULL) {
- ngx_log_error(NGX_LOG_ERR, ctx->log, ngx_errno,
- ngx_open_dir_n " \"%s\" failed", dname->data);
+ if (ngx_open_dir(dname, &dir) == NGX_ERROR) {
+ ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
+ ngx_open_dir_n " \"%s\" failed", dname->data);
return NGX_ERROR;
}
for ( ;; ) {
- de = ngx_read_dir(dir);
+ ngx_set_errno(0);
+ if (ngx_read_dir(&dir) == NGX_ERROR) {
+ err = ngx_errno;
+
+ if (err != NGX_ENOMOREFILES) {
+ ngx_log_error(NGX_LOG_CRIT, ctx->log, err,
+ ngx_read_dir_n " \"%s\" failed", dname->data);
+ rc = NGX_ERROR;
- if (de == NULL) {
- if (fname.len) {
- ngx_free(fname.data);
+ } else {
+ rc = NGX_OK;
}
+
break;
}
-ngx_log_debug(ctx->log, "file %s" _ de->d_name);
+ len = ngx_de_namelen(&dir);
-#ifdef __FreeBSD__
- nlen = de->d_namlen;
-#else
- nlen = ngx_strlen(de->d_name);
-#endif
+ngx_log_debug(ctx->log, "name '%s':%d" _ ngx_de_name(&dir) _ len);
- if (nlen == 1 && de->d_name[0] == '.') {
+ if (len == 1 && ngx_de_name(&dir)[0] == '.') {
continue;
}
- if (nlen == 2 && de->d_name[0] == '.' && de->d_name[1] == '.') {
+ if (len == 2
+ && ngx_de_name(&dir)[0] == '.'
+ && ngx_de_name(&dir)[1] == '.')
+ {
continue;
}
- if (dname->len + 1 + nlen > fname.len) {
- if (fname.len) {
- ngx_free(fname.data);
+ fname.len = dname->len + 1+ len;
+
+ if (fname.len + NGX_DIR_MASK_LEN > buf.len) {
+
+ if (buf.len) {
+ ngx_free(buf.data);
}
- fname.len = dname->len + 1 + nlen;
+ buf.len = dname->len + 1 + len + NGX_DIR_MASK_LEN;
- if (!(fname.data = ngx_alloc(fname.len + 1, ctx->log))) {
+ if (!(buf.data = ngx_alloc(buf.len + 1, ctx->log))) {
return NGX_ABORT;
}
}
- last = ngx_cpymem(fname.data, dname->data, dname->len);
+ last = ngx_cpymem(buf.data, dname->data, dname->len);
*last++ = '/';
- ngx_memcpy(last, de->d_name, nlen + 1);
+ ngx_memcpy(last, ngx_de_name(&dir), len + 1);
+ fname.data = buf.data;
-ngx_log_debug(ctx->log, "de %s" _ fname.data);
+ngx_log_debug(ctx->log, "path %s" _ fname.data);
- if (ngx_file_type(fname.data, &fi) == NGX_FILE_ERROR) {
- ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
- ngx_file_type_n " \"%s\" failed", fname.data);
- continue;
+ if (!dir.info_valid) {
+ if (ngx_de_info(fname.data, &dir) == NGX_FILE_ERROR) {
+ ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
+ ngx_de_info_n " \"%s\" failed", fname.data);
+ continue;
+ }
}
- if (ngx_is_dir((&fi))) {
+ if (ngx_de_is_dir(&dir)) {
ngx_log_debug(ctx->log, "enter %s" _ fname.data);
@@ -162,12 +176,14 @@ ngx_log_debug(ctx->log, "enter %s" _ fname.data);
/* there can not be directory on the last level */
|| level == NGX_MAX_PATH_LEVEL
/* an directory from the old path hierarchy */
- || nlen != ctx->path->level[level])
+ || len != ctx->path->level[level])
{
if (ngx_collect_garbage(ctx, &fname, -1) == NGX_ABORT) {
return NGX_ABORT;
}
+ fname.data[fname.len] = '\0';
+
ngx_log_error(NGX_LOG_NOTICE, ctx->log, 0,
"delete old hierachy directory \"%s\"",
fname.data);
@@ -178,7 +194,7 @@ ngx_log_debug(ctx->log, "enter %s" _ fname.data);
fname.data);
} else {
ctx->deleted++;
- ctx->freed += ngx_file_size((&fi));
+ ctx->freed += ngx_de_size(&dir);
}
continue;
@@ -188,7 +204,9 @@ ngx_log_debug(ctx->log, "enter %s" _ fname.data);
return NGX_ABORT;
}
- } else if (ngx_is_file((&fi))) {
+ } else if (ngx_de_is_file(&dir)) {
+
+ngx_log_debug(ctx->log, "file %s" _ fname.data);
if (level == -1
|| (level < NGX_MAX_PATH_LEVEL && ctx->path->level[level] != 0))
@@ -199,13 +217,13 @@ ngx_log_debug(ctx->log, "enter %s" _ fname.data);
fname.data);
} else {
ctx->deleted++;
- ctx->freed += ngx_file_size((&fi));
+ ctx->freed += ngx_de_size(&dir);
}
continue;
}
- if (ctx->handler(ctx, &fname, &fi) == NGX_ABORT) {
+ if (ctx->handler(ctx, &fname, &dir) == NGX_ABORT) {
return NGX_ABORT;
}
@@ -218,17 +236,26 @@ ngx_log_debug(ctx->log, "enter %s" _ fname.data);
ngx_delete_file_n " \"%s\" failed", fname.data);
} else {
ctx->deleted++;
- ctx->freed += ngx_file_size((&fi));
+ ctx->freed += ngx_de_size(&dir);
}
}
}
- return NGX_OK;
+ if (buf.len) {
+ ngx_free(buf.data);
+ }
+
+ if (ngx_close_dir(&dir) == NGX_ERROR) {
+ ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,
+ ngx_close_dir_n " \"%s\" failed", fname.data);
+ }
+
+ return rc;
}
-int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
- ngx_file_info_t *fi)
+static int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
+ ngx_dir_t *dir)
{
/*
* we use mtime only and do not use atime because:
@@ -237,7 +264,7 @@ int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
* Unices have mount option "noatime"
*/
- if (ngx_cached_time - ngx_file_mtime(fi) < 3600) {
+ if (ngx_cached_time - ngx_de_mtime(dir) < 3600) {
return NGX_OK;
}
@@ -251,6 +278,6 @@ int ngx_garbage_collector_temp_handler(ngx_gc_t *ctx, ngx_str_t *name,
}
ctx->deleted++;
- ctx->freed += ngx_file_size(fi);
+ ctx->freed += ngx_de_size(dir);
return NGX_OK;
}