]> pd.if.org Git - pdclib/blob - platform/posix/functions/stdio/_PDCLIB_open.c
17bd022e4f51f805a961f2b49d8c8a73f4612bed
[pdclib] / platform / posix / functions / stdio / _PDCLIB_open.c
1 /* _PDCLIB_open(_PDCLIB_fd_t*, const _PDCLIB_fileops_t**, 
2                 char const*, unsigned int)
3
4    This file is part of the Public Domain C Library (PDCLib).
5    Permission is granted to use, modify, and / or redistribute at will.
6 */
7 #ifndef REGTEST
8 #include <_PDCLIB_glue.h>
9 #include <_PDCLIB_io.h>
10 #include <fcntl.h>
11
12 extern const _PDCLIB_fileops_t _PDCLIB_fileops;
13
14 bool _PDCLIB_open( 
15    _PDCLIB_fd_t* fd, const _PDCLIB_fileops_t** ops,
16    char const * filename, unsigned int mode )
17 {
18     int osmode;
19     switch ( mode & ( _PDCLIB_FREAD | _PDCLIB_FWRITE | _PDCLIB_FAPPEND | _PDCLIB_FRW ) )
20     {
21         case _PDCLIB_FREAD: /* "r" */
22             osmode = O_RDONLY;
23             break;
24         case _PDCLIB_FWRITE: /* "w" */
25             osmode = O_WRONLY | O_CREAT | O_TRUNC;
26             break;
27         case _PDCLIB_FAPPEND: /* "a" */
28             osmode = O_WRONLY | O_APPEND | O_CREAT;
29             break;
30         case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */
31             osmode = O_RDWR;
32             break;
33         case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */
34             osmode = O_RDWR | O_CREAT | O_TRUNC;
35             break;
36         case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */
37             osmode = O_RDWR | O_APPEND | O_CREAT;
38             break;
39         default: /* Invalid mode */
40             return -1;
41     }
42
43     fd->sval = open(filename, osmode, 
44         S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
45     if(fd->sval == -1) {
46         return false;
47     }
48
49     *ops = &_PDCLIB_fileops;
50     return true;
51 }
52 #endif
53
54 #ifdef TEST
55 #include <_PDCLIB_test.h>
56
57 int main( void )
58 {
59     return TEST_RESULTS;
60 }
61
62 #endif