This source file includes following definitions.
- ADIOI_NTFS_Open
1
2
3
4
5
6
7
8
9 #include "ad_ntfs.h"
10
11 void ADIOI_NTFS_Open(ADIO_File fd, int *error_code)
12 {
13 int err;
14 int cmode, amode, attrib;
15 static char myname[] = "ADIOI_NTFS_Open";
16
17 amode = 0;
18 cmode = OPEN_EXISTING;
19 #ifdef USE_WIN_THREADED_IO
20 attrib = FILE_FLAG_OVERLAPPED;
21 #else
22 attrib = FILE_ATTRIBUTE_NORMAL;
23 #endif
24
25 if (fd->access_mode & ADIO_CREATE)
26 {
27 cmode = OPEN_ALWAYS;
28 }
29 if (fd->access_mode & ADIO_EXCL)
30 {
31 cmode = CREATE_NEW;
32 }
33
34 if (fd->access_mode & ADIO_RDONLY)
35 {
36 amode = GENERIC_READ;
37 }
38 if (fd->access_mode & ADIO_WRONLY)
39 {
40 amode = GENERIC_WRITE;
41 }
42 if (fd->access_mode & ADIO_RDWR)
43 {
44 amode = GENERIC_READ | GENERIC_WRITE;
45 }
46
47 if (fd->access_mode & ADIO_DELETE_ON_CLOSE)
48 {
49 attrib = attrib | FILE_FLAG_DELETE_ON_CLOSE;
50 }
51 if (fd->access_mode & ADIO_SEQUENTIAL)
52 {
53 attrib = attrib | FILE_FLAG_SEQUENTIAL_SCAN;
54 }
55 else
56 {
57 attrib = attrib | FILE_FLAG_RANDOM_ACCESS;
58 }
59
60 fd->fd_sys = CreateFile(fd->filename,
61 amode,
62 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
63 NULL,
64 cmode,
65 attrib,
66 NULL);
67 fd->fd_direct = -1;
68
69 if ((fd->fd_sys != INVALID_HANDLE_VALUE) && (fd->access_mode & ADIO_APPEND))
70 {
71 fd->fp_ind = fd->fp_sys_posn = SetFilePointer(fd->fd_sys, 0, NULL, FILE_END);
72 if (fd->fp_ind == INVALID_SET_FILE_POINTER)
73 {
74 char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
75 err = GetLastError();
76 ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
77 if (err != NO_ERROR)
78 {
79 *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
80 myname, __LINE__, MPI_ERR_IO,
81 "**io", "**io %s", errMsg);
82 return;
83 }
84 }
85 }
86
87
88 if (fd->fd_sys == INVALID_HANDLE_VALUE)
89 {
90 char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
91 err = GetLastError();
92 ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
93 *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
94 myname, __LINE__, MPI_ERR_IO,
95 "**io",
96 "**io %s", errMsg);
97 return;
98 }
99
100 *error_code = MPI_SUCCESS;
101 }