Re: Unix domain socket
От | Dave Page |
---|---|
Тема | Re: Unix domain socket |
Дата | |
Msg-id | E7F85A1B5FF8D44C8A1AF6885BC9A0E472B8AB@ratbert.vale-housing.co.uk обсуждение исходный текст |
Ответ на | Unix domain socket (Ramon Danieli <ramond@post.tau.ac.il>) |
Список | pgsql-odbc |
Thanks Ramon, patch applied. Regards, Dave. > -----Original Message----- > From: Ramon Danieli [mailto:ramond@post.tau.ac.il] > Sent: 01 March 2005 09:01 > To: pgsql-odbc@postgresql.org > Cc: Dave Page; Peter Eisentraut > Subject: Re: [ODBC] Unix domain socket > > Quoting Peter Eisentraut <peter_e@gmx.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. > >
В списке pgsql-odbc по дате отправления: