2
* $Id: digetdiskinfo.c,v 1.4 2009-11-29 17:32:24-08 bll Exp $
3
* $Source: /home/bll/DI/RCS/digetdiskinfo.c,v $
4
* Copyright 1994-2009 Brad Lanam, Walnut Creek, CA
7
/********************************************************/
10
In the cases where di_getDiskEntries() does not
11
get the volume information, di_getDiskInfo() is used
15
Gets the disk space used/available on the
16
partitions we want displayed.
19
/********************************************************/
30
# include <sys/types.h>
33
# include <sys/param.h>
41
#if _hdr_strings && ((! defined (_hdr_string)) || (_include_string))
45
#if _sys_mount /* FreeBSD, OpenBSD, NetBSD, HP-UX */
46
# include <sys/mount.h> /* statfs(); struct statfs; getfsstat() */
48
#if _sys_statvfs /* Linux, Solaris, FreeBSD, NetBSD, HP-UX */
49
# include <sys/statvfs.h> /* statvfs(); struct statvfs */
51
#if _sys_vfs /* Linux, HP-UX */
52
# include <sys/vfs.h> /* struct statfs */
54
#if _sys_statfs && ! defined (_sys_statvfs) /* Linux, SysV.3 */
55
# include <sys/statfs.h> /* statfs(); struct statfs */
57
#if _sys_fstyp /* SysV.3 */
58
# include <sys/fstyp.h> /* sysfs() */
60
#if _hdr_windows /* windows */
61
# include <windows.h> /* GetDiskFreeSpace(); GetVolumeInformation() */
64
/********************************************************/
66
#if defined(__cplusplus)
70
#if ! defined (_lib_statvfs) && \
73
# if _lib_statfs && _statfs_2arg
74
extern int statfs _((char *, struct statfs *));
76
# if _lib_statfs && _statfs_3arg
77
extern int statfs _((char *, struct statfs *, int));
79
# if _lib_statfs && _statfs_4arg
80
extern int statfs _((char *, struct statfs *, int, int));
86
#if defined(__cplusplus)
90
/********************************************************/
93
! defined (_lib_fs_stat_dev) && \
94
! defined (_lib_getmntinfo) && \
95
! defined (_lib_getfsstat) && \
96
! defined (_lib_getvfsstat) && \
97
! defined (_lib_GetVolumeInformation) && \
98
! defined (_class_os__Volumes)
103
* SysV.4. statvfs () returns both the free and available blocks.
107
# define DI_GETDISKINFO_DEF 1
111
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
113
di_getDiskInfo (diskInfo, diCount)
114
diDiskInfo_t **diskInfo;
122
if (debug > 0) { printf ("# lib:getDiskInfo: statvfs\n"); }
123
for (i = 0; i < *diCount; ++i)
125
diptr = *diskInfo + i;
127
if (diptr->printFlag == DI_PRNT_OK ||
128
diptr->printFlag == DI_PRNT_FORCE)
131
if (statvfs (diptr->name, &statBuf) == 0)
133
/* data general DG/UX 5.4R3.00 sometime returns 0 */
134
/* in the fragment size field. */
135
if (statBuf.f_frsize == 0 && statBuf.f_bsize != 0)
137
tblocksz = statBuf.f_bsize;
141
tblocksz = statBuf.f_frsize;
143
/* Linux! statvfs() returns values in f_bsize rather f_frsize. Bleah. */
144
/* Non-POSIX! Linux manual pages are incorrect. */
146
tblocksz = statBuf.f_bsize;
149
di_saveBlockSizes (diptr, tblocksz,
150
(_fs_size_t) statBuf.f_blocks,
151
(_fs_size_t) statBuf.f_bfree,
152
(_fs_size_t) statBuf.f_bavail);
153
di_saveInodeSizes (diptr,
154
(_fs_size_t) statBuf.f_files,
155
(_fs_size_t) statBuf.f_ffree,
156
(_fs_size_t) statBuf.f_favail);
160
printf ("%s: %s\n", diptr->name, diptr->fsType);
161
printf ("\tbsize:%ld frsize:%ld\n", (long) statBuf.f_bsize,
162
(long) statBuf.f_frsize);
163
# if _siz_long_long >= 8
164
printf ("\tblocks: tot:%llu free:%lld avail:%llu\n",
165
statBuf.f_blocks, statBuf.f_bfree, statBuf.f_bavail);
166
printf ("\tinodes: tot:%llu free:%llu avail:%llu\n",
167
statBuf.f_files, statBuf.f_ffree, statBuf.f_favail);
169
printf ("\tblocks: tot:%lu free:%lu avail:%lu\n",
170
statBuf.f_blocks, statBuf.f_bfree, statBuf.f_bavail);
171
printf ("\tinodes: tot:%lu free:%lu avail:%lu\n",
172
statBuf.f_files, statBuf.f_ffree, statBuf.f_favail);
178
fprintf (stderr, "statvfs: %s ", diptr->name);
182
} /* for each entry */
185
#endif /* _lib_statvfs */
187
#if _lib_statfs && _statfs_4arg && \
188
! defined (_lib_statvfs) && \
189
! defined (_lib_getmntinfo) && \
190
! defined (_lib_getfsstat) && \
191
! defined (_lib_getvfsstat) && \
192
! defined (_lib_getmnt)
194
# if ! defined (UBSIZE)
196
# define UBSIZE BSIZE
205
* SysV.3. We don't have available blocks; just set it to free blocks.
206
* The sysfs () call is used to get the disk type name.
210
# define DI_GETDISKINFO_DEF 1
214
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
216
di_getDiskInfo (diskInfo, diCount)
217
diDiskInfo_t **diskInfo;
223
struct statfs statBuf;
225
if (debug > 0) { printf ("# lib:getDiskInfo: sysv-statfs 4arg\n"); }
226
for (i = 0; i < *diCount; ++i)
228
diptr = *diskInfo + i;
229
if (diptr->printFlag == DI_PRNT_OK ||
230
diptr->printFlag == DI_PRNT_FORCE)
234
if (statfs (diptr->name, &statBuf, sizeof (statBuf), 0) == 0)
236
# if _mem_f_frsize_statfs
237
if (statBuf.f_frsize == 0 && statBuf.f_bsize != 0)
239
tblocksz = (_fs_size_t) statBuf.f_bsize;
243
tblocksz = (_fs_size_t) statBuf.f_frsize;
248
di_saveBlockSizes (diptr, tblocksz,
249
(_fs_size_t) statBuf.f_blocks,
250
(_fs_size_t) statBuf.f_bfree,
251
(_fs_size_t) statBuf.f_bfree);
252
di_saveInodeSizes (diptr,
253
(_fs_size_t) statBuf.f_files,
254
(_fs_size_t) statBuf.f_ffree,
255
(_fs_size_t) statBuf.f_ffree);
256
# if _lib_sysfs && _mem_f_fstyp_statfs
257
sysfs (GETFSTYP, statBuf.f_fstyp, diptr->fsType);
262
printf ("%s: %s\n", diptr->name, diptr->fsType);
263
# if _mem_f_frsize_statfs
264
printf ("\tbsize:%ld\n", statBuf.f_bsize);
265
printf ("\tfrsize:%ld\n", statBuf.f_frsize);
267
printf ("\tUBSIZE:%ld\n", UBSIZE);
269
printf ("\tblocks: tot:%ld free:%ld\n",
270
statBuf.f_blocks, statBuf.f_bfree);
271
printf ("\tinodes: tot:%ld free:%ld\n",
272
statBuf.f_files, statBuf.f_ffree);
274
} /* if we got the info */
277
fprintf (stderr, "statfs: %s ", diptr->name);
281
} /* for each entry */
284
#endif /* _statfs_4arg */
286
#if _lib_statfs && (_statfs_2arg ||_statfs_3arg) && \
287
! defined (_lib_statvfs) && \
288
! defined (_lib_getmntinfo) && \
289
! defined (_lib_getmnt) && \
290
! defined (_lib_GetDiskFreeSpace) && \
291
! defined (_lib_GetDiskFreeSpaceEx)
296
* SunOS/BSD/Pyramid/Some Linux
300
# define DI_GETDISKINFO_DEF 1
304
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
306
di_getDiskInfo (diskInfo, diCount)
307
diDiskInfo_t **diskInfo;
313
struct statfs statBuf;
315
if (debug > 0) { printf ("# lib:getDiskInfo: bsd-statfs 2/3arg\n"); }
316
for (i = 0; i < *diCount; ++i)
318
diptr = *diskInfo + i;
319
if (diptr->printFlag == DI_PRNT_OK ||
320
diptr->printFlag == DI_PRNT_FORCE)
322
if (statfs (diptr->name, &statBuf) == 0)
324
di_saveBlockSizes (diptr, (_fs_size_t) statBuf.f_bsize,
325
(_fs_size_t) statBuf.f_blocks,
326
(_fs_size_t) statBuf.f_bfree,
327
(_fs_size_t) statBuf.f_bavail);
328
di_saveInodeSizes (diptr,
329
(_fs_size_t) statBuf.f_files,
330
(_fs_size_t) statBuf.f_ffree,
331
(_fs_size_t) statBuf.f_ffree);
333
# if _lib_sysfs && _mem_f_fstyp_statfs
334
sysfs (GETFSTYP, statBuf.f_fstyp, diptr->fsType);
339
printf ("%s: %s\n", diptr->name, diptr->fsType);
340
printf ("\tbsize:%ld\n", (long) statBuf.f_bsize);
341
printf ("\tblocks: tot:%ld free:%ld avail:%ld\n",
342
(long) statBuf.f_blocks, (long) statBuf.f_bfree,
343
(long) statBuf.f_bavail);
344
printf ("\tinodes: tot:%ld free:%ld\n",
345
(long) statBuf.f_files, (long) statBuf.f_ffree);
347
} /* if we got the info */
350
fprintf (stderr, "statfs: %s ", diptr->name);
354
} /* for each entry */
357
#endif /* _statfs_2arg */
360
#if _lib_GetVolumeInformation
369
# define DI_GETDISKINFO_DEF 1
371
# define MSDOS_BUFFER_SIZE 256
375
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
377
di_getDiskInfo (diskInfo, diCount)
378
diDiskInfo_t **diskInfo;
385
char volName [MSDOS_BUFFER_SIZE];
386
char fsName [MSDOS_BUFFER_SIZE];
392
if (debug > 0) { printf ("# lib:getDiskInfo: GetVolumeInformation\n"); }
393
for (i = 0; i < *diCount; ++i)
395
diptr = *diskInfo + i;
396
if (diptr->printFlag == DI_PRNT_OK ||
397
diptr->printFlag == DI_PRNT_FORCE)
399
rc = GetVolumeInformation (diptr->name,
400
volName, MSDOS_BUFFER_SIZE, &serialNo, &maxCompLen,
401
&fsFlags, fsName, MSDOS_BUFFER_SIZE);
402
strncpy (diptr->fsType, fsName, DI_TYPE_LEN);
403
strncpy (diptr->special, volName, DI_SPEC_NAME_LEN);
405
# if _lib_GetDiskFreeSpaceEx
407
ULONGLONG bytesAvail;
408
ULONGLONG bytesTotal;
411
rc = GetDiskFreeSpaceEx (diptr->name,
412
(PULARGE_INTEGER) &bytesAvail,
413
(PULARGE_INTEGER) &bytesTotal,
414
(PULARGE_INTEGER) &bytesFree);
417
di_saveBlockSizes (diptr, (_fs_size_t) 1,
418
(_fs_size_t) bytesTotal,
419
(_fs_size_t) bytesFree,
420
(_fs_size_t) bytesAvail);
421
di_saveInodeSizes (diptr,
428
diptr->printFlag = DI_PRNT_BAD;
431
printf ("disk %s; could not get disk space\n",
438
printf ("%s: %s\n", diptr->name, diptr->fsType);
439
printf ("\ttot:%llu free:%llu\n",
440
bytesTotal, bytesFree);
441
printf ("\tavail:%llu\n", bytesAvail);
445
# if _lib_GetDiskFreeSpace
447
unsigned long sectorspercluster;
448
unsigned long bytespersector;
449
unsigned long totalclusters;
450
unsigned long freeclusters;
452
rc = GetDiskFreeSpace (diptr->name,
453
(LPDWORD) §orspercluster,
454
(LPDWORD) &bytespersector,
455
(LPDWORD) &freeclusters,
456
(LPDWORD) &totalclusters);
459
di_saveBlockSizes (diptr,
460
(_fs_size_t) (sectorspercluster * bytespersector),
461
(_fs_size_t) totalclusters,
462
(_fs_size_t) freeclusters,
463
(_fs_size_t) freeclusters);
464
di_saveInodeSizes (diptr,
471
diptr->printFlag = DI_PRNT_BAD;
474
printf ("disk %s; could not get disk space\n",
481
printf ("%s: %s\n", diptr->name, diptr->fsType);
482
printf ("\ts/c:%ld b/s:%ld\n", sectorspercluster,
484
printf ("\tclusters: tot:%ld free:%ld\n",
485
totalclusters, freeclusters);
490
} /* if printable drive */
491
} /* for each mounted drive */
494
#endif /* _lib_GetVolumeInformation */
496
#if ! defined (DI_GETDISKINFO_DEF)
499
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
501
di_getDiskInfo (diskInfo, diCount)
502
diDiskInfo_t **diskInfo;
506
if (debug > 0) { printf ("# lib:getDiskInfo: empty\n"); }