xref: /nrf52832-nimble/rt-thread/components/libc/compilers/dlib/syscall_open.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date           Author       Notes
8*10465441SEvalZero * 2015-01-28     Bernard      first version
9*10465441SEvalZero */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rtthread.h>
12*10465441SEvalZero #include <yfuns.h>
13*10465441SEvalZero #ifdef RT_USING_DFS
14*10465441SEvalZero #include <dfs_posix.h>
15*10465441SEvalZero #endif
16*10465441SEvalZero 
17*10465441SEvalZero #pragma module_name = "?__open"
18*10465441SEvalZero 
__open(const char * filename,int mode)19*10465441SEvalZero int __open(const char *filename, int mode)
20*10465441SEvalZero {
21*10465441SEvalZero #ifndef RT_USING_DFS
22*10465441SEvalZero   return _LLIO_ERROR;
23*10465441SEvalZero #else
24*10465441SEvalZero   int handle;
25*10465441SEvalZero   int open_mode = O_RDONLY;
26*10465441SEvalZero 
27*10465441SEvalZero   if (mode & _LLIO_CREAT)
28*10465441SEvalZero   {
29*10465441SEvalZero     open_mode |= O_CREAT;
30*10465441SEvalZero 
31*10465441SEvalZero     /* Check what we should do with it if it exists. */
32*10465441SEvalZero     if (mode & _LLIO_APPEND)
33*10465441SEvalZero     {
34*10465441SEvalZero       /* Append to the existing file. */
35*10465441SEvalZero       open_mode |= O_APPEND;
36*10465441SEvalZero     }
37*10465441SEvalZero 
38*10465441SEvalZero     if (mode & _LLIO_TRUNC)
39*10465441SEvalZero     {
40*10465441SEvalZero       /* Truncate the existsing file. */
41*10465441SEvalZero       open_mode |= O_TRUNC;
42*10465441SEvalZero     }
43*10465441SEvalZero   }
44*10465441SEvalZero 
45*10465441SEvalZero   if (mode & _LLIO_TEXT)
46*10465441SEvalZero   {
47*10465441SEvalZero     /* we didn't support text mode */
48*10465441SEvalZero   }
49*10465441SEvalZero 
50*10465441SEvalZero   switch (mode & _LLIO_RDWRMASK)
51*10465441SEvalZero   {
52*10465441SEvalZero   case _LLIO_RDONLY:
53*10465441SEvalZero     break;
54*10465441SEvalZero 
55*10465441SEvalZero   case _LLIO_WRONLY:
56*10465441SEvalZero     open_mode |= O_WRONLY;
57*10465441SEvalZero     break;
58*10465441SEvalZero 
59*10465441SEvalZero   case _LLIO_RDWR:
60*10465441SEvalZero     /* The file should be opened for both reads and writes. */
61*10465441SEvalZero     open_mode |= O_RDWR;
62*10465441SEvalZero     break;
63*10465441SEvalZero 
64*10465441SEvalZero   default:
65*10465441SEvalZero     return _LLIO_ERROR;
66*10465441SEvalZero   }
67*10465441SEvalZero 
68*10465441SEvalZero   handle = open(filename, open_mode, 0);
69*10465441SEvalZero   if (handle < 0)
70*10465441SEvalZero     return _LLIO_ERROR;
71*10465441SEvalZero 
72*10465441SEvalZero   return handle;
73*10465441SEvalZero #endif
74*10465441SEvalZero }
75