]> pd.if.org Git - pdclib/blob - platform/win32/functions/_PDCLIB/_PDCLIB_open.c
PDCLib includes with quotes, not <>.
[pdclib] / platform / win32 / functions / _PDCLIB / _PDCLIB_open.c
1 /* _PDCLIB_open( char const * const, int )
2
3    This file is part of the Public Domain C Library (PDCLib).
4    Permission is granted to use, modify, and / or redistribute at will.
5 */
6
7 /* This is a stub implementation of open.
8 */
9
10 #include <stdio.h>
11 #include <errno.h>
12
13 #ifndef REGTEST
14 #include "_PDCLIB_glue.h"
15 #include <windows.h>
16
17 extern const _PDCLIB_fileops_t _PDCLIB_fileops;
18
19 void _PDCLIB_w32errno(void);
20 bool _PDCLIB_open( _PDCLIB_fd_t * pFd, const _PDCLIB_fileops_t ** pOps,
21                    char const * const filename, unsigned int mode )
22 {
23     DWORD desiredAccess;
24     DWORD creationDisposition;
25
26     switch(mode & ( _PDCLIB_FREAD | _PDCLIB_FWRITE | _PDCLIB_FAPPEND 
27                     | _PDCLIB_FRW ))
28     {
29     case _PDCLIB_FREAD: /* "r" */
30         desiredAccess = GENERIC_READ;
31         creationDisposition = OPEN_EXISTING;
32         break;
33     case _PDCLIB_FWRITE: /* "w" */
34         desiredAccess = GENERIC_WRITE;
35         creationDisposition = CREATE_ALWAYS;
36         break;
37     case _PDCLIB_FAPPEND: /* "a" */
38         desiredAccess = GENERIC_WRITE;
39         creationDisposition = OPEN_ALWAYS;
40         break;
41     case _PDCLIB_FREAD | _PDCLIB_FRW: /* "r+" */
42         desiredAccess = GENERIC_READ | GENERIC_WRITE;
43         creationDisposition = OPEN_EXISTING;
44         break;
45     case _PDCLIB_FWRITE | _PDCLIB_FRW: /* "w+" */
46         desiredAccess = GENERIC_WRITE | GENERIC_READ;
47         creationDisposition = CREATE_ALWAYS;
48         break;
49     case _PDCLIB_FAPPEND | _PDCLIB_FRW: /* "a+" */
50         desiredAccess = GENERIC_WRITE | GENERIC_READ;
51         creationDisposition = OPEN_ALWAYS;
52         break;
53     default: /* Invalid mode */
54         errno = EINVAL;
55         return false;
56     }
57
58     HANDLE fd = CreateFileA(filename, desiredAccess, 
59         FILE_SHARE_READ | FILE_SHARE_DELETE,
60         NULL, creationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);
61
62     if(fd == INVALID_HANDLE_VALUE) {
63 #if 0
64         DWORD dw = GetLastError();
65         char* msgBuf;
66         FormatMessage(
67             FORMAT_MESSAGE_ALLOCATE_BUFFER | 
68             FORMAT_MESSAGE_FROM_SYSTEM |
69             FORMAT_MESSAGE_IGNORE_INSERTS,
70             NULL,
71             dw,
72             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
73             (LPSTR) &msgBuf,
74             0, NULL );
75
76         fprintf(stderr, "Error: %s\n", msgBuf);
77 #endif
78         _PDCLIB_w32errno();
79         return false;
80     }
81
82     if(mode & _PDCLIB_FAPPEND) {
83         LARGE_INTEGER offs;
84         offs.QuadPart = 0;
85         BOOL ok = SetFilePointerEx(fd, offs, NULL, FILE_END);
86         if(!ok) {
87             _PDCLIB_w32errno();
88             CloseHandle(fd);
89             return false;
90         }
91     }
92
93     pFd->pointer = fd;
94     *pOps = &_PDCLIB_fileops;
95     return true;
96 }
97
98 #endif
99
100 #ifdef TEST
101 #include "_PDCLIB_test.h"
102
103 #include <stdlib.h>
104 #include <string.h>
105
106 int main( void )
107 {
108     return TEST_RESULTS;
109 }
110
111 #endif
112