29
29
static void vio_init(Vio* vio, enum enum_vio_type type,
30
int sd, uint32_t flags)
30
my_socket sd, HANDLE hPipe, uint flags)
32
DBUG_ENTER("vio_init");
33
DBUG_PRINT("enter", ("type: %d sd: %d flags: %d", type, sd, flags));
32
35
#ifndef HAVE_VIO_READ_BUFF
33
36
flags&= ~VIO_BUFFERED_READ;
35
memset(vio, 0, sizeof(*vio));
38
bzero((char*) vio, sizeof(*vio));
42
vio->localhost= flags & VIO_LOCALHOST;
38
43
if ((flags & VIO_BUFFERED_READ) &&
39
44
!(vio->read_buffer= (char*)my_malloc(VIO_READ_BUFFER_SIZE, MYF(MY_WME))))
40
45
flags&= ~VIO_BUFFERED_READ;
47
if (type == VIO_TYPE_NAMEDPIPE)
49
vio->viodelete =vio_delete;
50
vio->vioerrno =vio_errno;
51
vio->read =vio_read_pipe;
52
vio->write =vio_write_pipe;
53
vio->fastsend =vio_fastsend;
54
vio->viokeepalive =vio_keepalive;
55
vio->should_retry =vio_should_retry;
56
vio->was_interrupted=vio_was_interrupted;
57
vio->vioclose =vio_close_pipe;
58
vio->peer_addr =vio_peer_addr;
59
vio->vioblocking =vio_blocking;
60
vio->is_blocking =vio_is_blocking;
61
vio->timeout =vio_ignore_timeout;
63
else /* default is VIO_TYPE_TCPIP */
66
if (type == VIO_TYPE_SHARED_MEMORY)
68
vio->viodelete =vio_delete;
69
vio->vioerrno =vio_errno;
70
vio->read =vio_read_shared_memory;
71
vio->write =vio_write_shared_memory;
72
vio->fastsend =vio_fastsend;
73
vio->viokeepalive =vio_keepalive;
74
vio->should_retry =vio_should_retry;
75
vio->was_interrupted=vio_was_interrupted;
76
vio->vioclose =vio_close_shared_memory;
77
vio->peer_addr =vio_peer_addr;
78
vio->vioblocking =vio_blocking;
79
vio->is_blocking =vio_is_blocking;
80
vio->timeout =vio_ignore_timeout;
42
85
vio->viodelete =vio_delete;
43
86
vio->vioerrno =vio_errno;
53
96
vio->is_blocking =vio_is_blocking;
54
97
vio->timeout =vio_timeout;
59
103
/* Reset initialized VIO to use with another transport type */
61
105
void vio_reset(Vio* vio, enum enum_vio_type type,
62
int sd, uint32_t flags)
106
my_socket sd, HANDLE hPipe, uint flags)
64
free(vio->read_buffer);
65
vio_init(vio, type, sd, flags);
108
my_free(vio->read_buffer, MYF(MY_ALLOW_ZERO_PTR));
109
vio_init(vio, type, sd, hPipe, flags);
69
113
/* Open the socket or TCP/IP connection and read the fnctl() status */
71
Vio *vio_new(int sd, enum enum_vio_type type, uint32_t flags)
115
Vio *vio_new(my_socket sd, enum enum_vio_type type, uint flags)
118
DBUG_ENTER("vio_new");
119
DBUG_PRINT("enter", ("sd: %d", sd));
75
120
if ((vio = (Vio*) my_malloc(sizeof(*vio),MYF(MY_WME))))
77
vio_init(vio, type, sd, flags);
78
sprintf(vio->desc, "TCP/IP (%d)", vio->sd);
122
vio_init(vio, type, sd, 0, flags);
124
(vio->type == VIO_TYPE_SOCKET ? "socket (%d)" : "TCP/IP (%d)"),
126
#if !defined(__WIN__)
127
#if !defined(NO_FCNTL_NONBLOCK)
80
129
We call fcntl() to set the flags and then immediately read them back
81
130
to make sure that we and the system are in agreement on the state of
89
138
fcntl(sd, F_SETFL, 0);
90
139
vio->fcntl_mode= fcntl(sd, F_GETFL);
140
#elif defined(HAVE_SYS_IOCTL_H) /* hpux */
141
/* Non blocking sockets doesn't work good on HPUX 11.0 */
142
(void) ioctl(sd,FIOSNBIO,0);
143
vio->fcntl_mode &= ~O_NONBLOCK;
145
#else /* !defined(__WIN__) */
147
/* set to blocking mode by default */
149
r = ioctlsocket(sd,FIONBIO,(void*) &arg);
150
vio->fcntl_mode &= ~O_NONBLOCK;
160
Vio *vio_new_win32pipe(HANDLE hPipe)
163
DBUG_ENTER("vio_new_handle");
164
if ((vio = (Vio*) my_malloc(sizeof(Vio),MYF(MY_WME))))
166
vio_init(vio, VIO_TYPE_NAMEDPIPE, 0, hPipe, VIO_LOCALHOST);
167
strmov(vio->desc, "named pipe");
173
Vio *vio_new_win32shared_memory(NET *net,HANDLE handle_file_map, HANDLE handle_map,
174
HANDLE event_server_wrote, HANDLE event_server_read,
175
HANDLE event_client_wrote, HANDLE event_client_read,
176
HANDLE event_conn_closed)
179
DBUG_ENTER("vio_new_win32shared_memory");
180
if ((vio = (Vio*) my_malloc(sizeof(Vio),MYF(MY_WME))))
182
vio_init(vio, VIO_TYPE_SHARED_MEMORY, 0, 0, VIO_LOCALHOST);
183
vio->handle_file_map= handle_file_map;
184
vio->handle_map= handle_map;
185
vio->event_server_wrote= event_server_wrote;
186
vio->event_server_read= event_server_read;
187
vio->event_client_wrote= event_client_wrote;
188
vio->event_client_read= event_client_read;
189
vio->event_conn_closed= event_conn_closed;
190
vio->shared_memory_remain= 0;
191
vio->shared_memory_pos= handle_map;
193
strmov(vio->desc, "shared memory");
96
201
void vio_delete(Vio* vio)