00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "includes.h"
00022
00023
00024
00025
00026
00027 static SMB_BIG_UINT adjust_blocks(SMB_BIG_UINT blocks, SMB_BIG_UINT fromsize, SMB_BIG_UINT tosize)
00028 {
00029 if (fromsize == tosize) {
00030 return blocks;
00031 } else if (fromsize > tosize) {
00032 return blocks * (fromsize / tosize);
00033 } else {
00034
00035 if (fromsize == 0) {
00036 fromsize = tosize;
00037 }
00038 return (blocks + 1) / (tosize / fromsize);
00039 }
00040 }
00041
00042
00043
00044
00045
00046
00047
00048 int sys_fsusage(const char *path, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
00049 {
00050 #ifdef STAT_STATFS3_OSF1
00051 #define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_fsize, (SMB_BIG_UINT)512)
00052 struct statfs fsd;
00053
00054 if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
00055 return -1;
00056 #endif
00057
00058 #ifdef STAT_STATFS2_FS_DATA
00059 #define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)1024, (SMB_BIG_UINT)512)
00060 struct fs_data fsd;
00061
00062 if (statfs (path, &fsd) != 1)
00063 return -1;
00064
00065 (*dsize) = CONVERT_BLOCKS (fsd.fd_req.btot);
00066 (*dfree) = CONVERT_BLOCKS (fsd.fd_req.bfreen);
00067 #endif
00068
00069 #ifdef STAT_STATFS2_BSIZE
00070 #define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_bsize, (SMB_BIG_UINT)512)
00071 struct statfs fsd;
00072
00073 if (statfs (path, &fsd) < 0)
00074 return -1;
00075
00076 #ifdef STATFS_TRUNCATES_BLOCK_COUNTS
00077
00078
00079
00080
00081
00082 if (fsd.f_blocks == 0x1fffff && fsd.f_spare[0] > 0) {
00083 fsd.f_blocks = fsd.f_spare[0];
00084 fsd.f_bfree = fsd.f_spare[1];
00085 fsd.f_bavail = fsd.f_spare[2];
00086 }
00087 #endif
00088 #endif
00089
00090
00091 #ifdef STAT_STATFS2_FSIZE
00092 #define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_fsize, (SMB_BIG_UINT)512)
00093
00094 struct statfs fsd;
00095
00096 if (statfs (path, &fsd) < 0)
00097 return -1;
00098 #endif
00099
00100 #ifdef STAT_STATFS4
00101 # if _AIX || defined(_CRAY)
00102 # define CONVERT_BLOCKS(B) adjust_blocks ((SMB_BIG_UINT)(B), (SMB_BIG_UINT)fsd.f_bsize, (SMB_BIG_UINT)512)
00103 # ifdef _CRAY
00104 # define f_bavail f_bfree
00105 # endif
00106 # else
00107 # define CONVERT_BLOCKS(B) ((SMB_BIG_UINT)B)
00108 # ifndef _SEQUENT_
00109 # ifndef DOLPHIN
00110 # define f_bavail f_bfree
00111 # endif
00112 # endif
00113 # endif
00114
00115 struct statfs fsd;
00116
00117 if (statfs (path, &fsd, sizeof fsd, 0) < 0)
00118 return -1;
00119
00120
00121
00122
00123 #endif
00124
00125 #if defined(STAT_STATVFS) || defined(STAT_STATVFS64)
00126 # define CONVERT_BLOCKS(B) \
00127 adjust_blocks ((SMB_BIG_UINT)(B), fsd.f_frsize ? (SMB_BIG_UINT)fsd.f_frsize : (SMB_BIG_UINT)fsd.f_bsize, (SMB_BIG_UINT)512)
00128
00129 #ifdef STAT_STATVFS64
00130 struct statvfs64 fsd;
00131 if (statvfs64(path, &fsd) < 0) return -1;
00132 #else
00133 struct statvfs fsd;
00134 if (statvfs(path, &fsd) < 0) return -1;
00135 #endif
00136
00137
00138
00139 #endif
00140
00141 #ifndef CONVERT_BLOCKS
00142
00143 return -1;
00144 #else
00145 #if !defined(STAT_STATFS2_FS_DATA)
00146
00147 (*dsize) = CONVERT_BLOCKS (fsd.f_blocks);
00148 (*dfree) = CONVERT_BLOCKS (fsd.f_bavail);
00149 #endif
00150 #endif
00151
00152 return 0;
00153 }