root/usr/src/ucblib/libucb/port/gen/statfs.c
/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */


/*
 * Copyright (c) 1985 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

/*
 * Copyright (c) 1988-1997, by Sun Microsystems, Inc.
 * All Rights reserved.
 */

/*LINTLIBRARY*/

#include <sys/types.h>
#include <errno.h>
#include <sys/statvfs.h>
#include <sys/vfs.h>

#if !defined(_LP64)
static void
cnvtvfs64(struct statfs64 *buf, struct statvfs64 *vbuf)
{
        buf->f_type = 0;
        buf->f_bsize = vbuf->f_frsize;
        buf->f_blocks = vbuf->f_blocks;
        buf->f_bfree = vbuf->f_bfree;
        buf->f_bavail = vbuf->f_bavail;
        buf->f_files = vbuf->f_files;
        buf->f_ffree = vbuf->f_ffree;
        buf->f_fsid.val[0] = vbuf->f_fsid;
        buf->f_fsid.val[1] = 0;
}

int
statfs64(char *path, struct statfs64 *buf)
{
        int ret;
        struct statvfs64 vbuf;

        if ((long)buf == -1L) {
                errno = EFAULT;
                return (-1);
        }

        if ((ret = statvfs64(path, &vbuf)) != -1)
                cnvtvfs64(buf, &vbuf);
        return (ret);
}

int
fstatfs64(int fd, struct statfs64 *buf)
{
        int ret;
        struct statvfs64 vbuf;

        if ((ret = fstatvfs64(fd, &vbuf)) != -1)
                cnvtvfs64(buf, &vbuf);
        return (ret);
}
#endif

static void
cnvtvfs(struct statfs *buf, struct statvfs *vbuf)
{
        buf->f_type = 0;
        buf->f_bsize = vbuf->f_frsize;
        buf->f_blocks = vbuf->f_blocks;
        buf->f_bfree = vbuf->f_bfree;
        buf->f_bavail = vbuf->f_bavail;
        buf->f_files = vbuf->f_files;
        buf->f_ffree = vbuf->f_ffree;
        buf->f_fsid.val[0] = vbuf->f_fsid;
        buf->f_fsid.val[1] = 0;
}

int
statfs(char *path, struct statfs *buf)
{
        int ret;
        struct statvfs vbuf;

        if ((long)buf == -1L) {
                errno = EFAULT;
                return (-1);
        }

        if ((ret = statvfs(path, &vbuf)) != -1)
                cnvtvfs(buf, &vbuf);
        return (ret);
}


int
fstatfs(int fd, struct statfs *buf)
{
        int ret;
        struct statvfs vbuf;

        if ((ret = fstatvfs(fd, &vbuf)) != -1)
                cnvtvfs(buf, &vbuf);
        return (ret);
}