1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
19da2e3ebdSchin *                   Phong Vo <kpv@research.att.com>                    *
20da2e3ebdSchin *                                                                      *
21da2e3ebdSchin ***********************************************************************/
22da2e3ebdSchin #pragma prototyped
23da2e3ebdSchin /*
24da2e3ebdSchin  * aux function for <ls.h> iblocks() macro
25da2e3ebdSchin  *
26da2e3ebdSchin  * return number of blocks, including indirect block count
27da2e3ebdSchin  * given stat info
28da2e3ebdSchin  *
29da2e3ebdSchin  * mail gsf@research.att.com when you figure out the stat.st_blocks units
30da2e3ebdSchin  * until then we assume LS_BLOCKSIZE (512)
31da2e3ebdSchin  */
32da2e3ebdSchin 
33da2e3ebdSchin #include <ast.h>
34da2e3ebdSchin #if _AIX /* XXX */
35da2e3ebdSchin #undef	major
36da2e3ebdSchin #undef	minor
37da2e3ebdSchin #undef	makedev
38da2e3ebdSchin #endif
39da2e3ebdSchin #include <ast_param.h>
40da2e3ebdSchin #include <ls.h>
41da2e3ebdSchin 
42da2e3ebdSchin #if !_mem_st_blocks_stat
43da2e3ebdSchin 
44da2e3ebdSchin #ifndef B_DIRECT
45da2e3ebdSchin #define B_DIRECT	10
46da2e3ebdSchin #endif
47da2e3ebdSchin 
48da2e3ebdSchin #ifdef BITFS
49da2e3ebdSchin 
50da2e3ebdSchin #define B_SIZE		BSIZE(st->st_dev)
51da2e3ebdSchin #define B_INDIRECT	NINDIR(st->st_dev)
52da2e3ebdSchin 
53da2e3ebdSchin #else
54da2e3ebdSchin 
55da2e3ebdSchin #ifdef BSIZE
56da2e3ebdSchin #define B_SIZE		BSIZE
57da2e3ebdSchin #else
58da2e3ebdSchin #define B_SIZE		1024
59da2e3ebdSchin #endif
60da2e3ebdSchin 
61da2e3ebdSchin #ifdef NINDIR
62da2e3ebdSchin #define B_INDIRECT	NINDIR
63da2e3ebdSchin #else
64da2e3ebdSchin #define B_INDIRECT	128
65da2e3ebdSchin #endif
66da2e3ebdSchin 
67da2e3ebdSchin #endif
68da2e3ebdSchin 
69da2e3ebdSchin #endif
70da2e3ebdSchin 
71da2e3ebdSchin off_t
_iblocks(register struct stat * st)72da2e3ebdSchin _iblocks(register struct stat* st)
73da2e3ebdSchin {
74da2e3ebdSchin #if _mem_st_blocks_stat
75da2e3ebdSchin 
76da2e3ebdSchin 	return (st->st_blocks <= 0 || st->st_size <= 0) ? 0 : st->st_blocks;
77da2e3ebdSchin 
78da2e3ebdSchin #else
79da2e3ebdSchin 	unsigned long	b;
80da2e3ebdSchin 	unsigned long	t;
81da2e3ebdSchin 
82da2e3ebdSchin 	t = b = (st->st_size + B_SIZE - 1) / B_SIZE;
83da2e3ebdSchin 	if ((b -= B_DIRECT) > 0)
84da2e3ebdSchin 	{
85da2e3ebdSchin 		t += (b - 1) / B_INDIRECT + 1;
86da2e3ebdSchin 		if ((b -= B_INDIRECT) > 0)
87da2e3ebdSchin 		{
88da2e3ebdSchin 			t += (b - 1) / (B_INDIRECT * B_INDIRECT) + 1;
89da2e3ebdSchin 			if (b > B_INDIRECT * B_INDIRECT)
90da2e3ebdSchin 				t++;
91da2e3ebdSchin 		}
92da2e3ebdSchin 	}
93da2e3ebdSchin 	return t * B_SIZE / LS_BLOCKSIZE;
94da2e3ebdSchin #endif
95da2e3ebdSchin }
96