summaryrefslogtreecommitdiff
path: root/vio/vio.c
diff options
context:
space:
mode:
authorunknown <tonu@x3.internalnet>2001-05-20 14:04:46 +0200
committerunknown <tonu@x3.internalnet>2001-05-20 14:04:46 +0200
commitf70e8a23fa9cfef27c9b963e648bcfd87e930bf3 (patch)
tree92971e504b06dfed3df5e0fc382215c66b0053a2 /vio/vio.c
parent0fc76938a128a78e2186f84b967c23cc0769e6fe (diff)
downloadmariadb-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.c151
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
+
+