mariadb/storage/connect/osutil.c
Olivier Bertrand 92d283c026 Fix MDEV-12142 crash when creating CSV table
Was an unprepared longjmp (now throw)
Also fix a wrong calculation of To_Line sometimes causing a crash
because of buffer overflow.
  modified:   storage/connect/tabdos.cpp

Fix a wrong setting of USER for JDBC tables in connect_assisted_discovery.
Update jdbc_new.test after that fix, which changed errors.
  modified:   storage/connect/ha_connect.cc
  modified:   storage/connect/mysql-test/connect/r/jdbc_new.result
  modified:   storage/connect/mysql-test/connect/t/jdbc_new.test

Make using try/catch/throw the default option
  modified:   storage/connect/CMakeLists.txt

Typo
  modified:   storage/connect/xindex.cpp

Replace setjmp-longjmp's by try_catch-throw
  modified:   storage/connect/CMakeLists.txt
  modified:   storage/connect/array.cpp
  modified:   storage/connect/blkfil.cpp
  modified:   storage/connect/colblk.cpp
  modified:   storage/connect/connect.cc
  modified:   storage/connect/filamtxt.cpp
  modified:   storage/connect/filamvct.cpp
  modified:   storage/connect/filter.cpp
  modified:   storage/connect/global.h
  modified:   storage/connect/ha_connect.cc
  modified:   storage/connect/jdbconn.cpp
  modified:   storage/connect/json.cpp
  modified:   storage/connect/jsonudf.cpp
  modified:   storage/connect/odbconn.cpp
  modified:   storage/connect/osutil.c
  modified:   storage/connect/plgdbutl.cpp
  deleted:    storage/connect/plugutil.c
  added:      storage/connect/plugutil.cpp
  modified:   storage/connect/tabdos.cpp
  modified:   storage/connect/tabfix.cpp
  modified:   storage/connect/tabfmt.cpp
  modified:   storage/connect/tabjdbc.cpp
  modified:   storage/connect/tabjdbc.h
  modified:   storage/connect/tabjson.cpp
  modified:   storage/connect/tabmul.cpp
  modified:   storage/connect/tabmul.h
  modified:   storage/connect/tabmysql.cpp
  modified:   storage/connect/tabodbc.cpp
  modified:   storage/connect/tabodbc.h
  modified:   storage/connect/tabpivot.cpp
  modified:   storage/connect/tabsys.cpp
  modified:   storage/connect/tabvct.cpp
  modified:   storage/connect/tabvir.cpp
  modified:   storage/connect/tabxml.cpp
  modified:   storage/connect/valblk.cpp
  modified:   storage/connect/value.cpp
  modified:   storage/connect/xindex.cpp
  modified:   storage/connect/xobject.cpp
2017-03-06 17:23:56 +01:00

178 lines
3.8 KiB
C

#include "my_global.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "osutil.h"
#ifdef __WIN__
my_bool CloseFileHandle(HANDLE h)
{
return !CloseHandle(h);
} /* end of CloseFileHandle */
#else /* UNIX */
/* code to handle Linux and Solaris */
#include <unistd.h>
#include <sys/stat.h>
#include <ctype.h>
#include <fcntl.h>
#include <pwd.h>
extern FILE *debug;
/***********************************************************************/
/* Define some functions not existing in the UNIX library. */
/***********************************************************************/
PSZ strupr(PSZ p)
{
register int i;
for (i = 0; p[i]; i++)
p[i] = toupper(p[i]);
return (p);
} /* end of strupr */
PSZ strlwr(PSZ p)
{
register int i;
for (i = 0; p[i]; i++)
p[i] = tolower(p[i]);
return (p);
} /* end of strlwr */
/***********************************************************************/
/* Define the splitpath function not existing in the UNIX library. */
/***********************************************************************/
void _splitpath(LPCSTR name, LPSTR drive, LPSTR dir, LPSTR fn, LPSTR ft)
{
LPCSTR p2, p = name;
#ifdef DEBTRACE
htrc("SplitPath: name=%s [%s (%d)]\n",
XSTR(name), XSTR(__FILE__), __LINE__);
#endif
if (drive) *drive = '\0';
if (dir) *dir = '\0';
if (fn) *fn = '\0';
if (ft) *ft = '\0';
if ((p2 = strrchr(p, '/'))) {
p2++;
if (dir) strncat(dir, p, p2 - p);
p = p2;
} /* endif p2 */
if ((p2 = strrchr(p, '.'))) {
if (fn) strncat(fn, p, p2 - p);
if (ft) strcpy(ft, p2);
} else
if (fn) strcpy(fn, p);
#ifdef DEBTRACE
htrc("SplitPath: name=%s drive=%s dir=%s filename=%s type=%s [%s(%d)]\n",
XSTR(name), XSTR(drive), XSTR(dir), XSTR(fn), XSTR(ft), __FILE__, __LINE__);
#endif
} /* end of _splitpath */
/***********************************************************************/
/* Define the makepath function not existing in the UNIX library. */
/***********************************************************************/
void _makepath(LPSTR name, LPCSTR drive __attribute__((unused)), LPCSTR dir, LPCSTR fn, LPCSTR ft)
{
int n;
if (!name)
return;
else
*name = '\0';
if (dir && (n = strlen(dir)) > 0) {
strcpy(name, dir);
if (name[n-1] != '/')
strcat(name, "/");
} /* endif dir */
if (fn)
strcat(name, fn);
if (ft && strlen(ft)) {
if (*ft != '.')
strcat(name, ".");
strcat(name, ft);
} /* endif ft */
} /* end of _makepath */
my_bool CloseFileHandle(HANDLE h)
{
return (close(h)) ? TRUE : FALSE;
} /* end of CloseFileHandle */
int GetLastError()
{
return errno;
} /* end of GetLastError */
unsigned long _filelength(int fd)
{
struct stat st;
if (fd == -1)
return 0;
if (fstat(fd, &st) != 0)
return 0;
return st.st_size;
} /* end of _filelength */
char *_fullpath(char *absPath, const char *relPath, size_t maxLength)
{
// Fixme
char *p;
if ( *relPath == '\\' || *relPath == '/' ) {
strncpy(absPath, relPath, maxLength);
} else if (*relPath == '~') {
// get the path to the home directory
struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir;
if (homedir)
strcat(strncpy(absPath, homedir, maxLength), relPath + 1);
else
strncpy(absPath, relPath, maxLength);
} else {
char buff[2*_MAX_PATH];
p= getcwd(buff, _MAX_PATH);
assert(p);
strcat(buff,"/");
strcat(buff, relPath);
strncpy(absPath, buff, maxLength);
} /* endif's relPath */
p = absPath;
for(; *p; p++)
if (*p == '\\')
*p = '/';
return absPath;
} /* end of _fullpath */
BOOL MessageBeep(uint i __attribute__((unused)))
{
// Fixme
return TRUE;
} /* end of MessageBeep */
#endif // UNIX