std::pair<std::wstring,std::wstring> split_pathname (const std::wstring &name, bool canonicalize) { std::wstring::size_type last_split = name.rfind (L'/'); // If a backslash exists in name, this is true; // If not, last_split = npos = -1, this is also true; std::wstring basename (name, last_split + 1); std::wstring dirname; if (last_split == std::wstring::npos) { // No backslash exist in name if (canonicalize) { dirname = get_current_dir <wchar_t> (); } else { dirname.assign (1, L'.'); } } else { if (last_split == 0) { // Dirname is root ++last_split; } dirname.assign (name, 0, last_split); if (canonicalize) { dirname = get_full_pathname (dirname); } } return std::pair<std::wstring,std::wstring> (dirname, basename); }
std::wstring get_nice_pathname (const std::wstring &name) { std::wstring fullname = get_full_pathname (name); std::wstring homefold = home_fold_pathname (fullname); std::wstring curdir = get_current_dir<wchar_t>(); // Special case: curdir == '/' if (curdir.length () < 2) { fullname.swap (homefold); return fullname; } // Special case: curdir == filename if (curdir == fullname) { fullname = L'.'; return fullname; } curdir += L'/'; fullname += L'/'; // In case fullname is an ancestor dir of curdir /* * curdir: ............/b_1/.../b_y/ * fullname: ............/c_1/.../c_z/ * | <--- --->| * length ox */ unsigned y; size_t ox; std::wstring::const_iterator ox_it = std::mismatch ( c(fullname).begin (), c(fullname).end (), curdir.c_str () // Not to be replaced by begin() (Not all implementations always maintain a null at the end!) ).first; while (*(ox_it-1) != L'/') { --ox_it; } ox = ox_it - c(fullname).begin (); y = std::count (c(curdir).begin () + ox, c(curdir).end (), L'/'); // Use either dot-dots or fullnames. These codes also apply to things under current directory unsigned dotdotlen = y*3; if ((y<3 && dotdotlen<ox) || (y==3 && dotdotlen*2<ox) || dotdotlen*4<ox) { // Use dot-dots iff // (1) No more than two levels, and shorter; or // (2) More than two levels, and MUCH shorter fullname.replace (0, ox, dotdotlen, L'.'); // Fill y dot-dots std::wstring::iterator it = fullname.begin (); std::wstring::iterator end = it + dotdotlen; while (it < end) { it += 2; *it++ = L'/'; } } fullname.resize (fullname.length () - 1); if (homefold.length () < fullname.length ()) { fullname.swap (homefold); } return fullname; }
BOOL InstallDriverPathLength (WORD * pcbPathOut, LPSTR envname) { #ifdef _MAC OSErr result; long fldrDid; short fldrRef; #endif BOOL retcode = FALSE; WORD len = 0; char path[1024]; char *ptr; #if !defined(UNIX_PWD) #ifdef _MAC result = FindFolder (kOnSystemDisk, kExtensionFolderType, kDontCreateFolder, &fldrRef, &fldrDid); if (result != noErr) { PUSH_ERROR (ODBC_ERROR_GENERAL_ERR); goto quit; } ptr = get_full_pathname (fldrDid, fldrRef); len = STRLEN (ptr); free (ptr); goto done; #else /* * On Windows, there is only one place to look */ len = GetWindowsDirectory (path, sizeof (path)); goto done; #endif #else /* * 1. Check $ODBCDRIVERS environment variable */ if ((ptr = getenv (envname)) && access (ptr, R_OK | W_OK | X_OK) == 0) { len = STRLEN (ptr); goto done; } /* * 2. Check /usr/local/lib and /usr/lib */ #ifdef _BE if (access ("/boot/beos/system/lib", R_OK | W_OK | X_OK) == 0) { len = STRLEN ("/boot/beos/system/lib"); goto done; } #else if (access ("/usr/local/lib", R_OK | W_OK | X_OK) == 0) { len = STRLEN ("/usr/local/lib"); goto done; } #endif #ifdef _BE if (access ("/boot/home/config/lib", R_OK | W_OK | X_OK) == 0) { len = STRLEN ("/boot/home/config/lib"); goto done; } #else if (access ("/usr/lib", R_OK | W_OK | X_OK) == 0) { len = STRLEN ("/usr/lib"); goto done; } #endif /* * 3. Check either $HOME */ if (!(ptr = getenv ("HOME"))) { ptr = (char *) getpwuid (getuid ()); if (ptr) ptr = ((struct passwd *) ptr)->pw_dir; } if (ptr) { #ifdef _BE sprintf (path, "%s/config/lib", ptr); #else sprintf (path, "%s/lib", ptr); #endif if (access (path, R_OK | W_OK | X_OK) == 0) { len = STRLEN (path); goto done; } } if (!mkdir (path, 0755)) goto done; #endif SQLPostInstallerError (ODBC_ERROR_GENERAL_ERR, "Cannot retrieve a directory where to install the driver or translator."); goto quit; done: retcode = TRUE; quit: if (pcbPathOut) *pcbPathOut = len; return retcode; }
/* * Algorithm for resolving an odbc.ini reference * * For UNIX : 1. Check for $ODBCINI variable, if exists return $ODBCINI. * 2. Check for $HOME/.odbc.ini or ~/.odbc.ini file, * if exists return it. * 3. Check for SYS_ODBC_INI build variable, if exists return * it. (ie : /etc/odbc.ini). * 4. No odbc.ini presence, return NULL. * * For WINDOWS, WIN32, OS2 : * 1. Check for the system odbc.ini file, if exists return it. * 2. No odbc.ini presence, return NULL. * * For VMS: 1. Check for $ODBCINI variable, if exists return $ODBCINI. * 2. Check for SYS$LOGIN:ODBC.INI file, if exists return it. * 3. No odbc.ini presence, return NULL. * * For Mac: 1. On powerPC, file is ODBC Preferences PPC * On 68k, file is ODBC Preferences * 2. Check for ...:System Folder:Preferences:ODBC Preferences * file, if exists return it. * 3. No odbc.ini presence, return NULL. * * For MacX: 1. Check for $ODBCINI variable, if exists return $ODBCINI. * 2. Check for $HOME/.odbc.ini or ~/.odbc.ini file, if exists * return it. * 3. Check for $HOME/Library/ODBC/odbc.ini or * ~/.odbc.ini file, if exists return it. * 4. Check for SYS_ODBC_INI build variable, if exists return * it. (ie : /etc/odbc.ini). * 5. Check for /Library/ODBC/odbc.ini * file, if exists return it. * 6. No odbc.ini presence, return NULL. */ char * _iodbcadm_getinifile (char *buf, int size, int bIsInst, int doCreate) { #ifdef _MAC HParamBlockRec hp; long fldrDid; short fldrRef; OSErr result; #endif /* endif _MAC */ int i, j; char *ptr; #ifdef _MAC # ifdef __POWERPC__ j = STRLEN (bIsInst ? ":ODBC Installer Preferences PPC" : ":ODBC Preferences PPC") + 1; # else j = STRLEN (bIsInst ? ":ODBC Installer Preferences" : ":ODBC Preferences") + 1; # endif /* endif __POWERPC__ */ #else j = STRLEN (bIsInst ? "/odbcinst.ini" : "/odbc.ini") + 1; #endif /* endif _MAC */ if (size < j) return NULL; #if !defined(UNIX_PWD) # ifdef _MAC result = FindFolder (kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder, &fldrRef, &fldrDid); if (result != noErr) return NULL; ptr = get_full_pathname (fldrDid, fldrRef); i = (ptr) ? STRLEN (ptr) : 0; if (i == 0 || i > size - j) { if (ptr) free (ptr); return NULL; } # ifdef __POWERPC__ STRCPY (buf, ptr); STRCAT (buf, bIsInst ? ":ODBC Installer Preferences PPC" : ":ODBC Preferences PPC"); # else STRCPY (buf, ptr); STRCAT (buf, bIsInst ? ":ODBC Installer Preferences" : ":ODBC Preferences"); # endif /* endif __POWERPC__ */ if (doCreate) { hp.fileParam.ioCompletion = NULL; hp.fileParam.ioVRefNum = fldrRef; hp.fileParam.ioDirID = fldrDid; # ifdef __POWERPC__ hp.fileParam.ioNamePtr = bIsInst ? "\pODBC Installer Preferences PPC" : "\pODBC Preferences PPC"; # else hp.fileParam.ioNamePtr = bIsInst ? "\pODBC Installer Preferences" : "\pODBC Preferences"; # endif PBHCreate (&hp, FALSE); } free (ptr); return buf; # else /* else _MAC */ /* * On Windows, there is only one place to look */ i = GetWindowsDirectory ((LPSTR) buf, size); if (i == 0 || i > size - j) return NULL; snprintf (buf + i, size - i, bIsInst ? "/odbcinst.ini" : "/odbc.ini"); return buf; # endif /* endif _MAC */ #else if (wSystemDSN == USERDSN_ONLY) { /* * 1. Check $ODBCINI environment variable */ if ((ptr = getenv (bIsInst ? "ODBCINSTINI" : "ODBCINI")) != NULL) { STRNCPY (buf, ptr, size); if (access (buf, R_OK) == 0) return buf; else if (doCreate) { int f = open ((char *) buf, O_CREAT, S_IREAD | S_IWRITE | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (f != -1) { close (f); return buf; } } } # ifdef VMS /* * 2a. VMS calls this HOME */ STRNCPY (buf, bIsInst ? "SYS$LOGIN:ODBCINST.INI" : "SYS$LOGIN:ODBC.INI", size); if (doCreate || access (buf, R_OK) == 0) return buf; # else /* else VMS */ /* * 2b. Check either $HOME/.odbc.ini or ~/.odbc.ini */ if ((ptr = getenv ("HOME")) == NULL) { ptr = (char *) getpwuid (getuid ()); if (ptr != NULL) ptr = ((struct passwd *) ptr)->pw_dir; } if (ptr != NULL) { snprintf (buf, size, bIsInst ? "%s/.odbcinst.ini" : "%s/.odbc.ini", ptr); if (doCreate || access (buf, R_OK) == 0) return buf; #if defined(__APPLE__) /* * Try to check the ~/Library/ODBC/odbc.ini */ snprintf (buf, size, bIsInst ? "%s" ODBCINST_INI_APP : "%s" ODBC_INI_APP, ptr); if (access (buf, R_OK) == 0) return buf; else if (doCreate) { int f = open ((char *) buf, O_CREAT, S_IREAD | S_IWRITE | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (f != -1) { close (f); return buf; } } # endif /* endif __APPLE__ */ } # endif /* endif VMS */ } /* * 3. Try SYS_ODBC_INI as the last resort */ if (wSystemDSN == SYSTEMDSN_ONLY || bIsInst) { /* * 1. Check $SYSODBCINI environment variable */ if ((ptr = getenv (bIsInst ? "SYSODBCINSTINI" : "SYSODBCINI")) != NULL) { STRNCPY (buf, ptr, size); if (access (buf, R_OK) == 0) return buf; else if (doCreate) { int f = open ((char *) buf, O_CREAT, S_IREAD | S_IWRITE | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (f != -1) { close (f); return buf; } } } #if defined(__APPLE__) /* * Try to check the /Library/ODBC/odbc.ini */ snprintf (buf, size, "%s", bIsInst ? ODBCINST_INI_APP : ODBC_INI_APP); if (access (buf, R_OK) == 0) return buf; else if (doCreate) { int f = open ((char *) buf, O_CREAT, S_IREAD | S_IWRITE | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (f != -1) { close (f); return buf; } } # endif /* endif __APPLE__ */ STRNCPY (buf, bIsInst ? SYS_ODBCINST_INI : SYS_ODBC_INI, size); return buf; } /* * No ini file found or accessible */ return NULL; #endif /* UNIX_PWD */ }