diff --git a/include/sys/statvfs.h b/include/sys/statvfs.h new file mode 100644 index 00000000000..a6cd2f456ad --- /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 + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Definitions for the flag in `f_flag'. These definitions should be + * kept in sync with the definitions in . + */ + +#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 902d30def8e..bce39a8acc2 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 760c3b7a091..60527c381c5 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 00000000000..18710066cc7 --- /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 +#include + +/**************************************************************************** + * 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 00000000000..449fe56bced --- /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 +#include + +/**************************************************************************** + * 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; +}