Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Update.
	* sysdeps/unix/sysv/linux/fstatvfs.c: Move actual code in...
	* sysdeps/unix/sysv/linux/internal_statvfs.c: ...here.  New file.
	* sysdeps/unix/sysv/linux/statvfs.c: Don't use fstatvfs since the
	open call would require read permission.
	Patch by James Antill <james@and.org>.

	* sysdeps/unix/sysv/linux/Dist: Add internal_fnmatch.c.

	* inet/getnameinfo.c: Terminate host name for NI_NOFQDN.
	PR1515.  Patches by Hideaki YOSHIFUJI <yoshfuji@ecei.tohoku.ac.jp>.
  • Loading branch information
Ulrich Drepper committed Jan 18, 2000
1 parent 3a47453 commit 6e9b72d
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 97 deletions.
11 changes: 10 additions & 1 deletion ChangeLog
@@ -1,7 +1,16 @@
2000-01-18 Ulrich Drepper <drepper@cygnus.com>

* sysdeps/unix/sysv/linux/fstatvfs.c: Move actual code in...
* sysdeps/unix/sysv/linux/internal_statvfs.c: ...here. New file.
* sysdeps/unix/sysv/linux/statvfs.c: Don't use fstatvfs since the
open call would require read permission.
Patch by James Antill <james@and.org>.

* sysdeps/unix/sysv/linux/Dist: Add internal_fnmatch.c.

* inet/getnameinfo.c: Terminate host name for NI_NOFQDN.
* sysdeps/posix/getaddrinfo.c: Correct modifications done for
PR1515. Patch by Hideaki YOSHIFUJI <yoshfuji@ecei.tohoku.ac.jp>.
PR1515. Patches by Hideaki YOSHIFUJI <yoshfuji@ecei.tohoku.ac.jp>.

* posix/regex.h (RE_SYNTAX_POSIX_EXTENDED): Add RE_CONTEXT_INVALID_OPS.
* posix/regex.c (regex_compile): Return appropriate errors for
Expand Down
2 changes: 2 additions & 0 deletions inet/getnameinfo.c
Expand Up @@ -243,6 +243,8 @@ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host,
{
strncpy (host, h->h_name,
min(hostlen, (size_t) (c - h->h_name)));
host[min(hostlen - 1, (size_t) (c - h->h_name))]
= '\0';
break;
}
}
Expand Down
1 change: 1 addition & 0 deletions sysdeps/unix/sysv/linux/Dist
Expand Up @@ -8,6 +8,7 @@ kernel-features.h
kernel_sigaction.h
kernel_stat.h
kernel_termios.h
internal_statvfs.c
ldd-rewrite.sed
lddlibc4.c
linux_fsinfo.h
Expand Down
84 changes: 3 additions & 81 deletions sysdeps/unix/sysv/linux/fstatvfs.c
@@ -1,4 +1,4 @@
/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Expand Down Expand Up @@ -37,86 +37,8 @@ fstatvfs (int fd, struct statvfs *buf)
if (__fstatfs (fd, &fsbuf) < 0)
return -1;

/* Now fill in the fields we have information for. */
buf->f_bsize = fsbuf.f_bsize;
/* Linux does not support f_frsize, so set it to the full block size. */
buf->f_frsize = 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_favail and f_flag. */

/* 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/mounts or
the /etc/mtab 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;
else if (strcmp (opt, "nodiratime") == 0)
buf->f_flag |= ST_NODIRATIME;

/* We can stop looking for more entries. */
break;
}
}

/* Close the file. */
__endmntent (mtab);
}

__set_errno (save_errno);
}

#include "internal_statvfs.c"

/* We signal success if the statfs call succeeded. */
return 0;
}
98 changes: 98 additions & 0 deletions sysdeps/unix/sysv/linux/internal_statvfs.c
@@ -0,0 +1,98 @@
/* Copyright (C) 1998, 1999, 2000 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. */

/* Now fill in the fields we have information for. */
buf->f_bsize = fsbuf.f_bsize;
/* Linux does not support f_frsize, so set it to the full block size. */
buf->f_frsize = 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_favail and f_flag. */

/* 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/mounts or
the /etc/mtab 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;
else if (strcmp (opt, "nodiratime") == 0)
buf->f_flag |= ST_NODIRATIME;

/* We can stop looking for more entries. */
break;
}
}

/* Close the file. */
__endmntent (mtab);
}

__set_errno (save_errno);
}
24 changes: 9 additions & 15 deletions sysdeps/unix/sysv/linux/statvfs.c
@@ -1,4 +1,4 @@
/* Copyright (C) 1998 Free Software Foundation, Inc.
/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
Expand Down Expand Up @@ -26,21 +26,15 @@
int
statvfs (const char *file, struct statvfs *buf)
{
int save_errno;
int retval;
int fd;
struct statfs fsbuf;
struct stat st;

fd = __open (file, O_RDONLY);
if (fd < 0)
/* Get as much information as possible from the system. */
if (__statfs (fd, &fsbuf) < 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;
#include "internal_statvfs.c"

/* We signal success if the statfs call succeeded. */
return 0;
}

0 comments on commit 6e9b72d

Please sign in to comment.