aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/odbc/socket.c')
-rw-r--r--src/interfaces/odbc/socket.c243
1 files changed, 130 insertions, 113 deletions
diff --git a/src/interfaces/odbc/socket.c b/src/interfaces/odbc/socket.c
index 555f9bff4cc..c4d0a1bec88 100644
--- a/src/interfaces/odbc/socket.c
+++ b/src/interfaces/odbc/socket.c
@@ -1,14 +1,14 @@
-/* Module: socket.c
+/* Module: socket.c
*
- * Description: This module contains functions for low level socket
- * operations (connecting/reading/writing to the backend)
+ * Description: This module contains functions for low level socket
+ * operations (connecting/reading/writing to the backend)
*
- * Classes: SocketClass (Functions prefix: "SOCK_")
+ * Classes: SocketClass (Functions prefix: "SOCK_")
*
- * API functions: none
+ * API functions: none
*
- * Comments: See "notice.txt" for copyright and license information.
+ * Comments: See "notice.txt" for copyright and license information.
*
*/
@@ -20,7 +20,7 @@
#ifndef WIN32
#include <stdlib.h>
-#include <string.h> /* for memset */
+#include <string.h> /* for memset */
#endif
extern GLOBAL_VALUES globals;
@@ -39,51 +39,53 @@ extern GLOBAL_VALUES globals;
void
SOCK_clear_error(SocketClass *self)
{
- self->errornumber = 0;
- self->errormsg = NULL;
+ self->errornumber = 0;
+ self->errormsg = NULL;
}
-SocketClass *
+SocketClass *
SOCK_Constructor()
{
-SocketClass *rv;
+ SocketClass *rv;
- rv = (SocketClass *) malloc(sizeof(SocketClass));
+ rv = (SocketClass *) malloc(sizeof(SocketClass));
- if (rv != NULL) {
- rv->socket = (SOCKETFD) -1;
+ if (rv != NULL)
+ {
+ rv->socket = (SOCKETFD) - 1;
rv->buffer_filled_in = 0;
rv->buffer_filled_out = 0;
rv->buffer_read_in = 0;
rv->buffer_in = (unsigned char *) malloc(globals.socket_buffersize);
- if ( ! rv->buffer_in)
+ if (!rv->buffer_in)
{
free(rv);
return NULL;
}
rv->buffer_out = (unsigned char *) malloc(globals.socket_buffersize);
- if ( ! rv->buffer_out)
+ if (!rv->buffer_out)
{
free(rv->buffer_in);
free(rv);
return NULL;
}
-
- rv->errormsg = NULL;
- rv->errornumber = 0;
+
+ rv->errormsg = NULL;
+ rv->errornumber = 0;
rv->reverse = FALSE;
- }
- return rv;
+ }
+ return rv;
}
void
SOCK_Destructor(SocketClass *self)
{
- if (self->socket != -1) {
+ if (self->socket != -1)
+ {
SOCK_put_char(self, 'X');
SOCK_flush_output(self);
closesocket(self->socket);
@@ -100,28 +102,31 @@ SOCK_Destructor(SocketClass *self)
}
-char
+char
SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname)
{
-struct hostent *host;
-struct sockaddr_in sadr;
-unsigned long iaddr;
+ struct hostent *host;
+ struct sockaddr_in sadr;
+ unsigned long iaddr;
- if (self->socket != -1) {
+ if (self->socket != -1)
+ {
self->errornumber = SOCKET_ALREADY_CONNECTED;
self->errormsg = "Socket is already connected";
return 0;
}
- memset((char *)&sadr, 0, sizeof(sadr));
+ memset((char *) &sadr, 0, sizeof(sadr));
- /* If it is a valid IP address, use it.
- Otherwise use hostname lookup.
- */
+ /*
+ * If it is a valid IP address, use it. Otherwise use hostname lookup.
+ */
iaddr = inet_addr(hostname);
- if (iaddr == INADDR_NONE) {
+ if (iaddr == INADDR_NONE)
+ {
host = gethostbyname(hostname);
- if (host == NULL) {
+ if (host == NULL)
+ {
self->errornumber = SOCKET_HOST_NOT_FOUND;
self->errormsg = "Could not resolve hostname.";
return 0;
@@ -129,177 +134,187 @@ unsigned long iaddr;
memcpy(&(sadr.sin_addr), host->h_addr, host->h_length);
}
else
- memcpy(&(sadr.sin_addr), (struct in_addr *) &iaddr, sizeof(iaddr));
+ memcpy(&(sadr.sin_addr), (struct in_addr *) & iaddr, sizeof(iaddr));
sadr.sin_family = AF_INET;
sadr.sin_port = htons(port);
self->socket = socket(AF_INET, SOCK_STREAM, 0);
- if (self->socket == -1) {
+ if (self->socket == -1)
+ {
self->errornumber = SOCKET_COULD_NOT_CREATE_SOCKET;
self->errormsg = "Could not create Socket.";
return 0;
}
- if ( connect(self->socket, (struct sockaddr *)&(sadr),
- sizeof(sadr)) < 0) {
+ if (connect(self->socket, (struct sockaddr *) & (sadr),
+ sizeof(sadr)) < 0)
+ {
self->errornumber = SOCKET_COULD_NOT_CONNECT;
self->errormsg = "Could not connect to remote socket.";
closesocket(self->socket);
- self->socket = (SOCKETFD) -1;
+ self->socket = (SOCKETFD) - 1;
return 0;
}
return 1;
}
-void
+void
SOCK_get_n_char(SocketClass *self, char *buffer, int len)
{
-int lf;
+ int lf;
- if ( ! buffer) {
+ if (!buffer)
+ {
self->errornumber = SOCKET_NULLPOINTER_PARAMETER;
self->errormsg = "get_n_char was called with NULL-Pointer";
return;
}
- for(lf=0; lf < len; lf++)
+ for (lf = 0; lf < len; lf++)
buffer[lf] = SOCK_get_next_byte(self);
}
-void
+void
SOCK_put_n_char(SocketClass *self, char *buffer, int len)
{
-int lf;
+ int lf;
- if ( ! buffer) {
+ if (!buffer)
+ {
self->errornumber = SOCKET_NULLPOINTER_PARAMETER;
self->errormsg = "put_n_char was called with NULL-Pointer";
return;
}
- for(lf=0; lf < len; lf++)
- SOCK_put_next_byte(self, (unsigned char)buffer[lf]);
+ for (lf = 0; lf < len; lf++)
+ SOCK_put_next_byte(self, (unsigned char) buffer[lf]);
}
-/* bufsize must include room for the null terminator
- will read at most bufsize-1 characters + null.
+/* bufsize must include room for the null terminator
+ will read at most bufsize-1 characters + null.
*/
-void
+void
SOCK_get_string(SocketClass *self, char *buffer, int bufsize)
{
-register int lf = 0;
+ register int lf = 0;
for (lf = 0; lf < bufsize; lf++)
- if ( ! (buffer[lf] = SOCK_get_next_byte(self)))
+ if (!(buffer[lf] = SOCK_get_next_byte(self)))
return;
-
- buffer[bufsize-1] = '\0';
+
+ buffer[bufsize - 1] = '\0';
}
-void
+void
SOCK_put_string(SocketClass *self, char *string)
{
-register int lf;
-int len;
+ register int lf;
+ int len;
- len = strlen(string)+1;
+ len = strlen(string) + 1;
- for(lf = 0; lf < len; lf++)
- SOCK_put_next_byte(self, (unsigned char)string[lf]);
+ for (lf = 0; lf < len; lf++)
+ SOCK_put_next_byte(self, (unsigned char) string[lf]);
}
-int
+int
SOCK_get_int(SocketClass *self, short len)
{
-char buf[4];
-
- switch (len) {
- case 2:
- SOCK_get_n_char(self, buf, len);
- 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);
- else
- return ntohl( *((unsigned int *) buf) );
-
- default:
- self->errornumber = SOCKET_GET_INT_WRONG_LENGTH;
- self->errormsg = "Cannot read ints of that length";
- return 0;
+ char buf[4];
+
+ switch (len)
+ {
+ case 2:
+ SOCK_get_n_char(self, buf, len);
+ 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);
+ else
+ return ntohl(*((unsigned int *) buf));
+
+ default:
+ self->errornumber = SOCKET_GET_INT_WRONG_LENGTH;
+ self->errormsg = "Cannot read ints of that length";
+ return 0;
}
}
-void
+void
SOCK_put_int(SocketClass *self, int value, short len)
{
-unsigned int rv;
+ unsigned int rv;
- switch (len) {
- case 2:
- rv = self->reverse ? value : htons( (unsigned short) value);
- SOCK_put_n_char(self, (char *) &rv, 2);
- return;
+ switch (len)
+ {
+ case 2:
+ rv = self->reverse ? value : htons((unsigned short) value);
+ SOCK_put_n_char(self, (char *) &rv, 2);
+ return;
- case 4:
- rv = self->reverse ? value : htonl( (unsigned int) value);
- SOCK_put_n_char(self, (char *) &rv, 4);
- return;
+ case 4:
+ rv = self->reverse ? value : htonl((unsigned int) value);
+ SOCK_put_n_char(self, (char *) &rv, 4);
+ return;
- default:
- self->errornumber = SOCKET_PUT_INT_WRONG_LENGTH;
- self->errormsg = "Cannot write ints of that length";
- return;
- }
+ default:
+ self->errornumber = SOCKET_PUT_INT_WRONG_LENGTH;
+ self->errormsg = "Cannot write ints of that length";
+ return;
+ }
}
-void
+void
SOCK_flush_output(SocketClass *self)
{
-int written;
+ int written;
- written = send(self->socket, (char *)self->buffer_out, self->buffer_filled_out, 0);
- if (written != self->buffer_filled_out) {
+ written = send(self->socket, (char *) self->buffer_out, self->buffer_filled_out, 0);
+ if (written != self->buffer_filled_out)
+ {
self->errornumber = SOCKET_WRITE_ERROR;
self->errormsg = "Could not flush socket buffer.";
}
self->buffer_filled_out = 0;
}
-unsigned char
+unsigned char
SOCK_get_next_byte(SocketClass *self)
{
- if (self->buffer_read_in >= self->buffer_filled_in) {
+ if (self->buffer_read_in >= self->buffer_filled_in)
+ {
/* there are no more bytes left in the buffer so */
- /* reload the buffer */
+ /* 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);
- if (self->buffer_filled_in < 0) {
+ if (self->buffer_filled_in < 0)
+ {
self->errornumber = SOCKET_READ_ERROR;
self->errormsg = "Error while reading from the socket.";
self->buffer_filled_in = 0;
return 0;
}
- if (self->buffer_filled_in == 0) {
+ if (self->buffer_filled_in == 0)
+ {
self->errornumber = SOCKET_CLOSED;
self->errormsg = "Socket has been closed.";
self->buffer_filled_in = 0;
@@ -309,17 +324,19 @@ SOCK_get_next_byte(SocketClass *self)
return self->buffer_in[self->buffer_read_in++];
}
-void
+void
SOCK_put_next_byte(SocketClass *self, unsigned char next_byte)
{
-int bytes_sent;
+ int bytes_sent;
self->buffer_out[self->buffer_filled_out++] = next_byte;
- if (self->buffer_filled_out == globals.socket_buffersize) {
+ if (self->buffer_filled_out == globals.socket_buffersize)
+ {
/* buffer is full, so write it out */
- bytes_sent = send(self->socket, (char *)self->buffer_out, globals.socket_buffersize, 0);
- if (bytes_sent != globals.socket_buffersize) {
+ bytes_sent = send(self->socket, (char *) self->buffer_out, globals.socket_buffersize, 0);
+ if (bytes_sent != globals.socket_buffersize)
+ {
self->errornumber = SOCKET_WRITE_ERROR;
self->errormsg = "Error while writing to the socket.";
}