Annotation of uae/src/fsusage.c, revision 1.1.1.1

1.1       root        1: /* fsusage.c -- return space usage of mounted filesystems
                      2:    Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
                      3: 
                      4:    This program is free software; you can redistribute it and/or modify
                      5:    it under the terms of the GNU General Public License as published by
                      6:    the Free Software Foundation; either version 2, or (at your option)
                      7:    any later version.
                      8: 
                      9:    This program is distributed in the hope that it will be useful,
                     10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     12:    GNU General Public License for more details.
                     13: 
                     14:    You should have received a copy of the GNU General Public License
                     15:    along with this program; if not, write to the Free Software Foundation,
                     16:    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
                     17: 
                     18: #include "sysconfig.h"
                     19: 
                     20: #include <sys/types.h>
                     21: 
                     22: #ifdef HAVE_SYS_STAT_H
                     23: #include <sys/stat.h>
                     24: #endif
                     25: 
                     26: #include "fsusage.h"
                     27: 
                     28: /* Return the number of TOSIZE-byte blocks used by
                     29:    BLOCKS FROMSIZE-byte blocks, rounding away from zero.
                     30:    TOSIZE must be positive.  Return -1 if FROMSIZE is not positive.  */
                     31: 
                     32: static long
                     33: adjust_blocks (blocks, fromsize, tosize)
                     34:      long blocks;
                     35:      int fromsize, tosize;
                     36: {
                     37:   if (tosize <= 0)
                     38:     abort ();
                     39:   if (fromsize <= 0)
                     40:     return -1;
                     41: 
                     42:   if (fromsize == tosize)      /* e.g., from 512 to 512 */
                     43:     return blocks;
                     44:   else if (fromsize > tosize)  /* e.g., from 2048 to 512 */
                     45:     return blocks * (fromsize / tosize);
                     46:   else                         /* e.g., from 256 to 512 */
                     47:     return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
                     48: }
                     49: 
                     50: #ifdef _WIN32
                     51: 
                     52: #include <windows.h>
                     53: 
                     54: int
                     55: get_fs_usage (path, disk, fsp)
                     56:      const char *path;
                     57:      const char *disk;
                     58:      struct fs_usage *fsp;
                     59: {
                     60:     char buf1[1024];
                     61:     char buf2[1024];
                     62:     DWORD SectorsPerCluster;
                     63:     DWORD BytesPerSector;
                     64:     DWORD NumberOfFreeClusters;
                     65:     DWORD TotalNumberOfClusters;
                     66: 
                     67:     fname_atow (path, buf1, sizeof buf1);
                     68: 
                     69:     GetFullPathName (buf1, sizeof buf2, buf2, NULL);
                     70: 
                     71:     buf2[3] = 0;
                     72: 
                     73:     if (!GetDiskFreeSpace (buf2, &SectorsPerCluster, &BytesPerSector,
                     74:                           &NumberOfFreeClusters, &TotalNumberOfClusters))
                     75:     {
                     76:        /* lasterror = GetLastError ();*/
                     77:        return -1;
                     78:     }
                     79:     
                     80:     BytesPerSector *= SectorsPerCluster;
                     81:     fsp->fsu_blocks = adjust_blocks (TotalNumberOfClusters, BytesPerSector, 512);
                     82:     fsp->fsu_bavail = adjust_blocks (NumberOfFreeClusters, BytesPerSector, 512);
                     83: 
                     84:     return 0;
                     85: }
                     86: 
                     87: #else /* ! _WIN32 */
                     88: 
                     89: int statfs ();
                     90: 
                     91: #if HAVE_UNISTD_H
                     92: # include <unistd.h>
                     93: #endif
                     94: 
                     95: #if HAVE_SYS_PARAM_H
                     96: # include <sys/param.h>
                     97: #endif
                     98: 
                     99: #if HAVE_SYS_MOUNT_H
                    100: # include <sys/mount.h>
                    101: #endif
                    102: 
                    103: #if HAVE_SYS_VFS_H
                    104: # include <sys/vfs.h>
                    105: #endif
                    106: 
                    107: #if HAVE_SYS_FS_S5PARAM_H      /* Fujitsu UXP/V */
                    108: # include <sys/fs/s5param.h>
                    109: #endif
                    110: 
                    111: #if defined (HAVE_SYS_FILSYS_H) && !defined (_CRAY)
                    112: # include <sys/filsys.h>       /* SVR2 */
                    113: #endif
                    114: 
                    115: #if HAVE_FCNTL_H
                    116: # include <fcntl.h>
                    117: #endif
                    118: 
                    119: #if HAVE_SYS_STATFS_H
                    120: # include <sys/statfs.h>
                    121: #endif
                    122: 
                    123: #if HAVE_DUSTAT_H              /* AIX PS/2 */
                    124: # include <sys/dustat.h>
                    125: #endif
                    126: 
                    127: #if HAVE_SYS_STATVFS_H         /* SVR4 */
                    128: # include <sys/statvfs.h>
                    129: int statvfs ();
                    130: #endif
                    131: 
                    132: /* Read LEN bytes at PTR from descriptor DESC, retrying if interrupted.
                    133:    Return the actual number of bytes read, zero for EOF, or negative
                    134:    for an error.  */
                    135: 
                    136: int
                    137: safe_read (desc, ptr, len)
                    138:      int desc;
                    139:      char *ptr;
                    140:      int len;
                    141: {
                    142:   int n_chars;
                    143: 
                    144:   if (len <= 0)
                    145:     return len;
                    146: 
                    147: #ifdef EINTR
                    148:   do
                    149:     {
                    150:       n_chars = read (desc, ptr, len);
                    151:     }
                    152:   while (n_chars < 0 && errno == EINTR);
                    153: #else
                    154:   n_chars = read (desc, ptr, len);
                    155: #endif
                    156: 
                    157:   return n_chars;
                    158: }
                    159: 
                    160: /* Fill in the fields of FSP with information about space usage for
                    161:    the filesystem on which PATH resides.
                    162:    DISK is the device on which PATH is mounted, for space-getting
                    163:    methods that need to know it.
                    164:    Return 0 if successful, -1 if not.  When returning -1, ensure that
                    165:    ERRNO is either a system error value, or zero if DISK is NULL
                    166:    on a system that requires a non-NULL value.  */
                    167: int
                    168: get_fs_usage (path, disk, fsp)
                    169:      const char *path;
                    170:      const char *disk;
                    171:      struct fs_usage *fsp;
                    172: {
                    173: #ifdef STAT_STATFS3_OSF1
                    174: # define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_fsize, 512)
                    175: 
                    176:   struct statfs fsd;
                    177: 
                    178:   if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
                    179:     return -1;
                    180: 
                    181: #endif /* STAT_STATFS3_OSF1 */
                    182: 
                    183: #ifdef STAT_STATFS2_FS_DATA    /* Ultrix */
                    184: # define CONVERT_BLOCKS(B) adjust_blocks ((B), 1024, 512)
                    185: 
                    186:   struct fs_data fsd;
                    187: 
                    188:   if (statfs (path, &fsd) != 1)
                    189:     return -1;
                    190:   fsp->fsu_blocks = CONVERT_BLOCKS (fsd.fd_req.btot);
                    191:   fsp->fsu_bfree = CONVERT_BLOCKS (fsd.fd_req.bfree);
                    192:   fsp->fsu_bavail = CONVERT_BLOCKS (fsd.fd_req.bfreen);
                    193:   fsp->fsu_files = fsd.fd_req.gtot;
                    194:   fsp->fsu_ffree = fsd.fd_req.gfree;
                    195: 
                    196: #endif /* STAT_STATFS2_FS_DATA */
                    197: 
                    198: #ifdef STAT_READ_FILSYS                /* SVR2 */
                    199: # ifndef SUPERBOFF
                    200: #  define SUPERBOFF (SUPERB * 512)
                    201: # endif
                    202: # define CONVERT_BLOCKS(B) \
                    203:     adjust_blocks ((B), (fsd.s_type == Fs2b ? 1024 : 512), 512)
                    204: 
                    205:   struct filsys fsd;
                    206:   int fd;
                    207: 
                    208:   if (! disk)
                    209:     {
                    210:       errno = 0;
                    211:       return -1;
                    212:     }
                    213: 
                    214:   fd = open (disk, O_RDONLY);
                    215:   if (fd < 0)
                    216:     return -1;
                    217:   lseek (fd, (long) SUPERBOFF, 0);
                    218:   if (safe_read (fd, (char *) &fsd, sizeof fsd) != sizeof fsd)
                    219:     {
                    220:       close (fd);
                    221:       return -1;
                    222:     }
                    223:   close (fd);
                    224:   fsp->fsu_blocks = CONVERT_BLOCKS (fsd.s_fsize);
                    225:   fsp->fsu_bfree = CONVERT_BLOCKS (fsd.s_tfree);
                    226:   fsp->fsu_bavail = CONVERT_BLOCKS (fsd.s_tfree);
                    227:   fsp->fsu_files = (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1);
                    228:   fsp->fsu_ffree = fsd.s_tinode;
                    229: 
                    230: #endif /* STAT_READ_FILSYS */
                    231: 
                    232: #ifdef STAT_STATFS2_BSIZE      /* 4.3BSD, SunOS 4, HP-UX, AIX */
                    233: # define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_bsize, 512)
                    234: 
                    235:   struct statfs fsd;
                    236: 
                    237:   if (statfs (path, &fsd) < 0)
                    238:     return -1;
                    239: 
                    240: # ifdef STATFS_TRUNCATES_BLOCK_COUNTS
                    241: 
                    242:   /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
                    243:      struct statfs are truncated to 2GB.  These conditions detect that
                    244:      truncation, presumably without botching the 4.1.1 case, in which
                    245:      the values are not truncated.  The correct counts are stored in
                    246:      undocumented spare fields.  */
                    247:   if (fsd.f_blocks == 0x1fffff && fsd.f_spare[0] > 0)
                    248:     {
                    249:       fsd.f_blocks = fsd.f_spare[0];
                    250:       fsd.f_bfree = fsd.f_spare[1];
                    251:       fsd.f_bavail = fsd.f_spare[2];
                    252:     }
                    253: # endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
                    254: 
                    255: #endif /* STAT_STATFS2_BSIZE */
                    256: 
                    257: #ifdef STAT_STATFS2_FSIZE      /* 4.4BSD */
                    258: # define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_fsize, 512)
                    259: 
                    260:   struct statfs fsd;
                    261: 
                    262:   if (statfs (path, &fsd) < 0)
                    263:     return -1;
                    264: 
                    265: #endif /* STAT_STATFS2_FSIZE */
                    266: 
                    267: #ifdef STAT_STATFS4            /* SVR3, Dynix, Irix, AIX */
                    268: # if _AIX || defined(_CRAY)
                    269: #  define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_bsize, 512)
                    270: #  ifdef _CRAY
                    271: #   define f_bavail f_bfree
                    272: #  endif
                    273: # else
                    274: #  define CONVERT_BLOCKS(B) (B)
                    275: #  ifndef _SEQUENT_            /* _SEQUENT_ is DYNIX/ptx */
                    276: #   ifndef DOLPHIN             /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
                    277: #    define f_bavail f_bfree
                    278: #   endif
                    279: #  endif
                    280: # endif
                    281: 
                    282:   struct statfs fsd;
                    283: 
                    284:   if (statfs (path, &fsd, sizeof fsd, 0) < 0)
                    285:     return -1;
                    286:   /* Empirically, the block counts on most SVR3 and SVR3-derived
                    287:      systems seem to always be in terms of 512-byte blocks,
                    288:      no matter what value f_bsize has.  */
                    289: 
                    290: #endif /* STAT_STATFS4 */
                    291: 
                    292: #ifdef STAT_STATVFS            /* SVR4 */
                    293: # define CONVERT_BLOCKS(B) \
                    294:     adjust_blocks ((B), fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize, 512)
                    295: 
                    296:   struct statvfs fsd;
                    297: 
                    298:   if (statvfs (path, &fsd) < 0)
                    299:     return -1;
                    300:   /* f_frsize isn't guaranteed to be supported.  */
                    301: 
                    302: #endif /* STAT_STATVFS */
                    303: 
                    304: #if !defined(STAT_STATFS2_FS_DATA) && !defined(STAT_READ_FILSYS)
                    305:                                /* !Ultrix && !SVR2 */
                    306: 
                    307:   fsp->fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks);
                    308:   fsp->fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree);
                    309:   fsp->fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail);
                    310:   fsp->fsu_files = fsd.f_files;
                    311:   fsp->fsu_ffree = fsd.f_ffree;
                    312: 
                    313: #endif /* not STAT_STATFS2_FS_DATA && not STAT_READ_FILSYS */
                    314: 
                    315:   return 0;
                    316: }
                    317: 
                    318: #if defined(_AIX) && defined(_I386)
                    319: /* AIX PS/2 does not supply statfs.  */
                    320: 
                    321: int
                    322: statfs (path, fsb)
                    323:      char *path;
                    324:      struct statfs *fsb;
                    325: {
                    326:   struct stat stats;
                    327:   struct dustat fsd;
                    328: 
                    329:   if (stat (path, &stats))
                    330:     return -1;
                    331:   if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd)))
                    332:     return -1;
                    333:   fsb->f_type   = 0;
                    334:   fsb->f_bsize  = fsd.du_bsize;
                    335:   fsb->f_blocks = fsd.du_fsize - fsd.du_isize;
                    336:   fsb->f_bfree  = fsd.du_tfree;
                    337:   fsb->f_bavail = fsd.du_tfree;
                    338:   fsb->f_files  = (fsd.du_isize - 2) * fsd.du_inopb;
                    339:   fsb->f_ffree  = fsd.du_tinode;
                    340:   fsb->f_fsid.val[0] = fsd.du_site;
                    341:   fsb->f_fsid.val[1] = fsd.du_pckno;
                    342:   return 0;
                    343: }
                    344: 
                    345: #endif /* _AIX && _I386 */
                    346: 
                    347: #endif /* ! _WIN32 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.