461 lines
15 KiB
Diff
461 lines
15 KiB
Diff
diff --git a/cmake/XRootDOSDefs.cmake b/cmake/XRootDOSDefs.cmake
|
|
index 8b182e61e..9f7c9aa59 100644
|
|
--- a/cmake/XRootDOSDefs.cmake
|
|
+++ b/cmake/XRootDOSDefs.cmake
|
|
@@ -70,6 +70,21 @@ if( ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" )
|
|
set( LINUX TRUE )
|
|
include( GNUInstallDirs )
|
|
set( EXTRA_LIBS rt )
|
|
+
|
|
+ # Check for musl libc with the compiler, since it provides way to detect it
|
|
+ execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine
|
|
+ OUTPUT_VARIABLE TARGET_TRIPLE ERROR_VARIABLE TARGET_ERROR)
|
|
+
|
|
+ if (NOT TARGET_ERROR)
|
|
+ if ("${TARGET_TRIPLE}" MATCHES "musl")
|
|
+ message(STATUS "Detected musl libc")
|
|
+ add_definitions(-DMUSL=1)
|
|
+ endif()
|
|
+ else()
|
|
+ message(WARNING "Could not detect system information!")
|
|
+ endif()
|
|
+
|
|
+ unset(TARGET_ERROR)
|
|
endif()
|
|
|
|
#-------------------------------------------------------------------------------
|
|
diff --git a/src/Xrd/XrdConfig.hh b/src/Xrd/XrdConfig.hh
|
|
index a06ad462f..2d1403a5e 100644
|
|
--- a/src/Xrd/XrdConfig.hh
|
|
+++ b/src/Xrd/XrdConfig.hh
|
|
@@ -34,6 +34,8 @@
|
|
#include "Xrd/XrdProtLoad.hh"
|
|
#include "Xrd/XrdProtocol.hh"
|
|
|
|
+#include <sys/types.h>
|
|
+
|
|
class XrdSysError;
|
|
class XrdTcpMonInfo;
|
|
class XrdNetSecurity;
|
|
diff --git a/src/Xrd/XrdPoll.hh b/src/Xrd/XrdPoll.hh
|
|
index 3790b03b0..d9bda5d62 100644
|
|
--- a/src/Xrd/XrdPoll.hh
|
|
+++ b/src/Xrd/XrdPoll.hh
|
|
@@ -29,7 +29,7 @@
|
|
/* specific prior written permission of the institution or contributor. */
|
|
/******************************************************************************/
|
|
|
|
-#include <sys/poll.h>
|
|
+#include <poll.h>
|
|
#include "XrdSys/XrdSysPthread.hh"
|
|
|
|
#define XRD_NUMPOLLERS 3
|
|
diff --git a/src/XrdAcc/XrdAccGroups.cc b/src/XrdAcc/XrdAccGroups.cc
|
|
index e663fdd35..94b8edbc7 100644
|
|
--- a/src/XrdAcc/XrdAccGroups.cc
|
|
+++ b/src/XrdAcc/XrdAccGroups.cc
|
|
@@ -46,6 +46,14 @@
|
|
#include "XrdAcc/XrdAccGroups.hh"
|
|
#include "XrdAcc/XrdAccPrivs.hh"
|
|
|
|
+#ifdef MUSL
|
|
+int innetgr(const char *netgroup, const char *host, const char *user,
|
|
+ const char *domain)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
// Additionally, this routine does not support a user in more than
|
|
// NGROUPS_MAX groups. This is a standard unix limit defined in limits.h.
|
|
|
|
diff --git a/src/XrdCl/XrdClFileStateHandler.hh b/src/XrdCl/XrdClFileStateHandler.hh
|
|
index 197151321..f83538819 100644
|
|
--- a/src/XrdCl/XrdClFileStateHandler.hh
|
|
+++ b/src/XrdCl/XrdClFileStateHandler.hh
|
|
@@ -39,6 +39,7 @@
|
|
#include <set>
|
|
#include <vector>
|
|
|
|
+#include <sys/time.h>
|
|
#include <sys/uio.h>
|
|
#include <cstdint>
|
|
|
|
diff --git a/src/XrdCl/XrdClMonitor.hh b/src/XrdCl/XrdClMonitor.hh
|
|
index 2fc753777..2b3a96c46 100644
|
|
--- a/src/XrdCl/XrdClMonitor.hh
|
|
+++ b/src/XrdCl/XrdClMonitor.hh
|
|
@@ -43,6 +43,8 @@
|
|
|
|
#include "XrdCl/XrdClFileSystem.hh"
|
|
|
|
+#include <sys/time.h>
|
|
+
|
|
namespace XrdCl
|
|
{
|
|
class URL;
|
|
diff --git a/src/XrdNet/XrdNetMsg.cc b/src/XrdNet/XrdNetMsg.cc
|
|
index fa6c16f87..f97e1af09 100644
|
|
--- a/src/XrdNet/XrdNetMsg.cc
|
|
+++ b/src/XrdNet/XrdNetMsg.cc
|
|
@@ -29,7 +29,7 @@
|
|
/******************************************************************************/
|
|
|
|
#include <cerrno>
|
|
-#include <sys/poll.h>
|
|
+#include <poll.h>
|
|
|
|
#include "XrdNet/XrdNet.hh"
|
|
#include "XrdNet/XrdNetMsg.hh"
|
|
diff --git a/src/XrdNet/XrdNetSecurity.cc b/src/XrdNet/XrdNetSecurity.cc
|
|
index 0f8451127..0faf563dd 100644
|
|
--- a/src/XrdNet/XrdNetSecurity.cc
|
|
+++ b/src/XrdNet/XrdNetSecurity.cc
|
|
@@ -40,11 +40,6 @@
|
|
#include <sys/types.h>
|
|
#include <Winsock2.h>
|
|
#include <io.h>
|
|
-int innetgr(const char *netgroup, const char *host, const char *user,
|
|
- const char *domain)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
#include "XrdSys/XrdWin32.hh"
|
|
#endif
|
|
|
|
@@ -53,6 +48,14 @@ int innetgr(const char *netgroup, const char *host, const char *user,
|
|
#include "XrdNet/XrdNetUtils.hh"
|
|
#include "XrdSys/XrdSysTrace.hh"
|
|
|
|
+#if defined(MUSL) || defined(WIN32)
|
|
+int innetgr(const char *netgroup, const char *host, const char *user,
|
|
+ const char *domain)
|
|
+{
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
+
|
|
/******************************************************************************/
|
|
/* L o c a l C l a s s e s */
|
|
/******************************************************************************/
|
|
diff --git a/src/XrdOfs/XrdOfsHandle.cc b/src/XrdOfs/XrdOfsHandle.cc
|
|
index 963f17a5a..26b40ce08 100644
|
|
--- a/src/XrdOfs/XrdOfsHandle.cc
|
|
+++ b/src/XrdOfs/XrdOfsHandle.cc
|
|
@@ -30,7 +30,7 @@
|
|
|
|
#include <cstdio>
|
|
#include <ctime>
|
|
-#include <sys/errno.h>
|
|
+#include <errno.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "XrdOfs/XrdOfsHandle.hh"
|
|
diff --git a/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh b/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh
|
|
index b1a94acd6..0202579cc 100644
|
|
--- a/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh
|
|
+++ b/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh
|
|
@@ -38,9 +38,7 @@
|
|
#include <memory>
|
|
#include <mutex>
|
|
|
|
-#if defined(__GLIBC__) || defined(__BIONIC__) || defined(__CYGWIN__)
|
|
-#include <byteswap.h>
|
|
-#elif defined(__APPLE__)
|
|
+#if defined(__APPLE__)
|
|
// Make sure that byte swap functions are not already defined.
|
|
#if !defined(bswap_16)
|
|
// Mac OS X / Darwin features
|
|
@@ -49,6 +47,8 @@
|
|
#define bswap_32(x) OSSwapInt32(x)
|
|
#define bswap_64(x) OSSwapInt64(x)
|
|
#endif
|
|
+#else
|
|
+#include <byteswap.h>
|
|
#endif
|
|
|
|
class XrdOssCsiTagstoreFile : public XrdOssCsiTagstore
|
|
diff --git a/src/XrdOuc/XrdOucBackTrace.cc b/src/XrdOuc/XrdOucBackTrace.cc
|
|
index 813183c32..c61a89b63 100644
|
|
--- a/src/XrdOuc/XrdOucBackTrace.cc
|
|
+++ b/src/XrdOuc/XrdOucBackTrace.cc
|
|
@@ -34,7 +34,7 @@
|
|
#include <vector>
|
|
#include <sys/syscall.h>
|
|
|
|
-#ifdef __GNUC__
|
|
+#ifndef MUSL /* glibc, uclibc, and macOS all have execinfo.h */
|
|
#include <execinfo.h>
|
|
#include <cxxabi.h>
|
|
#endif
|
|
@@ -176,13 +176,11 @@ XrdInfo *CvtRsp(const char *name, int snum)
|
|
/* D e m a n g l e */
|
|
/******************************************************************************/
|
|
|
|
+#ifndef MUSL
|
|
namespace
|
|
{
|
|
int Demangle(char *cSym, char *buff, int blen)
|
|
{
|
|
-#ifndef __GNUC__
|
|
- return -1;
|
|
-#else
|
|
int status;
|
|
char *plus = index(cSym, '+');
|
|
char *brak = (plus ? index(plus, '[') : 0);
|
|
@@ -201,7 +199,6 @@ int Demangle(char *cSym, char *buff, int blen)
|
|
status = snprintf(buff, blen, "%s %s+%s\n", brak, realname, plus+1);
|
|
free(realname);
|
|
return status;
|
|
-#endif
|
|
}
|
|
}
|
|
|
|
@@ -221,6 +218,7 @@ int DumpDepth()
|
|
return (depth <= maxDepth ? depth : maxDepth);
|
|
}
|
|
}
|
|
+#endif
|
|
|
|
/******************************************************************************/
|
|
/* D u m p S t a c k */
|
|
@@ -230,8 +228,8 @@ namespace
|
|
{
|
|
void DumpStack(char *bP, int bL, TidType tid)
|
|
{
|
|
-#ifndef __GNUC__
|
|
- snprintf(bP, bL, "TBT " TidFmt " No stack information available, not gnuc.", tid);
|
|
+#ifdef MUSL
|
|
+ snprintf(bP, bL, "TBT " TidFmt " No stack information available with musl libc.", tid);
|
|
return;
|
|
#else
|
|
static int btDepth = DumpDepth(); // One time MT-safe call
|
|
diff --git a/src/XrdPosix/XrdPosix.cc b/src/XrdPosix/XrdPosix.cc
|
|
index 0f32dc2ee..e4f020c09 100644
|
|
--- a/src/XrdPosix/XrdPosix.cc
|
|
+++ b/src/XrdPosix/XrdPosix.cc
|
|
@@ -53,6 +53,58 @@
|
|
|
|
extern XrdPosixLinkage Xunix;
|
|
|
|
+/******************************************************************************/
|
|
+/* U t i l i t y F u n c t i o n s */
|
|
+/******************************************************************************/
|
|
+
|
|
+#ifdef MUSL
|
|
+#include <stdio_ext.h>
|
|
+#endif
|
|
+
|
|
+static inline void fseterr(FILE *fp)
|
|
+{
|
|
+ /* Most systems provide FILE as a struct and the necessary bitmask in
|
|
+ <stdio.h>, because they need it for implementing getc() and putc() as
|
|
+ fast macros. This function is based on gnulib's fseterr.c */
|
|
+#if defined _IO_ERR_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
|
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
|
|
+ fp->_flags |= _IO_ERR_SEEN;
|
|
+#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __ANDROID__
|
|
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
|
+ fp->_flags |= __SERR;
|
|
+#elif defined _IOERR
|
|
+ /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
|
+ fp->_flag |= _IOERR;
|
|
+#elif defined __UCLIBC__ /* uClibc */
|
|
+ fp->__modeflags |= __FLAG_ERROR;
|
|
+#elif defined MUSL /* musl libc */
|
|
+ __fseterr(fp);
|
|
+#else
|
|
+ #error "Unsupported platform! Please report it as a bug."
|
|
+#endif
|
|
+}
|
|
+
|
|
+static inline void fseteof(FILE *fp)
|
|
+{
|
|
+ /* Most systems provide FILE as a struct and the necessary bitmask in
|
|
+ <stdio.h>, because they need it for implementing getc() and putc() as
|
|
+ fast macros. */
|
|
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
|
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
|
|
+ fp->_flags |= _IO_EOF_SEEN;
|
|
+#elif defined __sferror || defined __APPLE__ || defined __DragonFly__ || defined __ANDROID__
|
|
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
|
+ fp->_flags |= __SEOF;
|
|
+#elif defined _IOEOF
|
|
+ /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
|
+ fp->_flag |= _IOEOF;
|
|
+#elif defined __UCLIBC__ /* uClibc */
|
|
+ fp->__modeflags |= __FLAG_EOF;
|
|
+#else
|
|
+ (void) fseek(fp, 0L, SEEK_END);
|
|
+#endif
|
|
+}
|
|
+
|
|
/******************************************************************************/
|
|
/* X r d P o s i x _ A c c e s s */
|
|
/******************************************************************************/
|
|
@@ -308,19 +360,9 @@ size_t XrdPosix_Fread(void *ptr, size_t size, size_t nitems, FILE *stream)
|
|
|
|
// Get the right return code. Note that we cannot emulate the flags in sunx86
|
|
//
|
|
- if (bytes > 0 && size) rc = bytes/size;
|
|
-#ifndef SUNX86
|
|
-#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
|
|
- else if (bytes < 0) stream->_flags |= _IO_ERR_SEEN;
|
|
- else stream->_flags |= _IO_EOF_SEEN;
|
|
-#elif defined(__APPLE__) || defined(__FreeBSD__)
|
|
- else if (bytes < 0) stream->_flags |= __SEOF;
|
|
- else stream->_flags |= __SERR;
|
|
-#else
|
|
- else if (bytes < 0) stream->_flag |= _IOERR;
|
|
- else stream->_flag |= _IOEOF;
|
|
-#endif
|
|
-#endif
|
|
+ if (bytes > 0 && size) rc = bytes/size;
|
|
+ else if (bytes < 0) fseterr(stream);
|
|
+ else fseteof(stream);
|
|
|
|
return rc;
|
|
}
|
|
@@ -477,18 +519,10 @@ size_t XrdPosix_Fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream
|
|
|
|
bytes = Xroot.Write(fd, ptr, size*nitems);
|
|
|
|
-// Get the right return code. Note that we cannot emulate the flags in sunx86
|
|
+// Get the right return code.
|
|
//
|
|
if (bytes > 0 && size) rc = bytes/size;
|
|
-#ifndef SUNX86
|
|
-#if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
|
|
- else stream->_flags |= _IO_ERR_SEEN;
|
|
-#elif defined(__APPLE__) || defined(__FreeBSD__)
|
|
- else stream->_flags |= __SERR;
|
|
-#else
|
|
- else stream->_flag |= _IOERR;
|
|
-#endif
|
|
-#endif
|
|
+ else fseterr(stream);
|
|
|
|
return rc;
|
|
}
|
|
diff --git a/src/XrdPosix/XrdPosixFile.hh b/src/XrdPosix/XrdPosixFile.hh
|
|
index 4d77b88d3..6d99cf464 100644
|
|
--- a/src/XrdPosix/XrdPosixFile.hh
|
|
+++ b/src/XrdPosix/XrdPosixFile.hh
|
|
@@ -35,6 +35,7 @@
|
|
#include <sys/time.h>
|
|
#include <sys/param.h>
|
|
#include <sys/resource.h>
|
|
+#include <sys/types.h>
|
|
#include <sys/uio.h>
|
|
|
|
#include "XrdCl/XrdClFileSystem.hh"
|
|
diff --git a/src/XrdPosix/XrdPosixLinkage.hh b/src/XrdPosix/XrdPosixLinkage.hh
|
|
index 903153252..b5cc6d4b4 100644
|
|
--- a/src/XrdPosix/XrdPosixLinkage.hh
|
|
+++ b/src/XrdPosix/XrdPosixLinkage.hh
|
|
@@ -40,6 +40,7 @@
|
|
#include <unistd.h>
|
|
|
|
#include "XrdPosix/XrdPosixOsDep.hh"
|
|
+#include "XrdPosix/XrdPosixXrootd.hh"
|
|
#include "XrdSys/XrdSysPlatform.hh"
|
|
|
|
/******************************************************************************/
|
|
diff --git a/src/XrdPosix/XrdPosixPreload.cc b/src/XrdPosix/XrdPosixPreload.cc
|
|
index a62f0c658..8db1400d4 100644
|
|
--- a/src/XrdPosix/XrdPosixPreload.cc
|
|
+++ b/src/XrdPosix/XrdPosixPreload.cc
|
|
@@ -45,6 +45,22 @@
|
|
/******************************************************************************/
|
|
|
|
#include "XrdPosix/XrdPosixExtern.hh"
|
|
+
|
|
+#ifdef MUSL
|
|
+#undef creat64
|
|
+#undef fseeko64
|
|
+#undef ftello64
|
|
+#undef ftruncate64
|
|
+#undef lseek64
|
|
+#undef open64
|
|
+#undef pread64
|
|
+#undef pwrite64
|
|
+#undef readdir64
|
|
+#undef readdir64_r
|
|
+#undef statfs64
|
|
+#undef statvfs64
|
|
+#undef truncate64
|
|
+#endif
|
|
|
|
/******************************************************************************/
|
|
/* G l o b a l D e c l a r a t i o n s */
|
|
diff --git a/src/XrdSys/XrdSysPlatform.hh b/src/XrdSys/XrdSysPlatform.hh
|
|
index a1ac544ad..eaeaeabac 100644
|
|
--- a/src/XrdSys/XrdSysPlatform.hh
|
|
+++ b/src/XrdSys/XrdSysPlatform.hh
|
|
@@ -241,16 +241,8 @@ extern "C"
|
|
#if defined(_AIX) || \
|
|
(defined(XR__SUNGCC3) && !defined(__arch64__))
|
|
# define SOCKLEN_t size_t
|
|
-#elif defined(XR__GLIBC) || \
|
|
- defined(__FreeBSD__) || \
|
|
- (defined(__FreeBSD_kernel__) && defined(__GLIBC__)) || \
|
|
- (defined(XR__SUNGCC3) && defined(__arch64__)) || defined(__APPLE__) || \
|
|
- (defined(__sun) && defined(_SOCKLEN_T))
|
|
-# ifndef SOCKLEN_t
|
|
-# define SOCKLEN_t socklen_t
|
|
-# endif
|
|
#elif !defined(SOCKLEN_t)
|
|
-# define SOCKLEN_t int
|
|
+# define SOCKLEN_t socklen_t
|
|
#endif
|
|
|
|
#ifdef _LP64
|
|
diff --git a/src/XrdSys/XrdSysPthread.hh b/src/XrdSys/XrdSysPthread.hh
|
|
index 17f8fd0be..6d9802460 100644
|
|
--- a/src/XrdSys/XrdSysPthread.hh
|
|
+++ b/src/XrdSys/XrdSysPthread.hh
|
|
@@ -351,7 +351,7 @@ enum PrefType {prefWR=1};
|
|
|
|
XrdSysRWLock(PrefType ptype)
|
|
{
|
|
-#ifdef __linux__
|
|
+#if defined(__linux__) && (defined(__GLIBC__) || defined(__UCLIBC__))
|
|
pthread_rwlockattr_t attr;
|
|
pthread_rwlockattr_setkind_np(&attr,
|
|
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
|
|
@@ -367,7 +367,7 @@ enum PrefType {prefWR=1};
|
|
inline void ReInitialize(PrefType ptype)
|
|
{
|
|
pthread_rwlock_destroy(&lock);
|
|
-#ifdef __linux__
|
|
+#if defined(__linux__) && (defined(__GLIBC__) || defined(__UCLIBC__))
|
|
pthread_rwlockattr_t attr;
|
|
pthread_rwlockattr_setkind_np(&attr,
|
|
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
|
|
diff --git a/src/XrdTls/XrdTlsTempCA.cc b/src/XrdTls/XrdTlsTempCA.cc
|
|
index faf69785f..37431dee9 100644
|
|
--- a/src/XrdTls/XrdTlsTempCA.cc
|
|
+++ b/src/XrdTls/XrdTlsTempCA.cc
|
|
@@ -30,7 +30,7 @@
|
|
#include <cstdlib>
|
|
#include <fcntl.h>
|
|
#include <dirent.h>
|
|
-#include <sys/poll.h>
|
|
+#include <poll.h>
|
|
|
|
#include <unordered_set>
|
|
#include <memory>
|
|
diff --git a/src/XrdVoms/XrdVomsMapfile.cc b/src/XrdVoms/XrdVomsMapfile.cc
|
|
index 8ffbe9218..fddbfdc06 100644
|
|
--- a/src/XrdVoms/XrdVomsMapfile.cc
|
|
+++ b/src/XrdVoms/XrdVomsMapfile.cc
|
|
@@ -40,7 +40,7 @@
|
|
#include <vector>
|
|
#include <string>
|
|
#include <fcntl.h>
|
|
-#include <sys/poll.h>
|
|
+#include <poll.h>
|
|
|
|
bool XrdVomsMapfile::tried_configure = false;
|
|
std::unique_ptr<XrdVomsMapfile> XrdVomsMapfile::mapper;
|