diff src/core/ngx_garbage_collector.c @ 186:c1f3a3c7c5db

nginx-0.0.1-2003-11-17-00:49:42 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 16 Nov 2003 21:49:42 +0000
parents d5f50cefc322
children 02a715e85df1
line wrap: on
line diff
--- 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;
+    int         rc, len;
+    char       *last;
+    ngx_err_t   err;
+    ngx_str_t   fname, buf;
+    ngx_dir_t   dir;
 
-    fname.len = 0;
+    buf.len = 0;
 
-ngx_log_debug(ctx->log, "dir %s" _ dname->data);
+ngx_log_debug(ctx->log, "dir '%s':%d" _ dname->data _ dname->len);
 
-    dir = ngx_open_dir(dname->data);
-
-    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 (de == NULL) {
-            if (fname.len) {
-                ngx_free(fname.data);
+            if (err != NGX_ENOMOREFILES) {
+                ngx_log_error(NGX_LOG_CRIT, ctx->log, err,
+                              ngx_read_dir_n " \"%s\" failed", dname->data);
+                rc = NGX_ERROR;
+
+            } 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, "path %s" _ fname.data);
 
-ngx_log_debug(ctx->log, "de %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" _ fna
                    /* 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" _ fna
                                   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" _ fna
                 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" _ fna
                                   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" _ fna
                               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(n
      *    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(n
     }
 
     ctx->deleted++;
-    ctx->freed += ngx_file_size(fi);
+    ctx->freed += ngx_de_size(dir);
     return NGX_OK;
 }