diff options
| author | Eric Andersen <andersen@codepoet.org> | 2002-01-06 08:51:00 +0000 | 
|---|---|---|
| committer | Eric Andersen <andersen@codepoet.org> | 2002-01-06 08:51:00 +0000 | 
| commit | e077f341ca5758360b4c050c493a1d81b06c72a0 (patch) | |
| tree | 799972c6664367540864241cf6df377e706e1d1c /libc | |
| parent | 35a3f28ef419657978e9a62adb01a9a82c654158 (diff) | |
Support statvfs and statfs.  Added getmntent_r (and made it use
strtok_r instead of strtok), taught getmntent to use getmntent_r.
 -Erik
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/misc/Makefile | 2 | ||||
| -rw-r--r-- | libc/misc/mntent/mntent.c | 54 | ||||
| -rw-r--r-- | libc/misc/statfs/Makefile | 43 | ||||
| -rw-r--r-- | libc/misc/statfs/fstatfs64.c | 57 | ||||
| -rw-r--r-- | libc/misc/statfs/fstatvfs.c | 52 | ||||
| -rw-r--r-- | libc/misc/statfs/internal_statvfs.c | 109 | ||||
| -rw-r--r-- | libc/misc/statfs/statfs64.c | 54 | ||||
| -rw-r--r-- | libc/misc/statfs/statvfs.c | 53 | 
8 files changed, 404 insertions, 20 deletions
diff --git a/libc/misc/Makefile b/libc/misc/Makefile index eb0bf6ff0..dfa1bf9ea 100644 --- a/libc/misc/Makefile +++ b/libc/misc/Makefile @@ -26,7 +26,7 @@ include $(TOPDIR)Rules.mak  DIRS = assert ctype dirent file fnmatch glob internals lsearch \ -       mntent syslog time utmp tsearch locale regex sysvipc +       mntent syslog time utmp tsearch locale regex sysvipc statfs  all: libc.a diff --git a/libc/misc/mntent/mntent.c b/libc/misc/mntent/mntent.c index 9e8fda613..ea5cf23d8 100644 --- a/libc/misc/mntent/mntent.c +++ b/libc/misc/mntent/mntent.c @@ -4,15 +4,18 @@  #include <mntent.h> - -struct mntent *getmntent(FILE * filep) +/* Reentrant version of the above function.  */ +struct mntent *getmntent_r (FILE *filep,  +	struct mntent *mnt, char *buff, int bufsize)  {  	char *cp, *sep = " \t\n"; -	static char buff[BUFSIZ]; -	static struct mntent mnt; +	static char *ptrptr = 0; + +	if (!filep || !mnt || !buff) +	    return NULL;  	/* Loop on the file, skipping comment lines. - FvK 03/07/93 */ -	while ((cp = fgets(buff, sizeof buff, filep)) != NULL) { +	while ((cp = fgets(buff, bufsize, filep)) != NULL) {  		if (buff[0] == '#' || buff[0] == '\n')  			continue;  		break; @@ -24,29 +27,42 @@ struct mntent *getmntent(FILE * filep)  	if (cp == NULL)  		return NULL; -	mnt.mnt_fsname = strtok(buff, sep); -	if (mnt.mnt_fsname == NULL) +	ptrptr = 0; +	mnt->mnt_fsname = strtok_r(buff, sep, &ptrptr); +	if (mnt->mnt_fsname == NULL)  		return NULL; -	mnt.mnt_dir = strtok(NULL, sep); -	if (mnt.mnt_dir == NULL) +	ptrptr = 0; +	mnt->mnt_dir = strtok_r(NULL, sep, &ptrptr); +	if (mnt->mnt_dir == NULL)  		return NULL; -	mnt.mnt_type = strtok(NULL, sep); -	if (mnt.mnt_type == NULL) +	ptrptr = 0; +	mnt->mnt_type = strtok_r(NULL, sep, &ptrptr); +	if (mnt->mnt_type == NULL)  		return NULL; -	mnt.mnt_opts = strtok(NULL, sep); -	if (mnt.mnt_opts == NULL) -		mnt.mnt_opts = ""; +	ptrptr = 0; +	mnt->mnt_opts = strtok_r(NULL, sep, &ptrptr); +	if (mnt->mnt_opts == NULL) +		mnt->mnt_opts = ""; -	cp = strtok(NULL, sep); -	mnt.mnt_freq = (cp != NULL) ? atoi(cp) : 0; +	ptrptr = 0; +	cp = strtok_r(NULL, sep, &ptrptr); +	mnt->mnt_freq = (cp != NULL) ? atoi(cp) : 0; -	cp = strtok(NULL, sep); -	mnt.mnt_passno = (cp != NULL) ? atoi(cp) : 0; +	ptrptr = 0; +	cp = strtok_r(NULL, sep, &ptrptr); +	mnt->mnt_passno = (cp != NULL) ? atoi(cp) : 0; -	return &mnt; +	return mnt; +} + +struct mntent *getmntent(FILE * filep) +{ +    static char buff[BUFSIZ]; +    static struct mntent mnt; +    return(getmntent_r(filep, &mnt, buff, sizeof buff));  }  int addmntent(FILE * filep, const struct mntent *mnt) diff --git a/libc/misc/statfs/Makefile b/libc/misc/statfs/Makefile new file mode 100644 index 000000000..d8ebf28a9 --- /dev/null +++ b/libc/misc/statfs/Makefile @@ -0,0 +1,43 @@ +# Makefile for uClibc +# Copyright (C) 2001,2002 Erik Andersen <andersen@uclibc.org> +# +# This program 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. +# +# This program 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 this program; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Derived in part from the Linux-8086 C library, the GNU C Library, and several +# other sundry sources.  Files within this library are copyright by their +# respective copyright holders. + +TOPDIR=../../../ +include $(TOPDIR)Rules.mak + +CSRC = fstatfs64.c fstatvfs.c statfs64.c statvfs.c +COBJS=$(patsubst %.c,%.o, $(CSRC)) +OBJS=$(COBJS) + + +all: $(OBJS) $(LIBC) + +$(LIBC): ar-target + +ar-target: $(OBJS) +	$(AR) $(ARFLAGS) $(LIBC) $(OBJS) + +$(COBJS): %.o : %.c +	$(CC) $(CFLAGS) -c $< -o $@ +	$(STRIPTOOL) -x -R .note -R .comment $*.o + +clean: +	rm -f *.[oa] *~ core + diff --git a/libc/misc/statfs/fstatfs64.c b/libc/misc/statfs/fstatfs64.c new file mode 100644 index 000000000..9f45cf2db --- /dev/null +++ b/libc/misc/statfs/fstatfs64.c @@ -0,0 +1,57 @@ +/* Return information about the filesystem on which FD resides. +   Copyright (C) 1996, 1997, 1998, 1999, 2000 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 Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#include <features.h> + +#ifdef __UCLIBC_HAVE_LFS__ + +#define _FILE_OFFSET_BITS   64 +#define __USE_FILE_OFFSET64 +#define __USE_LARGEFILE64 + +#include <errno.h> +#include <string.h> +#include <sys/statfs.h> +#include <sys/statvfs.h> +#include <stddef.h> + +/* Return information about the filesystem on which FD resides.  */ +int fstatfs64 (int fd, struct statfs64 *buf) +{ +    struct statfs buf32; + +    if (fstatfs (fd, &buf32) < 0) +	return -1; + +    buf->f_type = buf32.f_type; +    buf->f_bsize = buf32.f_bsize; +    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_fsid = buf32.f_fsid; +    buf->f_namelen = buf32.f_namelen; +    memcpy (buf->f_spare, buf32.f_spare, sizeof (buf32.f_spare)); + +    return 0; +} + +#endif /* __UCLIBC_HAVE_LFS__ */ + diff --git a/libc/misc/statfs/fstatvfs.c b/libc/misc/statfs/fstatvfs.c new file mode 100644 index 000000000..9fb21aed6 --- /dev/null +++ b/libc/misc/statfs/fstatvfs.c @@ -0,0 +1,52 @@ +/* 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 Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#include <features.h> + +#ifdef __UCLIBC_HAVE_LFS__ +# define _FILE_OFFSET_BITS   64 +# define __USE_FILE_OFFSET64 +# define __USE_LARGEFILE64 +#endif + +#define __USE_GNU +#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> + +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; + +#define STAT(st) fstat (fd, st) +#include "internal_statvfs.c" + +    /* We signal success if the statfs call succeeded.  */ +    return 0; +} diff --git a/libc/misc/statfs/internal_statvfs.c b/libc/misc/statfs/internal_statvfs.c new file mode 100644 index 000000000..aa7af44f5 --- /dev/null +++ b/libc/misc/statfs/internal_statvfs.c @@ -0,0 +1,109 @@ +/* Copyright (C) 1998, 1999, 2000, 2001 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 Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; 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; +  if (sizeof (buf->f_fsid) == sizeof (fsbuf.f_fsid)) +    buf->f_fsid = (fsbuf.f_fsid.__val[0] +		   | ((unsigned long int) fsbuf.f_fsid.__val[1] +		      << (8 * (sizeof (buf->f_fsid) +			       - sizeof (fsbuf.f_fsid.__val[0]))))); +  else +    /* We cannot help here.  The statvfs element is not large enough to +       contain both words of the statfs f_fsid field.  */ +    buf->f_fsid = fsbuf.f_fsid.__val[0]; +#ifdef _STATVFSBUF_F_UNUSED +  buf->__f_unused = 0; +#endif +  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 (STAT (&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); +    } diff --git a/libc/misc/statfs/statfs64.c b/libc/misc/statfs/statfs64.c new file mode 100644 index 000000000..7c8d0b3d5 --- /dev/null +++ b/libc/misc/statfs/statfs64.c @@ -0,0 +1,54 @@ +/* Return information about the filesystem on which FILE resides. +   Copyright (C) 1996, 1997, 1998, 1999, 2000 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 Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#include <features.h> + +#ifdef __UCLIBC_HAVE_LFS__ + +#define _FILE_OFFSET_BITS   64 +#define __USE_FILE_OFFSET64 +#define __USE_LARGEFILE64 + +#include <errno.h> +#include <string.h> +#include <sys/statfs.h> +#include <stddef.h> + +/* Return information about the filesystem on which FILE resides.  */ +int statfs64 (const char *file, struct statfs64 *buf) +{ +    struct statfs buf32; + +    if (statfs (file, &buf32) < 0) +	return -1; + +    buf->f_type = buf32.f_type; +    buf->f_bsize = buf32.f_bsize; +    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_fsid = buf32.f_fsid; +    buf->f_namelen = buf32.f_namelen; +    memcpy (buf->f_spare, buf32.f_spare, sizeof (buf32.f_spare)); + +    return 0; +} +#endif diff --git a/libc/misc/statfs/statvfs.c b/libc/misc/statfs/statvfs.c new file mode 100644 index 000000000..7c002beb8 --- /dev/null +++ b/libc/misc/statfs/statvfs.c @@ -0,0 +1,53 @@ +/* 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. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Lesser General Public +   License as published by the Free Software Foundation; either +   version 2.1 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 +   Lesser General Public License for more details. + +   You should have received a copy of the GNU Lesser General Public +   License along with the GNU C Library; if not, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#include <features.h> + +#ifdef __UCLIBC_HAVE_LFS__ +# define _FILE_OFFSET_BITS   64 +# define __USE_FILE_OFFSET64 +# define __USE_LARGEFILE64 +#endif + +#define __USE_GNU +#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> + + +int statvfs (const char *file, struct statvfs *buf) +{ +    struct statfs fsbuf; +    struct stat st; + +    /* Get as much information as possible from the system.  */ +    if (statfs (file, &fsbuf) < 0) +	return -1; + +#define STAT(st) stat (file, st) +#include "internal_statvfs.c" + +    /* We signal success if the statfs call succeeded.  */ +    return 0; +}  | 
