提交 2f214bf4 编写于 作者: W wcc0

fix: add fchmod api

add fchmod api and testcases

Change-Id: I310e9e9d79bbe3fa8dbab6080bbfce8a77b79bb3
Signed-off-by: Nwcc0 <917033401@qq.com>
上级 76507c05
...@@ -2268,6 +2268,34 @@ OUT: ...@@ -2268,6 +2268,34 @@ OUT:
return ret; return ret;
} }
int SysFchmod(int fd, mode_t mode)
{
int ret;
int sysFd;
struct IATTR attr = {
.attr_chg_mode = mode,
.attr_chg_valid = CHG_MODE, /* change mode */
};
struct file *file = NULL;
sysFd = GetAssociatedSystemFd(fd);
if (sysFd < 0) {
return -EBADF;
}
ret = fs_getfilep(sysFd, &file);
if (ret < 0) {
return -get_errno();
}
ret = chattr(file->f_path, &attr);
if (ret < 0) {
return -get_errno();
}
return ret;
}
int SysFchownat(int fd, const char *path, uid_t owner, gid_t group, int flag) int SysFchownat(int fd, const char *path, uid_t owner, gid_t group, int flag)
{ {
int ret; int ret;
......
...@@ -234,6 +234,7 @@ extern int SysExecve(const char *fileName, char *const *argv, char *const *envp) ...@@ -234,6 +234,7 @@ extern int SysExecve(const char *fileName, char *const *argv, char *const *envp)
extern int SysChdir(const char *path); extern int SysChdir(const char *path);
extern int SysUtimensat(int fd, const char *path, struct timespec times[2], int flag); extern int SysUtimensat(int fd, const char *path, struct timespec times[2], int flag);
extern int SysFchmodat(int fd, const char *path, mode_t mode, int flag); extern int SysFchmodat(int fd, const char *path, mode_t mode, int flag);
extern int SysFchmod(int fd, mode_t mode);
extern int SysChmod(const char *path, mode_t mode); extern int SysChmod(const char *path, mode_t mode);
extern int SysFchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); extern int SysFchownat(int fd, const char *path, uid_t owner, gid_t group, int flag);
extern int SysFchown(int fd, uid_t owner, gid_t group); extern int SysFchown(int fd, uid_t owner, gid_t group);
......
...@@ -50,6 +50,7 @@ SYSCALL_HAND_DEF(__NR_sysinfo, SysInfo, int, ARG_NUM_1) ...@@ -50,6 +50,7 @@ SYSCALL_HAND_DEF(__NR_sysinfo, SysInfo, int, ARG_NUM_1)
SYSCALL_HAND_DEF(__NR_chdir, SysChdir, int, ARG_NUM_1) SYSCALL_HAND_DEF(__NR_chdir, SysChdir, int, ARG_NUM_1)
SYSCALL_HAND_DEF(__NR_utimensat, SysUtimensat, int, ARG_NUM_4) SYSCALL_HAND_DEF(__NR_utimensat, SysUtimensat, int, ARG_NUM_4)
SYSCALL_HAND_DEF(__NR_fchmodat, SysFchmodat, int, ARG_NUM_4) SYSCALL_HAND_DEF(__NR_fchmodat, SysFchmodat, int, ARG_NUM_4)
SYSCALL_HAND_DEF(__NR_fchmod, SysFchmod, int, ARG_NUM_2)
SYSCALL_HAND_DEF(__NR_utimensat, SysUtimensat, int, ARG_NUM_4) SYSCALL_HAND_DEF(__NR_utimensat, SysUtimensat, int, ARG_NUM_4)
SYSCALL_HAND_DEF(__NR_chmod, SysChmod, int, ARG_NUM_2) SYSCALL_HAND_DEF(__NR_chmod, SysChmod, int, ARG_NUM_2)
SYSCALL_HAND_DEF(__NR_lseek, SysLseek, off_t, ARG_NUM_7) /* current only support 32bit max 4G file */ SYSCALL_HAND_DEF(__NR_lseek, SysLseek, off_t, ARG_NUM_7) /* current only support 32bit max 4G file */
......
...@@ -211,6 +211,8 @@ sources_full = [ ...@@ -211,6 +211,8 @@ sources_full = [
"jffs/full/it_test_fs_jffs_002.cpp", "jffs/full/it_test_fs_jffs_002.cpp",
"jffs/full/it_test_fs_jffs_003.cpp", "jffs/full/it_test_fs_jffs_003.cpp",
"jffs/full/it_test_fs_jffs_004.cpp", "jffs/full/it_test_fs_jffs_004.cpp",
"jffs/full/it_test_fs_jffs_102.cpp",
"jffs/full/it_test_fs_jffs_103.cpp",
"jffs/full/It_jffs_001.cpp", "jffs/full/It_jffs_001.cpp",
"jffs/full/It_jffs_002.cpp", "jffs/full/It_jffs_002.cpp",
"jffs/full/It_jffs_003.cpp", "jffs/full/It_jffs_003.cpp",
......
...@@ -271,6 +271,8 @@ void ItTestFsJffs001(void); ...@@ -271,6 +271,8 @@ void ItTestFsJffs001(void);
void ItTestFsJffs002(void); void ItTestFsJffs002(void);
void ItTestFsJffs003(void); void ItTestFsJffs003(void);
void ItTestFsJffs004(void); void ItTestFsJffs004(void);
void ItTestFsJffs102(void);
void ItTestFsJffs103(void);
VOID ItJffs001(VOID); VOID ItJffs001(VOID);
VOID ItJffs002(VOID); VOID ItJffs002(VOID);
VOID ItJffs003(VOID); VOID ItJffs003(VOID);
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "It_fs_jffs.h" #include "It_vfs_jffs.h"
#define TEST_STRLEN 30 #define TEST_STRLEN 30
...@@ -37,13 +37,85 @@ static int TestCase(void) ...@@ -37,13 +37,85 @@ static int TestCase(void)
INT32 fd = 0; INT32 fd = 0;
INT32 ret = JFFS_IS_ERROR; INT32 ret = JFFS_IS_ERROR;
CHAR pathname1[TEST_STRLEN] = JFFS_PATH_NAME0; CHAR pathname1[TEST_STRLEN] = JFFS_PATH_NAME0;
struct stat info = {0};
fd = open(pathname1, O_NONBLOCK | O_CREAT | O_EXCL, 0777); fd = open(pathname1, O_NONBLOCK | O_CREAT | O_RDWR | O_EXCL, 0777);
ICUNIT_GOTO_NOT_EQUAL(fd, -1, fd, EXIT1); ICUNIT_GOTO_NOT_EQUAL(fd, -1, fd, EXIT1);
ret = fchmod(fd, S_IREAD); /* EBADF */
ret = fchmod(-1, S_IREAD);
ret = errno;
ICUNIT_GOTO_EQUAL(ret, EBADF, ret, EXIT1);
/* S_IRWXU */
ret = fchmod(fd, S_IRWXU);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IRWXU;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IRUSR */
ret = fchmod(fd, S_IRUSR);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IRUSR;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IWUSR */
ret = fchmod(fd, S_IWUSR);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IWUSR;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IXUSR */
ret = fchmod(fd, S_IXUSR);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IXUSR;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IRWXG */
ret = fchmod(fd, S_IRWXG);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IRWXG;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* SIRGRP */
ret = fchmod(fd, S_IRGRP);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IRGRP;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IXGRP */
ret = fchmod(fd, S_IXGRP);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IXGRP;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IRWXO */
ret = fchmod(fd, S_IRWXO);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode &S_IRWXO;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IROTH */
ret = fchmod(fd, S_IROTH);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IROTH;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
/* S_IXOTH */
ret = fchmod(fd, S_IXOTH);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
stat(pathname1, &info);
ret = info.st_mode & S_IXOTH;
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT);
ret = close(fd); ret = close(fd);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1);
......
...@@ -28,8 +28,7 @@ ...@@ -28,8 +28,7 @@
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "It_vfs_jffs.h"
#include "It_fs_jffs.h"
#define TEST_STRLEN 30 #define TEST_STRLEN 30
...@@ -41,6 +40,8 @@ static int TestCase(void) ...@@ -41,6 +40,8 @@ static int TestCase(void)
CHAR pathname0[TEST_STRLEN] = JFFS_PATH_NAME0; CHAR pathname0[TEST_STRLEN] = JFFS_PATH_NAME0;
CHAR pathname1[TEST_STRLEN] = JFFS_PATH_NAME0; CHAR pathname1[TEST_STRLEN] = JFFS_PATH_NAME0;
CHAR pathname2[TEST_STRLEN] = JFFS_PATH_NAME0; CHAR pathname2[TEST_STRLEN] = JFFS_PATH_NAME0;
CHAR pathname3[TEST_STRLEN] = JFFS_PATH_NAME01;
CHAR filebuf[256] = "abcdeab89abcedcde01234567fghij9876543210abcdeabc89abcedfghde0123456710abcdeabcde012876543289abcedfghij987654345673210abcdeabcde0123456789abcedfghij9876543210abcdeabcde0123456789abcedfg10abcdeahij9876543289abcedfghlbcde01234567I0lalalalalalalal";
struct stat info = {0}; struct stat info = {0};
ret = mkdir(pathname0, 0777); ret = mkdir(pathname0, 0777);
...@@ -60,16 +61,54 @@ static int TestCase(void) ...@@ -60,16 +61,54 @@ static int TestCase(void)
dirfd = open(pathname0, O_DIRECTORY); dirfd = open(pathname0, O_DIRECTORY);
ICUNIT_GOTO_NOT_EQUAL(dirfd, JFFS_IS_ERROR, dirfd, EXIT); ICUNIT_GOTO_NOT_EQUAL(dirfd, JFFS_IS_ERROR, dirfd, EXIT);
ret = fchmodat(fd, "test1", S_IREAD, 0); /* ENAMETOOLONG */
ret = fchmodat(dirfd, filebuf, S_IREAD, 0);
ret = errno;
ICUNIT_GOTO_EQUAL(ret, ENAMETOOLONG, ret, EXIT);
/* ENOENT */
ret = fchmodat(-1, "test1", S_IREAD, 0);
ret = errno;
ICUNIT_GOTO_EQUAL(ret, ENOENT, ret, EXIT);
/* EINVAL */
ret = fchmodat(dirfd, NULL, S_IREAD, 0);
ret = errno;
ICUNIT_GOTO_EQUAL(ret, EINVAL, ret, EXIT);
/* absolute path */
ret = fchmodat(0, pathname1, S_IRUSR | S_IWUSR | S_IXUSR, 0);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
stat(pathname1, &info);
ret = info.st_mode & (S_IRUSR | S_IWUSR | S_IXUSR);
ICUNIT_GOTO_EQUAL(ret, (S_IRUSR | S_IWUSR | S_IXUSR), ret, EXIT);
/* S_IRUSR | S_IWUSR | S_IXUSR */
ret = fchmodat(dirfd, "test1", S_IRUSR | S_IWUSR | S_IXUSR, 0);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
stat(pathname1, &info); stat(pathname1, &info);
ret = info.st_mode & S_IREAD; ret = info.st_mode & (S_IRUSR | S_IWUSR | S_IXUSR);
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, (S_IRUSR | S_IWUSR | S_IXUSR), ret, EXIT);
/* AT_FDCWD */
ret = fchmodat(AT_FDCWD, "test/test1", S_IRUSR | S_IWUSR | S_IXUSR, 0);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
stat(pathname1, &info);
ret = info.st_mode & (S_IRUSR | S_IWUSR | S_IXUSR);
ICUNIT_GOTO_EQUAL(ret, (S_IRUSR | S_IWUSR | S_IXUSR), ret, EXIT);
ret = close(dirfd); ret = close(dirfd);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
/* ENOTDIR */
dirfd = open(pathname3, O_NONBLOCK | O_CREAT | O_RDWR | O_EXCL, 0777);
ICUNIT_GOTO_NOT_EQUAL(fd, JFFS_IS_ERROR, fd, EXIT);
ret = fchmodat(dirfd, "test1", S_IROTH | S_IWOTH | S_IXOTH, 0);
ret = errno;
ICUNIT_GOTO_EQUAL(ret, ENOTDIR, ret, EXIT);
ret = close(dirfd);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
ret = remove(pathname3);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
ret = rmdir(pathname1); ret = rmdir(pathname1);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
...@@ -85,17 +124,15 @@ static int TestCase(void) ...@@ -85,17 +124,15 @@ static int TestCase(void)
stat(pathname2, &info); stat(pathname2, &info);
ret = info.st_mode & (S_IRUSR | S_IRGRP | S_IROTH); ret = info.st_mode & (S_IRUSR | S_IRGRP | S_IROTH);
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, (S_IRUSR | S_IRGRP | S_IROTH), ret, EXIT);
ret = close(fd); ret = close(fd);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
ret = fchmodat(dirfd, "test.txt", S_IREAD, 0); ret = fchmodat(dirfd, "test.txt", S_IRUSR | S_IWUSR | S_IXUSR, 0);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT1); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
stat(pathname2, &info); stat(pathname2, &info);
ret = info.st_mode & S_IREAD; ret = info.st_mode & (S_IRUSR | S_IWUSR | S_IXUSR);
ICUNIT_GOTO_NOT_EQUAL(ret, 0, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, (S_IRUSR | S_IWUSR | S_IXUSR), ret, EXIT);
ret = close(dirfd); ret = close(dirfd);
ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT); ICUNIT_GOTO_EQUAL(ret, JFFS_NO_ERROR, ret, EXIT);
...@@ -114,6 +151,7 @@ EXIT1: ...@@ -114,6 +151,7 @@ EXIT1:
close(fd); close(fd);
} }
EXIT: EXIT:
remove(pathname3);
remove(pathname2); remove(pathname2);
remove(pathname1); remove(pathname1);
remove(pathname0); remove(pathname0);
......
...@@ -1043,6 +1043,27 @@ HWTEST_F(VfsJffsTest, ItTestFsJffs004, TestSize.Level0) ...@@ -1043,6 +1043,27 @@ HWTEST_F(VfsJffsTest, ItTestFsJffs004, TestSize.Level0)
ItTestFsJffs004(); ItTestFsJffs004();
} }
/* *
* @tc.name: ItTestFsJffs102
* @tc.desc: function for VfsJffsTest
* @tc.type: FUNC
* @tc.require: AR000EEMQ9
*/
HWTEST_F(VfsJffsTest, ItTestFsJffs102, TestSize.Level0)
{
ItTestFsJffs102();
}
/* *
* @tc.name: ItTestFsJffs103
* @tc.desc: function for VfsJffsTest
* @tc.type: FUNC
* @tc.require: AR000EEMQ9
*/
HWTEST_F(VfsJffsTest, ItTestFsJffs103, TestSize.Level0)
{
ItTestFsJffs103();
}
/* * /* *
* @tc.name: IT_JFFS_002 * @tc.name: IT_JFFS_002
* @tc.desc: function for VfsJffsTest * @tc.desc: function for VfsJffsTest
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册