aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/windev/socket.c
diff options
context:
space:
mode:
authorHiroshi Inoue <inoue@tpf.co.jp>2002-01-11 06:01:47 +0000
committerHiroshi Inoue <inoue@tpf.co.jp>2002-01-11 06:01:47 +0000
commitd91b4451175dcd1996e8b5fdaa375d2bcf74d9a5 (patch)
tree2102451d41d2932d3a5ccd870407e1d25a35854c /src/interfaces/odbc/windev/socket.c
parent3b3b73072859a2b465e4c392abcb954626507856 (diff)
downloadpostgresql-d91b4451175dcd1996e8b5fdaa375d2bcf74d9a5.tar.gz
postgresql-d91b4451175dcd1996e8b5fdaa375d2bcf74d9a5.zip
*** empty log message ***
Diffstat (limited to 'src/interfaces/odbc/windev/socket.c')
-rw-r--r--src/interfaces/odbc/windev/socket.c355
1 files changed, 0 insertions, 355 deletions
diff --git a/src/interfaces/odbc/windev/socket.c b/src/interfaces/odbc/windev/socket.c
deleted file mode 100644
index 031a6779cba..00000000000
--- a/src/interfaces/odbc/windev/socket.c
+++ /dev/null
@@ -1,355 +0,0 @@
-/*-------
- * 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"
-
-#include "connection.h"
-
-#ifndef WIN32
-#include <stdlib.h>
-#include <string.h> /* for memset */
-#endif
-
-extern GLOBAL_VALUES globals;
-
-#ifndef BOOL
-#define BOOL int
-#endif
-#ifndef TRUE
-#define TRUE (BOOL)1
-#endif
-#ifndef FALSE
-#define FALSE (BOOL)0
-#endif
-
-
-void
-SOCK_clear_error(SocketClass *self)
-{
- self->errornumber = 0;
- self->errormsg = NULL;
-}
-
-
-SocketClass *
-SOCK_Constructor(const ConnectionClass *conn)
-{
- SocketClass *rv;
-
- rv = (SocketClass *) malloc(sizeof(SocketClass));
-
- if (rv != NULL)
- {
- rv->socket = (SOCKETFD) - 1;
- rv->buffer_filled_in = 0;
- rv->buffer_filled_out = 0;
- rv->buffer_read_in = 0;
-
- if (rv)
- rv->buffer_size = conn->connInfo.drivers.socket_buffersize;
- else
- rv->buffer_size = globals.socket_buffersize;
- rv->buffer_in = (unsigned char *) malloc(rv->buffer_size);
- if (!rv->buffer_in)
- {
- free(rv);
- return NULL;
- }
-
- rv->buffer_out = (unsigned char *) malloc(rv->buffer_size);
- if (!rv->buffer_out)
- {
- free(rv->buffer_in);
- free(rv);
- return NULL;
- }
- rv->errormsg = NULL;
- rv->errornumber = 0;
- rv->reverse = FALSE;
- }
- return rv;
-}
-
-
-void
-SOCK_Destructor(SocketClass *self)
-{
- mylog("SOCK_Destructor\n");
- if (self->socket != -1)
- {
- SOCK_put_char(self, 'X');
- SOCK_flush_output(self);
- closesocket(self->socket);
- }
-
- if (self->buffer_in)
- free(self->buffer_in);
-
- if (self->buffer_out)
- free(self->buffer_out);
-
- free(self);
-}
-
-
-char
-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;
- self->errormsg = "Socket is already connected";
- 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));
-
- sadr.sin_family = AF_INET;
- sadr.sin_port = htons(port);
-
- self->socket = socket(AF_INET, SOCK_STREAM, 0);
- 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)
- {
- self->errornumber = SOCKET_COULD_NOT_CONNECT;
- self->errormsg = "Could not connect to remote socket.";
- closesocket(self->socket);
- self->socket = (SOCKETFD) - 1;
- return 0;
- }
- return 1;
-}
-
-
-void
-SOCK_get_n_char(SocketClass *self, char *buffer, int len)
-{
- int lf;
-
- if (!buffer)
- {
- self->errornumber = SOCKET_NULLPOINTER_PARAMETER;
- self->errormsg = "get_n_char was called with NULL-Pointer";
- return;
- }
-
- for (lf = 0; lf < len; lf++)
- buffer[lf] = SOCK_get_next_byte(self);
-}
-
-
-void
-SOCK_put_n_char(SocketClass *self, char *buffer, int len)
-{
- int lf;
-
- 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]);
-}
-
-
-/*
- * bufsize must include room for the null terminator
- * will read at most bufsize-1 characters + null.
- * returns TRUE if truncation occurs.
- */
-BOOL
-SOCK_get_string(SocketClass *self, char *buffer, int bufsize)
-{
- register int lf = 0;
-
- for (lf = 0; lf < bufsize - 1; lf++)
- if (!(buffer[lf] = SOCK_get_next_byte(self)))
- return FALSE;
-
- buffer[bufsize - 1] = '\0';
- return TRUE;
-}
-
-
-void
-SOCK_put_string(SocketClass *self, char *string)
-{
- register int lf;
- int len;
-
- len = strlen(string) + 1;
-
- for (lf = 0; lf < len; lf++)
- SOCK_put_next_byte(self, (unsigned char) string[lf]);
-}
-
-
-int
-SOCK_get_int(SocketClass *self, short len)
-{
- switch (len)
- {
- case 2:
- {
- unsigned short buf;
-
- SOCK_get_n_char(self, (char *) &buf, len);
- if (self->reverse)
- return buf;
- else
- return ntohs(buf);
- }
-
- case 4:
- {
- unsigned int buf;
-
- SOCK_get_n_char(self, (char *) &buf, len);
- if (self->reverse)
- return buf;
- else
- return ntohl(buf);
- }
-
- default:
- self->errornumber = SOCKET_GET_INT_WRONG_LENGTH;
- self->errormsg = "Cannot read ints of that length";
- return 0;
- }
-}
-
-
-void
-SOCK_put_int(SocketClass *self, int value, short len)
-{
- unsigned int rv;
-
- 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;
-
- default:
- self->errornumber = SOCKET_PUT_INT_WRONG_LENGTH;
- self->errormsg = "Cannot write ints of that length";
- return;
- }
-}
-
-
-void
-SOCK_flush_output(SocketClass *self)
-{
- int written;
-
- 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
-SOCK_get_next_byte(SocketClass *self)
-{
- if (self->buffer_read_in >= self->buffer_filled_in)
- {
- /*
- * there are no more bytes left in the buffer so reload the buffer
- */
- self->buffer_read_in = 0;
- self->buffer_filled_in = recv(self->socket, (char *) self->buffer_in, self->buffer_size, 0);
-
- mylog("read %d, global_socket_buffersize=%d\n", self->buffer_filled_in, self->buffer_size);
-
- 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)
- {
- self->errornumber = SOCKET_CLOSED;
- self->errormsg = "Socket has been closed.";
- self->buffer_filled_in = 0;
- return 0;
- }
- }
- return self->buffer_in[self->buffer_read_in++];
-}
-
-
-void
-SOCK_put_next_byte(SocketClass *self, unsigned char next_byte)
-{
- int bytes_sent;
-
- self->buffer_out[self->buffer_filled_out++] = next_byte;
-
- if (self->buffer_filled_out == self->buffer_size)
- {
- /* buffer is full, so write it out */
- bytes_sent = send(self->socket, (char *) self->buffer_out, self->buffer_size, 0);
- if (bytes_sent != self->buffer_size)
- {
- self->errornumber = SOCKET_WRITE_ERROR;
- self->errormsg = "Error while writing to the socket.";
- }
- self->buffer_filled_out = 0;
- }
-}