diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-03-20 16:35:19 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-03-20 16:35:19 +0000 |
commit | 867506f3b0f0c23128d601a8812de023078c88b4 (patch) | |
tree | cc04aaefd099a90961bebdac8ea60cbcbe218d47 /sysdeps/unix/sysv/linux | |
parent | 8e31cf7e9f269668c6c86db9813839efc2fd434b (diff) | |
download | glibc-867506f3b0f0c23128d601a8812de023078c88b4.tar.gz glibc-867506f3b0f0c23128d601a8812de023078c88b4.tar.xz glibc-867506f3b0f0c23128d601a8812de023078c88b4.zip |
Update.
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.
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-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 |
5 files changed, 347 insertions, 24 deletions
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, |