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