Commit 748252aa authored by Chris Friedt's avatar Chris Friedt Committed by Henrik Brix Andersen
Browse files

posix: device_io: use mode argument correctly in open()



Previously, we had only used the flags field and ignored mode
with the open() function.

Signed-off-by: default avatarChris Friedt <cfriedt@tenstorrent.com>
parent ab8b28ed
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
#include <stdio.h>
#include <stdint.h>

#include <zephyr/posix/fcntl.h>
#include <zephyr/posix/poll.h>
#include <zephyr/posix/unistd.h>
#include <zephyr/posix/sys/select.h>
@@ -16,28 +17,28 @@
int zvfs_close(int fd);
FILE *zvfs_fdopen(int fd, const char *mode);
int zvfs_fileno(FILE *file);
int zvfs_open(const char *name, int flags);
int zvfs_open(const char *name, int flags, int mode);
ssize_t zvfs_read(int fd, void *buf, size_t sz, size_t *from_offset);
ssize_t zvfs_write(int fd, const void *buf, size_t sz, size_t *from_offset);

void FD_CLR(int fd, struct zvfs_fd_set *fdset)
{
	return ZVFS_FD_CLR(fd, (struct zvfs_fd_set *)fdset);
	return ZVFS_FD_CLR(fd, fdset);
}

int FD_ISSET(int fd, struct zvfs_fd_set *fdset)
{
	return ZVFS_FD_ISSET(fd, (struct zvfs_fd_set *)fdset);
	return ZVFS_FD_ISSET(fd, fdset);
}

void FD_SET(int fd, struct zvfs_fd_set *fdset)
{
	ZVFS_FD_SET(fd, (struct zvfs_fd_set *)fdset);
	ZVFS_FD_SET(fd, fdset);
}

void FD_ZERO(fd_set *fdset)
{
	ZVFS_FD_ZERO((struct zvfs_fd_set *)fdset);
	ZVFS_FD_ZERO(fdset);
}

int close(int fd)
@@ -60,8 +61,16 @@ int fileno(FILE *file)

int open(const char *name, int flags, ...)
{
	/* FIXME: necessarily need to check for O_CREAT and unpack ... if set */
	return zvfs_open(name, flags);
	int mode = 0;
	va_list args;

	if ((flags & O_CREAT) != 0) {
		va_start(args, flags);
		mode = va_arg(args, int);
		va_end(args);
	}

	return zvfs_open(name, flags, mode);
}
#ifdef CONFIG_POSIX_DEVICE_IO_ALIAS_OPEN
FUNC_ALIAS(open, _open, int);
+29 −9
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ static int posix_mode_to_zephyr(int mf)
	return mode;
}

int zvfs_open(const char *name, int flags)
int zvfs_open(const char *name, int flags, int mode)
{
	int rc, fd;
	struct posix_fs_desc *ptr = NULL;
@@ -102,24 +102,44 @@ int zvfs_open(const char *name, int flags)

	ptr = posix_fs_alloc_obj(false);
	if (ptr == NULL) {
		zvfs_free_fd(fd);
		errno = EMFILE;
		return -1;
		rc = -EMFILE;
		goto out_err;
	}

	fs_file_t_init(&ptr->file);

	rc = fs_open(&ptr->file, name, zmode);
	if (flags & O_CREAT) {
		flags &= ~O_CREAT;

		rc = fs_open(&ptr->file, name, FS_O_CREATE | (mode & O_ACCMODE));
		if (rc < 0) {
			goto out_err;
		}
		rc = fs_close(&ptr->file);
		if (rc < 0) {
			goto out_err;
		}
	}

	rc = fs_open(&ptr->file, name, zmode);
	if (rc < 0) {
		goto out_err;
	}

	zvfs_finalize_fd(fd, ptr, &fs_fd_op_vtable);

	goto out;

out_err:
	if (ptr != NULL) {
		posix_fs_free_obj(ptr);
	}

	zvfs_free_fd(fd);
	errno = -rc;
	return -1;
	}

	zvfs_finalize_fd(fd, ptr, &fs_fd_op_vtable);

out:
	return fd;
}

+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ static int test_mkdir(void)
		return res;
	}

	res = open(TEST_DIR_FILE, O_CREAT | O_RDWR);
	res = open(TEST_DIR_FILE, O_CREAT | O_RDWR, 0770);

	if (res < 0) {
		TC_PRINT("Failed opening file [%d]\n", res);
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ static int test_file_open(void)
{
	int res;

	res = open(TEST_FILE, O_CREAT | O_RDWR);
	res = open(TEST_FILE, O_CREAT | O_RDWR, 0660);
	if (res < 0) {
		TC_ERROR("Failed opening file: %d, errno=%d\n", res, errno);
		/* FIXME: restructure tests as per #46897 */
+2 −2
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ static int test_file_open_flags(void)

	/* 2 Create file for read only, attempt to read, attempt to write */
	TC_PRINT("Open on non-existent file, flags = O_CREAT | O_WRONLY\n");
	fd = open(THE_FILE, O_CREAT | O_WRONLY);
	fd = open(THE_FILE, O_CREAT | O_WRONLY, 0440);
	if (fd < 0) {
		TC_PRINT("Expected success; fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
@@ -236,7 +236,7 @@ static int test_file_open_flags(void)
	TC_PRINT("Attempt write to file opened with O_APPEND | O_RDWR\n");
	/* Clean start */
	unlink(THE_FILE);
	fd = open(THE_FILE, O_CREAT | O_WRONLY);
	fd = open(THE_FILE, O_CREAT | O_WRONLY, 0440);
	if (fd < 0) {
		TC_PRINT("Expected success, fd = %d, errno = %d\n", fd, errno);
		return TC_FAIL;
Loading