1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
3 * Copyright (C) 1997 University of Chicago.
4 * See COPYRIGHT notice in top-level directory.
9 void ADIOI_NTFS_WriteContig(ADIO_File fd
, void *buf
, int count
,
10 MPI_Datatype datatype
, int file_ptr_type
,
11 ADIO_Offset offset
, ADIO_Status
*status
,
14 static char myname
[] = "ADIOI_NTFS_WriteContig";
16 DWORD dwNumWritten
= 0;
17 int err
=-1, datatype_size
, len
;
20 /* If file pointer type in ADIO_INDIVIDUAL then offset should be
21 ignored and the current location of file pointer should be used */
22 if(file_ptr_type
== ADIO_INDIVIDUAL
){
26 MPI_Type_size(datatype
, &datatype_size
);
27 len
= datatype_size
* count
;
29 pOvl
= (OVERLAPPED
*) ADIOI_Calloc(sizeof(OVERLAPPED
), 1);
32 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
33 myname
, __LINE__
, MPI_ERR_IO
,
34 "**nomem", "**nomem %s", "OVERLAPPED");
37 pOvl
->hEvent
= CreateEvent(NULL
, TRUE
, TRUE
, NULL
);
38 if (pOvl
->hEvent
== NULL
)
40 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
42 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
43 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
44 myname
, __LINE__
, MPI_ERR_IO
,
45 "**io", "**io %s", errMsg
);
49 pOvl
->Offset
= DWORDLOW(offset
);
50 pOvl
->OffsetHigh
= DWORDHIGH(offset
);
52 if (file_ptr_type
== ADIO_EXPLICIT_OFFSET
)
54 if (fd
->fp_sys_posn
!= offset
)
56 dwTemp
= DWORDHIGH(offset
);
57 if (SetFilePointer(fd
->fd_sys
, DWORDLOW(offset
), &dwTemp
, FILE_BEGIN
) == INVALID_SET_FILE_POINTER
)
62 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
63 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
64 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
65 myname
, __LINE__
, MPI_ERR_IO
,
66 "**io", "**io %s", errMsg
);
67 CloseHandle(pOvl
->hEvent
);
73 /*printf("WriteFile(%d bytes)\n", len);fflush(stdout);*/
74 err
= WriteFile(fd
->fd_sys
, buf
, len
, &dwNumWritten
, pOvl
);
75 /* --BEGIN ERROR HANDLING-- */
79 if (err
!= ERROR_IO_PENDING
)
81 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
82 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
83 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
84 myname
, __LINE__
, MPI_ERR_IO
,
87 CloseHandle(pOvl
->hEvent
);
92 /* --END ERROR HANDLING-- */
93 err
= GetOverlappedResult(fd
->fd_sys
, pOvl
, &dwNumWritten
, TRUE
);
94 /* --BEGIN ERROR HANDLING-- */
97 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
99 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
100 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
,
101 MPIR_ERR_RECOVERABLE
, myname
,
102 __LINE__
, MPI_ERR_IO
, "**io",
104 CloseHandle(pOvl
->hEvent
);
108 /* --END ERROR HANDLING-- */
109 if (!CloseHandle(pOvl
->hEvent
))
111 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
112 err
= GetLastError();
113 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
114 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
115 myname
, __LINE__
, MPI_ERR_IO
,
116 "**io", "**io %s", errMsg
);
117 CloseHandle(pOvl
->hEvent
);
123 fd
->fp_sys_posn
= offset
+ dwNumWritten
;
124 /* individual file pointer not updated */
128 /* write from curr. location of ind. file pointer */
129 if (fd
->fp_sys_posn
!= fd
->fp_ind
)
131 dwTemp
= DWORDHIGH(fd
->fp_ind
);
132 if (SetFilePointer(fd
->fd_sys
, DWORDLOW(fd
->fp_ind
), &dwTemp
, FILE_BEGIN
) == INVALID_SET_FILE_POINTER
)
134 err
= GetLastError();
137 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
138 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
139 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
140 myname
, __LINE__
, MPI_ERR_IO
,
141 "**io", "**io %s", errMsg
);
142 CloseHandle(pOvl
->hEvent
);
148 /*printf("WriteFile(%d bytes)\n", len);fflush(stdout);*/
149 err
= WriteFile(fd
->fd_sys
, buf
, len
, &dwNumWritten
, pOvl
);
150 /* --BEGIN ERROR HANDLING-- */
153 err
= GetLastError();
154 if (err
!= ERROR_IO_PENDING
)
156 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
157 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
158 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
159 myname
, __LINE__
, MPI_ERR_IO
,
162 CloseHandle(pOvl
->hEvent
);
167 /* --END ERROR HANDLING-- */
168 err
= GetOverlappedResult(fd
->fd_sys
, pOvl
, &dwNumWritten
, TRUE
);
169 /* --BEGIN ERROR HANDLING-- */
172 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
173 err
= GetLastError();
174 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
175 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
,
176 MPIR_ERR_RECOVERABLE
, myname
,
177 __LINE__
, MPI_ERR_IO
, "**io",
179 CloseHandle(pOvl
->hEvent
);
183 /* --END ERROR HANDLING-- */
184 if (!CloseHandle(pOvl
->hEvent
))
186 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
187 err
= GetLastError();
188 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
189 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
190 myname
, __LINE__
, MPI_ERR_IO
,
191 "**io", "**io %s", errMsg
);
197 fd
->fp_ind
= fd
->fp_ind
+ dwNumWritten
;
198 fd
->fp_sys_posn
= fd
->fp_ind
;
201 #ifdef HAVE_STATUS_SET_BYTES
204 MPIR_Status_set_bytes(status
, datatype
, dwNumWritten
);
208 /* --BEGIN ERROR HANDLING-- */
211 char errMsg
[ADIOI_NTFS_ERR_MSG_MAX
];
212 err
= GetLastError();
213 ADIOI_NTFS_Strerror(err
, errMsg
, ADIOI_NTFS_ERR_MSG_MAX
);
214 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
215 myname
, __LINE__
, MPI_ERR_IO
,
220 /* --END ERROR HANDLING-- */
221 *error_code
= MPI_SUCCESS
;