Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-odbc by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group