1 /***************************************************************************
2 *
3 * $Header: /usr/local/cvsroot/utils/ytree/freesp.c,v 1.25 2012/09/11 16:40:02 werner Exp $
4 *
5 * Ermittlung der freien Plattenkapazitaet
6 *
7 ***************************************************************************/
8
9
10 #include "ytree.h"
11
12 #if ( defined( linux ) || defined( sun ) || defined( __NeXT__ ) || defined(hpux) || defined( __DJGPP__ ) || defined ( __GNU__ ) ) && !defined( SVR4 )
13
14 #include <sys/vfs.h>
15 #else
16 #ifdef WIN32
17 #include <dos.h>
18 #else
19 #if defined( SVR4 ) || defined( OSF1 ) || defined( sun56 ) || defined( __NetBSD__ )
20 #include <sys/statvfs.h>
21 #else
22 #if ( defined( ultrix ) || defined( __OpenBSD__ ) || defined ( __FreeBSD__ ) || defined (__APPLE__) )
23 #include <sys/param.h>
24 #include <sys/mount.h>
25 #else
26 #if defined( QNX )
27 #include <sys/types.h>
28 #include <sys/disk.h>
29 #else
30 /* z.B. SVR3 */
31 #include <sys/statfs.h>
32 #endif /* QNX */
33 #endif /* ultrix */
34 #endif /* SVR4 */
35 #endif /* WIN32 */
36 #endif /* sun / linux / __NeXT__ hpux */
37
38 #ifdef __GNU__
39 #include <hurd/hurd_types.h>
40 #endif
41
42
43
44 /* Volume-Name und freien Plattenplatz ermitteln */
45 /*-----------------------------------------------*/
46
GetDiskParameter(char * path,char * volume_name,LONGLONG * avail_bytes,LONGLONG * total_disk_space)47 int GetDiskParameter( char *path,
48 char *volume_name,
49 LONGLONG *avail_bytes,
50 LONGLONG *total_disk_space
51 )
52 {
53
54 #ifdef WIN32
55 struct _diskfree_t diskspace;
56 #else
57 #if defined( SVR4 ) || defined( OSF1 ) || defined( __NetBSD__ )
58 struct statvfs statfs_struct;
59 #else
60 #ifdef ultrix
61 struct fs_data statfs_struct;
62 #else
63 #ifdef QNX
64 long total_blocks, free_blocks;
65 int fd;
66 #else
67 struct statfs statfs_struct;
68 #endif /* QNX */
69 #endif /* ultrix */
70 #endif /* SVR4 */
71 #endif /* WIN32 */
72
73 char *p;
74 char *fname;
75 int result;
76 LONGLONG bfree;
77 LONGLONG this_disk_space;
78
79
80 #ifdef WIN32
81 if( ( result = _getdiskfree( 0, &diskspace ) ) == 0 )
82 #else
83 #ifdef __DJGPP__
84 if( ( result = statfs( path, &statfs_struct ) ) == 0 )
85 #else
86 #ifdef QNX
87 fd = open(path, O_RDONLY );
88 if( ( result = disk_space( fd, &free_blocks, &total_blocks ) ) == 0 )
89 #else
90
91 if( ( result = STATFS( path, &statfs_struct, sizeof( statfs_struct ), 0 ) ) == 0 )
92 #endif /* QNX */
93 #endif /* __DJGPP__ */
94 #endif /* WIN32 */
95 {
96 if( volume_name )
97 {
98 /* Name ermitteln */
99 /*----------------*/
100
101 if( mode == DISK_MODE || mode == USER_MODE )
102 {
103
104 #ifdef linux
105 switch( statfs_struct.f_type ) {
106 case 0xEF51:
107 fname = "EXT2-OLD"; break;
108 case 0xEF53:
109 fname = "EXT2"; break;
110 case 0x137D:
111 fname = "EXT"; break;
112 case 0x9660:
113 fname = "ISOFS"; break;
114 case 0x137F:
115 fname = "MINIX"; break;
116 case 0x138F:
117 fname = "MINIX2"; break;
118 case 0x2468:
119 fname = "MINIX-NEW"; break;
120 case 0x4d44:
121 fname = "DOS"; break;
122 case 0x6969:
123 fname = "NFS"; break;
124 case 0x9fa0:
125 fname = "PROC"; break;
126 case 0x012FD16D:
127 fname = "XIAFS"; break;
128 default:
129 fname = "LINUX";
130 }
131 #else
132 #ifdef __GNU__
133 switch( statfs_struct.f_type ) {
134 case FSTYPE_UFS:
135 fname = "UFS"; break;
136 case FSTYPE_NFS:
137 fname = "NFS"; break;
138 case FSTYPE_GFS:
139 fname = "GFS"; break;
140 case FSTYPE_LFS:
141 fname = "LFS"; break;
142 case FSTYPE_SYSV:
143 fname = "SYSV"; break;
144 case FSTYPE_FTP:
145 fname = "FTP"; break;
146 case FSTYPE_TAR:
147 fname = "TAR"; break;
148 case FSTYPE_AR:
149 fname = "AR"; break;
150 case FSTYPE_CPIO:
151 fname = "CPIO"; break;
152 case FSTYPE_MSLOSS:
153 fname = "DOS"; break;
154 case FSTYPE_CPM:
155 fname = "CPM"; break;
156 case FSTYPE_HFS:
157 fname = "HFS"; break;
158 case FSTYPE_DTFS:
159 fname = "DTFS"; break;
160 case FSTYPE_GRFS:
161 fname = "GRFS"; break;
162 case FSTYPE_TERM:
163 fname = "TERM"; break;
164 case FSTYPE_DEV:
165 fname = "DEV"; break;
166 case FSTYPE_PROC:
167 fname = "PROC"; break;
168 case FSTYPE_IFSOCK:
169 fname = "IFSOCK"; break;
170 case FSTYPE_AFS:
171 fname = "AFS"; break;
172 case FSTYPE_DFS:
173 fname = "DFS"; break;
174 case FSTYPE_PROC9:
175 fname = "PROC9"; break;
176 case FSTYPE_SOCKET:
177 fname = "SOCKET"; break;
178 case FSTYPE_MISC:
179 fname = "MISC"; break;
180 case FSTYPE_EXT2FS:
181 fname = "EXT2FS"; break;
182 case FSTYPE_HTTP:
183 fname = "HTTP"; break;
184 case FSTYPE_MEMFS:
185 fname = "MEM"; break;
186 case FSTYPE_ISO9660:
187 fname = "ISO9660"; break;
188 default:
189 fname = "HURD";
190 }
191 #else
192 #if defined( sun56 ) || defined( sun ) || defined( hpux ) || defined( __NeXT__ ) || defined( ultrix ) || defined ( __FreeBSD__ ) || defined (__APPLE__)
193 fname = "UNIX";
194 #else
195 #ifdef WIN32
196 fname = "WIN-NT";
197 #else
198 #ifdef __DJGPP__
199 fname = "DJGPP";
200 #else
201 #ifdef QNX
202 fname = "QNX";
203 #else
204 #if defined( SVR4 ) || defined( OSF1 )
205 fname = statfs_struct.f_fstr;
206 #else
207 #if defined(__OpenBSD__) || defined(__NetBSD__)
208 fname = statfs_struct.f_fstypename;
209 #else
210 fname = statfs_struct.f_fname;
211 #endif /* __OpenBSD__ || __NetBSD__ */
212 #endif /* SVR4 */
213 #endif /* __DJGPP__ */
214 #endif /* QNX */
215 #endif /* WIN32 */
216 #endif /* sun / hpux / __NeXT__ ultrix */
217 #endif /* __GNU__ */
218 #endif /* linux */
219
220 (void) strncpy( volume_name,
221 fname,
222 MINIMUM( DISK_NAME_LENGTH, strlen( fname ) )
223 );
224 volume_name[ MINIMUM( DISK_NAME_LENGTH, strlen( fname ))] = '\0';
225 }
226 else
227 {
228 /* TAR/ZOO/ZIP-FILE_MODE */
229 /*-----------------------*/
230
231 if( ( p = strrchr( statistic.login_path, FILE_SEPARATOR_CHAR ) ) == NULL )
232 p = statistic.login_path;
233 else p++;
234
235 (void) strncpy( volume_name, p, sizeof( statistic.disk_name ) );
236 volume_name[sizeof( statistic.disk_name )] = '\0';
237 }
238 } /* volume_name */
239
240 #ifdef WIN32
241 *avail_bytes = (long) diskspace.bytes_per_sector *
242 (long) diskspace.sectors_per_cluster *
243 (long) diskspace.avail_clusters;
244 this_disk_space = 900000000L; /* for now.. */
245 #else
246
247 #if (defined( SVR4 ) || defined( OSF1 )) && !defined( __DGUX__ )
248 bfree = getuid() ? statfs_struct.f_bavail : statfs_struct.f_bfree;
249 if( bfree < 0L ) bfree = 0L;
250 *avail_bytes = bfree * statfs_struct.f_frsize;
251 this_disk_space = statfs_struct.f_blocks * statfs_struct.f_frsize;
252 #else
253 #if defined( _IBMR2 ) || defined( linux ) || defined( sun ) || defined( __NeXT__ ) || defined( __GNU__ )
254 bfree = getuid() ? statfs_struct.f_bavail : statfs_struct.f_bfree;
255 if( bfree < 0L ) bfree = 0L;
256 *avail_bytes = bfree * statfs_struct.f_bsize;
257 this_disk_space = statfs_struct.f_blocks * statfs_struct.f_blocks;
258 #else
259 #ifdef SVR3
260 bfree = statfs_struct.f_bfree;
261 if( bfree < 0L ) bfree = 0L;
262 *avail_bytes = bfree * BLKSIZ; /* SYSV */
263 this_disk_space = statfs_struct.f_blocks * BLKSIZ;
264 #else
265 #if defined( ultrix )
266 bfree = statfs_struct.fd_req.bfree;
267 if( bfree < 0L ) bfree = 0L;
268 #else
269 #if defined( QNX )
270 *avail_bytes = free_blocks * 512;
271 this_disk_space = total_blocks * 512;
272 #else
273 bfree = statfs_struct.f_bfree;
274 if( bfree < 0L ) bfree = 0L;
275 *avail_bytes = bfree * statfs_struct.f_bsize;
276 this_disk_space = statfs_struct.f_blocks * statfs_struct.f_bsize;
277 #endif /* QNX */
278 #endif /* ultrix */
279 #endif /* SVR3 */
280 #endif /* SVR4/!__DGUX__ */
281 #endif /* _IBMR2/linux/sun/__NeXT__/__GNU__ */
282 #endif /* WIN32 */
283
284 if( total_disk_space )
285 {
286 *total_disk_space = this_disk_space;
287 }
288 }
289 #ifdef QNX
290 close(fd);
291 #endif
292 return( result );
293 }
294
295
296
297
GetAvailBytes(LONGLONG * avail_bytes)298 int GetAvailBytes(LONGLONG *avail_bytes)
299 {
300 return( GetDiskParameter( statistic.tree->name,
301 NULL,
302 avail_bytes,
303 NULL
304 )
305 );
306 }
307
308
309
310