Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
ab271b4d
Commit
ab271b4d
authored
Mar 07, 2005
by
joerg@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Manual merge.
parent
792d4019
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
105 additions
and
48 deletions
+105
-48
sql/net_serv.cc
sql/net_serv.cc
+105
-48
No files found.
sql/net_serv.cc
View file @
ab271b4d
...
...
@@ -14,6 +14,13 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/*
This file is the net layer API for the MySQL client/server protocol,
which is a tightly coupled, proprietary protocol owned by MySQL AB.
Any re-implementations of this protocol must also be under GPL
unless one has got an license from MySQL AB stating otherwise.
*/
/*
Write and read of logical packets to/from socket
...
...
@@ -26,6 +33,10 @@
C file.
*/
/*
HFTODO this must be hidden if we don't want client capabilities in
embedded library
*/
#ifdef __WIN__
#include <winsock.h>
#endif
...
...
@@ -41,6 +52,13 @@
#include <signal.h>
#include <errno.h>
#ifdef EMBEDDED_LIBRARY
#undef MYSQL_SERVER
#undef MYSQL_CLIENT
#define MYSQL_CLIENT
#endif
/*EMBEDDED_LIBRARY */
/*
The following handles the differences when this is linked between the
client and the server.
...
...
@@ -66,10 +84,15 @@ void sql_print_error(const char *format,...);
#ifdef MYSQL_SERVER
#define USE_QUERY_CACHE
/*
The following variables/functions should really not be declared
extern, but as it's hard to include mysql_priv.h here, we have to
live with this for a while.
*/
extern
uint
test_flags
;
extern
void
query_cache_insert
(
NET
*
net
,
const
char
*
packet
,
ulong
length
);
extern
ulong
bytes_sent
,
bytes_received
,
net_big_packet_count
;
extern
pthread_mutex_t
LOCK_bytes_sent
,
LOCK_bytes_received
;
extern
void
query_cache_insert
(
NET
*
net
,
const
char
*
packet
,
ulong
length
);
#else
#undef statistic_add
#undef statistic_increment
...
...
@@ -85,7 +108,7 @@ static my_bool net_write_buff(NET *net,const char *packet,ulong len);
/* Init with packet info */
int
my_net_init
(
NET
*
net
,
Vio
*
vio
)
my_bool
my_net_init
(
NET
*
net
,
Vio
*
vio
)
{
DBUG_ENTER
(
"my_net_init"
);
my_net_local_init
(
net
);
/* Set some limits */
...
...
@@ -104,6 +127,7 @@ int my_net_init(NET *net, Vio* vio)
net
->
where_b
=
net
->
remain_in_buf
=
0
;
net
->
last_errno
=
0
;
net
->
query_cache_query
=
0
;
net
->
report_error
=
0
;
if
(
vio
!=
0
)
/* If real connection */
{
...
...
@@ -132,7 +156,7 @@ void net_end(NET *net)
/* Realloc the packet buffer */
static
my_bool
net_realloc
(
NET
*
net
,
ulong
length
)
my_bool
net_realloc
(
NET
*
net
,
ulong
length
)
{
uchar
*
buff
;
ulong
pkt_length
;
...
...
@@ -141,10 +165,11 @@ static my_bool net_realloc(NET *net, ulong length)
if
(
length
>=
net
->
max_packet_size
)
{
DBUG_PRINT
(
"error"
,
(
"Packet too large. Max six
e: %lu"
,
DBUG_PRINT
(
"error"
,
(
"Packet too large. Max siz
e: %lu"
,
net
->
max_packet_size
));
net
->
error
=
1
;
net
->
last_errno
=
ER_NET_PACKET_TOO_LARGE
;
net
->
error
=
1
;
net
->
report_error
=
1
;
net
->
last_errno
=
ER_NET_PACKET_TOO_LARGE
;
DBUG_RETURN
(
1
);
}
pkt_length
=
(
length
+
IO_SIZE
-
1
)
&
~
(
IO_SIZE
-
1
);
...
...
@@ -156,10 +181,9 @@ static my_bool net_realloc(NET *net, ulong length)
NET_HEADER_SIZE
+
COMP_HEADER_SIZE
,
MYF
(
MY_WME
))))
{
net
->
error
=
1
;
#ifdef MYSQL_SERVER
net
->
last_errno
=
ER_OUT_OF_RESOURCES
;
#endif
net
->
error
=
1
;
net
->
report_error
=
1
;
net
->
last_errno
=
ER_OUT_OF_RESOURCES
;
DBUG_RETURN
(
1
);
}
net
->
buff
=
net
->
write_pos
=
buff
;
...
...
@@ -193,14 +217,14 @@ void net_clear(NET *net)
/* Flush write_buffer if not empty. */
int
net_flush
(
NET
*
net
)
my_bool
net_flush
(
NET
*
net
)
{
int
error
=
0
;
my_bool
error
=
0
;
DBUG_ENTER
(
"net_flush"
);
if
(
net
->
buff
!=
net
->
write_pos
)
{
error
=
net_real_write
(
net
,(
char
*
)
net
->
buff
,
(
ulong
)
(
net
->
write_pos
-
net
->
buff
));
error
=
test
(
net_real_write
(
net
,(
char
*
)
net
->
buff
,
(
ulong
)
(
net
->
write_pos
-
net
->
buff
)
));
net
->
write_pos
=
net
->
buff
;
}
/* Sync packet number if using compression */
...
...
@@ -223,7 +247,7 @@ int net_flush(NET *net)
If compression is used the original package is modified!
*/
int
my_bool
my_net_write
(
NET
*
net
,
const
char
*
packet
,
ulong
len
)
{
uchar
buff
[
NET_HEADER_SIZE
];
...
...
@@ -250,23 +274,46 @@ my_net_write(NET *net,const char *packet,ulong len)
buff
[
3
]
=
(
uchar
)
net
->
pkt_nr
++
;
if
(
net_write_buff
(
net
,(
char
*
)
buff
,
NET_HEADER_SIZE
))
return
1
;
#ifndef DEBUG_DATA_PACKETS
DBUG_DUMP
(
"packet_header"
,(
char
*
)
buff
,
NET_HEADER_SIZE
);
#endif
return
test
(
net_write_buff
(
net
,
packet
,
len
));
}
/*
Send a command to the server.
SYNOPSIS
net_write_command()
net NET handler
command Command in MySQL server (enum enum_server_command)
header Header to write after command
head_len Length of header
packet Query or parameter to query
len Length of packet
DESCRIPTION
The reason for having both header and packet is so that libmysql
can easy add a header to a special command (like prepared statements)
without having to re-alloc the string.
As the command is part of the first data packet, we have to do some data
juggling to put the command in there, without having to create a new
packet.
This function will split big packets into sub-packets if needed.
(Each sub packet can only be 2^24 bytes)
RETURN VALUES
0 ok
1 error
*/
int
net_write_command
(
NET
*
net
,
uchar
command
,
const
char
*
packet
,
ulong
len
)
my_bool
net_write_command
(
NET
*
net
,
uchar
command
,
const
char
*
header
,
ulong
head_len
,
const
char
*
packet
,
ulong
len
)
{
ulong
length
=
len
+
1
;
/* 1 extra byte for command */
ulong
length
=
len
+
1
+
head_len
;
/* 1 extra byte for command */
uchar
buff
[
NET_HEADER_SIZE
+
1
];
uint
header_size
=
NET_HEADER_SIZE
+
1
;
DBUG_ENTER
(
"net_write_command"
);
...
...
@@ -277,25 +324,28 @@ net_write_command(NET *net,uchar command,const char *packet,ulong len)
if
(
length
>=
MAX_PACKET_LENGTH
)
{
/* Take into account that we have the command in the first header */
len
=
MAX_PACKET_LENGTH
-
1
;
len
=
MAX_PACKET_LENGTH
-
1
-
head_len
;
do
{
int3store
(
buff
,
MAX_PACKET_LENGTH
);
buff
[
3
]
=
(
uchar
)
net
->
pkt_nr
++
;
if
(
net_write_buff
(
net
,(
char
*
)
buff
,
header_size
)
||
net_write_buff
(
net
,
packet
,
len
))
net_write_buff
(
net
,
header
,
head_len
)
||
net_write_buff
(
net
,
packet
,
len
))
DBUG_RETURN
(
1
);
packet
+=
len
;
length
-=
MAX_PACKET_LENGTH
;
len
=
MAX_PACKET_LENGTH
;
head_len
=
0
;
header_size
=
NET_HEADER_SIZE
;
}
while
(
length
>=
MAX_PACKET_LENGTH
);
len
=
length
;
/* Data left to be written */
}
int3store
(
buff
,
length
);
buff
[
3
]
=
(
uchar
)
net
->
pkt_nr
++
;
DBUG_RETURN
(
test
(
net_write_buff
(
net
,(
char
*
)
buff
,
header_size
)
||
net_write_buff
(
net
,
packet
,
len
)
||
net_flush
(
net
)));
DBUG_RETURN
(
test
(
net_write_buff
(
net
,
(
char
*
)
buff
,
header_size
)
||
(
head_len
&&
net_write_buff
(
net
,
(
char
*
)
header
,
head_len
))
||
net_write_buff
(
net
,
packet
,
len
)
||
net_flush
(
net
)));
}
/*
...
...
@@ -336,6 +386,9 @@ net_write_buff(NET *net,const char *packet,ulong len)
else
left_length
=
(
ulong
)
(
net
->
buff_end
-
net
->
write_pos
);
#ifdef DEBUG_DATA_PACKETS
DBUG_DUMP
(
"data"
,
packet
,
len
);
#endif
if
(
len
>
left_length
)
{
if
(
net
->
write_pos
!=
net
->
buff
)
...
...
@@ -411,10 +464,12 @@ net_real_write(NET *net,const char *packet,ulong len)
COMP_HEADER_SIZE
,
MYF
(
MY_WME
))))
{
#ifdef MYSQL_SERVER
net
->
last_errno
=
ER_OUT_OF_RESOURCES
;
net
->
error
=
2
;
net
->
last_errno
=
ER_OUT_OF_RESOURCES
;
net
->
error
=
2
;
/* TODO is it needed to set this variable if we have no socket */
net
->
report_error
=
1
;
#endif
net
->
reading_or_writing
=
0
;
net
->
reading_or_writing
=
0
;
DBUG_RETURN
(
1
);
}
memcpy
(
b
+
header_length
,
packet
,
len
);
...
...
@@ -461,9 +516,10 @@ net_real_write(NET *net,const char *packet,ulong len)
my_progname
,
vio_errno
(
net
->
vio
));
#endif
/* EXTRA_DEBUG */
#ifdef MYSQL_SERVER
net
->
last_errno
=
ER_NET_ERROR_ON_WRITE
;
net
->
last_errno
=
ER_NET_ERROR_ON_WRITE
;
#endif
net
->
error
=
2
;
/* Close socket */
net
->
error
=
2
;
/* Close socket */
net
->
report_error
=
1
;
goto
end
;
}
retry_count
=
0
;
...
...
@@ -489,7 +545,8 @@ net_real_write(NET *net,const char *packet,ulong len)
continue
;
}
#endif
/* defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER) */
net
->
error
=
2
;
/* Close socket */
net
->
error
=
2
;
/* Close socket */
net
->
report_error
=
1
;
#ifdef MYSQL_SERVER
net
->
last_errno
=
(
interrupted
?
ER_NET_WRITE_INTERRUPTED
:
ER_NET_ERROR_ON_WRITE
);
...
...
@@ -667,9 +724,10 @@ my_real_read(NET *net, ulong *complen)
my_progname
,
vio_errno
(
net
->
vio
));
#endif
/* EXTRA_DEBUG */
len
=
packet_error
;
net
->
error
=
2
;
/* Close socket */
net
->
error
=
2
;
/* Close socket */
net
->
report_error
=
1
;
#ifdef MYSQL_SERVER
net
->
last_errno
=
ER_NET_FCNTL_ERROR
;
net
->
last_errno
=
ER_NET_FCNTL_ERROR
;
#endif
goto
end
;
}
...
...
@@ -698,7 +756,8 @@ my_real_read(NET *net, ulong *complen)
DBUG_PRINT
(
"error"
,(
"Couldn't read packet: remain: %u errno: %d length: %ld"
,
remain
,
vio_errno
(
net
->
vio
),
length
));
len
=
packet_error
;
net
->
error
=
2
;
/* Close socket */
net
->
error
=
2
;
/* Close socket */
net
->
report_error
=
1
;
#ifdef MYSQL_SERVER
net
->
last_errno
=
(
interrupted
?
ER_NET_READ_INTERRUPTED
:
ER_NET_READ_ERROR
);
...
...
@@ -712,6 +771,8 @@ my_real_read(NET *net, ulong *complen)
if
(
i
==
0
)
{
/* First parts is packet length */
ulong
helping
;
DBUG_DUMP
(
"packet_header"
,(
char
*
)
net
->
buff
+
net
->
where_b
,
NET_HEADER_SIZE
);
if
(
net
->
buff
[
net
->
where_b
+
3
]
!=
(
uchar
)
net
->
pkt_nr
)
{
if
(
net
->
buff
[
net
->
where_b
]
!=
(
uchar
)
255
)
...
...
@@ -720,7 +781,6 @@ my_real_read(NET *net, ulong *complen)
(
"Packets out of order (Found: %d, expected %u)"
,
(
int
)
net
->
buff
[
net
->
where_b
+
3
],
net
->
pkt_nr
));
DBUG_DUMP
(
"packet_header"
,(
char
*
)
net
->
buff
+
net
->
where_b
,
4
);
#ifdef EXTRA_DEBUG
fprintf
(
stderr
,
"Packets out of order (Found: %d, expected %d)
\n
"
,
(
int
)
net
->
buff
[
net
->
where_b
+
3
],
...
...
@@ -728,6 +788,7 @@ my_real_read(NET *net, ulong *complen)
#endif
}
len
=
packet_error
;
net
->
report_error
=
1
;
#ifdef MYSQL_SERVER
net
->
last_errno
=
ER_NET_PACKETS_OUT_OF_ORDER
;
#endif
...
...
@@ -776,6 +837,10 @@ end:
vio_blocking
(
net
->
vio
,
net_blocking
,
&
old_mode
);
}
net
->
reading_or_writing
=
0
;
#ifdef DEBUG_DATA_PACKETS
if
(
len
!=
packet_error
)
DBUG_DUMP
(
"data"
,(
char
*
)
net
->
buff
+
net
->
where_b
,
len
);
#endif
return
(
len
);
}
...
...
@@ -908,7 +973,8 @@ my_net_read(NET *net)
if
(
my_uncompress
((
byte
*
)
net
->
buff
+
net
->
where_b
,
&
packet_len
,
&
complen
))
{
net
->
error
=
2
;
/* caller will close socket */
net
->
error
=
2
;
/* caller will close socket */
net
->
report_error
=
1
;
#ifdef MYSQL_SERVER
net
->
last_errno
=
ER_NET_UNCOMPRESS_ERROR
;
#endif
...
...
@@ -929,12 +995,3 @@ my_net_read(NET *net)
return
len
;
}
bool
net_request_file
(
NET
*
net
,
const
char
*
fname
)
{
char
tmp
[
FN_REFLEN
+
1
],
*
end
;
DBUG_ENTER
(
"net_request_file"
);
tmp
[
0
]
=
(
char
)
251
;
/* NULL_LENGTH */
end
=
strnmov
(
tmp
+
1
,
fname
,
sizeof
(
tmp
)
-
2
);
DBUG_RETURN
(
my_net_write
(
net
,
tmp
,(
uint
)
(
end
-
tmp
))
||
net_flush
(
net
));
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment