diff options
author | Byron Nikolaidis <byronn@insightdist.com> | 1998-06-03 20:33:45 +0000 |
---|---|---|
committer | Byron Nikolaidis <byronn@insightdist.com> | 1998-06-03 20:33:45 +0000 |
commit | 99d21d5b62a54d64b95dc915a35fb35111bbc430 (patch) | |
tree | 06f02f33d40f78fd3b73ad6d775b18fd34ffd7e4 /src/interfaces/odbc/socket.c | |
parent | 85f91d0e8e2fa996a2c7ec629037387e1a9cfd88 (diff) |
Update odbc driver to current version V.0244
Diffstat (limited to 'src/interfaces/odbc/socket.c')
-rw-r--r-- | src/interfaces/odbc/socket.c | 74 |
1 files changed, 42 insertions, 32 deletions
diff --git a/src/interfaces/odbc/socket.c b/src/interfaces/odbc/socket.c index 40318ea5022..4d28f04b15c 100644 --- a/src/interfaces/odbc/socket.c +++ b/src/interfaces/odbc/socket.c @@ -1,16 +1,16 @@ -
-/* Module: socket.c
- *
- * Description: This module contains functions for low level socket
- * operations (connecting/reading/writing to the backend)
- *
- * Classes: SocketClass (Functions prefix: "SOCK_")
- *
- * API functions: none
- *
- * Comments: See "notice.txt" for copyright and license information.
- *
- */
+ +/* Module: socket.c + * + * Description: This module contains functions for low level socket + * operations (connecting/reading/writing to the backend) + * + * Classes: SocketClass (Functions prefix: "SOCK_") + * + * API functions: none + * + * Comments: See "notice.txt" for copyright and license information. + * + */ #include "socket.h" @@ -45,8 +45,8 @@ SocketClass *rv; return NULL; rv->errormsg = NULL; - rv->errornumber = 0;
-
+ rv->errornumber = 0; + rv->reverse = FALSE; } return rv; @@ -77,6 +77,7 @@ SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname) { struct hostent *host; struct sockaddr_in sadr; +unsigned long iaddr; if (self->socket != -1) { self->errornumber = SOCKET_ALREADY_CONNECTED; @@ -84,15 +85,24 @@ struct sockaddr_in sadr; return 0; } - host = gethostbyname(hostname); - if (host == NULL) { - self->errornumber = SOCKET_HOST_NOT_FOUND; - self->errormsg = "Could not resolve hostname."; - return 0; + memset((char *)&sadr, 0, sizeof(sadr)); + + /* If it is a valid IP address, use it. + Otherwise use hostname lookup. + */ + iaddr = inet_addr(hostname); + if (iaddr == INADDR_NONE) { + host = gethostbyname(hostname); + if (host == NULL) { + self->errornumber = SOCKET_HOST_NOT_FOUND; + self->errormsg = "Could not resolve hostname."; + return 0; + } + memcpy(&(sadr.sin_addr), host->h_addr, host->h_length); } + else + memcpy(&(sadr.sin_addr), (struct in_addr *) &iaddr, sizeof(iaddr)); - memset((char *)&sadr, 0, sizeof(sadr)); - memcpy(&(sadr.sin_addr), host->h_addr, host->h_length); sadr.sin_family = AF_INET; sadr.sin_port = htons(port); @@ -185,15 +195,15 @@ char buf[4]; switch (len) { case 2: SOCK_get_n_char(self, buf, len); - if (self->reverse)
- return *((unsigned short *) buf);
- else
+ if (self->reverse) + return *((unsigned short *) buf); + else return ntohs( *((unsigned short *) buf) ); case 4: - SOCK_get_n_char(self, buf, len);
- if (self->reverse)
- return *((unsigned int *) buf);
+ SOCK_get_n_char(self, buf, len); + if (self->reverse) + return *((unsigned int *) buf); else return ntohl( *((unsigned int *) buf) ); @@ -202,7 +212,7 @@ char buf[4]; self->errormsg = "Cannot read ints of that length"; return 0; } -}
+} void @@ -211,12 +221,12 @@ SOCK_put_int(SocketClass *self, int value, short len) unsigned int rv; switch (len) { - case 2:
+ case 2: rv = self->reverse ? value : htons( (unsigned short) value); SOCK_put_n_char(self, (char *) &rv, 2); return; - case 4:
+ case 4: rv = self->reverse ? value : htonl( (unsigned int) value); SOCK_put_n_char(self, (char *) &rv, 4); return; @@ -251,7 +261,7 @@ SOCK_get_next_byte(SocketClass *self) // reload the buffer self->buffer_read_in = 0; - self->buffer_filled_in = recv(self->socket, (char *)self->buffer_in, globals.socket_buffersize, 0);
+ self->buffer_filled_in = recv(self->socket, (char *)self->buffer_in, globals.socket_buffersize, 0); mylog("read %d, global_socket_buffersize=%d\n", self->buffer_filled_in, globals.socket_buffersize); |