diff options
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | bits/statvfs.h | 84 | ||||
-rw-r--r-- | io/Makefile | 5 | ||||
-rw-r--r-- | io/sys/statvfs.h | 57 | ||||
-rw-r--r-- | libc.map | 5 | ||||
-rw-r--r-- | sysdeps/generic/bits/statvfs.h | 84 | ||||
-rw-r--r-- | sysdeps/generic/fstatvfs.c | 33 | ||||
-rw-r--r-- | sysdeps/generic/fstatvfs64.c | 46 | ||||
-rw-r--r-- | sysdeps/generic/statvfs.c | 34 | ||||
-rw-r--r-- | sysdeps/generic/statvfs64.c | 47 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/statfs.h | 14 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/statvfs.h | 92 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/fstatvfs.c | 173 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/statvfs.c | 46 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/mount.h | 46 |
15 files changed, 758 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog index 89fdc27bfd..bb6514ff1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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. diff --git a/bits/statvfs.h b/bits/statvfs.h new file mode 100644 index 0000000000..44408f72ba --- /dev/null +++ b/bits/statvfs.h @@ -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 +}; diff --git a/io/Makefile b/io/Makefile index e5c86b4cf6..8329f4fa62 100644 --- a/io/Makefile +++ b/io/Makefile @@ -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 \ diff --git a/io/sys/statvfs.h b/io/sys/statvfs.h new file mode 100644 index 0000000000..4da8e7c348 --- /dev/null +++ b/io/sys/statvfs.h @@ -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 */ diff --git a/libc.map b/libc.map index 879ca07d24..7a39f2c0f2 100644 --- a/libc.map +++ b/libc.map @@ -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; diff --git a/sysdeps/generic/bits/statvfs.h b/sysdeps/generic/bits/statvfs.h new file mode 100644 index 0000000000..44408f72ba --- /dev/null +++ b/sysdeps/generic/bits/statvfs.h @@ -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 +}; diff --git a/sysdeps/generic/fstatvfs.c b/sysdeps/generic/fstatvfs.c new file mode 100644 index 0000000000..779ba94277 --- /dev/null +++ b/sysdeps/generic/fstatvfs.c @@ -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> diff --git a/sysdeps/generic/fstatvfs64.c b/sysdeps/generic/fstatvfs64.c new file mode 100644 index 0000000000..a96c7bdec2 --- /dev/null +++ b/sysdeps/generic/fstatvfs64.c @@ -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; +} diff --git a/sysdeps/generic/statvfs.c b/sysdeps/generic/statvfs.c new file mode 100644 index 0000000000..36cd45e49e --- /dev/null +++ b/sysdeps/generic/statvfs.c @@ -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> diff --git a/sysdeps/generic/statvfs64.c b/sysdeps/generic/statvfs64.c new file mode 100644 index 0000000000..349760362b --- /dev/null +++ b/sysdeps/generic/statvfs64.c @@ -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; +} diff --git a/sysdeps/unix/sysv/linux/bits/statfs.h b/sysdeps/unix/sysv/linux/bits/statfs.h index a56ed79e7c..31ae564b46 100644 --- a/sysdeps/unix/sysv/linux/bits/statfs.h +++ b/sysdeps/unix/sysv/linux/bits/statfs.h @@ -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]; diff --git a/sysdeps/unix/sysv/linux/bits/statvfs.h b/sysdeps/unix/sysv/linux/bits/statvfs.h new file mode 100644 index 0000000000..85cdc9857b --- /dev/null +++ b/sysdeps/unix/sysv/linux/bits/statvfs.h @@ -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 +}; diff --git a/sysdeps/unix/sysv/linux/fstatvfs.c b/sysdeps/unix/sysv/linux/fstatvfs.c new file mode 100644 index 0000000000..53edb6be3a --- /dev/null +++ b/sysdeps/unix/sysv/linux/fstatvfs.c @@ -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; +} diff --git a/sysdeps/unix/sysv/linux/statvfs.c b/sysdeps/unix/sysv/linux/statvfs.c new file mode 100644 index 0000000000..c3df2e6a49 --- /dev/null +++ b/sysdeps/unix/sysv/linux/statvfs.c @@ -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; +} diff --git a/sysdeps/unix/sysv/linux/sys/mount.h b/sysdeps/unix/sysv/linux/sys/mount.h index f7d45704d2..c9ace10822 100644 --- a/sysdeps/unix/sysv/linux/sys/mount.h +++ b/sysdeps/unix/sysv/linux/sys/mount.h @@ -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 <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, |