~ubuntu-branches/ubuntu/maverick/di/maverick

« back to all changes in this revision

Viewing changes to digetinfo.c

  • Committer: Bazaar Package Importer
  • Author(s): Michael Ablassmeier
  • Date: 2009-12-06 19:03:54 UTC
  • mfrom: (1.1.10 upstream) (3.1.4 sid)
  • Revision ID: james.westby@ubuntu.com-20091206190354-whfqb83521hg9jf8
Tags: 4.18-1
* New upstream release
* iffe has been replaced with new build environment, no need to make
  our own dfsg free tarball anymore, remove debian/README.debian-source
* raise compat level to 5
* Bump standards version
* add ${misc:Depends} to debian/control

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
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
 
5
 */
 
6
 
 
7
/********************************************************/
 
8
/*
 
9
 
 
10
    In the cases where di_getDiskEntries() does not
 
11
    get the volume information, di_getDiskInfo() is used
 
12
    to fetch the info.
 
13
 
 
14
    di_getDiskInfo ()
 
15
        Gets the disk space used/available on the
 
16
        partitions we want displayed.
 
17
 
 
18
*/
 
19
/********************************************************/
 
20
 
 
21
#include "config.h"
 
22
#include "di.h"
 
23
#include "dimntopt.h"
 
24
 
 
25
#include <stdio.h>
 
26
#if _hdr_stdlib
 
27
# include <stdlib.h>
 
28
#endif
 
29
#if _sys_types
 
30
# include <sys/types.h>
 
31
#endif
 
32
#if _sys_param
 
33
# include <sys/param.h>
 
34
#endif
 
35
#if _hdr_errno
 
36
# include <errno.h>
 
37
#endif
 
38
#if _hdr_string
 
39
# include <string.h>
 
40
#endif
 
41
#if _hdr_strings && ((! defined (_hdr_string)) || (_include_string))
 
42
# include <strings.h>
 
43
#endif
 
44
 
 
45
#if _sys_mount                  /* FreeBSD, OpenBSD, NetBSD, HP-UX */
 
46
# include <sys/mount.h>         /* statfs(); struct statfs; getfsstat() */
 
47
#endif
 
48
#if _sys_statvfs                /* Linux, Solaris, FreeBSD, NetBSD, HP-UX */
 
49
# include <sys/statvfs.h>       /* statvfs(); struct statvfs */
 
50
#endif
 
51
#if _sys_vfs                    /* Linux, HP-UX */
 
52
# include <sys/vfs.h>           /* struct statfs */
 
53
#endif
 
54
#if _sys_statfs && ! defined (_sys_statvfs)     /* Linux, SysV.3 */
 
55
# include <sys/statfs.h>                        /* statfs(); struct statfs */
 
56
#endif
 
57
#if _sys_fstyp                  /* SysV.3 */
 
58
# include <sys/fstyp.h>         /* sysfs() */
 
59
#endif
 
60
#if _hdr_windows            /* windows */
 
61
# include <windows.h>       /* GetDiskFreeSpace(); GetVolumeInformation() */
 
62
#endif
 
63
 
 
64
/********************************************************/
 
65
 
 
66
#if defined(__cplusplus)
 
67
  extern "C" {
 
68
#endif
 
69
 
 
70
#if ! defined (_lib_statvfs) && \
 
71
        _lib_statfs && \
 
72
        _npt_statfs
 
73
# if _lib_statfs && _statfs_2arg
 
74
  extern int statfs _((char *, struct statfs *));
 
75
# endif
 
76
# if _lib_statfs && _statfs_3arg
 
77
  extern int statfs _((char *, struct statfs *, int));
 
78
# endif
 
79
# if _lib_statfs && _statfs_4arg
 
80
  extern int statfs _((char *, struct statfs *, int, int));
 
81
# endif
 
82
#endif
 
83
 
 
84
extern int debug;
 
85
 
 
86
#if defined(__cplusplus)
 
87
  }
 
88
#endif
 
89
 
 
90
/********************************************************/
 
91
 
 
92
#if _lib_statvfs && \
 
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)
 
99
 
 
100
/*
 
101
 * di_getDiskInfo
 
102
 *
 
103
 * SysV.4.  statvfs () returns both the free and available blocks.
 
104
 *
 
105
 */
 
106
 
 
107
# define DI_GETDISKINFO_DEF 1
 
108
 
 
109
void
 
110
# if _proto_stdc
 
111
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
 
112
# else
 
113
di_getDiskInfo (diskInfo, diCount)
 
114
    diDiskInfo_t **diskInfo;
 
115
    int *diCount;
 
116
# endif
 
117
{
 
118
    diDiskInfo_t     *diptr;
 
119
    int             i;
 
120
    Statvfs_t       statBuf;
 
121
 
 
122
    if (debug > 0) { printf ("# lib:getDiskInfo: statvfs\n"); }
 
123
    for (i = 0; i < *diCount; ++i)
 
124
    {
 
125
        diptr = *diskInfo + i;
 
126
 
 
127
        if (diptr->printFlag == DI_PRNT_OK ||
 
128
            diptr->printFlag == DI_PRNT_FORCE)
 
129
        {
 
130
            _fs_size_t      tblocksz;
 
131
            if (statvfs (diptr->name, &statBuf) == 0)
 
132
            {
 
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)
 
136
                {
 
137
                    tblocksz = statBuf.f_bsize;
 
138
                }
 
139
                else
 
140
                {
 
141
                    tblocksz = statBuf.f_frsize;
 
142
                }
 
143
/* Linux! statvfs() returns values in f_bsize rather f_frsize.  Bleah.  */
 
144
/* Non-POSIX!  Linux manual pages are incorrect.                        */
 
145
#  if linux
 
146
                tblocksz = statBuf.f_bsize;
 
147
#  endif /* linux */
 
148
 
 
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);
 
157
 
 
158
                if (debug > 1)
 
159
                {
 
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);
 
168
# else
 
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);
 
173
# endif
 
174
                }
 
175
            }
 
176
            else
 
177
            {
 
178
                fprintf (stderr, "statvfs: %s ", diptr->name);
 
179
                perror ("");
 
180
            }
 
181
        }
 
182
    } /* for each entry */
 
183
}
 
184
 
 
185
#endif /* _lib_statvfs */
 
186
 
 
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)
 
193
 
 
194
# if ! defined (UBSIZE)
 
195
#  if defined (BSIZE)
 
196
#   define UBSIZE            BSIZE
 
197
#  else
 
198
#   define UBSIZE            512
 
199
#  endif
 
200
# endif
 
201
 
 
202
/*
 
203
 * di_getDiskInfo
 
204
 *
 
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.
 
207
 *
 
208
 */
 
209
 
 
210
# define DI_GETDISKINFO_DEF 1
 
211
 
 
212
void
 
213
# if _proto_stdc
 
214
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
 
215
# else
 
216
di_getDiskInfo (diskInfo, diCount)
 
217
    diDiskInfo_t **diskInfo;
 
218
    int *diCount;
 
219
# endif
 
220
{
 
221
    diDiskInfo_t     *diptr;
 
222
    int             i;
 
223
    struct statfs   statBuf;
 
224
 
 
225
    if (debug > 0) { printf ("# lib:getDiskInfo: sysv-statfs 4arg\n"); }
 
226
    for (i = 0; i < *diCount; ++i)
 
227
    {
 
228
        diptr = *diskInfo + i;
 
229
        if (diptr->printFlag == DI_PRNT_OK ||
 
230
            diptr->printFlag == DI_PRNT_FORCE)
 
231
        {
 
232
            _fs_size_t      tblocksz;
 
233
 
 
234
            if (statfs (diptr->name, &statBuf, sizeof (statBuf), 0) == 0)
 
235
            {
 
236
# if _mem_f_frsize_statfs
 
237
                if (statBuf.f_frsize == 0 && statBuf.f_bsize != 0)
 
238
                {
 
239
                    tblocksz = (_fs_size_t) statBuf.f_bsize;
 
240
                }
 
241
                else
 
242
                {
 
243
                    tblocksz = (_fs_size_t) statBuf.f_frsize;
 
244
                }
 
245
# else
 
246
                tblocksz = UBSIZE;
 
247
# endif
 
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);
 
258
# endif
 
259
 
 
260
                if (debug > 1)
 
261
                {
 
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);
 
266
# else
 
267
                    printf ("\tUBSIZE:%ld\n", UBSIZE);
 
268
# endif
 
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);
 
273
                }
 
274
            } /* if we got the info */
 
275
            else
 
276
            {
 
277
                fprintf (stderr, "statfs: %s ", diptr->name);
 
278
                perror ("");
 
279
            }
 
280
        }
 
281
    } /* for each entry */
 
282
}
 
283
 
 
284
#endif /* _statfs_4arg */
 
285
 
 
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)
 
292
 
 
293
/*
 
294
 * di_getDiskInfo
 
295
 *
 
296
 * SunOS/BSD/Pyramid/Some Linux
 
297
 *
 
298
 */
 
299
 
 
300
# define DI_GETDISKINFO_DEF 1
 
301
 
 
302
void
 
303
# if _proto_stdc
 
304
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
 
305
# else
 
306
di_getDiskInfo (diskInfo, diCount)
 
307
    diDiskInfo_t **diskInfo;
 
308
    int *diCount;
 
309
# endif
 
310
{
 
311
    diDiskInfo_t     *diptr;
 
312
    int             i;
 
313
    struct statfs   statBuf;
 
314
 
 
315
    if (debug > 0) { printf ("# lib:getDiskInfo: bsd-statfs 2/3arg\n"); }
 
316
    for (i = 0; i < *diCount; ++i)
 
317
    {
 
318
        diptr = *diskInfo + i;
 
319
        if (diptr->printFlag == DI_PRNT_OK ||
 
320
            diptr->printFlag == DI_PRNT_FORCE)
 
321
        {
 
322
            if (statfs (diptr->name, &statBuf) == 0)
 
323
            {
 
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);
 
332
 
 
333
# if _lib_sysfs && _mem_f_fstyp_statfs
 
334
                sysfs (GETFSTYP, statBuf.f_fstyp, diptr->fsType);
 
335
# endif
 
336
 
 
337
                if (debug > 1)
 
338
                {
 
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);
 
346
                }
 
347
            } /* if we got the info */
 
348
            else
 
349
            {
 
350
                fprintf (stderr, "statfs: %s ", diptr->name);
 
351
                perror ("");
 
352
            }
 
353
        }
 
354
    } /* for each entry */
 
355
}
 
356
 
 
357
#endif /* _statfs_2arg */
 
358
 
 
359
 
 
360
#if _lib_GetVolumeInformation
 
361
 
 
362
/*
 
363
 * di_getDiskInfo
 
364
 *
 
365
 * Windows
 
366
 *
 
367
 */
 
368
 
 
369
# define DI_GETDISKINFO_DEF 1
 
370
 
 
371
# define MSDOS_BUFFER_SIZE          256
 
372
 
 
373
void
 
374
# if _proto_stdc
 
375
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
 
376
# else
 
377
di_getDiskInfo (diskInfo, diCount)
 
378
    diDiskInfo_t **diskInfo;
 
379
    int *diCount;
 
380
# endif
 
381
{
 
382
    diDiskInfo_t         *diptr;
 
383
    int                 i;
 
384
    int                 rc;
 
385
    char                volName [MSDOS_BUFFER_SIZE];
 
386
    char                fsName [MSDOS_BUFFER_SIZE];
 
387
    DWORD               serialNo;
 
388
    DWORD               maxCompLen;
 
389
    DWORD               fsFlags;
 
390
 
 
391
 
 
392
    if (debug > 0) { printf ("# lib:getDiskInfo: GetVolumeInformation\n"); }
 
393
    for (i = 0; i < *diCount; ++i)
 
394
    {
 
395
        diptr = *diskInfo + i;
 
396
        if (diptr->printFlag == DI_PRNT_OK ||
 
397
            diptr->printFlag == DI_PRNT_FORCE)
 
398
        {
 
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);
 
404
 
 
405
# if _lib_GetDiskFreeSpaceEx
 
406
            {
 
407
                ULONGLONG bytesAvail;
 
408
                ULONGLONG bytesTotal;
 
409
                ULONGLONG bytesFree;
 
410
 
 
411
                rc = GetDiskFreeSpaceEx (diptr->name,
 
412
                        (PULARGE_INTEGER) &bytesAvail,
 
413
                        (PULARGE_INTEGER) &bytesTotal,
 
414
                        (PULARGE_INTEGER) &bytesFree);
 
415
                if (rc > 0)
 
416
                {
 
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,
 
422
                        (_fs_size_t) 0,
 
423
                        (_fs_size_t) 0,
 
424
                        (_fs_size_t) 0);
 
425
                }
 
426
                else
 
427
                {
 
428
                    diptr->printFlag = DI_PRNT_BAD;
 
429
                    if (debug)
 
430
                    {
 
431
                        printf ("disk %s; could not get disk space\n",
 
432
                                diptr->name);
 
433
                    }
 
434
                }
 
435
 
 
436
                if (debug > 1)
 
437
                {
 
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);
 
442
                }
 
443
            }
 
444
# else
 
445
#  if _lib_GetDiskFreeSpace
 
446
            {
 
447
                unsigned long           sectorspercluster;
 
448
                unsigned long           bytespersector;
 
449
                unsigned long           totalclusters;
 
450
                unsigned long           freeclusters;
 
451
 
 
452
                rc = GetDiskFreeSpace (diptr->name,
 
453
                        (LPDWORD) &sectorspercluster,
 
454
                        (LPDWORD) &bytespersector,
 
455
                        (LPDWORD) &freeclusters,
 
456
                        (LPDWORD) &totalclusters);
 
457
                if (rc > 0)
 
458
                {
 
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,
 
465
                        (_fs_size_t) 0,
 
466
                        (_fs_size_t) 0,
 
467
                        (_fs_size_t) 0);
 
468
                }
 
469
                else
 
470
                {
 
471
                    diptr->printFlag = DI_PRNT_BAD;
 
472
                    if (debug)
 
473
                    {
 
474
                        printf ("disk %s; could not get disk space\n",
 
475
                                diptr->name);
 
476
                    }
 
477
                }
 
478
 
 
479
                if (debug > 1)
 
480
                {
 
481
                    printf ("%s: %s\n", diptr->name, diptr->fsType);
 
482
                    printf ("\ts/c:%ld  b/s:%ld\n", sectorspercluster,
 
483
                        bytespersector);
 
484
                    printf ("\tclusters: tot:%ld free:%ld\n",
 
485
                        totalclusters, freeclusters);
 
486
                }
 
487
            }
 
488
#  endif
 
489
# endif
 
490
        } /* if printable drive */
 
491
    } /* for each mounted drive */
 
492
}
 
493
 
 
494
#endif  /* _lib_GetVolumeInformation */
 
495
 
 
496
#if ! defined (DI_GETDISKINFO_DEF)
 
497
void
 
498
#  if _proto_stdc
 
499
di_getDiskInfo (diDiskInfo_t **diskInfo, int *diCount)
 
500
#  else
 
501
di_getDiskInfo (diskInfo, diCount)
 
502
    diDiskInfo_t **diskInfo;
 
503
    int *diCount;
 
504
#  endif
 
505
{
 
506
    if (debug > 0) { printf ("# lib:getDiskInfo: empty\n"); }
 
507
    return;
 
508
}
 
509
#endif