Re: Unix domain socket

From: Ramon Danieli <ramond(at)post(dot)tau(dot)ac(dot)il>
To: pgsql-odbc(at)postgresql(dot)org
Cc: Dave Page <dpage(at)vale-housing(dot)co(dot)uk>, Peter Eisentraut <peter_e(at)gmx(dot)net>
Subject: Re: Unix domain socket
Date: 2005-03-01 09:00:59
Message-ID: 1109667659.42242f4bb5c42@webmail2.tau.ac.il
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-odbc

Quoting Peter Eisentraut <peter_e(at)gmx(dot)net>:

> Dave Page wrote:
> > Hmm, did even realise it had crept in there. Well to enable it you
> > will need to define the HAVE_UNIX_SOCKETS macro when you compile.
> > Does it then work? As for why it's done the way it is, I have no idea
> > - it was committed by Hiroshi Inoue, so he'd need to answer that -
> > unfortunately though, he no longer works on psqlODBC.
>
> HAVE_UNIX_SOCKETS is defined in the server source tree, so I guess this
> could be a leftover from those days. Turn on the macro and see if you
> get it working.
>
> --

The macro is turned on automatically (RHL 4.0AS, gcc version 3.4.2 20041017 (Red
Hat 3.4.2-6.fc3)) and it works.

The following patch allow users to configure the Unix domain socket path,
using the "Uds" property.
I took some code from the unixODBC PG driver and performed the necessary
adjustments.
Please note that unlike unixODBC, I have followed the current convention, which
means that:
1) "Uds" is considered only if "Servername" is empty.
2) Default path is "/tmp".
3) The provided path should point the folder that comtains the UDS node.

Please let me know if you find anything wrong in this patch and whether it will
be included sometimes in the near future.

Thanks,
Ramon

diff -Naur psqlodbc-08.00.0004/connection.c
psqlodbc-08.00.0004.patch/connection.c
--- psqlodbc-08.00.0004/connection.c 2005-01-28 23:36:14.000000000 +0200
+++ psqlodbc-08.00.0004.patch/connection.c 2005-02-27 14:40:34.430232000 +0200
@@ -725,7 +725,16 @@
return 0;
}

- mylog("CC_connect(): DSN = '%s', server = '%s', port = '%s', database = '%s',
username = '%s', password='%s'\n", ci->dsn, ci->server, ci->port, ci->database,
ci->username, ci->password ? "xxxxx" : "");
+ mylog("CC_connect(): DSN = '%s', server = '%s', port = '%s',"
+#ifdef HAVE_UNIX_SOCKETS
+ " uds = '%s',"
+#endif
+ " database = '%s', username = '%s',"
+ " password='%s'\n", ci->dsn, ci->server, ci->port,
+#ifdef HAVE_UNIX_SOCKETS
+ ci->uds,
+#endif
+ ci->database, ci->username, ci->password ? "xxxxx" : "");

another_version_retry:

@@ -747,7 +756,11 @@

mylog("connecting to the server socket...\n");

- SOCK_connect_to(sock, (short) atoi(ci->port), ci->server);
+ SOCK_connect_to(sock, (short) atoi(ci->port), ci->server
+#ifdef HAVE_UNIX_SOCKETS
+ , ci->uds
+#endif
+ );
if (SOCK_get_errcode(sock) != 0)
{
mylog("connection to the server socket failed.\n");
diff -Naur psqlodbc-08.00.0004/connection.h
psqlodbc-08.00.0004.patch/connection.h
--- psqlodbc-08.00.0004/connection.h 2005-01-28 23:36:14.000000000 +0200
+++ psqlodbc-08.00.0004.patch/connection.h 2005-02-27 16:04:37.469858000 +0200
@@ -19,6 +19,10 @@
#include <pthread.h>
#endif

+#if !defined WIN32 && defined HAVE_SYS_UN_H && !defined HAVE_UNIX_SOCKETS
+#define HAVE_UNIX_SOCKETS
+#endif
+
typedef enum
{
CONN_NOT_CONNECTED, /* Connection has not been established */
@@ -239,6 +243,9 @@
char conn_settings[LARGE_REGISTRY_LEN];
char protocol[SMALL_REGISTRY_LEN];
char port[SMALL_REGISTRY_LEN];
+#ifdef HAVE_UNIX_SOCKETS
+ char uds[LARGE_REGISTRY_LEN];
+#endif
char onlyread[SMALL_REGISTRY_LEN];
char fake_oid_index[SMALL_REGISTRY_LEN];
char show_oid_column[SMALL_REGISTRY_LEN];
diff -Naur psqlodbc-08.00.0004/dlg_specific.c
psqlodbc-08.00.0004.patch/dlg_specific.c
--- psqlodbc-08.00.0004/dlg_specific.c 2005-01-28 23:36:15.000000000 +0200
+++ psqlodbc-08.00.0004.patch/dlg_specific.c 2005-02-27 16:03:10.559495000
+0200
@@ -286,6 +286,11 @@
else if (stricmp(attribute, INI_PORT) == 0)
strcpy(ci->port, value);

+#ifdef HAVE_UNIX_SOCKETS
+ else if (stricmp(attribute, INI_UDS) == 0)
+ strcpy(ci->uds, value);
+#endif
+
else if (stricmp(attribute, INI_READONLY) == 0 || stricmp(attribute, "A0") ==
0)
strcpy(ci->onlyread, value);

@@ -492,6 +497,11 @@
if (ci->port[0] == '\0' || overwrite)
SQLGetPrivateProfileString(DSN, INI_PORT, "", ci->port, sizeof(ci->port),
ODBC_INI);

+#ifdef HAVE_UNIX_SOCKETS
+ if (ci->uds[0] == '\0' || overwrite)
+ SQLGetPrivateProfileString(DSN, INI_UDS, "", ci->uds, sizeof(ci->uds),
ODBC_INI);
+#endif
+
if (ci->onlyread[0] == '\0' || overwrite)
SQLGetPrivateProfileString(DSN, INI_READONLY, "", ci->onlyread,
sizeof(ci->onlyread), ODBC_INI);

@@ -725,6 +735,13 @@
ci->port,
ODBC_INI);

+#ifdef HAVE_UNIX_SOCKETS
+ SQLWritePrivateProfileString(DSN,
+ INI_UDS,
+ ci->uds,
+ ODBC_INI);
+#endif
+
SQLWritePrivateProfileString(DSN,
INI_USER,
ci->username,
diff -Naur psqlodbc-08.00.0004/dlg_specific.h
psqlodbc-08.00.0004.patch/dlg_specific.h
--- psqlodbc-08.00.0004/dlg_specific.h 2005-01-28 23:36:15.000000000 +0200
+++ psqlodbc-08.00.0004.patch/dlg_specific.h 2005-02-27 14:10:03.393190000
+0200
@@ -38,6 +38,14 @@
#define INI_KDESC "Description" /* Data source description */
#define INI_SERVER "Servername" /* Name of Server running PostgreSQL */
#define INI_PORT "Port" /* Port on which the Postmaster is listening */
+
+#if !defined WIN32 && defined HAVE_SYS_UN_H
+#ifndef HAVE_UNIX_SOCKETS
+#define HAVE_UNIX_SOCKETS
+#endif
+#define INI_UDS "Uds" /* Unix domain socket path*/
+#endif
+
#define INI_DATABASE "Database" /* Database Name */
#define INI_USER "Username" /* Default User Name */
#define INI_PASSWORD "Password" /* Default Password */
diff -Naur psqlodbc-08.00.0004/socket.c psqlodbc-08.00.0004.patch/socket.c
--- psqlodbc-08.00.0004/socket.c 2005-01-28 23:36:20.000000000 +0200
+++ psqlodbc-08.00.0004.patch/socket.c 2005-02-27 16:20:34.993553000 +0200
@@ -109,7 +109,11 @@


char
-SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname)
+SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname
+#ifdef HAVE_UNIX_SOCKETS
+ , char *uds /* unix domain socket path */
+#endif
+ )
{
#if defined (POSIX_MULTITHREAD_SUPPORT)
const int bufsz = 8192;
@@ -140,7 +144,7 @@


/*
- * If it is a valid IP address, use it. Otherwise use hostname lookup.
+ * If it is a valid IP address, use it. Otherwise use AF_UNIX socket.
*/
if (hostname && hostname[0])
{
@@ -196,7 +200,7 @@
}
un->sun_family = family = AF_UNIX;
/* passing NULL means that this only suports the pg default "/tmp" */
- UNIXSOCK_PATH(un, port, ((char *) NULL));
+ UNIXSOCK_PATH(un, port, uds);
sLen = UNIXSOCK_LEN(un);
self->sadr = (struct sockaddr *) un;
}
diff -Naur psqlodbc-08.00.0004/socket.h psqlodbc-08.00.0004.patch/socket.h
--- psqlodbc-08.00.0004/socket.h 2005-01-28 23:36:20.000000000 +0200
+++ psqlodbc-08.00.0004.patch/socket.h 2005-02-27 16:18:22.733047000 +0200
@@ -34,7 +34,7 @@

#define SOCK_ERRNO errno
#define SOCK_ERRNO_SET(e) (errno = e)
-#ifdef HAVE_SYS_UN_H
+#if defined HAVE_SYS_UN_H && !defined HAVE_UNIX_SOCKETS
#define HAVE_UNIX_SOCKETS
#endif /* HAVE_SYS_UN_H */
#else
@@ -121,7 +121,12 @@
/* Socket prototypes */
SocketClass *SOCK_Constructor(const ConnectionClass *conn);
void SOCK_Destructor(SocketClass *self);
-char SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname);
+char SOCK_connect_to(SocketClass *self, unsigned short port,
+ char *hostname
+#ifdef HAVE_UNIX_SOCKETS
+ , char *uds
+#endif
+ );
void SOCK_get_n_char(SocketClass *self, char *buffer, int len);
void SOCK_put_n_char(SocketClass *self, char *buffer, int len);
BOOL SOCK_get_string(SocketClass *self, char *buffer, int bufsize);

----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.

In response to

Responses

Browse pgsql-odbc by date

  From Date Subject
Next Message Philippe Lang 2005-03-01 10:58:45 Re: New snapshot - 08.00.0005
Previous Message Janet Borschowa 2005-02-28 19:21:33 Re: (Fwd) SQLSetPos problem under Linux