* cygwin.din (fstatvfs): Export.

(statvfs): Export.
	* syscalls.cc: Include sys/statvfs.h.
	(statvfs): New function.  Move statfs functionality here.
	(fstatvfs): New function.
	(statfs): Just call statvfs and copy structure.  Check validity of
	incoming struct statfs pointer.
	* include/cygwin/types.h (fsblkcnt_t): Define.
	(fsfilcnt_t): Define.
	* include/cygwin/version.h: Bump API minor version.
	* include/sys/statvfs.h: New file.
This commit is contained in:
Corinna Vinschen 2005-02-23 13:12:43 +00:00
parent e5ef74dfb2
commit a652e6d52a
6 changed files with 113 additions and 7 deletions

View File

@ -1,3 +1,17 @@
2005-02-23 Corinna Vinschen <corinna@vinschen.de>
* cygwin.din (fstatvfs): Export.
(statvfs): Export.
* syscalls.cc: Include sys/statvfs.h.
(statvfs): New function. Move statfs functionality here.
(fstatvfs): New function.
(statfs): Just call statvfs and copy structure. Check validity of
incoming struct statfs pointer.
* include/cygwin/types.h (fsblkcnt_t): Define.
(fsfilcnt_t): Define.
* include/cygwin/version.h: Bump API minor version.
* include/sys/statvfs.h: New file.
2005-02-23 Corinna Vinschen <corinna@vinschen.de> 2005-02-23 Corinna Vinschen <corinna@vinschen.de>
* devices.h: Switch FH_ZERO and FH_PORT as on Linux. Add FH_FULL. * devices.h: Switch FH_ZERO and FH_PORT as on Linux. Add FH_FULL.

View File

@ -564,6 +564,7 @@ _fsetpos64 = fsetpos64 SIGFE
_fstat64 = fstat64 SIGFE _fstat64 = fstat64 SIGFE
fstatfs SIGFE fstatfs SIGFE
_fstatfs = fstatfs SIGFE _fstatfs = fstatfs SIGFE
fstatvfs SIGFE
fdatasync SIGFE fdatasync SIGFE
fsync SIGFE fsync SIGFE
_fsync = fsync SIGFE _fsync = fsync SIGFE
@ -1307,6 +1308,7 @@ _sscanf = sscanf SIGFE
_stat64 = stat64 SIGFE _stat64 = stat64 SIGFE
statfs SIGFE statfs SIGFE
_statfs = statfs SIGFE _statfs = statfs SIGFE
statvfs SIGFE
strcasecmp NOSIGFE strcasecmp NOSIGFE
_strcasecmp = strcasecmp NOSIGFE _strcasecmp = strcasecmp NOSIGFE
strcat NOSIGFE strcat NOSIGFE

View File

@ -66,6 +66,16 @@ typedef __blkcnt32_t blkcnt_t;
#endif #endif
#endif /*__blkcnt_t_defined*/ #endif /*__blkcnt_t_defined*/
#ifndef __fsblkcnt_t_defined
#define __fsblkcnt_t_defined
typedef unsigned long fsblkcnt_t;
#endif /* __fsblkcnt_t_defined */
#ifndef __fsfilcnt_t_defined
#define __fsfilcnt_t_defined
typedef unsigned long fsfilcnt_t;
#endif /* __fsfilcnt_t_defined */
#ifndef __uid_t_defined #ifndef __uid_t_defined
#define __uid_t_defined #define __uid_t_defined
typedef unsigned short __uid16_t; typedef unsigned short __uid16_t;

View File

@ -248,12 +248,13 @@ details. */
118: Export getpriority, setpriority. 118: Export getpriority, setpriority.
119: Export fdatasync. 119: Export fdatasync.
120: Export basename, dirname. 120: Export basename, dirname.
121: Export statvfs, fstatvfs.
*/ */
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0 #define CYGWIN_VERSION_API_MAJOR 0
#define CYGWIN_VERSION_API_MINOR 120 #define CYGWIN_VERSION_API_MINOR 121
/* There is also a compatibity version number associated with the /* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible shared memory regions. It is incremented when incompatible

View File

@ -0,0 +1,41 @@
/* sys/statvfs.h
Copyright 2005 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifndef _SYS_STATVFS_H_
#define _SYS_STATVFS_H_
#include <sys/types.h>
struct statvfs {
unsigned long f_bsize; /* file system block size */
unsigned long f_frsize; /* fragment size */
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* free blocks in fs */
fsblkcnt_t f_bavail; /* free blocks avail to non-superuser */
fsfilcnt_t f_files; /* total file nodes in file system */
fsfilcnt_t f_ffree; /* free file nodes in fs */
fsfilcnt_t f_favail; /* avail file nodes in fs */
unsigned long f_fsid; /* file system id */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum length of filenames */
};
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
int statvfs (const char *__path, struct statvfs *__buf);
int fstatvfs (int __fd, struct statvfs *__buf);
#ifdef __cplusplus
};
#endif /* __cplusplus */
#endif /*_SYS_STATVFS_H_*/

View File

@ -24,6 +24,7 @@ details. */
#include "winsup.h" #include "winsup.h"
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/vfs.h> /* needed for statfs */ #include <sys/vfs.h> /* needed for statfs */
#include <sys/statvfs.h> /* needed for statvfs */
#include <pwd.h> #include <pwd.h>
#include <grp.h> #include <grp.h>
#include <stdlib.h> #include <stdlib.h>
@ -1684,10 +1685,14 @@ get_osfhandle (int fd)
} }
extern "C" int extern "C" int
statfs (const char *fname, struct statfs *sfs) statvfs (const char *fname, struct statvfs *sfs)
{ {
char root[CYG_MAX_PATH]; char root[CYG_MAX_PATH];
if (check_null_empty_str_errno (fname)
|| check_null_invalid_struct_errno (sfs))
return -1;
syscall_printf ("statfs %s", fname); syscall_printf ("statfs %s", fname);
if (!sfs) if (!sfs)
@ -1729,18 +1734,51 @@ statfs (const char *fname, struct statfs *sfs)
__seterrno (); __seterrno ();
return -1; return -1;
} }
sfs->f_type = flags;
sfs->f_bsize = spc*bps; sfs->f_bsize = spc*bps;
sfs->f_frsize = spc*bps;
sfs->f_blocks = totalc; sfs->f_blocks = totalc;
sfs->f_bavail = availc;
sfs->f_bfree = freec; sfs->f_bfree = freec;
sfs->f_files = -1; sfs->f_bavail = availc;
sfs->f_ffree = -1; sfs->f_files = ULONG_MAX;
sfs->f_ffree = ULONG_MAX;
sfs->f_favail = ULONG_MAX;
sfs->f_fsid = vsn; sfs->f_fsid = vsn;
sfs->f_namelen = maxlen; sfs->f_flag = flags;
sfs->f_namemax = maxlen;
return 0; return 0;
} }
extern "C" int
fstatvfs (int fd, struct statvfs *sfs)
{
cygheap_fdget cfd (fd);
if (cfd < 0)
return -1;
return statvfs (cfd->get_name (), sfs);
}
extern "C" int
statfs (const char *fname, struct statfs *sfs)
{
if (check_null_invalid_struct_errno (sfs))
return -1;
struct statvfs vfs;
int ret = statvfs (fname, &vfs);
if (!ret)
{
sfs->f_type = vfs.f_flag;
sfs->f_bsize = vfs.f_bsize;
sfs->f_blocks = vfs.f_blocks;
sfs->f_bavail = vfs.f_bavail;
sfs->f_bfree = vfs.f_bfree;
sfs->f_files = -1;
sfs->f_ffree = -1;
sfs->f_fsid = vfs.f_fsid;
sfs->f_namelen = vfs.f_namemax;
}
return ret;
}
extern "C" int extern "C" int
fstatfs (int fd, struct statfs *sfs) fstatfs (int fd, struct statfs *sfs)
{ {