3030#include <string.h>
3131#include <m_string.h>
3232
33- #ifdef HAVE_NPIPE_DYNAMIC
34- #define my_malloc (A , B ) malloc((A))
35- #undef my_free
36- #define my_free (A ,B ) free(((A)))
37- #endif
38-
3933/* Function prototypes */
4034my_bool pvio_npipe_set_timeout (MARIADB_PVIO * pvio , enum enum_pvio_timeout type , int timeout );
4135int pvio_npipe_get_timeout (MARIADB_PVIO * pvio , enum enum_pvio_timeout type );
4236size_t pvio_npipe_read (MARIADB_PVIO * pvio , uchar * buffer , size_t length );
43- size_t pvio_npipe_write (MARIADB_PVIO * pvio , uchar * buffer , size_t length );
37+ size_t pvio_npipe_write (MARIADB_PVIO * pvio , const uchar * buffer , size_t length );
4438int pvio_npipe_wait_io_or_timeout (MARIADB_PVIO * pvio , my_bool is_read , int timeout );
4539my_bool pvio_npipe_blocking (MARIADB_PVIO * pvio , my_bool value , my_bool * old_value );
4640my_bool pvio_npipe_connect (MARIADB_PVIO * pvio , MA_PVIO_CINFO * cinfo );
4741my_bool pvio_npipe_close (MARIADB_PVIO * pvio );
4842int pvio_npipe_fast_send (MARIADB_PVIO * pvio );
4943int pvio_npipe_keepalive (MARIADB_PVIO * pvio );
50- my_socket pvio_npipe_get_socket (MARIADB_PVIO * pvio );
44+ my_bool pvio_npipe_get_handle (MARIADB_PVIO * pvio , void * handle );
5145my_bool pvio_npipe_is_blocking (MARIADB_PVIO * pvio );
5246
5347struct st_ma_pvio_methods pvio_npipe_methods = {
5448 pvio_npipe_set_timeout ,
5549 pvio_npipe_get_timeout ,
5650 pvio_npipe_read ,
51+ NULL ,
5752 pvio_npipe_write ,
53+ NULL ,
5854 pvio_npipe_wait_io_or_timeout ,
5955 pvio_npipe_blocking ,
6056 pvio_npipe_connect ,
6157 pvio_npipe_close ,
6258 pvio_npipe_fast_send ,
6359 pvio_npipe_keepalive ,
64- pvio_npipe_get_socket ,
60+ pvio_npipe_get_handle ,
6561 pvio_npipe_is_blocking
6662};
6763
@@ -87,7 +83,6 @@ struct st_pvio_npipe {
8783 HANDLE pipe ;
8884 OVERLAPPED overlapped ;
8985 size_t rw_size ;
90- int fcntl_mode ;
9186 MYSQL * mysql ;
9287};
9388
@@ -117,7 +112,7 @@ size_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
117112
118113 cpipe = (struct st_pvio_npipe * )pvio -> data ;
119114
120- if (ReadFile (cpipe -> pipe , buffer , length , & dwRead , & cpipe -> overlapped ))
115+ if (ReadFile (cpipe -> pipe , ( LPVOID ) buffer , length , & dwRead , & cpipe -> overlapped ))
121116 {
122117 r = (size_t )dwRead ;
123118 goto end ;
@@ -131,7 +126,7 @@ size_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length)
131126 return r ;
132127}
133128
134- size_t pvio_npipe_write (MARIADB_PVIO * pvio , uchar * buffer , size_t length )
129+ size_t pvio_npipe_write (MARIADB_PVIO * pvio , const uchar * buffer , size_t length )
135130{
136131 DWORD dwWrite = 0 ;
137132 size_t r = -1 ;
@@ -171,10 +166,11 @@ int pvio_npipe_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeo
171166 status = WaitForSingleObject (cpipe -> overlapped .hEvent , timeout );
172167 if (status == WAIT_OBJECT_0 )
173168 {
174- if (GetOverlappedResult (cpipe -> pipe , & cpipe -> overlapped , & cpipe -> rw_size , FALSE))
169+ if (GetOverlappedResult (cpipe -> pipe , & cpipe -> overlapped , ( LPDWORD ) & cpipe -> rw_size , FALSE))
175170 return 0 ;
176171 }
177- /* other status codes are: WAIT_ABANDONED, WAIT_TIMEOUT and WAIT_FAILED */
172+ /* For other status codes (WAIT_ABANDONED, WAIT_TIMEOUT and WAIT_FAILED)
173+ we return error */
178174 save_error = GetLastError ();
179175 CancelIo (cpipe -> pipe );
180176 SetLastError (save_error );
@@ -184,12 +180,27 @@ int pvio_npipe_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeo
184180my_bool pvio_npipe_blocking (MARIADB_PVIO * pvio , my_bool block , my_bool * previous_mode )
185181{
186182 /* not supported */
183+ DWORD flags = 0 ;
184+ struct st_pvio_npipe * cpipe = NULL ;
185+
186+ cpipe = (struct st_pvio_npipe * )pvio -> data ;
187+
188+ if (previous_mode )
189+ {
190+ if (!GetNamedPipeHandleState (cpipe -> pipe , & flags , NULL , NULL , NULL , NULL , 0 ))
191+ return 1 ;
192+ * previous_mode = flags & PIPE_NOWAIT ? 0 : 1 ;
193+ }
194+
195+ flags = block ? PIPE_WAIT : PIPE_NOWAIT ;
196+ if (!SetNamedPipeHandleState (cpipe -> pipe , & flags , NULL , NULL ))
197+ return 1 ;
187198 return 0 ;
188199}
189200
190201int pvio_npipe_keepalive (MARIADB_PVIO * pvio )
191202{
192- /* not supported */
203+ /* keep alive is used for TCP/IP connections only */
193204 return 0 ;
194205}
195206
@@ -205,7 +216,7 @@ my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
205216 if (!pvio || !cinfo )
206217 return 1 ;
207218
208- if (!(cpipe = (struct st_pvio_npipe * )my_malloc (sizeof (struct st_pvio_npipe ), MYF ( 0 ) )))
219+ if (!(cpipe = (struct st_pvio_npipe * )LocalAlloc (sizeof (struct st_pvio_npipe ), 0 )))
209220 {
210221 PVIO_SET_ERROR (cinfo -> mysql , CR_OUT_OF_MEMORY , unknown_sqlstate , 0 , "" );
211222 return 1 ;
@@ -244,14 +255,14 @@ my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
244255
245256 if (GetLastError () != ERROR_PIPE_BUSY )
246257 {
247- pvio -> set_error (pvio , CR_NAMEDPIPEOPEN_ERROR , SQLSTATE_UNKNOWN , 0 ,
258+ pvio -> set_error (pvio -> mysql , CR_NAMEDPIPEOPEN_ERROR , SQLSTATE_UNKNOWN , 0 ,
248259 cinfo -> host , cinfo -> unix_socket , GetLastError ());
249260 goto end ;
250261 }
251262
252263 if (has_timedout || !WaitNamedPipe (szPipeName , pvio -> timeout [PVIO_CONNECT_TIMEOUT ]))
253264 {
254- pvio -> set_error (pvio , CR_NAMEDPIPEWAIT_ERROR , SQLSTATE_UNKNOWN , 0 ,
265+ pvio -> set_error (pvio -> mysql , CR_NAMEDPIPEWAIT_ERROR , SQLSTATE_UNKNOWN , 0 ,
255266 cinfo -> host , cinfo -> unix_socket , GetLastError ());
256267 goto end ;
257268 }
@@ -261,15 +272,15 @@ my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
261272 dwMode = PIPE_READMODE_BYTE | PIPE_WAIT ;
262273 if (!SetNamedPipeHandleState (cpipe -> pipe , & dwMode , NULL , NULL ))
263274 {
264- pvio -> set_error (pvio , CR_NAMEDPIPESETSTATE_ERROR , SQLSTATE_UNKNOWN , 0 ,
275+ pvio -> set_error (pvio -> mysql , CR_NAMEDPIPESETSTATE_ERROR , SQLSTATE_UNKNOWN , 0 ,
265276 cinfo -> host , cinfo -> unix_socket , (ulong ) GetLastError ());
266277 goto end ;
267278 }
268279
269280 /* Register event handler for overlapped IO */
270281 if (!(cpipe -> overlapped .hEvent = CreateEvent (NULL , FALSE, FALSE, NULL )))
271282 {
272- pvio -> set_error (pvio , CR_EVENT_CREATE_FAILED , SQLSTATE_UNKNOWN , 0 ,
283+ pvio -> set_error (pvio -> mysql , CR_EVENT_CREATE_FAILED , SQLSTATE_UNKNOWN , 0 ,
273284 GetLastError ());
274285 goto end ;
275286 }
@@ -280,7 +291,7 @@ my_bool pvio_npipe_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
280291 {
281292 if (cpipe -> pipe != INVALID_HANDLE_VALUE )
282293 CloseHandle (cpipe -> pipe );
283- my_free (( gptr ) cpipe , MYF ( 0 ) );
294+ LocalFree ( cpipe );
284295 pvio -> data = NULL ;
285296 }
286297 return 1 ;
@@ -303,22 +314,32 @@ my_bool pvio_npipe_close(MARIADB_PVIO *pvio)
303314 CloseHandle (cpipe -> pipe );
304315 cpipe -> pipe = INVALID_HANDLE_VALUE ;
305316 }
306- my_free (( gptr ) pvio -> data , MYF ( 0 ) );
317+ LocalFree ( pvio -> data );
307318 pvio -> data = NULL ;
308319 }
309320 return r ;
310321}
311322
312- my_socket pvio_npipe_get_socket (MARIADB_PVIO * pvio )
323+ my_bool pvio_npipe_get_handle (MARIADB_PVIO * pvio , void * handle )
313324{
314325 if (pvio && pvio -> data )
315- return (my_socket )((struct st_pvio_npipe * )pvio -> data )-> pipe ;
316- return INVALID_SOCKET ;
326+ {
327+ * (HANDLE * )handle = ((struct st_pvio_npipe * )pvio -> data )-> pipe ;
328+ return 0 ;
329+ }
330+ return 1 ;
317331}
318332
319333my_bool pvio_npipe_is_blocking (MARIADB_PVIO * pvio )
320334{
321- return 1 ;
335+ DWORD flags = 0 ;
336+ struct st_pvio_npipe * cpipe = NULL ;
337+
338+ cpipe = (struct st_pvio_npipe * )pvio -> data ;
339+
340+ if (!GetNamedPipeHandleState (cpipe -> pipe , & flags , NULL , NULL , NULL , NULL , 0 ))
341+ return 1 ;
342+ return (flags & PIPE_NOWAIT ) ? 0 : 1 ;
322343}
323344
324345#endif
0 commit comments