diff options
author | Igor Sysoev <igor@sysoev.ru> | 2009-03-30 11:43:06 +0400 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2009-03-30 11:43:06 +0400 |
commit | 1be7419d10a4c2226783f280af9e2aa7ff48b738 (patch) | |
tree | ab1c63ea9b9edb9c1eddcc93c5c572230694ce4e | |
parent | a1e9bfbc859490e25f4fff07ddc5441c9a91abcc (diff) |
ngx_fs_bsize()
-rw-r--r-- | auto/headers | 12 | ||||
-rw-r--r-- | auto/os/features | 24 | ||||
-rw-r--r-- | auto/os/linux | 3 | ||||
-rw-r--r-- | src/os/unix/ngx_files.c | 47 | ||||
-rw-r--r-- | src/os/unix/ngx_files.h | 3 | ||||
-rw-r--r-- | src/os/unix/ngx_freebsd_config.h | 1 | ||||
-rw-r--r-- | src/os/unix/ngx_linux_config.h | 1 | ||||
-rw-r--r-- | src/os/unix/ngx_posix_config.h | 6 | ||||
-rw-r--r-- | src/os/unix/ngx_solaris_config.h | 1 | ||||
-rw-r--r-- | src/os/win32/ngx_files.c | 20 | ||||
-rw-r--r-- | src/os/win32/ngx_files.h | 2 |
11 files changed, 115 insertions, 5 deletions
diff --git a/auto/headers b/auto/headers index 542b757c1..cdd5d294b 100644 --- a/auto/headers +++ b/auto/headers @@ -2,8 +2,10 @@ # Copyright (C) Igor Sysoev -ngx_include="unistd.h"; . auto/include -ngx_include="inttypes.h"; . auto/include -ngx_include="limits.h"; . auto/include -ngx_include="sys/filio.h"; . auto/include -ngx_include="crypt.h"; . auto/include +ngx_include="unistd.h"; . auto/include +ngx_include="inttypes.h"; . auto/include +ngx_include="limits.h"; . auto/include +ngx_include="sys/filio.h"; . auto/include +ngx_include="sys/mount.h"; . auto/include +ngx_include="sys/statvfs.h"; . auto/include +ngx_include="crypt.h"; . auto/include diff --git a/auto/os/features b/auto/os/features index ecb210da6..f00663c88 100644 --- a/auto/os/features +++ b/auto/os/features @@ -205,3 +205,27 @@ ngx_feature_path= ngx_feature_libs= ngx_feature_test="directio(0, DIRECTIO_ON);" . auto/feature + + +ngx_feature="statfs()" +ngx_feature_name="NGX_HAVE_STATFS" +ngx_feature_run=no +ngx_feature_incs="$NGX_INCLUDE_SYS_MOUNT_H + $NGX_INCLUDE_SYS_VFS_H" +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct statfs fs; + statfs(NULL, &fs);" +. auto/feature + + +ngx_feature="statvfs()" +ngx_feature_name="NGX_HAVE_STATVFS" +ngx_feature_run=no +ngx_feature_incs="#include <sys/types.h> + #include <sys/statvfs.h>" +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct statvfs fs; + statvfs(NULL, &fs);" +. auto/feature diff --git a/auto/os/linux b/auto/os/linux index 698886fa8..43ff3c9e2 100644 --- a/auto/os/linux +++ b/auto/os/linux @@ -124,4 +124,7 @@ ngx_feature_test="long mask = 0; . auto/feature +ngx_include="sys/vfs.h"; . auto/include + + CC_AUX_FLAGS=$cc_aux_flags diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c index 1203989b6..98ed08229 100644 --- a/src/os/unix/ngx_files.c +++ b/src/os/unix/ngx_files.c @@ -416,3 +416,50 @@ ngx_directio_off(ngx_fd_t fd) } #endif + + +#if (NGX_HAVE_STATFS) + +size_t +ngx_fs_bsize(u_char *name) +{ + struct statfs fs; + + if (statfs((char *) name, &fs) == -1) { + return 512; + } + + if ((fs.f_bsize % 512) != 0) { + return 512; + } + + return (size_t) fs.f_bsize; +} + +#elif (NGX_HAVE_STATVFS) + +size_t +ngx_fs_bsize(u_char *name) +{ + struct statvfs fs; + + if (statvfs((char *) name, &fs) == -1) { + return 512; + } + + if ((fs.f_frsize % 512) != 0) { + return 512; + } + + return (size_t) fs.f_frsize; +} + +#else + +size_t +ngx_fs_bsize(u_char *name) +{ + return 512; +} + +#endif diff --git a/src/os/unix/ngx_files.h b/src/os/unix/ngx_files.h index 21e5ff45c..dcd14c35f 100644 --- a/src/os/unix/ngx_files.h +++ b/src/os/unix/ngx_files.h @@ -274,4 +274,7 @@ ngx_int_t ngx_directio_off(ngx_fd_t fd); #endif +size_t ngx_fs_bsize(u_char *name); + + #endif /* _NGX_FILES_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_freebsd_config.h b/src/os/unix/ngx_freebsd_config.h index 24dcdcb46..377148602 100644 --- a/src/os/unix/ngx_freebsd_config.h +++ b/src/os/unix/ngx_freebsd_config.h @@ -22,6 +22,7 @@ #include <grp.h> #include <dirent.h> #include <glob.h> +#include <sys/mount.h> /* statfs() */ #include <sys/filio.h> /* FIONBIO */ #include <sys/uio.h> diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index bf2eae892..abeda08af 100644 --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -28,6 +28,7 @@ #include <grp.h> #include <dirent.h> #include <glob.h> +#include <sys/vfs.h> /* statfs() */ #include <sys/uio.h> #include <sys/stat.h> diff --git a/src/os/unix/ngx_posix_config.h b/src/os/unix/ngx_posix_config.h index ec7ee944f..152e23238 100644 --- a/src/os/unix/ngx_posix_config.h +++ b/src/os/unix/ngx_posix_config.h @@ -44,6 +44,12 @@ #include <grp.h> #include <dirent.h> #include <glob.h> +#if (NGX_HAVE_SYS_MOUNT_H) +#include <sys/mount.h> /* statfs() */ +#endif +#if (NGX_HAVE_SYS_STATVFS_H) +#include <sys/statvfs.h> /* statvfs() */ +#endif #if (NGX_HAVE_SYS_FILIO_H) #include <sys/filio.h> /* FIONBIO */ diff --git a/src/os/unix/ngx_solaris_config.h b/src/os/unix/ngx_solaris_config.h index 989a30e2c..663f26570 100644 --- a/src/os/unix/ngx_solaris_config.h +++ b/src/os/unix/ngx_solaris_config.h @@ -28,6 +28,7 @@ #include <grp.h> #include <dirent.h> #include <glob.h> +#include <sys/statvfs.h> /* statvfs() */ #include <sys/filio.h> /* FIONBIO */ #include <sys/uio.h> diff --git a/src/os/win32/ngx_files.c b/src/os/win32/ngx_files.c index eff843ab7..afe31b9a0 100644 --- a/src/os/win32/ngx_files.c +++ b/src/os/win32/ngx_files.c @@ -504,8 +504,28 @@ ngx_directio_on(ngx_fd_t fd) return 0; } + ngx_int_t ngx_directio_off(ngx_fd_t fd) { return 0; } + + +size_t +ngx_fs_bsize(u_char *name) +{ + u_char root[4]; + u_long sc, bs, nfree, ncl; + + if (name[2] == ':') { + ngx_cpystrn(root, name, 4); + name = root; + } + + if (GetDiskFreeSpace((const char *) name, &sc, &bs, &nfree, &ncl) == 0) { + return 512; + } + + return sc * bs; +} diff --git a/src/os/win32/ngx_files.h b/src/os/win32/ngx_files.h index b8487920f..47a76611b 100644 --- a/src/os/win32/ngx_files.h +++ b/src/os/win32/ngx_files.h @@ -243,5 +243,7 @@ ngx_int_t ngx_directio_on(ngx_fd_t fd); ngx_int_t ngx_directio_off(ngx_fd_t fd); #define ngx_directio_off_n "ngx_directio_off_n" +size_t ngx_fs_bsize(u_char *name); + #endif /* _NGX_FILES_H_INCLUDED_ */ |