/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2010 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #pragma prototyped /* * aux function for iblocks() macro * * return number of blocks, including indirect block count * given stat info * * mail gsf@research.att.com when you figure out the stat.st_blocks units * until then we assume LS_BLOCKSIZE (512) */ #include #if _AIX /* XXX */ #undef major #undef minor #undef makedev #endif #include #include #if !_mem_st_blocks_stat #ifndef B_DIRECT #define B_DIRECT 10 #endif #ifdef BITFS #define B_SIZE BSIZE(st->st_dev) #define B_INDIRECT NINDIR(st->st_dev) #else #ifdef BSIZE #define B_SIZE BSIZE #else #define B_SIZE 1024 #endif #ifdef NINDIR #define B_INDIRECT NINDIR #else #define B_INDIRECT 128 #endif #endif #endif off_t _iblocks(register struct stat* st) { #if _mem_st_blocks_stat return (st->st_blocks <= 0 || st->st_size <= 0) ? 0 : st->st_blocks; #else unsigned long b; unsigned long t; t = b = (st->st_size + B_SIZE - 1) / B_SIZE; if ((b -= B_DIRECT) > 0) { t += (b - 1) / B_INDIRECT + 1; if ((b -= B_INDIRECT) > 0) { t += (b - 1) / (B_INDIRECT * B_INDIRECT) + 1; if (b > B_INDIRECT * B_INDIRECT) t++; } } return t * B_SIZE / LS_BLOCKSIZE; #endif }