/**************************************************************** * * * Copyright 2001, 2009 Fidelity Information Services, Inc * * * * This source code contains the intellectual property * * of its copyright holder(s), and is made available * * under a license. If you do not know the terms of * * the license, please stop and do not read further. * * * ****************************************************************/ /* disk_block_available(int fd, int4 *ret, booleat_t fill_unix_holes) * parameter: * fd: file descriptor of the file that is located * on the disk being examined * *ret: address to put the number of available blocks * fill_unix_holes * TRUE ==> the calculation takes the * hole in this file into consideration * FALSE ==> plain system service * return: * 0: upon successful completion, the number of available * blocks is put to ret. * errno: as to why the request failed. * note that DISK_BLOCK_SIZE is used here instead of GDS_BLOCK_SIZE, * this is due to the intension to make this routine more general */ #include "mdef.h" #include #include "gtm_unistd.h" #include "gtm_stat.h" #include "gtm_statvfs.h" #ifndef __MVS__ #if !defined(sun) && !defined(__CYGWIN__) #include #endif #include #else #define DEV_BSIZE fstat_buf.st_blksize #endif #include "eintr_wrappers.h" #include "disk_block_available.h" int4 disk_block_available(int fd, GTM_BAVAIL_TYPE *ret, boolean_t fill_unix_holes) { struct stat fstat_buf; struct statvfs fstatvfs_buf; int status; FSTATVFS_FILE(fd, &fstatvfs_buf, status); if (-1 == status) return errno; *ret = (GTM_BAVAIL_TYPE)((fstatvfs_buf.f_frsize / DISK_BLOCK_SIZE) * fstatvfs_buf.f_bavail); if (fill_unix_holes) { FSTAT_FILE(fd, &fstat_buf, status); if (-1 == status) return errno; *ret -= (GTM_BAVAIL_TYPE)(DEV_BSIZE / DISK_BLOCK_SIZE * (DIVIDE_ROUND_UP(fstat_buf.st_size, DEV_BSIZE) - fstat_buf.st_blocks)); } return 0; }