summaryrefslogtreecommitdiff
path: root/components/libc/compilers/dlib/syscall_open.c
blob: 4d557db4b029ef5f3394eab5169f482bfb627660 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
* Change Logs:
* Date           Author       Notes
* 2015-01-28     Bernard      first version
*/

#include <rtthread.h>
#include <LowLevelIOInterface.h>
#include <fcntl.h>
#include <compiler_private.h>
#define DBG_TAG    "dlib.syscall.open"
#define DBG_LVL    DBG_INFO
#include <rtdbg.h>

/*
 * The "__open" function opens the file named "filename" as specified
 * by "mode".
 */

#pragma module_name = "?__open"

int __open(const char *filename, int mode)
{
#ifdef DFS_USING_POSIX
    int handle;
    int open_mode = O_RDONLY;

    if (mode & _LLIO_CREAT)
    {
        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;
        }
    }

    if (mode & _LLIO_TEXT)
    {
        /* we didn't support text mode */
    }

    switch (mode & _LLIO_RDWRMASK)
    {
    case _LLIO_RDONLY:
        break;

    case _LLIO_WRONLY:
        open_mode |= O_WRONLY;
        break;

    case _LLIO_RDWR:
        /* The file should be opened for both reads and writes. */
        open_mode |= O_RDWR;
        break;

    default:
        return _LLIO_ERROR;
    }

    handle = open(filename, open_mode, 0);
    if (handle < 0)
    {
        return _LLIO_ERROR;
    }
    return handle;
#else
    LOG_W(_WARNING_WITHOUT_FS);
    return _LLIO_ERROR;
#endif /* DFS_USING_POSIX */
}