Commit f46acd4a authored by Sergei Petrunia's avatar Sergei Petrunia

Adopt Debian's fix-FTBFS-on-GNU-Hurd.patch.

- Took the original patch by Ondrej Sury;
- Applied a fix for a known problem in the patch:
   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=882062
- Fixed a few other issues
parent 45cabf10
...@@ -46,6 +46,10 @@ MACRO(CHECK_DTRACE) ...@@ -46,6 +46,10 @@ MACRO(CHECK_DTRACE)
AND NOT CMAKE_SYSTEM_NAME MATCHES "SunOS") AND NOT CMAKE_SYSTEM_NAME MATCHES "SunOS")
SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace") SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace")
ENDIF() ENDIF()
# On GNU/Hurd, dtrace is not supported
IF(DTRACE AND CMAKE_SYSTEM_NAME MATCHES "GNU")
SET(ENABLE_DTRACE OFF CACHE BOOL "Disable dtrace")
ENDIF()
SET(HAVE_DTRACE ${ENABLE_DTRACE}) SET(HAVE_DTRACE ${ENABLE_DTRACE})
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS") IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
IF(CMAKE_SIZEOF_VOID_P EQUAL 4) IF(CMAKE_SIZEOF_VOID_P EQUAL 4)
......
...@@ -77,6 +77,9 @@ IF(NOT VERSION) ...@@ -77,6 +77,9 @@ IF(NOT VERSION)
SET(DEFAULT_MACHINE "i386") SET(DEFAULT_MACHINE "i386")
ENDIF() ENDIF()
ENDIF() ENDIF()
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "GNU")
SET(DEFAULT_PLATFORM "GNU")
SET(DEFAULT_MACHINE "i386")
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin") ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
IF(CMAKE_OSX_DEPLOYMENT_TARGET) IF(CMAKE_OSX_DEPLOYMENT_TARGET)
SET(DEFAULT_PLATFORM "osx${CMAKE_OSX_DEPLOYMENT_TARGET}") SET(DEFAULT_PLATFORM "osx${CMAKE_OSX_DEPLOYMENT_TARGET}")
......
...@@ -623,11 +623,14 @@ static ...@@ -623,11 +623,14 @@ static
int int
mkdirp(const char *pathname, int Flags, myf MyFlags) mkdirp(const char *pathname, int Flags, myf MyFlags)
{ {
char parent[PATH_MAX], *p; char *parent, *p;
int len = strlen(pathname) + 1;
/* make a parent directory path */ /* make a parent directory path */
strncpy(parent, pathname, sizeof(parent)); if (!(parent= (char *)malloc(len)))
parent[sizeof(parent) - 1] = 0; return(-1);
strncpy(parent, pathname, len);
parent[len-1]= 0;
for (p = parent + strlen(parent); for (p = parent + strlen(parent);
!is_path_separator(*p) && p != parent; p--); !is_path_separator(*p) && p != parent; p--);
...@@ -636,19 +639,23 @@ mkdirp(const char *pathname, int Flags, myf MyFlags) ...@@ -636,19 +639,23 @@ mkdirp(const char *pathname, int Flags, myf MyFlags)
/* try to make parent directory */ /* try to make parent directory */
if (p != parent && mkdirp(parent, Flags, MyFlags) != 0) { if (p != parent && mkdirp(parent, Flags, MyFlags) != 0) {
free(parent);
return(-1); return(-1);
} }
/* make this one if parent has been made */ /* make this one if parent has been made */
if (my_mkdir(pathname, Flags, MyFlags) == 0) { if (my_mkdir(pathname, Flags, MyFlags) == 0) {
free(parent);
return(0); return(0);
} }
/* if it already exists that is fine */ /* if it already exists that is fine */
if (errno == EEXIST) { if (errno == EEXIST) {
free(parent);
return(0); return(0);
} }
free(parent);
return(-1); return(-1);
} }
...@@ -658,17 +665,24 @@ bool ...@@ -658,17 +665,24 @@ bool
equal_paths(const char *first, const char *second) equal_paths(const char *first, const char *second)
{ {
#ifdef HAVE_REALPATH #ifdef HAVE_REALPATH
char real_first[PATH_MAX]; char *real_first, *real_second;
char real_second[PATH_MAX]; int result;
if (realpath(first, real_first) == NULL) { real_first = realpath(first, 0);
if (real_first == NULL) {
return false; return false;
} }
if (realpath(second, real_second) == NULL) {
real_second = realpath(second, 0);
if (real_second == NULL) {
free(real_first);
return false; return false;
} }
return (strcmp(real_first, real_second) == 0); result = strcmp(real_first, real_second);
free(real_first);
free(real_second);
return result == 0;
#else #else
return strcmp(first, second) == 0; return strcmp(first, second) == 0;
#endif #endif
......
...@@ -318,13 +318,23 @@ int wsrep_write_cache(wsrep_t* const wsrep, ...@@ -318,13 +318,23 @@ int wsrep_write_cache(wsrep_t* const wsrep,
void wsrep_dump_rbr_buf(THD *thd, const void* rbr_buf, size_t buf_len) void wsrep_dump_rbr_buf(THD *thd, const void* rbr_buf, size_t buf_len)
{ {
char filename[PATH_MAX]= {0}; int len= snprintf(NULL, 0, "%s/GRA_%ld_%lld.log",
int len= snprintf(filename, PATH_MAX, "%s/GRA_%ld_%lld.log",
wsrep_data_home_dir, thd->thread_id, wsrep_data_home_dir, thd->thread_id,
(long long)wsrep_thd_trx_seqno(thd)); (long long)wsrep_thd_trx_seqno(thd));
if (len >= PATH_MAX) if (len < 0)
{ {
WSREP_ERROR("RBR dump path too long: %d, skipping dump.", len); WSREP_ERROR("snprintf error: %d, skipping dump.", len);
DBUG_VOID_RETURN;
}
char *filename= (char *)malloc(len++);
int len1= snprintf(filename, len, "%s/GRA_%ld_%lld.log",
wsrep_data_home_dir, thd->thread_id,
(long long)wsrep_thd_trx_seqno(thd));
if (len >= len1)
{
WSREP_ERROR("RBR dump path truncated: %d, skipping dump.", len);
free(filename);
return; return;
} }
...@@ -343,6 +353,7 @@ void wsrep_dump_rbr_buf(THD *thd, const void* rbr_buf, size_t buf_len) ...@@ -343,6 +353,7 @@ void wsrep_dump_rbr_buf(THD *thd, const void* rbr_buf, size_t buf_len)
WSREP_ERROR("Failed to open file '%s': %d (%s)", WSREP_ERROR("Failed to open file '%s': %d (%s)",
filename, errno, strerror(errno)); filename, errno, strerror(errno));
} }
free(filename);
} }
/* /*
...@@ -448,19 +459,32 @@ void wsrep_dump_rbr_buf_with_header(THD *thd, const void *rbr_buf, ...@@ -448,19 +459,32 @@ void wsrep_dump_rbr_buf_with_header(THD *thd, const void *rbr_buf,
{ {
DBUG_ENTER("wsrep_dump_rbr_buf_with_header"); DBUG_ENTER("wsrep_dump_rbr_buf_with_header");
char filename[PATH_MAX]= {0};
File file; File file;
IO_CACHE cache; IO_CACHE cache;
Log_event_writer writer(&cache); Log_event_writer writer(&cache);
Format_description_log_event *ev=NULL; Format_description_log_event *ev=NULL;
int len= my_snprintf(filename, PATH_MAX, "%s/GRA_%ld_%lld_v2.log", longlong thd_trx_seqno= (long long)wsrep_thd_trx_seqno(thd);
int len= my_snprintf(NULL, 0, "%s/GRA_%ld_%lld_v2.log",
wsrep_data_home_dir, thd->thread_id, wsrep_data_home_dir, thd->thread_id,
(long long) wsrep_thd_trx_seqno(thd)); thd_trx_seqno);
if (len >= PATH_MAX) char *filename;
if (len < 0 || !(filename= (char*)malloc(len++)))
{ {
WSREP_ERROR("RBR dump path too long: %d, skipping dump.", len); WSREP_ERROR("snprintf error: %d, skipping dump.", len);
DBUG_VOID_RETURN;
}
int len1= my_snprintf(filename, len, "%s/GRA_%ld_%lld_v2.log",
wsrep_data_home_dir, thd->thread_id,
thd_trx_seqno);
if (len >= len1)
{
WSREP_ERROR("RBR dump path truncated: %d, skipping dump.", len);
free(filename);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -501,6 +525,7 @@ void wsrep_dump_rbr_buf_with_header(THD *thd, const void *rbr_buf, ...@@ -501,6 +525,7 @@ void wsrep_dump_rbr_buf_with_header(THD *thd, const void *rbr_buf,
end_io_cache(&cache); end_io_cache(&cache);
cleanup1: cleanup1:
free(filename);
mysql_file_close(file, MYF(MY_WME)); mysql_file_close(file, MYF(MY_WME));
if (!thd->wsrep_applier) delete ev; if (!thd->wsrep_applier) delete ev;
......
...@@ -107,6 +107,7 @@ ...@@ -107,6 +107,7 @@
#cmakedefine HAVE_SIGNAL_H #cmakedefine HAVE_SIGNAL_H
#cmakedefine HAVE_SYS_MMAN_H #cmakedefine HAVE_SYS_MMAN_H
#cmakedefine HAVE_SYS_PARAM_H #cmakedefine HAVE_SYS_PARAM_H
#cmakedefine HAVE_SYS_POLL_H
#cmakedefine HAVE_SYS_RESOURCE_H #cmakedefine HAVE_SYS_RESOURCE_H
#cmakedefine HAVE_SYS_SELECT_H #cmakedefine HAVE_SYS_SELECT_H
#cmakedefine HAVE_SYS_SOCKET_H #cmakedefine HAVE_SYS_SOCKET_H
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment