rt-thread/components/libc/compilers/dlib/syscall_open.c

84 lines
1.6 KiB
C
Raw Normal View History

2015-01-31 11:13:50 +08:00
/*
2021-03-08 18:19:04 +08:00
* Copyright (c) 2006-2021, RT-Thread Development Team
2018-10-14 19:28:18 +08:00
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2015-01-28 Bernard first version
*/
2015-01-31 11:13:50 +08:00
#include <rtthread.h>
2021-11-13 05:47:32 +08:00
#include <LowLevelIOInterface.h>
2021-10-26 12:51:32 +08:00
#include <fcntl.h>
2021-12-26 22:41:24 +08:00
#include <compiler_private.h>
#define DBG_TAG "dlib.syscall.open"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
2015-01-31 11:13:50 +08:00
2021-11-13 23:16:31 +08:00
/*
* The "__open" function opens the file named "filename" as specified
* by "mode".
*/
2015-01-31 11:13:50 +08:00
#pragma module_name = "?__open"
int __open(const char *filename, int mode)
{
2021-11-16 00:22:49 +08:00
#ifdef DFS_USING_POSIX
2021-12-26 22:41:24 +08:00
int handle;
int open_mode = O_RDONLY;
2021-12-26 22:41:24 +08:00
if (mode & _LLIO_CREAT)
2015-01-31 11:13:50 +08:00
{
2021-12-26 22:41:24 +08:00
open_mode |= O_CREAT;
/* Check what we should do with it if it exists. */
if (mode & _LLIO_APPEND)
{
/* Append to the existing file. */
open_mode |= O_APPEND;
}
if (mode & _LLIO_TRUNC)
{
/* Truncate the existsing file. */
open_mode |= O_TRUNC;
}
2015-01-31 11:13:50 +08:00
}
2021-12-26 22:41:24 +08:00
if (mode & _LLIO_TEXT)
2015-01-31 11:13:50 +08:00
{
2021-12-26 22:41:24 +08:00
/* we didn't support text mode */
2015-01-31 11:13:50 +08:00
}
2021-12-26 22:41:24 +08:00
switch (mode & _LLIO_RDWRMASK)
{
case _LLIO_RDONLY:
break;
2021-12-26 22:41:24 +08:00
case _LLIO_WRONLY:
open_mode |= O_WRONLY;
break;
2021-12-26 22:41:24 +08:00
case _LLIO_RDWR:
/* The file should be opened for both reads and writes. */
open_mode |= O_RDWR;
break;
2021-12-26 22:41:24 +08:00
default:
return _LLIO_ERROR;
}
2021-12-26 22:41:24 +08:00
handle = open(filename, open_mode, 0);
if (handle < 0)
{
return _LLIO_ERROR;
}
return handle;
2021-10-26 12:51:32 +08:00
#else
2021-12-26 22:41:24 +08:00
LOG_W(warning_without_fs);
return _LLIO_ERROR;
2021-11-16 00:22:49 +08:00
#endif /* DFS_USING_POSIX */
2015-01-31 11:13:50 +08:00
}