From 13a52c1f0345c1b86b2bf43d766851a6ab852934 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 12 Jun 2001 15:14:47 +0000 Subject: [PATCH] I installed postgres 7.1 with --enable-odbc. I then installed tclodbc (http://sourceforge.net/projects/tclodbc) and libiodbc-2.50.3 (http://www.iodbc.org/dist/libiodbc-2.50.3.tar.gz). I could not get either to work... postgres would not find the global odbcinst.ini file. I traced this to src/interfaces/odbc/gpps.c -- here are the many things I think are wrong: Run tclodbc and do a ``database db '' where ``DSNname'' is one of the DSN's in /usr/local/etc/odbcinst.ini (or wherever the global ini file is installed.) The result is always the error message that ``one of server,port,database,etc. are missing''. Run libiodbc-2.50.3/samples/odbctest . The command fails to connect to the database and just exits. Dave Bodenstab --- src/interfaces/odbc/gpps.c | 47 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/interfaces/odbc/gpps.c b/src/interfaces/odbc/gpps.c index 93acebe1d5..ec5ada6507 100644 --- a/src/interfaces/odbc/gpps.c +++ b/src/interfaces/odbc/gpps.c @@ -37,6 +37,7 @@ #include #include "misc.h" #include "gpps.h" +#include "dlg_specific.h" #ifndef TRUE #define TRUE ((BOOL)1) @@ -46,6 +47,12 @@ #endif +/* + * theIniFileName is searched for in: + * $HOME/theIniFileName + * theIniFileName + * ODBCINST_INI + */ DWORD GetPrivateProfileString(char *theSection, /* section name */ char *theKey, /* search key name */ @@ -70,46 +77,38 @@ GetPrivateProfileString(char *theSection, /* section name */ size_t aReturnLength = 0; BOOL aSectionFound = FALSE; BOOL aKeyFound = FALSE; - int j = 0; + size_t aReturnLength = 0; + BOOL aSectionFound = FALSE; + BOOL aKeyFound = FALSE; - j = strlen(theIniFileName) + 1; ptr = (char *) getpwuid(getuid()); /* get user info */ - if (ptr == NULL) - { - if (MAXPGPATH - 1 < j) - theIniFileName[MAXPGPATH - 1] = '\0'; - - sprintf(buf, "%s", theIniFileName); - } - ptr = ((struct passwd *) ptr)->pw_dir; /* get user home dir */ - if (ptr == NULL || *ptr == '\0') + if (ptr == NULL || (((struct passwd *) ptr)->pw_dir) == NULL || *(((struct passwd *) ptr)->pw_dir) == '\0') ptr = "/home"; + else + ptr = ((struct passwd *) ptr)->pw_dir; /* get user home dir */ /* - * This doesn't make it so we find an ini file but allows normal - * processing to continue further on down. The likelihood is that the - * file won't be found and thus the default value will be returned. + * If it can't be opened because the paths are too long, then + * skip it, don't just truncate the path string... The truncated path + * might accidently be an existing file. The default value will be + * returned instead. */ - if (MAXPGPATH - 1 < strlen(ptr) + j) + if (MAXPGPATH - 1 >= strlen(ptr) + 1 + strlen(theIniFileName)) { - if (MAXPGPATH - 1 < strlen(ptr)) - ptr[MAXPGPATH - 1] = '\0'; - else - theIniFileName[MAXPGPATH - 1 - strlen(ptr)] = '\0'; + sprintf(buf, "%s/%s", ptr, theIniFileName); + aFile = (FILE *) fopen(buf, PG_BINARY_R); } - sprintf(buf, "%s/%s", ptr, theIniFileName); - /* * This code makes it so that a file in the users home dir overrides a * the "default" file as passed in */ - aFile = (FILE *) (buf ? fopen(buf, PG_BINARY_R) : NULL); if (!aFile) { - sprintf(buf, "%s", theIniFileName); - aFile = (FILE *) (buf ? fopen(buf, PG_BINARY_R) : NULL); + aFile = (FILE *) fopen(theIniFileName, PG_BINARY_R); + if (!aFile) + aFile = (FILE *) fopen(ODBCINST_INI, PG_BINARY_R); } aLength = (theDefault == NULL) ? 0 : strlen(theDefault); -- 2.11.0