From e77c9be0dc54addf0a94cf417ede49a690c4d8c1 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 6 Apr 2004 03:33:25 +0000 Subject: [PATCH] Added support for fstatvfs. --- configure | 4 ++ configure.ac | 2 + include/config.h.in | 6 +++ include/wine/port.h | 5 +++ libs/port/Makefile.in | 1 + libs/port/fstatvfs.c | 98 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 116 insertions(+) create mode 100644 libs/port/fstatvfs.c diff --git a/configure b/configure index ba51f643699..cf04fbdd126 100755 --- a/configure +++ b/configure @@ -15978,6 +15978,8 @@ fi + + @@ -15995,6 +15997,8 @@ for ac_func in \ clone \ finite \ fpclass \ + fstatfs \ + fstatvfs \ ftruncate \ ftruncate64 \ futimes \ diff --git a/configure.ac b/configure.ac index 76675f8cc10..328ac834e15 100644 --- a/configure.ac +++ b/configure.ac @@ -1025,6 +1025,8 @@ AC_CHECK_FUNCS(\ clone \ finite \ fpclass \ + fstatfs \ + fstatvfs \ ftruncate \ ftruncate64 \ futimes \ diff --git a/include/config.h.in b/include/config.h.in index 5c63db70ba7..b56687b7a2a 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -125,6 +125,12 @@ /* Define to 1 if the system has the type `fsfilcnt_t'. */ #undef HAVE_FSFILCNT_T +/* Define to 1 if you have the `fstatfs' function. */ +#undef HAVE_FSTATFS + +/* Define to 1 if you have the `fstatvfs' function. */ +#undef HAVE_FSTATVFS + /* Define to 1 if you have the header file. */ #undef HAVE_FT2BUILD_H diff --git a/include/wine/port.h b/include/wine/port.h index 0a1c44a6614..0c9c4f481c2 100644 --- a/include/wine/port.h +++ b/include/wine/port.h @@ -222,6 +222,10 @@ struct statvfs #ifndef NO_LIBWINE_PORT +#ifndef HAVE_FSTATVFS +int fstatvfs( int fd, struct statvfs *buf ); +#endif + #ifndef HAVE_GETOPT_LONG extern char *optarg; extern int optind; @@ -391,6 +395,7 @@ extern long interlocked_xchg_add( long *dest, long incr ); #define __WINE_NOT_PORTABLE(func) func##_is_not_portable func##_is_not_portable +#define fstatvfs __WINE_NOT_PORTABLE(fstatvfs) #define getopt_long __WINE_NOT_PORTABLE(getopt_long) #define getopt_long_only __WINE_NOT_PORTABLE(getopt_long_only) #define getpagesize __WINE_NOT_PORTABLE(getpagesize) diff --git a/libs/port/Makefile.in b/libs/port/Makefile.in index 6241205773c..57ad743e522 100644 --- a/libs/port/Makefile.in +++ b/libs/port/Makefile.in @@ -7,6 +7,7 @@ VPATH = @srcdir@ MODULE = libwine_port.a C_SRCS = \ + fstatvfs.c \ getopt.c \ getopt1.c \ getpagesize.c \ diff --git a/libs/port/fstatvfs.c b/libs/port/fstatvfs.c new file mode 100644 index 00000000000..a6ba691e1af --- /dev/null +++ b/libs/port/fstatvfs.c @@ -0,0 +1,98 @@ +/* + * fstatvfs function + * + * Copyright 2004 Alexandre Julliard + * + * This 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. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#ifndef HAVE_FSTATVFS + +#include +#include +#include +#ifdef HAVE_SYS_PARAM_H +# include +#endif +#ifdef STATFS_DEFINED_BY_SYS_VFS +# include +#else +# ifdef STATFS_DEFINED_BY_SYS_MOUNT +# include +# else +# ifdef STATFS_DEFINED_BY_SYS_STATFS +# include +# endif +# endif +#endif + +int fstatvfs( int fd, struct statvfs *buf ) +{ + int ret; +#ifdef HAVE_FSTATFS + struct statfs info; + +/* FIXME: add autoconf check for this */ +#if defined(__svr4__) || defined(_SCO_DS) || defined(__sun) + ret = fstatfs( fd, &info, 0, 0 ); +#else + ret = fstatfs( fd, &info ); +#endif + if (ret >= 0) + { + memset( buf, 0, sizeof(*buf) ); + buf->f_bsize = info.f_bsize; + buf->f_blocks = info.f_blocks; + buf->f_files = info.f_files; +#ifdef HAVE_STRUCT_STATFS_F_NAMELEN + buf->f_namemax = info.f_namelen; +#endif +#ifdef HAVE_STRUCT_STATFS_F_FRSIZE + buf->f_frsize = info.f_frsize; +#else + buf->f_frsize = info.f_bsize; +#endif +#ifdef HAVE_STRUCT_STATFS_F_BFREE + buf->f_bfree = info.f_bfree; +#else + buf->f_bfree = info.f_bavail; +#endif +#ifdef HAVE_STRUCT_STATFS_F_BAVAIL + buf->f_bavail = info.f_bavail; +#else + buf->f_bavail = info.f_bfree; +#endif +#ifdef HAVE_STRUCT_STATFS_F_FFREE + buf->f_ffree = info.f_ffree; +#else + buf->f_ffree = info.f_favail; +#endif +#ifdef HAVE_STRUCT_STATFS_F_FAVAIL + buf->f_favail = info.f_favail; +#else + buf->f_favail = info.f_ffree; +#endif + } +#else /* HAVE_FSTATFS */ + ret = -1; + errno = ENOSYS; +#endif /* HAVE_FSTATFS */ + return ret; +} + +#endif /* HAVE_FSTATVFS */