390.1.6
by Monty Taylor
Oh dear god the changes. The changes. I'd tell you what they are, but I'd just be making stuff up. Suffice it to day it's mostly all around splitting files in libdrizzle into different files and removing interdepends. And whatever else I happened to see... |
1 |
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
|
2 |
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
3 |
*
|
|
4 |
* Copyright (C) 2008 Sun Microsystems, Inc.
|
|
5 |
*
|
|
6 |
* This program is free software; you can redistribute it and/or modify
|
|
7 |
* it under the terms of the GNU General Public License as published by
|
|
8 |
* the Free Software Foundation; version 2 of the License.
|
|
9 |
*
|
|
10 |
* This program is distributed in the hope that it will be useful,
|
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 |
* GNU General Public License for more details.
|
|
14 |
*
|
|
15 |
* You should have received a copy of the GNU General Public License
|
|
16 |
* along with this program; if not, write to the Free Software
|
|
17 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18 |
*/
|
|
19 |
||
20 |
/* Various helper functions not intended to be part of a public API */
|
|
21 |
||
612.2.4
by Monty Taylor
Moved some defines to config.h. Stopped including config.h directly anywhere. |
22 |
#include <drizzled/global.h> |
390.1.6
by Monty Taylor
Oh dear god the changes. The changes. I'd tell you what they are, but I'd just be making stuff up. Suffice it to day it's mostly all around splitting files in libdrizzle into different files and removing interdepends. And whatever else I happened to see... |
23 |
#include "libdrizzle_priv.h" |
139.1.13
by Trond Norbye
Replaced inclusion of sys/poll and sys/fcntl with poll.h and fcntl.h |
24 |
#include <poll.h> |
25 |
#include <fcntl.h> |
|
390.1.6
by Monty Taylor
Oh dear god the changes. The changes. I'd tell you what they are, but I'd just be making stuff up. Suffice it to day it's mostly all around splitting files in libdrizzle into different files and removing interdepends. And whatever else I happened to see... |
26 |
|
27 |
const char *unknown_sqlstate= "HY000"; |
|
28 |
const char *not_error_sqlstate= "00000"; |
|
29 |
const char *cant_connect_sqlstate= "08001"; |
|
30 |
||
31 |
const char * sqlstate_get_unknown(void) |
|
32 |
{
|
|
33 |
return unknown_sqlstate; |
|
34 |
}
|
|
35 |
||
36 |
const char * sqlstate_get_not_error(void) |
|
37 |
{
|
|
38 |
return not_error_sqlstate; |
|
39 |
}
|
|
40 |
||
41 |
const char * sqlstate_get_cant_connect(void) |
|
42 |
{
|
|
43 |
return cant_connect_sqlstate; |
|
44 |
}
|
|
45 |
||
46 |
/****************************************************************************
|
|
47 |
A modified version of connect(). connect_with_timeout() allows you to specify
|
|
48 |
a timeout value, in seconds, that we should wait until we
|
|
49 |
derermine we can't connect to a particular host. If timeout is 0,
|
|
50 |
connect_with_timeout() will behave exactly like connect().
|
|
51 |
||
52 |
Base version coded by Steve Bernacki, Jr. <steve@navinet.net>
|
|
53 |
*****************************************************************************/
|
|
54 |
||
395
by Brian Aker
Fixed uint/ushort issue in libdrizzle |
55 |
int connect_with_timeout(int fd, const struct sockaddr *name, uint32_t namelen, int32_t timeout) |
390.1.6
by Monty Taylor
Oh dear god the changes. The changes. I'd tell you what they are, but I'd just be making stuff up. Suffice it to day it's mostly all around splitting files in libdrizzle into different files and removing interdepends. And whatever else I happened to see... |
56 |
{
|
57 |
int flags, res, s_err; |
|
58 |
||
59 |
/*
|
|
60 |
If they passed us a timeout of zero, we should behave
|
|
61 |
exactly like the normal connect() call does.
|
|
62 |
*/
|
|
63 |
||
64 |
if (timeout == 0) |
|
65 |
return connect(fd, (struct sockaddr*) name, namelen); |
|
66 |
||
67 |
flags = fcntl(fd, F_GETFL, 0); /* Set socket to not block */ |
|
68 |
#ifdef O_NONBLOCK
|
|
69 |
fcntl(fd, F_SETFL, flags | O_NONBLOCK); /* and save the flags.. */ |
|
70 |
#endif
|
|
71 |
||
72 |
res= connect(fd, (struct sockaddr*) name, namelen); |
|
73 |
s_err= errno; /* Save the error... */ |
|
74 |
fcntl(fd, F_SETFL, flags); |
|
75 |
if ((res != 0) && (s_err != EINPROGRESS)) |
|
76 |
{
|
|
77 |
errno= s_err; /* Restore it */ |
|
78 |
return(-1); |
|
79 |
}
|
|
80 |
if (res == 0) /* Connected quickly! */ |
|
81 |
return(0); |
|
82 |
||
83 |
return wait_for_data(fd, timeout); |
|
84 |
}
|
|
85 |
||
86 |
/*
|
|
87 |
Wait up to timeout seconds for a connection to be established.
|
|
88 |
||
89 |
We prefer to do this with poll() as there is no limitations with this.
|
|
90 |
If not, we will use select()
|
|
91 |
*/
|
|
92 |
||
93 |
int wait_for_data(int fd, int32_t timeout) |
|
94 |
{
|
|
95 |
struct pollfd ufds; |
|
96 |
int res; |
|
97 |
||
98 |
ufds.fd= fd; |
|
99 |
ufds.events= POLLIN | POLLPRI; |
|
100 |
if (!(res= poll(&ufds, 1, (int) timeout*1000))) |
|
101 |
{
|
|
102 |
errno= EINTR; |
|
103 |
return -1; |
|
104 |
}
|
|
105 |
if (res < 0 || !(ufds.revents & (POLLIN | POLLPRI)) || (ufds.revents & POLLHUP)) |
|
106 |
return -1; |
|
107 |
return 0; |
|
108 |
}
|