81
if (vio != 0) /* If real connection */
100
if (vio != 0) /* If real connection */
83
net->fd = drizzleclient_vio_fd(vio); /* For perl DBI/DBD */
84
drizzleclient_vio_fastsend(vio);
89
bool drizzleclient_net_init_sock(NET * net, int sock, int flags,
90
uint32_t buffer_length)
93
Vio *drizzleclient_vio_tmp= drizzleclient_vio_new(sock, VIO_TYPE_TCPIP, flags);
94
if (drizzleclient_vio_tmp == NULL)
97
if (drizzleclient_net_init(net, drizzleclient_vio_tmp, buffer_length))
102
net->fd = vio_fd(vio); /* For perl DBI/DBD */
103
#if defined(MYSQL_SERVER)
104
if (!(test_flags & TEST_BLOCKING))
99
/* Only delete the temporary vio if we didn't already attach it to the
102
if (drizzleclient_vio_tmp && (net->vio != drizzleclient_vio_tmp))
103
drizzleclient_vio_delete(drizzleclient_vio_tmp);
106
(void) shutdown(sock, SHUT_RDWR);
107
vio_blocking(vio, FALSE, &old_mode);
114
void drizzleclient_net_end(NET *net)
116
if (net->buff != NULL)
122
void drizzleclient_net_close(NET *net)
124
if (net->vio != NULL)
126
drizzleclient_vio_delete(net->vio);
131
bool drizzleclient_net_peer_addr(NET *net, char *buf, uint16_t *port, size_t buflen)
133
return drizzleclient_vio_peer_addr(net->vio, buf, port, buflen);
136
void drizzleclient_net_keepalive(NET *net, bool flag)
138
drizzleclient_vio_keepalive(net->vio, flag);
141
int drizzleclient_net_get_sd(NET *net)
146
bool drizzleclient_net_more_data(NET *net)
148
return (net->vio == 0 || net->vio->read_pos < net->vio->read_end);
116
void net_end(NET *net)
118
DBUG_ENTER("net_end");
119
my_free(net->buff,MYF(MY_ALLOW_ZERO_PTR));
151
125
/** Realloc the packet buffer. */
153
static bool drizzleclient_net_realloc(NET *net, size_t length)
127
my_bool net_realloc(NET *net, size_t length)
156
130
size_t pkt_length;
131
DBUG_ENTER("net_realloc");
132
DBUG_PRINT("enter",("length: %lu", (ulong) length));
158
134
if (length >= net->max_packet_size)
136
DBUG_PRINT("error", ("Packet too large. Max size: %lu",
137
net->max_packet_size));
160
138
/* @todo: 1 and 2 codes are identical. */
162
net->last_errno= CR_NET_PACKET_TOO_LARGE;
140
net->last_errno= ER_NET_PACKET_TOO_LARGE;
142
my_error(ER_NET_PACKET_TOO_LARGE, MYF(0));
165
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
146
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
167
148
We must allocate some extra bytes for the end 0 and to be able to
168
149
read big compressed blocks
170
if (!(buff= (unsigned char*) realloc((char*) net->buff, pkt_length +
171
NET_HEADER_SIZE + COMP_HEADER_SIZE)))
151
if (!(buff= (uchar*) my_realloc((char*) net->buff, pkt_length +
152
NET_HEADER_SIZE + COMP_HEADER_SIZE,
173
155
/* @todo: 1 and 2 codes are identical. */
175
net->last_errno= CR_OUT_OF_MEMORY;
157
net->last_errno= ER_OUT_OF_RESOURCES;
176
158
/* In the server the error is reported by MY_WME flag. */
179
161
net->buff=net->write_pos=buff;
180
net->buff_end=buff+(net->max_packet= (uint32_t) pkt_length);
162
net->buff_end=buff+(net->max_packet= (ulong) pkt_length);
186
Check if there is any data to be read from the socket.
188
@param sd socket descriptor
193
1 Data or EOF to read
195
-1 Don't know if data is ready or not
168
Check if there is any data to be read from the socket.
170
@param sd socket descriptor
175
1 Data or EOF to read
177
-1 Don't know if data is ready or not
198
static bool net_data_is_ready(int sd)
180
static int net_data_is_ready(my_socket sd)
200
183
struct pollfd ufds;
207
190
if (res < 0 || !(ufds.revents & (POLLIN | POLLPRI)))
198
/* Windows uses an _array_ of 64 fd's as default, so it's safe */
199
if (sd >= FD_SETSIZE)
201
#define NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
206
tv.tv_sec= tv.tv_usec= 0;
208
if ((res= select(sd+1, &sfds, NULL, NULL, &tv)) < 0)
211
return test(res ? FD_ISSET(sd, &sfds) : 0);
212
#endif /* HAVE_POLL */
213
Remove unwanted characters from connection
214
and check if disconnected.
216
Read from socket until there is nothing more to read. Discard
219
If there is anything when to read 'drizzleclient_net_clear' is called this
220
normally indicates an error in the protocol.
222
When connection is properly closed (for TCP it means with
223
a FIN packet), then select() considers a socket "ready to read",
224
in the sense that there's EOF to read, but read() returns 0.
226
@param net NET handler
227
@param clear_buffer if <> 0, then clear all data from comm buff
216
Remove unwanted characters from connection
217
and check if disconnected.
219
Read from socket until there is nothing more to read. Discard
222
If there is anything when to read 'net_clear' is called this
223
normally indicates an error in the protocol.
225
When connection is properly closed (for TCP it means with
226
a FIN packet), then select() considers a socket "ready to read",
227
in the sense that there's EOF to read, but read() returns 0.
229
@param net NET handler
230
@param clear_buffer if <> 0, then clear all data from comm buff
230
void drizzleclient_net_clear(NET *net, bool clear_buffer)
233
void net_clear(NET *net, my_bool clear_buffer)
237
DBUG_ENTER("net_clear");
232
239
if (clear_buffer)
234
while (net_data_is_ready(net->vio->sd) > 0)
241
while ((ready= net_data_is_ready(net->vio->sd)) > 0)
236
243
/* The socket is ready */
237
if (drizzleclient_vio_read(net->vio, net->buff,
238
(size_t) net->max_packet) <= 0)
244
if ((long) (count= vio_read(net->vio, net->buff,
245
(size_t) net->max_packet)) > 0)
247
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
248
(long) count, vio_description(net->vio)));
252
DBUG_PRINT("info",("socket ready but only EOF to read - disconnected"));
257
#ifdef NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE
258
/* 'net_data_is_ready' returned "don't know" */
261
/* Read unblocking to clear net */
263
if (!vio_blocking(net->vio, FALSE, &old_mode))
265
while ((long) (count= vio_read(net->vio, net->buff,
266
(size_t) net->max_packet)) > 0)
267
DBUG_PRINT("info",("skipped %ld bytes from file: %s",
268
(long) count, vio_description(net->vio)));
269
vio_blocking(net->vio, TRUE, &old_mode);
272
#endif /* NET_DATA_IS_READY_CAN_RETURN_MINUS_ONE */
245
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
274
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
246
275
net->write_pos=net->buff;
251
280
/** Flush write_buffer if not empty. */
253
bool drizzleclient_net_flush(NET *net)
282
my_bool net_flush(NET *net)
285
DBUG_ENTER("net_flush");
256
286
if (net->buff != net->write_pos)
258
error=drizzleclient_net_real_write(net, net->buff,
259
(size_t) (net->write_pos - net->buff)) ? 1 : 0;
288
error=test(net_real_write(net, net->buff,
289
(size_t) (net->write_pos - net->buff)));
260
290
net->write_pos=net->buff;
262
292
/* Sync packet number if using compression */
263
293
if (net->compress)
264
294
net->pkt_nr=net->compress_pkt_nr;
269
299
/*****************************************************************************
270
** Write something to server/client buffer
271
*****************************************************************************/
300
** Write something to server/client buffer
301
*****************************************************************************/
274
Write a logical packet with packet header.
276
Format: Packet length (3 bytes), packet number(1 byte)
277
When compression is used a 3 byte compression length is added
280
If compression is used the original package is modified!
304
Write a logical packet with packet header.
306
Format: Packet length (3 bytes), packet number(1 byte)
307
When compression is used a 3 byte compression length is added
310
If compression is used the original package is modified!
284
drizzleclient_net_write(NET *net,const unsigned char *packet,size_t len)
314
my_net_write(NET *net,const uchar *packet,size_t len)
286
unsigned char buff[NET_HEADER_SIZE];
316
uchar buff[NET_HEADER_SIZE];
287
317
if (unlikely(!net->vio)) /* nowhere to write */
294
324
while (len >= MAX_PACKET_LENGTH)
296
const uint32_t z_size = MAX_PACKET_LENGTH;
326
const ulong z_size = MAX_PACKET_LENGTH;
297
327
int3store(buff, z_size);
298
buff[3]= (unsigned char) net->pkt_nr++;
328
buff[3]= (uchar) net->pkt_nr++;
299
329
if (net_write_buff(net, buff, NET_HEADER_SIZE) ||
300
net_write_buff(net, packet, z_size))
330
net_write_buff(net, packet, z_size))
302
332
packet += z_size;
305
335
/* Write last packet */
306
336
int3store(buff,len);
307
buff[3]= (unsigned char) net->pkt_nr++;
337
buff[3]= (uchar) net->pkt_nr++;
308
338
if (net_write_buff(net, buff, NET_HEADER_SIZE))
310
return net_write_buff(net,packet,len) ? 1 : 0;
340
#ifndef DEBUG_DATA_PACKETS
341
DBUG_DUMP("packet_header", buff, NET_HEADER_SIZE);
343
return test(net_write_buff(net,packet,len));
314
Send a command to the server.
316
The reason for having both header and packet is so that libdrizzle
317
can easy add a header to a special command (like prepared statements)
318
without having to re-alloc the string.
320
As the command is part of the first data packet, we have to do some data
321
juggling to put the command in there, without having to create a new
324
This function will split big packets into sub-packets if needed.
325
(Each sub packet can only be 2^24 bytes)
327
@param net NET handler
328
@param command Command in MySQL server (enum enum_server_command)
329
@param header Header to write after command
330
@param head_len Length of header
331
@param packet Query or parameter to query
332
@param len Length of packet
347
Send a command to the server.
349
The reason for having both header and packet is so that libmysql
350
can easy add a header to a special command (like prepared statements)
351
without having to re-alloc the string.
353
As the command is part of the first data packet, we have to do some data
354
juggling to put the command in there, without having to create a new
357
This function will split big packets into sub-packets if needed.
358
(Each sub packet can only be 2^24 bytes)
360
@param net NET handler
361
@param command Command in MySQL server (enum enum_server_command)
362
@param header Header to write after command
363
@param head_len Length of header
364
@param packet Query or parameter to query
365
@param len Length of packet
341
drizzleclient_net_write_command(NET *net,unsigned char command,
342
const unsigned char *header, size_t head_len,
343
const unsigned char *packet, size_t len)
374
net_write_command(NET *net,uchar command,
375
const uchar *header, size_t head_len,
376
const uchar *packet, size_t len)
345
uint32_t length=len+1+head_len; /* 1 extra byte for command */
346
unsigned char buff[NET_HEADER_SIZE+1];
347
uint32_t header_size=NET_HEADER_SIZE+1;
378
ulong length=len+1+head_len; /* 1 extra byte for command */
379
uchar buff[NET_HEADER_SIZE+1];
380
uint header_size=NET_HEADER_SIZE+1;
381
DBUG_ENTER("net_write_command");
382
DBUG_PRINT("enter",("length: %lu", (ulong) len));
349
buff[4]=command; /* For first packet */
384
buff[4]=command; /* For first packet */
351
386
if (length >= MAX_PACKET_LENGTH)
357
392
int3store(buff, MAX_PACKET_LENGTH);
358
buff[3]= (unsigned char) net->pkt_nr++;
393
buff[3]= (uchar) net->pkt_nr++;
359
394
if (net_write_buff(net, buff, header_size) ||
360
net_write_buff(net, header, head_len) ||
361
net_write_buff(net, packet, len))
395
net_write_buff(net, header, head_len) ||
396
net_write_buff(net, packet, len))
364
399
length-= MAX_PACKET_LENGTH;
365
400
len= MAX_PACKET_LENGTH;
367
402
header_size= NET_HEADER_SIZE;
368
403
} while (length >= MAX_PACKET_LENGTH);
369
len=length; /* Data left to be written */
404
len=length; /* Data left to be written */
371
406
int3store(buff,length);
372
buff[3]= (unsigned char) net->pkt_nr++;
373
return((net_write_buff(net, buff, header_size) ||
374
(head_len && net_write_buff(net, header, head_len)) ||
375
net_write_buff(net, packet, len) || drizzleclient_net_flush(net)) ? 1 : 0 );
407
buff[3]= (uchar) net->pkt_nr++;
408
DBUG_RETURN(test(net_write_buff(net, buff, header_size) ||
409
(head_len && net_write_buff(net, header, head_len)) ||
410
net_write_buff(net, packet, len) || net_flush(net)));
379
Caching the data in a local buffer before sending it.
414
Caching the data in a local buffer before sending it.
381
416
Fill up net->buffer and send it to the client when full.
383
If the rest of the to-be-sent-packet is bigger than buffer,
384
send it in one big block (to avoid copying to internal buffer).
385
If not, copy the rest of the data to the buffer and return without
388
@param net Network handler
389
@param packet Packet to send
390
@param len Length of packet
393
The cached buffer can be sent as it is with 'drizzleclient_net_flush()'.
394
In this code we have to be careful to not send a packet longer than
395
MAX_PACKET_LENGTH to drizzleclient_net_real_write() if we are using the compressed
396
protocol as we store the length of the compressed packet in 3 bytes.
418
If the rest of the to-be-sent-packet is bigger than buffer,
419
send it in one big block (to avoid copying to internal buffer).
420
If not, copy the rest of the data to the buffer and return without
423
@param net Network handler
424
@param packet Packet to send
425
@param len Length of packet
428
The cached buffer can be sent as it is with 'net_flush()'.
429
In this code we have to be careful to not send a packet longer than
430
MAX_PACKET_LENGTH to net_real_write() if we are using the compressed
431
protocol as we store the length of the compressed packet in 3 bytes.
405
net_write_buff(NET *net, const unsigned char *packet, uint32_t len)
440
net_write_buff(NET *net, const uchar *packet, ulong len)
407
uint32_t left_length;
408
443
if (net->compress && net->max_packet > MAX_PACKET_LENGTH)
409
444
left_length= MAX_PACKET_LENGTH - (net->write_pos - net->buff);
411
left_length= (uint32_t) (net->buff_end - net->write_pos);
446
left_length= (ulong) (net->buff_end - net->write_pos);
448
#ifdef DEBUG_DATA_PACKETS
449
DBUG_DUMP("data", packet, len);
413
451
if (len > left_length)
415
453
if (net->write_pos != net->buff)
417
455
/* Fill up already used packet and write it */
418
memcpy(net->write_pos,packet,left_length);
419
if (drizzleclient_net_real_write(net, net->buff,
420
(size_t) (net->write_pos - net->buff) + left_length))
456
memcpy((char*) net->write_pos,packet,left_length);
457
if (net_real_write(net, net->buff,
458
(size_t) (net->write_pos - net->buff) + left_length))
422
460
net->write_pos= net->buff;
423
461
packet+= left_length;
424
462
len-= left_length;
426
464
if (net->compress)
429
We can't have bigger packets than 16M with compression
430
Because the uncompressed length is stored in 3 bytes
467
We can't have bigger packets than 16M with compression
468
Because the uncompressed length is stored in 3 bytes
432
470
left_length= MAX_PACKET_LENGTH;
433
471
while (len > left_length)
435
if (drizzleclient_net_real_write(net, packet, left_length))
437
packet+= left_length;
473
if (net_real_write(net, packet, left_length))
475
packet+= left_length;
441
479
if (len > net->max_packet)
442
return drizzleclient_net_real_write(net, packet, len) ? 1 : 0;
480
return net_real_write(net, packet, len) ? 1 : 0;
443
481
/* Send out rest of the blocks as full sized blocks */
445
memcpy(net->write_pos,packet,len);
483
memcpy((char*) net->write_pos,packet,len);
446
484
net->write_pos+= len;
452
Read and write one packet using timeouts.
453
If needed, the packet is compressed before sending.
456
- TODO is it needed to set this variable if we have no socket
460
TODO: rewrite this in a manner to do non-block writes. If a write can not be made, and we are
461
in the server, yield to another process and come back later.
464
drizzleclient_net_real_write(NET *net, const unsigned char *packet, size_t len)
490
Read and write one packet using timeouts.
491
If needed, the packet is compressed before sending.
494
- TODO is it needed to set this variable if we have no socket
498
net_real_write(NET *net,const uchar *packet, size_t len)
467
const unsigned char *pos, *end;
468
uint32_t retry_count= 0;
501
const uchar *pos,*end;
507
my_bool net_blocking = vio_is_blocking(net->vio);
508
DBUG_ENTER("net_real_write");
470
/* Backup of the original SO_RCVTIMEO timeout */
510
#if defined(MYSQL_SERVER) && defined(USE_QUERY_CACHE)
511
query_cache_insert((char*) packet, len, net->pkt_nr);
472
514
if (net->error == 2)
473
return(-1); /* socket can't be used */
515
DBUG_RETURN(-1); /* socket can't be used */
475
517
net->reading_or_writing=2;
476
518
if (net->compress)
480
const uint32_t header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
481
if (!(b= (unsigned char*) malloc(len + NET_HEADER_SIZE +
522
uint header_length=NET_HEADER_SIZE+COMP_HEADER_SIZE;
523
if (!(b= (uchar*) my_malloc(len + NET_HEADER_SIZE +
524
COMP_HEADER_SIZE, MYF(MY_WME))))
485
net->last_errno= CR_OUT_OF_MEMORY;
527
net->last_errno= ER_OUT_OF_RESOURCES;
486
528
/* In the server, the error is reported by MY_WME flag. */
487
529
net->reading_or_writing= 0;
490
532
memcpy(b+header_length,packet,len);
492
complen= len * 120 / 100 + 12;
493
unsigned char * compbuf= (unsigned char *) malloc(complen);
496
uLongf tmp_complen= complen;
497
int res= compress((Bytef*) compbuf, &tmp_complen,
498
(Bytef*) (b+header_length),
500
complen= tmp_complen;
504
if ((res != Z_OK) || (complen >= len))
508
size_t tmplen= complen;
534
if (my_compress(b+header_length, &len, &complen))
517
536
int3store(&b[NET_HEADER_SIZE],complen);
518
537
int3store(b,len);
519
b[3]=(unsigned char) (net->compress_pkt_nr++);
538
b[3]=(uchar) (net->compress_pkt_nr++);
520
539
len+= header_length;
543
#ifdef DEBUG_DATA_PACKETS
544
DBUG_DUMP("data", packet, len);
548
thr_alarm_init(&alarmed);
550
thr_alarm(&alarmed, net->write_timeout, &alarm_buff);
553
/* Write timeout is set in my_net_set_write_timeout */
554
#endif /* NO_ALARM */
526
/* Loop until we have read everything */
527
558
while (pos != end)
530
if ((long) (length= drizzleclient_vio_write(net->vio, pos, (size_t) (end-pos))) <= 0)
560
if ((long) (length= vio_write(net->vio,pos,(size_t) (end-pos))) <= 0)
533
* We could end up here with net->vio == NULL
535
* If that is the case, we exit the while loop
537
if (net->vio == NULL)
540
const bool interrupted= drizzleclient_vio_should_retry(net->vio);
542
If we read 0, or we were interrupted this means that
543
we need to switch to blocking mode and wait until the timeout
544
on the socket kicks in.
546
if ((interrupted || length == 0))
562
my_bool interrupted = vio_should_retry(net->vio);
563
if ((interrupted || length == 0) && !thr_alarm_in_use(&alarmed))
550
while (drizzleclient_vio_blocking(net->vio, true, &old_mode) < 0)
552
if (drizzleclient_vio_should_retry(net->vio) && retry_count++ < net->retry_count)
554
net->error= 2; /* Close socket */
555
net->last_errno= CR_NET_PACKET_TOO_LARGE;
565
if (!thr_alarm(&alarmed, net->write_timeout, &alarm_buff))
566
{ /* Always true for client */
568
while (vio_blocking(net->vio, TRUE, &old_mode) < 0)
570
if (vio_should_retry(net->vio) && retry_count++ < net->retry_count)
574
"%s: my_net_write: fcntl returned error %d, aborting thread\n",
575
my_progname,vio_errno(net->vio));
576
#endif /* EXTRA_DEBUG */
577
net->error= 2; /* Close socket */
578
net->last_errno= ER_NET_PACKET_TOO_LARGE;
580
my_error(ER_NET_PACKET_TOO_LARGE, MYF(0));
563
if (retry_count++ < net->retry_count)
567
if (drizzleclient_vio_errno(net->vio) == EINTR)
571
net->error= 2; /* Close socket */
572
net->last_errno= (interrupted ? CR_NET_WRITE_INTERRUPTED :
573
CR_NET_ERROR_ON_WRITE);
589
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
592
if (retry_count++ < net->retry_count)
595
fprintf(stderr, "%s: write looped, aborting thread\n",
597
#endif /* EXTRA_DEBUG */
599
#if defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER)
600
if (vio_errno(net->vio) == SOCKET_EINTR)
602
DBUG_PRINT("warning",("Interrupted write. Retrying..."));
605
#endif /* defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER) */
606
net->error= 2; /* Close socket */
607
net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED :
608
ER_NET_ERROR_ON_WRITE);
610
my_error(net->last_errno, MYF(0));
611
#endif /* MYSQL_SERVER */
579
if ((net->compress) && (packet != NULL))
580
free((char*) packet);
615
update_statistics(thd_increment_bytes_sent(length));
619
my_free((char*) packet,MYF(0));
620
if (thr_alarm_in_use(&alarmed))
623
thr_end_alarm(&alarmed);
624
vio_blocking(net->vio, net_blocking, &old_mode);
581
626
net->reading_or_writing=0;
583
return(((int) (pos != end)));
588
Reads one packet to net->buff + net->where_b.
589
Long packets are handled by drizzleclient_net_read().
590
This function reallocates the net->buff buffer if necessary.
593
Returns length of packet.
627
DBUG_RETURN(((int) (pos != end)));
631
/*****************************************************************************
632
** Read something from server/clinet
633
*****************************************************************************/
637
static my_bool net_safe_read(NET *net, uchar *buff, size_t length,
638
thr_alarm_t *alarmed)
644
if ((long) (tmp= vio_read(net->vio, buff, length)) <= 0)
646
my_bool interrupted = vio_should_retry(net->vio);
647
if (!thr_got_alarm(alarmed) && interrupted)
648
{ /* Probably in MIT threads */
649
if (retry_count++ < net->retry_count)
661
Help function to clear the commuication buffer when we get a too big packet.
663
@param net Communication handle
664
@param remain Bytes to read
665
@param alarmed Parameter for thr_alarm()
666
@param alarm_buff Parameter for thr_alarm()
669
0 Was able to read the whole packet
671
1 Got mailformed packet from client
674
static my_bool my_net_skip_rest(NET *net, uint32 remain, thr_alarm_t *alarmed,
678
DBUG_ENTER("my_net_skip_rest");
679
DBUG_PRINT("enter",("bytes_to_skip: %u", (uint) remain));
681
/* The following is good for debugging */
682
update_statistics(thd_increment_net_big_packet_count(1));
684
if (!thr_alarm_in_use(alarmed))
687
if (thr_alarm(alarmed,net->read_timeout, alarm_buff) ||
688
vio_blocking(net->vio, TRUE, &old_mode) < 0)
689
DBUG_RETURN(1); /* Can't setup, abort */
695
size_t length= min(remain, net->max_packet);
696
if (net_safe_read(net, net->buff, length, alarmed))
698
update_statistics(thd_increment_bytes_received(length));
699
remain -= (uint32) length;
701
if (old != MAX_PACKET_LENGTH)
703
if (net_safe_read(net, net->buff, NET_HEADER_SIZE, alarmed))
705
old=remain= uint3korr(net->buff);
710
#endif /* NO_ALARM */
714
Reads one packet to net->buff + net->where_b.
715
Long packets are handled by my_net_read().
716
This function reallocates the net->buff buffer if necessary.
719
Returns length of packet.
597
723
my_real_read(NET *net, size_t *complen)
601
uint32_t i,retry_count=0;
602
size_t len=packet_error;
603
uint32_t remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
727
uint i,retry_count=0;
728
ulong len=packet_error;
733
my_bool net_blocking=vio_is_blocking(net->vio);
734
uint32 remain= (net->compress ? NET_HEADER_SIZE+COMP_HEADER_SIZE :
608
net->reading_or_writing= 1;
609
/* Read timeout is set in drizzleclient_net_set_read_timeout */
611
pos = net->buff + net->where_b; /* net->packet -4 */
613
for (i= 0; i < 2 ; i++)
738
net->reading_or_writing=1;
739
thr_alarm_init(&alarmed);
742
thr_alarm(&alarmed,net->read_timeout,&alarm_buff);
744
/* Read timeout is set in my_net_set_read_timeout */
745
#endif /* NO_ALARM */
747
pos = net->buff + net->where_b; /* net->packet -4 */
748
for (i=0 ; i < 2 ; i++)
752
/* First read is done with non blocking mode */
753
if ((long) (length= vio_read(net->vio, pos, remain)) <= 0L)
755
my_bool interrupted = vio_should_retry(net->vio);
757
DBUG_PRINT("info",("vio_read returned %ld errno: %d",
758
(long) length, vio_errno(net->vio)));
759
#if defined(MYSQL_SERVER)
761
We got an error that there was no data on the socket. We now set up
762
an alarm to not 'read forever', change the socket to non blocking
765
if ((interrupted || length == 0) && !thr_alarm_in_use(&alarmed))
767
if (!thr_alarm(&alarmed,net->read_timeout,&alarm_buff)) /* Don't wait too long */
770
while (vio_blocking(net->vio, TRUE, &old_mode) < 0)
772
if (vio_should_retry(net->vio) &&
773
retry_count++ < net->retry_count)
776
("fcntl returned error %d, aborting thread",
777
vio_errno(net->vio)));
780
"%s: read: fcntl returned error %d, aborting thread\n",
781
my_progname,vio_errno(net->vio));
782
#endif /* EXTRA_DEBUG */
784
net->error= 2; /* Close socket */
785
net->last_errno= ER_NET_FCNTL_ERROR;
787
my_error(ER_NET_FCNTL_ERROR, MYF(0));
795
#endif /* defined(MYSQL_SERVER) */
796
if (thr_alarm_in_use(&alarmed) && !thr_got_alarm(&alarmed) &&
798
{ /* Probably in MIT threads */
799
if (retry_count++ < net->retry_count)
802
fprintf(stderr, "%s: read looped with error %d, aborting thread\n",
803
my_progname,vio_errno(net->vio));
804
#endif /* EXTRA_DEBUG */
806
#if defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER)
807
if (vio_errno(net->vio) == SOCKET_EINTR)
809
DBUG_PRINT("warning",("Interrupted read. Retrying..."));
813
DBUG_PRINT("error",("Couldn't read packet: remain: %u errno: %d length: %ld",
814
remain, vio_errno(net->vio), (long) length));
816
net->error= 2; /* Close socket */
817
net->last_errno= (vio_was_interrupted(net->vio) ?
818
ER_NET_READ_INTERRUPTED :
821
my_error(net->last_errno, MYF(0));
825
remain -= (uint32) length;
827
update_statistics(thd_increment_bytes_received(length));
830
{ /* First parts is packet length */
832
DBUG_DUMP("packet_header", net->buff+net->where_b,
834
if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr)
836
if (net->buff[net->where_b] != (uchar) 255)
839
("Packets out of order (Found: %d, expected %u)",
840
(int) net->buff[net->where_b + 3],
844
fprintf(stderr,"Error: Packets out of order (Found: %d, expected %d)\n",
845
(int) net->buff[net->where_b + 3],
846
(uint) (uchar) net->pkt_nr);
852
/* Not a NET error on the client. XXX: why? */
854
my_error(ER_NET_PACKETS_OUT_OF_ORDER, MYF(0));
858
net->compress_pkt_nr= ++net->pkt_nr;
862
If the packet is compressed then complen > 0 and contains the
863
number of bytes in the uncompressed packet
865
*complen=uint3korr(&(net->buff[net->where_b + NET_HEADER_SIZE]));
868
len=uint3korr(net->buff+net->where_b);
869
if (!len) /* End of big multi-packet */
871
helping = max(len,*complen) + net->where_b;
872
/* The necessary size of net->buff */
873
if (helping >= net->max_packet)
875
if (net_realloc(net,helping))
877
#if defined(MYSQL_SERVER) && !defined(NO_ALARM)
878
if (!net->compress &&
879
!my_net_skip_rest(net, (uint32) len, &alarmed, &alarm_buff))
880
net->error= 3; /* Successfully skiped packet */
882
len= packet_error; /* Return error and close connection */
886
pos=net->buff + net->where_b;
887
remain = (uint32) len;
892
if (thr_alarm_in_use(&alarmed))
617
/* First read is done with non blocking mode */
618
if ((long) (length= drizzleclient_vio_read(net->vio, pos, remain)) <= 0L)
620
if (net->vio == NULL)
623
const bool interrupted = drizzleclient_vio_should_retry(net->vio);
626
{ /* Probably in MIT threads */
627
if (retry_count++ < net->retry_count)
630
if (drizzleclient_vio_errno(net->vio) == EINTR)
635
net->error= 2; /* Close socket */
636
net->last_errno= (drizzleclient_vio_was_interrupted(net->vio) ?
637
CR_NET_READ_INTERRUPTED :
642
remain -= (uint32_t) length;
646
{ /* First parts is packet length */
649
if (net->buff[net->where_b + 3] != (unsigned char) net->pkt_nr)
652
/* Not a NET error on the client. XXX: why? */
655
net->compress_pkt_nr= ++net->pkt_nr;
659
If the packet is compressed then complen > 0 and contains the
660
number of bytes in the uncompressed packet
662
*complen=uint3korr(&(net->buff[net->where_b + NET_HEADER_SIZE]));
665
len=uint3korr(net->buff+net->where_b);
666
if (!len) /* End of big multi-packet */
668
helping = max(len,*complen) + net->where_b;
669
/* The necessary size of net->buff */
670
if (helping >= net->max_packet)
672
if (drizzleclient_net_realloc(net,helping))
674
len= packet_error; /* Return error and close connection */
678
pos=net->buff + net->where_b;
679
remain = (uint32_t) len;
895
thr_end_alarm(&alarmed);
896
vio_blocking(net->vio, net_blocking, &old_mode);
684
net->reading_or_writing= 0;
898
net->reading_or_writing=0;
899
#ifdef DEBUG_DATA_PACKETS
900
if (len != packet_error)
901
DBUG_DUMP("data", net->buff+net->where_b, len);
691
Read a packet from the client/server and return it without the internal
694
If the packet is the first packet of a multi-packet packet
695
(which is indicated by the length of the packet = 0xffffff) then
696
all sub packets are read and concatenated.
698
If the packet was compressed, its uncompressed and the length of the
699
uncompressed packet is returned.
702
The function returns the length of the found packet or packet_error.
703
net->read_pos points to the read data.
908
Read a packet from the client/server and return it without the internal
911
If the packet is the first packet of a multi-packet packet
912
(which is indicated by the length of the packet = 0xffffff) then
913
all sub packets are read and concatenated.
915
If the packet was compressed, its uncompressed and the length of the
916
uncompressed packet is returned.
919
The function returns the length of the found packet or packet_error.
920
net->read_pos points to the read data.
707
drizzleclient_net_read(NET *net)
924
my_net_read(NET *net)
709
926
size_t len, complen;
760
977
if (buf_length - start_of_packet >= NET_HEADER_SIZE)
762
read_length = uint3korr(net->buff+start_of_packet);
765
/* End of multi-byte packet */
766
start_of_packet += NET_HEADER_SIZE;
769
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
771
if (multi_byte_packet)
773
/* Remove packet header for second packet */
774
memmove(net->buff + first_packet_offset + start_of_packet,
775
net->buff + first_packet_offset + start_of_packet +
777
buf_length - start_of_packet);
778
start_of_packet += read_length;
779
buf_length -= NET_HEADER_SIZE;
782
start_of_packet+= read_length + NET_HEADER_SIZE;
979
read_length = uint3korr(net->buff+start_of_packet);
982
/* End of multi-byte packet */
983
start_of_packet += NET_HEADER_SIZE;
986
if (read_length + NET_HEADER_SIZE <= buf_length - start_of_packet)
988
if (multi_byte_packet)
990
/* Remove packet header for second packet */
991
memmove(net->buff + first_packet_offset + start_of_packet,
992
net->buff + first_packet_offset + start_of_packet +
994
buf_length - start_of_packet);
995
start_of_packet += read_length;
996
buf_length -= NET_HEADER_SIZE;
999
start_of_packet+= read_length + NET_HEADER_SIZE;
784
if (read_length != MAX_PACKET_LENGTH) /* last package */
786
multi_byte_packet= 0; /* No last zero len packet */
789
multi_byte_packet= NET_HEADER_SIZE;
790
/* Move data down to read next data packet after current one */
791
if (first_packet_offset)
793
memmove(net->buff,net->buff+first_packet_offset,
794
buf_length-first_packet_offset);
795
buf_length-=first_packet_offset;
796
start_of_packet -= first_packet_offset;
797
first_packet_offset=0;
1001
if (read_length != MAX_PACKET_LENGTH) /* last package */
1003
multi_byte_packet= 0; /* No last zero len packet */
1006
multi_byte_packet= NET_HEADER_SIZE;
1007
/* Move data down to read next data packet after current one */
1008
if (first_packet_offset)
1010
memmove(net->buff,net->buff+first_packet_offset,
1011
buf_length-first_packet_offset);
1012
buf_length-=first_packet_offset;
1013
start_of_packet -= first_packet_offset;
1014
first_packet_offset=0;
802
1019
/* Move data down to read next data packet after current one */
803
1020
if (first_packet_offset)
805
memmove(net->buff,net->buff+first_packet_offset,
806
buf_length-first_packet_offset);
807
buf_length-=first_packet_offset;
808
start_of_packet -= first_packet_offset;
809
first_packet_offset=0;
1022
memmove(net->buff,net->buff+first_packet_offset,
1023
buf_length-first_packet_offset);
1024
buf_length-=first_packet_offset;
1025
start_of_packet -= first_packet_offset;
1026
first_packet_offset=0;
812
1029
net->where_b=buf_length;
813
1030
if ((packet_len = my_real_read(net,&complen)) == packet_error)
1031
return packet_error;
1032
if (my_uncompress(net->buff + net->where_b, packet_len,
818
unsigned char * compbuf= (unsigned char *) malloc(complen);
821
uLongf tmp_complen= complen;
822
int error= uncompress((Bytef*) compbuf, &tmp_complen,
823
(Bytef*) (net->buff + net->where_b),
825
complen= tmp_complen;
829
net->error= 2; /* caller will close socket */
830
net->last_errno= CR_NET_UNCOMPRESS_ERROR;
834
memcpy((net->buff + net->where_b), compbuf, complen);
1035
net->error= 2; /* caller will close socket */
1036
net->last_errno= ER_NET_UNCOMPRESS_ERROR;
1038
my_error(ER_NET_UNCOMPRESS_ERROR, MYF(0));
1040
return packet_error;
1042
buf_length+= complen;
843
buf_length+= complen;
845
1045
net->read_pos= net->buff+ first_packet_offset + NET_HEADER_SIZE;
846
1046
net->buf_length= buf_length;
847
net->remain_in_buf= (uint32_t) (buf_length - start_of_packet);
848
len = ((uint32_t) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
1047
net->remain_in_buf= (ulong) (buf_length - start_of_packet);
1048
len = ((ulong) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
849
1049
multi_byte_packet);
850
net->save_char= net->read_pos[len]; /* Must be saved */
851
net->read_pos[len]=0; /* Safeguard for drizzleclient_use_result */
1050
net->save_char= net->read_pos[len]; /* Must be saved */
1051
net->read_pos[len]=0; /* Safeguard for mysql_use_result */
857
void drizzleclient_net_set_read_timeout(NET *net, uint32_t timeout)
1057
void my_net_set_read_timeout(NET *net, uint timeout)
1059
DBUG_ENTER("my_net_set_read_timeout");
1060
DBUG_PRINT("enter", ("timeout: %d", timeout));
859
1061
net->read_timeout= timeout;
862
drizzleclient_vio_timeout(net->vio, 0, timeout);
1064
vio_timeout(net->vio, 0, timeout);
868
void drizzleclient_net_set_write_timeout(NET *net, uint32_t timeout)
1070
void my_net_set_write_timeout(NET *net, uint timeout)
1072
DBUG_ENTER("my_net_set_write_timeout");
1073
DBUG_PRINT("enter", ("timeout: %d", timeout));
870
1074
net->write_timeout= timeout;
873
drizzleclient_vio_timeout(net->vio, 1, timeout);
1077
vio_timeout(net->vio, 1, timeout);
878
Clear possible error state of struct NET
880
@param net clear the state of the argument
883
void drizzleclient_drizzleclient_net_clear_error(NET *net)
886
net->last_error[0]= '\0';
887
strcpy(net->sqlstate, not_error_sqlstate);