37 #include <sys/types.h> 39 #include <sys/param.h> 40 #include <sys/socket.h> 42 #include <netinet/in.h> 44 #include <netinet/ip.h> 45 #include <netinet/ip_icmp.h> 48 #include <netinet/if_ether.h> 49 #include <net/if_dl.h> 51 #include <arpa/inet.h> 54 #include <sys/ioctl.h> 56 #include <sys/filio.h> 59 #include <sys/sockio.h> 64 #include <netinet/tcp.h> 68 #if defined(SERVER_MODE) 80 #ifndef HAVE_GETHOSTBYNAME_R 85 #define HOST_ID_ARRAY_SIZE 8 86 #define TCP_MIN_NUM_RETRIES 3 87 #define CONTROLLEN (sizeof(struct cmsghdr) + sizeof(int)) 88 #if !defined(INADDR_NONE) 89 #define INADDR_NONE 0xffffffff 94 #if !defined (WINDOWS) 95 #define SET_NONBLOCKING(fd) { \ 96 int flags = fcntl (fd, F_GETFL); \ 97 flags |= O_NONBLOCK; \ 98 fcntl (fd, F_SETFL, flags); \ 103 static int css_sockaddr (
const char *
host,
int port,
struct sockaddr *saddr, socklen_t * slen);
121 size_t namelen_ = (size_t) namelen;
122 addrinfo hints, *result =
NULL;
124 memset (&hints, 0,
sizeof (hints));
125 hints.ai_family = AF_UNSPEC;
126 hints.ai_socktype = SOCK_STREAM;
127 hints.ai_flags = AI_CANONNAME;
129 char hostname[namelen_];
130 hostname[namelen_ - 1] =
'\0';
131 gethostname (hostname, namelen_);
133 int gai_error = getaddrinfo (hostname,
NULL, &hints, &result);
140 size_t canonname_size =
strlen (result->ai_canonname) + 1;
141 if (canonname_size > namelen_)
143 freeaddrinfo (result);
147 memcpy (name, result->ai_canonname, canonname_size);
148 name[canonname_size] =
'\0';
150 freeaddrinfo (result);
157 static char path[PATH_MAX];
158 static bool need_init =
true;
164 if (cubrid_tmp ==
NULL || cubrid_tmp[0] ==
'\0')
211 setsockopt (sd, IPPROTO_TCP, TCP_NODELAY, (
const char *) &bool_value,
sizeof (bool_value));
216 setsockopt (sd, SOL_SOCKET, SO_KEEPALIVE, (
const char *) &bool_value,
sizeof (bool_value));
235 in_addr = inet_addr (host);
238 memcpy ((
void *) ip_addr, (
void *) &in_addr,
sizeof (in_addr));
243 #ifdef HAVE_GETHOSTBYNAME_R 244 #if defined (HAVE_GETHOSTBYNAME_R_GLIBC) 245 struct hostent *hp, hent;
249 if (gethostbyname_r (host, &hent, buf,
sizeof (buf), &hp, &herr) != 0 || hp ==
NULL)
254 memcpy ((
void *) ip_addr, (
void *) hent.h_addr, hent.h_length);
255 #elif defined (HAVE_GETHOSTBYNAME_R_SOLARIS) 260 if (gethostbyname_r (host, &hent, buf,
sizeof (buf), &herr) ==
NULL)
265 memcpy ((
void *) ip_addr, (
void *) hent.h_addr, hent.h_length);
266 #elif defined (HAVE_GETHOSTBYNAME_R_HOSTENT_DATA) 268 struct hostent_data ht_data;
270 if (gethostbyname_r (host, &hent, &ht_data) == -1)
275 memcpy ((
void *) ip_addr, (
void *) hent.h_addr, hent.h_length);
277 #error "HAVE_GETHOSTBYNAME_R" 283 hp = gethostbyname (host);
290 memcpy ((
void *) ip_addr, (
void *) hp->h_addr, hp->h_length);
309 struct sockaddr_in tcp_saddr;
310 struct sockaddr_un unix_saddr;
316 memset ((
void *) &tcp_saddr, 0,
sizeof (tcp_saddr));
317 tcp_saddr.sin_family = AF_INET;
318 tcp_saddr.sin_port =
htons (port);
324 in_addr = inet_addr (host);
327 memcpy ((
void *) &tcp_saddr.sin_addr, (
void *) &in_addr, sizeof (in_addr));
331 #ifdef HAVE_GETHOSTBYNAME_R 332 #if defined (HAVE_GETHOSTBYNAME_R_GLIBC) 333 struct hostent *hp, hent;
337 if (gethostbyname_r (host, &hent, buf,
sizeof (buf), &hp, &herr) != 0 || hp ==
NULL)
342 memcpy ((
void *) &tcp_saddr.sin_addr, (
void *) hent.h_addr, hent.h_length);
343 #elif defined (HAVE_GETHOSTBYNAME_R_SOLARIS) 348 if (gethostbyname_r (host, &hent, buf,
sizeof (buf), &herr) ==
NULL)
353 memcpy ((
void *) &tcp_saddr.sin_addr, (
void *) hent.h_addr, hent.h_length);
354 #elif defined (HAVE_GETHOSTBYNAME_R_HOSTENT_DATA) 356 struct hostent_data ht_data;
358 if (gethostbyname_r (host, &hent, &ht_data) == -1)
363 memcpy ((
void *) &tcp_saddr.sin_addr, (
void *) hent.h_addr, hent.h_length);
365 #error "HAVE_GETHOSTBYNAME_R" 372 hp = gethostbyname (host);
379 memcpy ((
void *) &tcp_saddr.sin_addr, (
void *) hp->h_addr, hp->h_length);
388 memcpy ((
void *) &in_addr, (
void *) &tcp_saddr.sin_addr, sizeof (in_addr));
389 if (in_addr == inet_addr (
"127.0.0.1"))
391 memset ((
void *) &unix_saddr, 0,
sizeof (unix_saddr));
392 unix_saddr.sun_family = AF_UNIX;
394 *slen =
sizeof (unix_saddr);
395 memcpy ((
void *) saddr, (
void *) &unix_saddr, *slen);
399 *slen =
sizeof (tcp_saddr);
400 memcpy ((
void *) saddr, (
void *) &tcp_saddr, *slen);
417 struct sockaddr *saddr;
419 time_t start_contime;
420 int nsecs, sleep_nsecs = 1;
424 struct sockaddr_in in;
425 struct sockaddr_un un;
431 saddr = (
struct sockaddr *) &saddr_buf;
435 start_contime = time (
NULL);
438 sd = socket (saddr->sa_family, SOCK_STREAM, 0);
456 if ((success = connect (sd, saddr, slen)) == 0)
466 if ((errno == ECONNREFUSED || errno == ETIMEDOUT) && will_retry ==
true)
468 nsecs = (int) difftime (time (
NULL), start_contime);
480 if (sleep_nsecs > 30)
489 if (nsecs < 0 && sleep_nsecs > (-nsecs))
491 sleep_nsecs = -nsecs;
495 (void) sleep (sleep_nsecs);
527 while (success < 0 && will_retry ==
true);
531 #if defined(CUBRID_DEBUG) 541 #if !defined (WINDOWS) 553 struct sockaddr *saddr;
556 struct pollfd po[1] = { {0, 0, 0} };
559 struct sockaddr_in in;
560 struct sockaddr_un un;
567 saddr = (
struct sockaddr *) &saddr_buf;
571 sd = socket (saddr->sa_family, SOCK_STREAM, 0);
584 n = connect (sd, saddr, slen);
595 if (errno != EINPROGRESS)
598 #if defined(CUBRID_DEBUG) 606 po[0].events = POLLOUT;
608 n = poll (po, 1, timeout);
616 #if defined(CUBRID_DEBUG) 627 #if defined(CUBRID_DEBUG) 635 if (getsockopt (sd, SOL_SOCKET, SO_ERROR, (
void *) &n, &slen) < 0)
637 #if defined(CUBRID_DEBUG) 645 #if defined(CUBRID_DEBUG) 665 struct sockaddr_in tcp_srv_addr;
666 struct sockaddr_un unix_srv_addr;
668 int reuseaddr_flag = 1;
669 struct stat unix_socket_stat;
675 memset ((
void *) &tcp_srv_addr, 0,
sizeof (tcp_srv_addr));
676 tcp_srv_addr.sin_family = AF_INET;
677 tcp_srv_addr.sin_addr.s_addr =
htonl (INADDR_ANY);
681 tcp_srv_addr.sin_port =
htons (port);
689 unix_srv_addr.sun_family = AF_UNIX;
703 sockfd[0] = socket (AF_INET, SOCK_STREAM, 0);
710 if (setsockopt (sockfd[0], SOL_SOCKET, SO_REUSEADDR, (
char *) &reuseaddr_flag,
sizeof (reuseaddr_flag)) < 0)
717 if (bind (sockfd[0], (
struct sockaddr *) &tcp_srv_addr,
sizeof (tcp_srv_addr)) < 0)
719 if (errno == EADDRINUSE && retry_count <= 5)
747 fcntl (sockfd[0], F_SETFD, 1);
749 ioctl (sockfd[0], FIOCLEX, 0);
762 if (!S_ISSOCK (unix_socket_stat.st_mode))
782 sockfd[1] = socket (AF_UNIX, SOCK_STREAM, 0);
790 if (setsockopt (sockfd[1], SOL_SOCKET, SO_REUSEADDR, (
char *) &reuseaddr_flag,
sizeof (reuseaddr_flag)) < 0)
798 if (bind (sockfd[1], (
struct sockaddr *) &unix_srv_addr,
sizeof (unix_srv_addr)) < 0)
800 if (errno == EADDRINUSE && retry_count <= 5)
822 fcntl (sockfd[1], F_SETFD, 1);
824 ioctl (sockfd[1], FIOCLEX, 0);
845 clilen =
sizeof (sa);
846 new_sockfd = accept (sockfd, &sa, &clilen);
863 if (sa.sa_family == AF_INET)
865 setsockopt (sockfd, IPPROTO_TCP, TCP_NODELAY, (
char *) &
boolean,
sizeof (
boolean));
885 struct sockaddr_un serv_addr;
887 *sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
894 memset ((
void *) &serv_addr, 0,
sizeof (serv_addr));
895 serv_addr.sun_family = AF_UNIX;
896 strncpy (serv_addr.sun_path, pathname, sizeof (serv_addr.sun_path) - 1);
897 servlen =
strlen (pathname) + 1 +
sizeof (serv_addr.sun_family);
899 if (bind (*sockfd, (
struct sockaddr *) &serv_addr, servlen) < 0)
910 chmod (pathname, S_IRWXU | S_IRWXG | S_IRWXO);
913 if (listen (*sockfd, 5) != 0)
933 struct sockaddr_un cli_addr;
936 clilen =
sizeof (cli_addr);
940 *newfd = accept (sockfd, (
struct sockaddr *) &cli_addr, &clilen);
955 setsockopt (sockfd, IPPROTO_TCP, TCP_NODELAY, (
char *) &
boolean,
sizeof (
boolean));
970 struct sockaddr_un serv_addr;
971 bool will_retry =
true;
975 memset ((
void *) &serv_addr, 0,
sizeof (serv_addr));
976 serv_addr.sun_family = AF_UNIX;
977 strncpy (serv_addr.sun_path, path_name, sizeof (serv_addr.sun_path) - 1);
978 servlen =
strlen (serv_addr.sun_path) + 1 +
sizeof (serv_addr.sun_family);
988 *sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
996 success = connect (*sockfd, (
struct sockaddr *) &serv_addr, servlen);
1004 if (errno == ECONNREFUSED || errno == ETIMEDOUT)
1029 while (success < 0 && will_retry ==
true);
1035 #if defined(CUBRID_DEBUG) 1041 if (num_retries > 0)
1043 #if defined(CUBRID_DEBUG) 1061 unsigned short req_id;
1064 struct iovec iov[1];
1067 #if defined(LINUX) || defined(AIX) 1068 static struct cmsghdr *cmptr =
NULL;
1071 iov[0].iov_base = (
char *) &req_id;
1072 iov[0].iov_len =
sizeof (
unsigned short);
1075 msg.msg_name = (caddr_t)
NULL;
1076 msg.msg_namelen = 0;
1077 #if !defined(LINUX) && !defined(AIX) 1078 msg.msg_accrights = (caddr_t) & new_fd;
1079 msg.msg_accrightslen =
sizeof (new_fd);
1085 msg.msg_control = (
void *) cmptr;
1089 rc = recvmsg (fd, &msg, 0);
1092 TPRINTF (
"recvmsg failed for fd = %d\n", rc);
1097 *rid =
ntohs (req_id);
1100 #if defined(LINUX) || defined(AIX) 1101 new_fd = *(
SOCKET *) CMSG_DATA (cmptr);
1105 ioctl (new_fd, SIOCSPGRP, (caddr_t) & pid);
1107 fcntl (new_fd, F_SETOWN, pid);
1125 unsigned short req_id;
1126 struct iovec iov[1];
1128 #if defined(LINUX) || defined(AIX) 1129 static struct cmsghdr *cmptr =
NULL;
1132 request =
htonl (request_for_server);
1133 if (send (server_fd, (
char *) &request,
sizeof (
int), 0) < 0)
1139 req_id =
htons (rid);
1142 iov[0].iov_base = (
char *) &req_id;
1143 iov[0].iov_len =
sizeof (
unsigned short);
1146 msg.msg_namelen = 0;
1147 msg.msg_name = (caddr_t) 0;
1148 #if !defined(LINUX) && !defined(AIX) 1149 msg.msg_accrights = (caddr_t) & client_fd;
1150 msg.msg_accrightslen =
sizeof (client_fd);
1156 cmptr->cmsg_level = SOL_SOCKET;
1157 cmptr->cmsg_type = SCM_RIGHTS;
1159 msg.msg_control = (
void *) cmptr;
1161 *(
SOCKET *) CMSG_DATA (cmptr) = client_fd;
1164 if (sendmsg (server_fd, &msg, 0) < 0)
1193 #if defined(CUBRID_DEBUG) 1211 unsigned int id = 0;
1213 #ifdef HAVE_GETHOSTID 1214 id = (
unsigned int) gethostid ();
1273 rc = ioctl (fd, FIONREAD, (caddr_t) &
count);
1289 #if defined (ENABLE_UNUSED_FUNCTION) 1299 socklen_t error_size =
sizeof (socklen_t);
1302 if (getsockopt (fd, SOL_SOCKET, SO_ERROR, (
char *) &error_code, &error_size) >= 0)
1317 return (
int) sysconf (_SC_OPEN_MAX);
1320 #define SET_NONBLOCKING(fd) { \ 1321 int flags = fcntl (fd, F_GETFL); \ 1322 flags |= O_NONBLOCK; \ 1323 fcntl (fd, F_SETFL, flags); \ 1351 *(u_char *) (&answer) = *(u_char *) w;
1356 sum = (sum >> 16) + (sum & 0xffff);
1362 #if defined(ENABLE_UNUSED_FUNCTION) 1376 char sendbuf[1500], recvbuf[1500];
1379 struct sockaddr_in sa_recv;
1383 int size, seq, n, hlen;
1388 pid = (uint16_t) getpid ();
1390 setsockopt (sd, SOL_SOCKET, SO_RCVBUF, &size,
sizeof (size));
1399 icmp = (
struct icmp *) sendbuf;
1400 icmp->icmp_type = ICMP_ECHO;
1401 icmp->icmp_code = 0;
1402 icmp->icmp_id =
htons (pid);
1403 icmp->icmp_seq =
htons (seq);
1405 gettimeofday (&tv,
NULL);
1406 memcpy (icmp->icmp_data, &tv, sizeof (tv));
1407 plen = ICMP_ADVLENMIN +
sizeof (tv);
1408 icmp->icmp_cksum = 0;
1409 icmp->icmp_cksum =
in_cksum ((u_short *) icmp, plen);
1411 n = sendto (sd, sendbuf, plen, 0, (
struct sockaddr *) sa_send,
sizeof (
struct sockaddr));
1412 if (n < 0 && errno != EINPROGRESS)
1415 inet_ntoa (sa_send->sin_addr), errno);
1423 tv.tv_sec = timeout >= 1000 ? 1 : 0;
1424 tv.tv_usec = timeout >= 1000 ? 0 : timeout * 1000;
1425 n = select (sd + 1, &fds,
NULL,
NULL, &tv);
1426 if (n < 0 && errno != EINTR)
1435 slen =
sizeof (sa_recv);
1436 n = recvfrom (sd, recvbuf,
sizeof (recvbuf), 0, (
struct sockaddr *) &sa_recv, &slen);
1437 ip = (
struct ip *) recvbuf;
1438 hlen = (ip->ip_hl) << 2;
1439 icmp = (
struct icmp *) (recvbuf + hlen);
1444 if ((n - hlen >= 8) && icmp->icmp_type == ICMP_ECHOREPLY && (
ntohs (icmp->icmp_id) ==
pid)
1445 && (sa_send->sin_addr.s_addr == sa_recv.sin_addr.s_addr))
1454 while (timeout > 0);
1475 struct sockaddr_in saddr;
1477 struct pollfd po[1];
1479 #if defined (CS_MODE) 1483 slen =
sizeof (saddr);
1484 if (getpeername (sd, (
struct sockaddr *) &saddr, &slen) < 0)
1491 if (saddr.sin_family != AF_INET)
1498 if ((nsd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP)) >= 0)
1500 return (
css_ping (nsd, &saddr, timeout) == 0);
1504 if ((nsd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
1513 saddr.sin_port =
htons (7);
1514 n = connect (nsd, (
struct sockaddr *) &saddr, slen);
1520 if (n == 0 || (n < 0 && errno == ECONNREFUSED))
1545 po[0].events = POLLOUT;
1547 n = poll (po, 1, timeout);
1567 if (getsockopt (nsd, SOL_SOCKET, SO_ERROR, (
void *) &n, &size) < 0)
1574 if (n == 0 || n == ECONNREFUSED)
1596 struct sockaddr_in in;
1597 struct sockaddr_un un;
1599 struct sockaddr *saddr;
1600 socklen_t saddr_len;
1602 saddr = (
struct sockaddr *) &saddr_buf;
1603 saddr_len =
sizeof (saddr_buf);
1604 if (getpeername (sockfd, saddr, &saddr_len) != 0)
1608 return getnameinfo (saddr, saddr_len, hostname, len,
NULL, 0, NI_NOFQDN);
1622 struct sockaddr_in in;
1623 struct sockaddr_un un;
1625 struct sockaddr *saddr;
1626 socklen_t saddr_len;
1628 saddr = (
struct sockaddr *) &saddr_buf;
1629 saddr_len =
sizeof (saddr_buf);
1630 if (getsockname (sockfd, saddr, &saddr_len) != 0)
1634 return getnameinfo (saddr, saddr_len, hostname, len,
NULL, 0, NI_NOFQDN);
void css_close_server_connection_socket(void)
bool css_tcp_listen_server_datagram(SOCKET sockfd, SOCKET *newfd)
#define ERR_CSS_TCP_CANNOT_CREATE_SOCKET
#define ERR_CSS_TCP_CANNOT_CREATE_STREAM
#define ERR_CSS_TCP_DATAGRAM_ACCEPT
int css_hostname_to_ip(const char *host, unsigned char *ip_addr)
unsigned int htonl(unsigned int from)
#define pthread_mutex_unlock(a)
SOCKET css_tcp_client_open_with_retry(const char *host, int port, bool will_retry)
#define ERR_CSS_TCP_BIND_ABORT
int css_gethostname(char *name, size_t namelen)
#define ERR_CSS_TCP_PASSING_FD
#define SET_NONBLOCKING(fd)
int css_get_max_socket_fds(void)
static int in_cksum(u_short *addr, int len)
#define er_log_debug(...)
bool css_tcp_setup_server_datagram(const char *pathname, SOCKET *sockfd)
#define ERR_CSS_TCP_HOST_NAME_ERROR
bool css_transfer_fd(SOCKET server_fd, SOCKET client_fd, unsigned short rid, CSS_SERVER_REQUEST request_for_server)
static pthread_mutex_t gethostbyname_lock
void * prm_get_value(PARAM_ID prm_id)
#define ERR_CSS_TCP_PORT_ERROR
#define ERR_CSS_TCP_DATAGRAM_CONNECT
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
int prm_get_integer_value(PARAM_ID prm_id)
SOCKET css_tcp_client_open(const char *host, int port)
#define TCP_MIN_NUM_RETRIES
const char * envvar_prefix(void)
int prm_get_master_port_id(void)
#define IS_INVALID_SOCKET(socket)
SOCKET css_server_accept(SOCKET sockfd)
#define ERR_CSS_TCP_DATAGRAM_BIND
static const int css_Maximum_server_count
void css_shutdown_socket(SOCKET fd)
unsigned short htons(unsigned short from)
bool css_peer_alive(SOCKET sd, int timeout)
#define TPRINTF(error_string, arg)
SOCKET css_open_new_socket_from_master(SOCKET fd, unsigned short *rid)
static int css_sockaddr(const char *host, int port, struct sockaddr *saddr, socklen_t *slen)
static int css_fd_error(SOCKET fd)
void er_set_with_oserror(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
#define ER_BO_UNABLE_TO_FIND_HOSTNAME
bool css_tcp_master_datagram(char *path_name, SOCKET *sockfd)
const char * envvar_get(const char *name)
unsigned int css_gethostid(void)
#define ERR_CSS_TCP_RECVMSG
int css_ping(SOCKET sd, struct sockaddr_in *sa_send, int timeout)
char * css_get_master_domain_path(void)
unsigned short ntohs(unsigned short from)
SOCKET css_tcp_client_open_with_timeout(const char *host, int port, int timeout)
#define ERR_CSS_TCP_ACCEPT_ERROR
int css_tcp_master_open(int port, SOCKET *sockfd)
bool prm_get_bool_value(PARAM_ID prm_id)
#define ERR_CSS_TCP_CANNOT_CONNECT_TO_MASTER
int css_get_peer_name(SOCKET sockfd, char *hostname, size_t len)
int css_get_sock_name(SOCKET sockfd, char *hostname, size_t len)
enum css_server_request CSS_SERVER_REQUEST
#define pthread_mutex_lock(a)
static void css_sockopt(SOCKET sd)
int css_open_server_connection_socket(void)
#define ERR_CSS_UNIX_DOMAIN_SOCKET_FILE_EXIST
SOCKET css_master_accept(SOCKET sockfd)
#define ERR_CSS_TCP_DATAGRAM_SOCKET