You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ag...@apache.org on 2020/07/13 19:25:11 UTC

[incubator-nuttx] branch master updated: fs/vfs: Implement statvfs and fstatvfs

This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 6f6d61e  fs/vfs: Implement statvfs and fstatvfs
6f6d61e is described below

commit 6f6d61eec40732487c2d5c97e43e4b38c9d056fd
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Fri Jul 10 22:27:06 2020 +0800

    fs/vfs: Implement statvfs and fstatvfs
    
    specified here:
    https://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/statvfs.h.html
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 include/sys/statvfs.h           | 84 +++++++++++++++++++++++++++++++++++++++++
 include/sys/types.h             |  5 +++
 libs/libc/unistd/Make.defs      |  2 +-
 libs/libc/unistd/lib_fstatvfs.c | 73 +++++++++++++++++++++++++++++++++++
 libs/libc/unistd/lib_statvfs.c  | 73 +++++++++++++++++++++++++++++++++++
 5 files changed, 236 insertions(+), 1 deletion(-)

diff --git a/include/sys/statvfs.h b/include/sys/statvfs.h
new file mode 100644
index 0000000..a6cd2f4
--- /dev/null
+++ b/include/sys/statvfs.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * include/sys/statvfs.h
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+#ifndef __INCLUDE_SYS_STATVFS_H
+#define __INCLUDE_SYS_STATVFS_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/types.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Definitions for the flag in `f_flag'.  These definitions should be
+ * kept in sync with the definitions in <sys/mount.h>.
+ */
+
+#define ST_RDONLY             0x0001 /* Mount read-only.  */
+#define ST_NOSUID             0x0002 /* Ignore suid and sgid bits.  */
+
+/****************************************************************************
+ * Type Definitions
+ ****************************************************************************/
+
+struct statvfs
+{
+  unsigned long f_bsize;   /* File system block size */
+  unsigned long f_frsize;  /* Fundamental file system block size */
+  fsblkcnt_t    f_blocks;  /* Total number of blocks on file system in
+                            * units of f_frsize */
+  fsblkcnt_t    f_bfree;   /* Total number of free blocks */
+  fsblkcnt_t    f_bavail;  /* Number of free blocks available to
+                            * non-privileged process */
+  fsfilcnt_t    f_files;   /* Total number of file serial numbers */
+  fsfilcnt_t    f_ffree;   /* Total number of free file serial numbers */
+  fsfilcnt_t    f_favail;  /* Number of file serial numbers available to
+                            * non-privileged process */
+  unsigned long f_fsid;    /* File system ID */
+  unsigned long f_flag;    /* Bit mask of f_flag values */
+  unsigned long f_namemax; /* Maximum filename length */
+};
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+int statvfs(FAR const char *path, FAR struct statvfs *buf);
+int fstatvfs(int fd, FAR struct statvfs *buf);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __INCLUDE_SYS_STATVFS_H */
diff --git a/include/sys/types.h b/include/sys/types.h
index 902d30d..bce39a8 100644
--- a/include/sys/types.h
+++ b/include/sys/types.h
@@ -202,6 +202,11 @@ typedef int wint_t;
 
 typedef int wctype_t;
 
+/* fsblkcnt_t and fsfilcnt_t shall be defined as unsigned integer types. */
+
+typedef uint32_t     fsblkcnt_t;
+typedef uint32_t     fsfilcnt_t;
+
 /* blkcnt_t and off_t are signed integer types.
  *
  *   blkcnt_t is used for file block counts.
diff --git a/libs/libc/unistd/Make.defs b/libs/libc/unistd/Make.defs
index 760c3b7..60527c3 100644
--- a/libs/libc/unistd/Make.defs
+++ b/libs/libc/unistd/Make.defs
@@ -37,7 +37,7 @@
 
 CSRCS += lib_access.c lib_daemon.c lib_swab.c lib_pathconf.c lib_sysconf.c
 CSRCS += lib_getopt.c lib_getoptargp.c lib_getoptindp.c lib_getoptoptp.c
-CSRCS += lib_alarm.c lib_sleep.c lib_usleep.c
+CSRCS += lib_alarm.c lib_fstatvfs.c lib_statvfs.c lib_sleep.c lib_usleep.c
 CSRCS += lib_seteuid.c lib_setegid.c lib_geteuid.c lib_getegid.c
 CSRCS += lib_setreuid.c lib_setregid.c
 CSRCS += lib_getrusage.c
diff --git a/libs/libc/unistd/lib_fstatvfs.c b/libs/libc/unistd/lib_fstatvfs.c
new file mode 100644
index 0000000..1871006
--- /dev/null
+++ b/libs/libc/unistd/lib_fstatvfs.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * libs/libc/unistd/lib_fstatvfs.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/statfs.h>
+#include <sys/statvfs.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: fstatvfs
+ *
+ * Description:
+ *   The fstatvfs() function shall obtain information about the file system
+ *   containing the file referenced by fd.
+ *
+ *   the buf argument is a pointer to a statvfs structure that shall be
+ *   filled. Read, write, or execute permission of the named file is not
+ *   required.
+ *
+ * Returned Value:
+ *   Upon successful completion, statvfs() shall return 0. Otherwise, it
+ *   shall return -1 and set errno to indicate the error.
+ *
+ ****************************************************************************/
+
+int fstatvfs(int fd, FAR struct statvfs *buf)
+{
+  struct statfs tmp;
+  int ret;
+
+  ret = fstatfs(fd, &tmp);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+  buf->f_bsize   = tmp.f_bsize;
+  buf->f_frsize  = tmp.f_bsize;
+  buf->f_blocks  = tmp.f_blocks;
+  buf->f_bfree   = tmp.f_bfree;
+  buf->f_bavail  = tmp.f_bavail;
+  buf->f_files   = tmp.f_files;
+  buf->f_ffree   = tmp.f_ffree;
+  buf->f_favail  = tmp.f_ffree;
+  buf->f_fsid    = 0;
+  buf->f_flag    = 0;
+  buf->f_namemax = tmp.f_namelen;
+
+  return ret;
+}
diff --git a/libs/libc/unistd/lib_statvfs.c b/libs/libc/unistd/lib_statvfs.c
new file mode 100644
index 0000000..449fe56
--- /dev/null
+++ b/libs/libc/unistd/lib_statvfs.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * libs/libc/unistd/lib_statvfs.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/statfs.h>
+#include <sys/statvfs.h>
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: statvfs
+ *
+ * Description:
+ *   The statvfs() function shall obtain information about the file system
+ *   containing the file named by path.
+ *
+ *   the buf argument is a pointer to a statvfs structure that shall be
+ *   filled. Read, write, or execute permission of the named file is not
+ *   required.
+ *
+ * Returned Value:
+ *   Upon successful completion, statvfs() shall return 0. Otherwise, it
+ *   shall return -1 and set errno to indicate the error.
+ *
+ ****************************************************************************/
+
+int statvfs(FAR const char *path, FAR struct statvfs *buf)
+{
+  struct statfs tmp;
+  int ret;
+
+  ret = statfs(path, &tmp);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+  buf->f_bsize   = tmp.f_bsize;
+  buf->f_frsize  = tmp.f_bsize;
+  buf->f_blocks  = tmp.f_blocks;
+  buf->f_bfree   = tmp.f_bfree;
+  buf->f_bavail  = tmp.f_bavail;
+  buf->f_files   = tmp.f_files;
+  buf->f_ffree   = tmp.f_ffree;
+  buf->f_favail  = tmp.f_ffree;
+  buf->f_fsid    = 0;
+  buf->f_flag    = 0;
+  buf->f_namemax = tmp.f_namelen;
+
+  return ret;
+}