diff options
Diffstat (limited to 'lib/odbc/c_src')
| -rw-r--r-- | lib/odbc/c_src/odbcserver.c | 100 | ||||
| -rw-r--r-- | lib/odbc/c_src/odbcserver.h | 1 | 
2 files changed, 38 insertions, 63 deletions
| diff --git a/lib/odbc/c_src/odbcserver.c b/lib/odbc/c_src/odbcserver.c index c9627e9d05..077d78bfe5 100644 --- a/lib/odbc/c_src/odbcserver.c +++ b/lib/odbc/c_src/odbcserver.c @@ -108,8 +108,8 @@  #if defined WIN32  #include <winsock2.h>  -/*  #include <ws2tcpip.h >  When we can support a newer c-compiler*/  #include <windows.h>  +#include <ws2tcpip.h >  #include <fcntl.h>  #include <sql.h>  #include <sqlext.h> @@ -1599,7 +1599,7 @@ static Boolean decode_params(db_state *state, byte *buffer, int *index, param_ar  	    break;      case SQL_C_TYPE_TIMESTAMP:  	    ts = (TIMESTAMP_STRUCT*) param->values.string; -	    ei_decode_tuple_header(buffer, index, &val); +	    ei_decode_tuple_header(buffer, index, &size);  	    ei_decode_long(buffer, index, &val);  	    ts[j].year = (SQLUSMALLINT)val;  	    ei_decode_long(buffer, index, &val); @@ -1727,74 +1727,48 @@ static byte * receive_erlang_port_msg(void)  }  /* ------------- Socket communication functions --------------------------*/ -#define USE_IPV4 -#ifdef UNIX -#define SOCKET int    -#endif -#if defined WIN32 || defined USE_IPV4 -/* Currently only an old windows compiler is supported so we do not have ipv6 -  capabilities */ +#if defined(WIN32)  static SOCKET connect_to_erlang(const char *port) -{ -    SOCKET sock; -    struct sockaddr_in sin; -     -    sock = socket(AF_INET, SOCK_STREAM, 0); -     -    memset(&sin, 0, sizeof(sin)); -    sin.sin_port = htons ((unsigned short)atoi(port)); -    sin.sin_family = AF_INET; -    sin.sin_addr.s_addr = inet_addr("127.0.0.1"); -     -    if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) != 0) { -        close_socket(sock); -        DO_EXIT(EXIT_SOCKET_CONNECT); -    } -    return sock; -}  #elif defined(UNIX)  static int connect_to_erlang(const char *port) +#endif  { -    int sock; -     -    struct addrinfo hints; -    struct addrinfo *erlang_ai, *first; -     -    memset(&hints, 0, sizeof(hints)); -    hints.ai_family = PF_UNSPEC; /* PF_INET or PF_INET6 */ -    hints.ai_socktype = SOCK_STREAM; -    hints.ai_protocol = IPPROTO_TCP; -     -    if (getaddrinfo("localhost", port, &hints, &first) != 0) { -  	DO_EXIT(EXIT_FAILURE); -    } +#if defined(WIN32) +	SOCKET sock; +#elif defined(UNIX) +	int sock; +#endif +	struct sockaddr_in sin; + +#if defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_ADDR) && defined(AF_INET6) +	struct sockaddr_in6 sin6; + +	sock = socket(AF_INET6, SOCK_STREAM, 0); + +	memset(&sin6, 0, sizeof(sin6)); +	sin6.sin6_port = htons ((unsigned short)atoi(port)); +	sin6.sin6_family = AF_INET6; +	sin6.sin6_addr = in6addr_loopback; -    for (erlang_ai = first; erlang_ai; erlang_ai = erlang_ai->ai_next) { +	if (connect(sock, (struct sockaddr*)&sin6, sizeof(sin6)) == 0) { +		return sock; +	} +	close_socket(sock); +#endif +	sock = socket(AF_INET, SOCK_STREAM, 0); + +	memset(&sin, 0, sizeof(sin)); +	sin.sin_port = htons ((unsigned short)atoi(port)); +	sin.sin_family = AF_INET; +	sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); -	sock = socket(erlang_ai->ai_family, erlang_ai->ai_socktype, -		      erlang_ai->ai_protocol); -	if (sock < 0) -	    continue; -	if (connect(sock,  (struct sockaddr*)erlang_ai->ai_addr, -		    erlang_ai->ai_addrlen) < 0) { -	    close(sock);  -	    sock = -1; -	    continue; -	} else { -	    break; +	if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) != 0) { +		close_socket(sock); +		DO_EXIT(EXIT_SOCKET_CONNECT);  	} -    } -    freeaddrinfo(first);  -     -    if (sock < 0){ -	close_socket(sock);  -	DO_EXIT(EXIT_SOCKET_CONNECT);  -    } -     -    return sock; +	return sock;  } -#endif  #ifdef WIN32  static void close_socket(SOCKET socket) @@ -2177,9 +2151,9 @@ static void init_param_column(param_array *params, byte *buffer, int *index,        params->type.sql = SQL_TYPE_TIMESTAMP;        params->type.len = sizeof(TIMESTAMP_STRUCT);        params->type.c = SQL_C_TYPE_TIMESTAMP; -      params->type.col_size = (SQLUINTEGER)19;//;sizeof(TIMESTAMP_STRUCT); +      params->type.col_size = (SQLUINTEGER)COL_SQL_TIMESTAMP;        params->values.string = -        (TIMESTAMP_STRUCT *)safe_malloc(num_param_values * params->type.len);       +        (byte *)safe_malloc(num_param_values * params->type.len);        break;      case USER_FLOAT:  	params->type.sql = SQL_FLOAT; diff --git a/lib/odbc/c_src/odbcserver.h b/lib/odbc/c_src/odbcserver.h index e6d8df1f58..3e2b22ab7d 100644 --- a/lib/odbc/c_src/odbcserver.h +++ b/lib/odbc/c_src/odbcserver.h @@ -98,6 +98,7 @@  #define COL_SQL_REAL 7  #define COL_SQL_DOUBLE 15  #define COL_SQL_TINYINT 4 +#define COL_SQL_TIMESTAMP 19  /* Types of parameters given to param_query*/  #define USER_SMALL_INT 1 | 
