diff options
author | unknown <tonu@x3.internalnet> | 2001-05-20 14:04:46 +0200 |
---|---|---|
committer | unknown <tonu@x3.internalnet> | 2001-05-20 14:04:46 +0200 |
commit | f70e8a23fa9cfef27c9b963e648bcfd87e930bf3 (patch) | |
tree | 92971e504b06dfed3df5e0fc382215c66b0053a2 /vio/vio.c | |
parent | 0fc76938a128a78e2186f84b967c23cc0769e6fe (diff) | |
download | mariadb-git-f70e8a23fa9cfef27c9b963e648bcfd87e930bf3.tar.gz |
viotcpip.c BitKeeper file /home/tonu/bk/mysql-4.0/vio/viotcpip.c
viosslfactories.c BitKeeper file /home/tonu/bk/mysql-4.0/vio/viosslfactories.c
viossl.c BitKeeper file /home/tonu/bk/mysql-4.0/vio/viossl.c
vio.c BitKeeper file /home/tonu/bk/mysql-4.0/vio/vio.c
Diffstat (limited to 'vio/vio.c')
-rw-r--r-- | vio/vio.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/vio/vio.c b/vio/vio.c new file mode 100644 index 00000000000..9775c002737 --- /dev/null +++ b/vio/vio.c @@ -0,0 +1,151 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Note that we can't have assertion on file descriptors; The reason for + this is that during mysql shutdown, another thread can close a file + we are working on. In this case we should just return read errors from + the file descriptior. +*/ + +#define DONT_MAP_VIO +#include <global.h> + +#include <errno.h> +#include <assert.h> +#include <vio.h> +#include <my_sys.h> +#include <my_net.h> +#include <m_string.h> +#ifdef HAVE_POLL +#include <sys/poll.h> +#endif +#ifdef HAVE_SYS_IOCTL_H +#include <sys/ioctl.h> +#endif + +#if defined(__EMX__) +#define ioctlsocket ioctl +#endif /* defined(__EMX__) */ + +#if defined(MSDOS) || defined(__WIN__) +#ifdef __WIN__ +#undef errno +#undef EINTR +#undef EAGAIN +#define errno WSAGetLastError() +#define EINTR WSAEINTR +#define EAGAIN WSAEINPROGRESS +#endif /* __WIN__ */ +#define O_NONBLOCK 1 /* For emulation of fcntl() */ +#endif +#ifndef EWOULDBLOCK +#define EWOULDBLOCK EAGAIN +#endif + + +/* + * Helper to fill most of the st_vio* with defaults. + */ + +void vio_reset(st_vio* vio, enum enum_vio_type type, + my_socket sd, HANDLE hPipe, + my_bool localhost) +{ + bzero((char*) vio, sizeof(st_vio)); + vio->type = type; + vio->sd = sd; + vio->hPipe = hPipe; + vio->localhost= localhost; +#ifdef HAVE_VIO +if(type == VIO_TYPE_SSL){ + vio->viodelete =vio_ssl_delete; + vio->vioerrno =vio_ssl_errno; + vio->read =vio_ssl_read; + vio->write =vio_ssl_write; + vio->fastsend =vio_ssl_fastsend; + vio->viokeepalive=vio_ssl_keepalive; + vio->should_retry=vio_ssl_should_retry; + vio->vioclose =vio_ssl_close; + vio->peer_addr =vio_ssl_peer_addr; + vio->in_addr =vio_ssl_in_addr; + vio->poll_read =vio_ssl_poll_read; +} else { /* default is VIO_TYPE_TCPIP */ + vio->viodelete =vio_delete; + vio->vioerrno =vio_errno; + vio->read =vio_read; + vio->write =vio_write; + vio->fastsend =vio_fastsend; + vio->viokeepalive=vio_keepalive; + vio->should_retry=vio_should_retry; + vio->vioclose =vio_close; + vio->peer_addr =vio_peer_addr; + vio->in_addr =vio_in_addr; + vio->poll_read =vio_poll_read; +} + +#endif /* HAVE_VIO */ +} + +/* Open the socket or TCP/IP connection and read the fnctl() status */ + +st_vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost) +{ + st_vio *vio; + DBUG_ENTER("vio_new"); + DBUG_PRINT("enter", ("sd=%d", sd)); + if ((vio = (st_vio*) my_malloc(sizeof(*vio),MYF(MY_WME)))) + { + vio_reset(vio, type, sd, 0, localhost); + sprintf(vio->desc, + (vio->type == VIO_TYPE_SOCKET ? "socket (%d)" : "TCP/IP (%d)"), + vio->sd); +#if !defined(___WIN__) && !defined(__EMX__) +#if !defined(NO_FCNTL_NONBLOCK) + vio->fcntl_mode = fcntl(sd, F_GETFL); +#elif defined(HAVE_SYS_IOCTL_H) /* hpux */ + /* Non blocking sockets doesn't work good on HPUX 11.0 */ + (void) ioctl(sd,FIOSNBIO,0); +#endif +#else /* !defined(__WIN__) && !defined(__EMX__) */ + { + /* set to blocking mode by default */ + ulong arg=0, r; + r = ioctlsocket(sd,FIONBIO,(void*) &arg, sizeof(arg)); + } +#endif + } + DBUG_RETURN(vio); +} + + +#ifdef __WIN__ + +st_vio *vio_new_win32pipe(HANDLE hPipe) +{ + st_vio *vio; + DBUG_ENTER("vio_new_handle"); + if ((vio = (st_vio*) my_malloc(sizeof(st_vio),MYF(MY_WME)))) + { + vio_reset(vio, VIO_TYPE_NAMEDPIPE, 0, hPipe, TRUE); + strmov(vio->desc, "named pipe"); + } + DBUG_RETURN(vio); +} + +#endif + + |