1998-03-20 16:24  Ulrich Drepper  <drepper@cygnus.com>

	* libc.map: Add statvfs, fstatvfs, statvfs64, and fstatvfs64.
	* io/Makefile (headers): Add sys/statvfs.h and bits/statvfs.h.
	* io/sys/statvfs.h: New file.
	* sysdeps/generic/fstatvfs.h: New file.
	* sysdeps/generic/statvfs.h: New file.
	* sysdeps/generic/fstatvfs64.h: New file.
	* sysdeps/generic/statvfs64.h: New file.
	* sysdeps/generic/bits/statvfs.h: New file.
	* sysdeps/unix/sysv/linux/fstatvfs.c: New file.
	* sysdeps/unix/sysv/linux/statvfs.c: New file.
	* sysdeps/unix/sysv/linux/bits/statvfs.h: New file.

	* sysdeps/unix/sysv/linux/bits/statfs.h: Correct type for f_files
	and f_ffree elements.

	* sysdeps/unix/sysv/linux/sys/mount.h: Pretty print.  Define
	mount options in enum.
This commit is contained in:
Ulrich Drepper 1998-03-20 16:35:19 +00:00
parent 8e31cf7e9f
commit 867506f3b0
15 changed files with 758 additions and 28 deletions

View File

@ -1,3 +1,23 @@
1998-03-20 16:24 Ulrich Drepper <drepper@cygnus.com>
* libc.map: Add statvfs, fstatvfs, statvfs64, and fstatvfs64.
* io/Makefile (headers): Add sys/statvfs.h and bits/statvfs.h.
* io/sys/statvfs.h: New file.
* sysdeps/generic/fstatvfs.h: New file.
* sysdeps/generic/statvfs.h: New file.
* sysdeps/generic/fstatvfs64.h: New file.
* sysdeps/generic/statvfs64.h: New file.
* sysdeps/generic/bits/statvfs.h: New file.
* sysdeps/unix/sysv/linux/fstatvfs.c: New file.
* sysdeps/unix/sysv/linux/statvfs.c: New file.
* sysdeps/unix/sysv/linux/bits/statvfs.h: New file.
* sysdeps/unix/sysv/linux/bits/statfs.h: Correct type for f_files
and f_ffree elements.
* sysdeps/unix/sysv/linux/sys/mount.h: Pretty print. Define
mount options in enum.
1998-03-20 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* configure.in: Check for recent egcs/gcc.

84
bits/statvfs.h Normal file
View File

@ -0,0 +1,84 @@
/* Definition of `struct statvfs', information about a filesystem.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _SYS_STATVFS_H
# error "Never include <bits/statvfs.h> directly; use <sys/statvfs.h> instead."
#endif
#include <bits/types.h>
/* GNU Hurd NOTE: The size of this structure (16 ints) is known in
<hurd/hurd_types.defs>, since it is used in the `file_statfs' RPC. MiG
does not cope at all well with the passed C structure not being of the
expected size. There are some filler words at the end to allow for
future expansion. To increase the size of the structure used in the RPC
and retain binary compatibility, we would need to assign a new message
number. */
struct statvfs
{
unsigned long int f_bsize;
unsigned long int f_frsize;
#ifndef __USE_FILE_OFFSET64
__fsblkcnt_t f_blocks;
__fsblkcnt_t f_bfree;
__fsblkcnt_t f_bavail;
__fsfilcnt_t f_files;
__fsfilcnt_t f_ffree;
__fsfilcnt_t f_favail;
#else
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
__fsfilcnt64_t f_favail;
#endif
__fsid_t f_fsid;
unsigned long int f_flag;
unsigned long int f_namemax;
unsigned int f_spare[6];
};
#ifdef __USE_LARGEFILE64
struct statvfs64
{
unsigned long int f_bsize;
unsigned long int f_frsize;
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
__fsfilcnt64_t f_favail;
__fsid_t f_fsid;
unsigned long int f_flag;
unsigned long int f_namemax;
unsigned int f_spare[6];
};
#endif
/* Definitions for the flag in `f_flag'. */
enum
{
ST_RDONLY = 1,
#define ST_RDONLY ST_RDONLY
ST_NOSUID = 2
#define ST_NOSUID ST_NOSUID
};

View File

@ -1,4 +1,4 @@
# Copyright (C) 1992, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
# Copyright (C) 1992, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@ -22,7 +22,7 @@
subdir := io
headers := sys/stat.h bits/stat.h sys/statfs.h bits/statfs.h sys/vfs.h \
fcntl.h sys/fcntl.h bits/fcntl.h \
sys/statvfs.h bits/statvfs.h fcntl.h sys/fcntl.h bits/fcntl.h \
poll.h sys/poll.h bits/poll.h \
utime.h ftw.h fts.h
@ -32,6 +32,7 @@ routines := \
stat fstat lstat mknod stat64 fstat64 lstat64 \
xstat fxstat lxstat xmknod xstat64 fxstat64 lxstat64 \
statfs fstatfs statfs64 fstatfs64 \
statvfs fstatvfs statvfs64 fstatvfs64 \
umask chmod fchmod mkdir \
open open64 close read write lseek lseek64 access euidaccess \
fcntl flock lockf \

57
io/sys/statvfs.h Normal file
View File

@ -0,0 +1,57 @@
/* Definitions for getting information about a filesystem.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _SYS_STATVFS_H
#define _SYS_STATVFS_H 1
#include <features.h>
/* Get the system-specific definition of `struct statfs'. */
#include <bits/statvfs.h>
__BEGIN_DECLS
/* Return information about the filesystem on which FILE resides. */
extern int __statvfs __P ((__const char *__file, struct statvfs *__buf));
#ifndef __USE_FILE_OFFSET64
extern int statvfs __P ((__const char *__file, struct statvfs *__buf));
#else
extern int statvfs __P ((__const char *__file, struct statvfs *__buf))
__asm__ ("statvfs64");
#endif
#ifdef __USE_LARGEFILE64
extern int statvfs64 __P ((__const char *__file, struct statvfs64 *__buf));
#endif
/* Return information about the filesystem containing the file FILDES
refers to. */
extern int __fstatvfs __P ((int __fildes, struct statvfs *__buf));
#ifndef __USE_FILE_OFFSET64
extern int fstatvfs __P ((int __fildes, struct statvfs *__buf));
#else
extern int fstatvfs __P ((int __fildes, struct statvfs *__buf))
__asm__ ("fstatvfs64");
#endif
#ifdef __USE_LARGEFILE64
extern int fstatvfs64 __P ((int __fildes, struct statvfs64 *__buf));
#endif
__END_DECLS
#endif /* sys/statvfs.h */

View File

@ -489,7 +489,7 @@ GLIBC_2.1 {
# f*
fgetpos64; fmtmsg; fopen64; freopen64; fseeko; fseeko64; fsetpos64;
fstatfs64; ftello; ftello64; ftruncate64; ftw64;
fstatfs64; fstatvfs; fstatvfs64; ftello; ftello64; ftruncate64; ftw64;
fopen; fclose; fdopen;
# g*
@ -535,7 +535,8 @@ GLIBC_2.1 {
# s*
scandir64; setitimer; setrlimit64; setutxent; settimeofday;
sighold; sigrelse; sigignore; sigset; statfs64; strcasestr; sysv_signal;
sighold; sigrelse; sigignore; sigset; statfs64; statvfs; statvfs64;
strcasestr; sysv_signal;
# New RT signal functions.
sigqueue; sigtimedwait; sigwaitinfo;

View File

@ -0,0 +1,84 @@
/* Definition of `struct statvfs', information about a filesystem.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _SYS_STATVFS_H
# error "Never include <bits/statvfs.h> directly; use <sys/statvfs.h> instead."
#endif
#include <bits/types.h>
/* GNU Hurd NOTE: The size of this structure (16 ints) is known in
<hurd/hurd_types.defs>, since it is used in the `file_statfs' RPC. MiG
does not cope at all well with the passed C structure not being of the
expected size. There are some filler words at the end to allow for
future expansion. To increase the size of the structure used in the RPC
and retain binary compatibility, we would need to assign a new message
number. */
struct statvfs
{
unsigned long int f_bsize;
unsigned long int f_frsize;
#ifndef __USE_FILE_OFFSET64
__fsblkcnt_t f_blocks;
__fsblkcnt_t f_bfree;
__fsblkcnt_t f_bavail;
__fsfilcnt_t f_files;
__fsfilcnt_t f_ffree;
__fsfilcnt_t f_favail;
#else
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
__fsfilcnt64_t f_favail;
#endif
__fsid_t f_fsid;
unsigned long int f_flag;
unsigned long int f_namemax;
unsigned int f_spare[6];
};
#ifdef __USE_LARGEFILE64
struct statvfs64
{
unsigned long int f_bsize;
unsigned long int f_frsize;
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
__fsfilcnt64_t f_favail;
__fsid_t f_fsid;
unsigned long int f_flag;
unsigned long int f_namemax;
unsigned int f_spare[6];
};
#endif
/* Definitions for the flag in `f_flag'. */
enum
{
ST_RDONLY = 1,
#define ST_RDONLY ST_RDONLY
ST_NOSUID = 2
#define ST_NOSUID ST_NOSUID
};

View File

@ -0,0 +1,33 @@
/* Return information about the filesystem on which FD resides.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <sys/statvfs.h>
/* Return information about the filesystem on which FD resides. */
int
__fstatvfs (int fd, struct statvfs *buf)
{
__set_errno (ENOSYS);
return -1;
}
stub_warning (fstatvfs)
weak_alias (__fstatvfs, fstatvfs)
#include <stub-tag.h>

View File

@ -0,0 +1,46 @@
/* Return information about the filesystem on which FD resides.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <sys/statvfs.h>
/* Return information about the filesystem on which FD resides. */
int
fstatvfs64 (int fd, struct statvfs64 *buf)
{
struct statvfs buf32;
if (fstatvfs (fd, &buf32) < 0)
return -1;
buf->f_bsize = buf32.f_bsize;
buf->f_frsize = buf32.f_frsize;
buf->f_blocks = buf32.f_blocks;
buf->f_bfree = buf32.f_bfree;
buf->f_bavail = buf32.f_bavail;
buf->f_files = buf32.f_files;
buf->f_ffree = buf32.f_ffree;
buf->f_favail = buf32.f_favail;
buf->f_fsid = buf32.f_fsid;
buf->f_flag = buf32.f_flag;
buf->f_namemax = buf32.f_namemax;
memcpy (buf->f_spare, buf32.f_spare, sizeof (buf32.f_spare));
return 0;
}

34
sysdeps/generic/statvfs.c Normal file
View File

@ -0,0 +1,34 @@
/* Return information about the filesystem on which FILE resides.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <sys/statvfs.h>
#include <stddef.h>
/* Return information about the filesystem on which FILE resides. */
int
__statvfs (const char *file, struct statvfs *buf)
{
__set_errno (ENOSYS);
return -1;
}
weak_alias (__statvfs, statvfs)
stub_warning (statvfs)
#include <stub-tag.h>

View File

@ -0,0 +1,47 @@
/* Return information about the filesystem on which FILE resides.
Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <sys/statvfs.h>
#include <stddef.h>
/* Return information about the filesystem on which FILE resides. */
int
statvfs64 (const char *file, struct statvfs64 *buf)
{
struct statvfs buf32;
if (statvfs (file, &buf32) < 0)
return -1;
buf->f_bsize = buf32.f_bsize;
buf->f_frsize = buf32.f_frsize;
buf->f_blocks = buf32.f_blocks;
buf->f_bfree = buf32.f_bfree;
buf->f_bavail = buf32.f_bavail;
buf->f_files = buf32.f_files;
buf->f_ffree = buf32.f_ffree;
buf->f_favail = buf32.f_favail;
buf->f_fsid = buf32.f_fsid;
buf->f_flag = buf32.f_flag;
buf->f_namemax = buf32.f_namemax;
memcpy (buf->f_spare, buf32.f_spare, sizeof (buf32.f_spare));
return 0;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -30,14 +30,14 @@ struct statfs
__fsblkcnt_t f_blocks;
__fsblkcnt_t f_bfree;
__fsblkcnt_t f_bavail;
__fsblkcnt_t f_files;
__fsblkcnt_t f_ffree;
__fsfilcnt_t f_files;
__fsfilcnt_t f_ffree;
#else
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsblkcnt64_t f_files;
__fsblkcnt64_t f_ffree;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
#endif
__fsid_t f_fsid;
int f_namelen;
@ -52,8 +52,8 @@ struct statfs64
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsblkcnt64_t f_files;
__fsblkcnt64_t f_ffree;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
__fsid_t f_fsid;
int f_namelen;
int f_spare[6];

View File

@ -0,0 +1,92 @@
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _SYS_STATVFS_H
# error "Never include <bits/statvfs.h> directly; use <sys/statvfs.h> instead."
#endif
#include <bits/types.h> /* For __fsid_t, __fsblkcnt_t and __fsfilcnt_t. */
struct statvfs
{
unsigned long int f_bsize;
unsigned long int f_frsize;
#ifndef __USE_FILE_OFFSET64
__fsblkcnt_t f_blocks;
__fsblkcnt_t f_bfree;
__fsblkcnt_t f_bavail;
__fsfilcnt_t f_files;
__fsfilcnt_t f_ffree;
__fsfilcnt_t f_favail;
#else
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
__fsfilcnt64_t f_favail;
#endif
__fsid_t f_fsid;
unsigned long int f_flag;
unsigned long int f_namemax;
int f_spare[6];
};
#ifdef __USE_LARGEFILE64
struct statvfs64
{
unsigned long int f_bsize;
unsigned long int f_frsize;
__fsblkcnt64_t f_blocks;
__fsblkcnt64_t f_bfree;
__fsblkcnt64_t f_bavail;
__fsfilcnt64_t f_files;
__fsfilcnt64_t f_ffree;
__fsfilcnt64_t f_favail;
__fsid_t f_fsid;
unsigned long int f_flag;
unsigned long int f_namemax;
int f_spare[6];
};
#endif
/* Definitions for the flag in `f_flag'. These definitions should be
kept in sync which the definitions in <sys/mount.h>. */
enum
{
ST_RDONLY = 1, /* Mount read-only. */
#define ST_RDONLY ST_RDONLY
ST_NOSUID = 2, /* Ignore suid and sgid bits. */
#define ST_NOSUID ST_NOSUID
ST_NODEV = 4, /* Disallow access to device special files. */
#define ST_NODEV ST_NODEV
ST_NOEXEC = 8, /* Disallow program execution. */
#define ST_NOEXEC ST_NOEXEC
ST_SYNCHRONOUS = 16, /* Writes are synced at once. */
#define ST_SYNCHRONOUS ST_SYNCHRONOUS
ST_MANDLOCK = 64, /* Allow mandatory locks on an FS. */
#define ST_MANDLOCK ST_MANDLOCK
ST_WRITE = 128, /* Write on file/directory/symlink. */
#define ST_WRITE ST_WRITE
ST_APPEND = 256, /* Append-only file. */
#define ST_APPEND ST_APPEND
ST_IMMUTABLE = 512, /* Immutable file. */
#define ST_IMMUTABLE ST_IMMUTABLE
ST_NOATIME = 1024 /* Do not update access times. */
#define ST_NOATIME ST_NOATIME
};

View File

@ -0,0 +1,173 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <mntent.h>
#include <paths.h>
#include <string.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/statfs.h>
#include <sys/statvfs.h>
/* These definitions come from the kernel headers. But we cannot
include the headers here because of type clashes. If there will
become new filesystem types available we have to add the
appropriate definitions here.*/
#define ADFS_SUPER_MAGIC 0xadf5
#define AFFS_SUPER_MAGIC 0xadff
#define CODA_SUPER_MAGIC 0x73757245
#define EXT2_SUPER_MAGIC 0xef53
#define HPFS_SUPER_MAGIC 0xf995e849
#define ISOFS_SUPER_MAGIC 0x9660
#define MINIX_SUPER_MAGIC 0x137f
#define MINIX_SUPER_MAGIC2 0x138F
#define MINIX2_SUPER_MAGIC 0x2468
#define MINIX2_SUPER_MAGIC2 0x2478
#define MSDOS_SUPER_MAGIC 0x4d44
#define NCP_SUPER_MAGIC 0x564c
#define NFS_SUPER_MAGIC 0x6969
#define PROC_SUPER_MAGIC 0x9fa0
#define SMB_SUPER_MAGIC 0x517b
#define XENIX_SUPER_MAGIC 0x012ff7b4
#define SYSV4_SUPER_MAGIC 0x012ff7b5
#define SYSV2_SUPER_MAGIC 0x012ff7b6
#define COH_SUPER_MAGIC 0x012ff7b7
int
fstatvfs (int fd, struct statvfs *buf)
{
struct statfs fsbuf;
struct stat st;
/* Get as much information as possible from the system. */
if (__fstatfs (fd, &fsbuf) < 0)
return -1;
/* Now fill in the fields me have information for. */
buf->f_bsize = fsbuf.f_bsize;
buf->f_blocks = fsbuf.f_blocks;
buf->f_bfree = fsbuf.f_bfree;
buf->f_bavail = fsbuf.f_bavail;
buf->f_files = fsbuf.f_files;
buf->f_ffree = fsbuf.f_ffree;
buf->f_fsid = fsbuf.f_fsid;
buf->f_namemax = fsbuf.f_namelen;
memset (buf->f_spare, '\0', 6 * sizeof (int));
/* What remains to do is to fill the fields f_frsize, f_favail,
and f_flag. */
switch (fsbuf.f_type)
{
case EXT2_SUPER_MAGIC:
/* This is not really correct since the fragment size can vary. */
buf->f_frsize = 1024;
break;
case ADFS_SUPER_MAGIC:
case AFFS_SUPER_MAGIC:
case CODA_SUPER_MAGIC:
case HPFS_SUPER_MAGIC:
case ISOFS_SUPER_MAGIC:
case MINIX_SUPER_MAGIC:
case MINIX_SUPER_MAGIC2:
case MINIX2_SUPER_MAGIC:
case MINIX2_SUPER_MAGIC2:
case MSDOS_SUPER_MAGIC:
case NCP_SUPER_MAGIC:
case NFS_SUPER_MAGIC:
case PROC_SUPER_MAGIC:
case SMB_SUPER_MAGIC:
case XENIX_SUPER_MAGIC:
case SYSV4_SUPER_MAGIC:
case SYSV2_SUPER_MAGIC:
case COH_SUPER_MAGIC:
default:
/* I hope it's safe to assume no fragmentation. */
buf->f_frsize = buf->f_bsize;
break;
}
/* XXX I have no idea how to compute f_favail. Any idea??? */
buf->f_favail = buf->f_ffree;
/* Determining the flags is tricky. We have to read /proc/mount or
the /etc/matb file and search for the entry which matches the given
file. The way we can test for matching filesystem is using the
device number. */
buf->f_flag = 0;
if (fstat (fd, &st) >= 0)
{
int save_errno = errno;
struct mntent mntbuf;
FILE *mtab;
mtab = __setmntent ("/proc/mounts", "r");
if (mtab == NULL)
mtab = __setmntent (_PATH_MOUNTED, "r");
if (mtab != NULL)
{
char tmpbuf[1024];
while (__getmntent_r (mtab, &mntbuf, tmpbuf, sizeof (tmpbuf)))
{
struct stat fsst;
/* Find out about the device the current entry is for. */
if (stat (mntbuf.mnt_dir, &fsst) >= 0
&& st.st_dev == fsst.st_dev)
{
/* Bingo, we found the entry for the device FD is on.
Now interpret the option string. */
char *cp = mntbuf.mnt_opts;
char *opt;
while ((opt = strsep (&cp, ",")) != NULL)
if (strcmp (opt, "ro") == 0)
buf->f_flag |= ST_RDONLY;
else if (strcmp (opt, "nosuid") == 0)
buf->f_flag |= ST_NOSUID;
else if (strcmp (opt, "noexec") == 0)
buf->f_flag |= ST_NOEXEC;
else if (strcmp (opt, "nodev") == 0)
buf->f_flag |= ST_NODEV;
else if (strcmp (opt, "sync") == 0)
buf->f_flag |= ST_SYNCHRONOUS;
else if (strcmp (opt, "mand") == 0)
buf->f_flag |= ST_MANDLOCK;
else if (strcmp (opt, "noatime") == 0)
buf->f_flag |= ST_NOATIME;
/* We can stop looking for more entries. */
break;
}
}
/* Close the file. */
__endmntent (mtab);
}
__set_errno (save_errno);
}
/* We signal success if the statfs call succeeded. */
return 0;
}

View File

@ -0,0 +1,46 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/statvfs.h>
int
statvfs (const char *file, struct statvfs *buf)
{
int save_errno;
int retval;
int fd;
fd = open (file, O_RDONLY);
if (fd < 0)
return -1;
/* Let fstatvfs do the real work. */
retval = fstatvfs (fd, buf);
/* Close the file while preserving the error number. */
save_errno = errno;
close (fd);
__set_errno (save_errno);
return retval;
}

View File

@ -1,5 +1,5 @@
/* Header file for mounting/unmount Linux filesystems.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -20,32 +20,42 @@
/* This is taken from /usr/include/linux/fs.h. */
#ifndef _SYS_MOUNT_H
#define _SYS_MOUNT_H 1
#include <features.h>
#include <sys/ioctl.h>
__BEGIN_DECLS
#define BLOCK_SIZE 1024
#define BLOCK_SIZE_BITS 10
/* These are the fs-independent mount-flags: up to 16 flags are
supported */
#define MS_RDONLY 1 /* Mount read-only. */
#define MS_NOSUID 2 /* Ignore suid and sgid bits. */
#define MS_NODEV 4 /* Disallow access to device special files. */
#define MS_NOEXEC 8 /* Disallow program execution. */
#define MS_SYNCHRONOUS 16 /* Writes are synced at once. */
#define MS_REMOUNT 32 /* Alter flags of a mounted FS. */
#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS. */
#define S_WRITE 128 /* Write on file/directory/symlink. */
#define S_APPEND 256 /* Append-only file. */
#define S_IMMUTABLE 512 /* Immutable file. */
#define MS_NOATIME 1024 /* Do not update access times. */
enum
{
MS_RDONLY = 1, /* Mount read-only. */
#define MS_RDONLY MS_RDONLY
MS_NOSUID = 2, /* Ignore suid and sgid bits. */
#define MS_NOSUID MS_NOSUID
MS_NODEV = 4, /* Disallow access to device special files. */
#define MS_NODEV MS_NODEV
MS_NOEXEC = 8, /* Disallow program execution. */
#define MS_NOEXEC MS_NOEXEC
MS_SYNCHRONOUS = 16, /* Writes are synced at once. */
#define MS_SYNCHRONOUS MS_SYNCHRONOUS
MS_REMOUNT = 32, /* Alter flags of a mounted FS. */
#define MS_REMOUNT MS_REMOUNT
MS_MANDLOCK = 64, /* Allow mandatory locks on an FS. */
#define MS_MANDLOCK MS_MANDLOCK
S_WRITE = 128, /* Write on file/directory/symlink. */
#define S_WRITE S_WRITE
S_APPEND = 256, /* Append-only file. */
#define S_APPEND S_APPEND
S_IMMUTABLE = 512, /* Immutable file. */
#define S_IMMUTABLE S_IMMUTABLE
MS_NOATIME = 1024 /* Do not update access times. */
#define MS_NOATIME MS_NOATIME
};
/* Flags that can be altered by MS_REMOUNT */
#define MS_RMT_MASK (MS_RDONLY | MS_MANDLOCK)
@ -70,6 +80,8 @@ __BEGIN_DECLS
#define BLKRAGET _IO(0x12, 99) /* Get current read ahead setting. */
__BEGIN_DECLS
/* Mount a filesystem. */
extern int mount __P ((__const char *__special_file, __const char *__dir,
__const char *__fstype, unsigned long int __rwflag,