From fabfbc49e7ac9ca8f7722b10f82005c7bdf1985f Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Thu, 19 Jan 2023 14:47:58 +0100 Subject: [PATCH 01/19] [RPM] Add g++ as build dependency --- packaging/rhel/xrootd.spec.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packaging/rhel/xrootd.spec.in b/packaging/rhel/xrootd.spec.in index bbafe833035..3182309f438 100644 --- a/packaging/rhel/xrootd.spec.in +++ b/packaging/rhel/xrootd.spec.in @@ -184,6 +184,8 @@ Requires(postun): initscripts %if %{?rhel}%{!?rhel:0} == 7 BuildRequires: devtoolset-7 +%else +BuildRequires: gcc-c++ %endif %description From 5056af53d17d236e515cb44114133fe9090b34c1 Mon Sep 17 00:00:00 2001 From: Costin Grigoras Date: Wed, 8 Feb 2023 17:30:23 +0100 Subject: [PATCH 02/19] Update XrdPosixAdmin.cc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes compilation issue on older gcc ``` /usr/src/xrootd-5.5.2/src/XrdPosix/XrdPosixAdmin.cc: In member function ‘XrdCl::URL* XrdPosixAdmin::FanOut(int&)’: /usr/src/xrootd-5.5.2/src/XrdPosix/XrdPosixAdmin.cc:70:32: error: ‘ptrdiff_t’ was not declared in this scope if (i > std::numeric_limits::max() / sizeof(XrdCl::URL)) ^ /usr/src/xrootd-5.5.2/src/XrdPosix/XrdPosixAdmin.cc:70:32: note: suggested alternatives: In file included from /usr/include/c++/5/limits:42:0, from /usr/src/xrootd-5.5.2/src/XrdPosix/XrdPosixAdmin.cc:32: /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h:197:28: note: ‘std::ptrdiff_t’ typedef __PTRDIFF_TYPE__ ptrdiff_t; ^ /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h:197:28: note: ‘std::ptrdiff_t’ /usr/src/xrootd-5.5.2/src/XrdPosix/XrdPosixAdmin.cc:70:41: error: template argument 1 is invalid if (i > std::numeric_limits::max() / sizeof(XrdCl::URL)) ^ src/CMakeFiles/XrdPosix.dir/build.make:62: recipe for target 'src/CMakeFiles/XrdPosix.dir/XrdPosix/XrdPosixAdmin.cc.o' failed make[2]: *** [src/CMakeFiles/XrdPosix.dir/XrdPosix/XrdPosixAdmin.cc.o] Error 1 ``` --- src/XrdPosix/XrdPosixAdmin.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/XrdPosix/XrdPosixAdmin.cc b/src/XrdPosix/XrdPosixAdmin.cc index eb8ccdecd9e..3b7e9810353 100644 --- a/src/XrdPosix/XrdPosixAdmin.cc +++ b/src/XrdPosix/XrdPosixAdmin.cc @@ -30,6 +30,7 @@ #include #include +#include #include #include #include From 1c6833068806eddc45e286b8079007403d940a60 Mon Sep 17 00:00:00 2001 From: Cedric Caffy Date: Fri, 10 Feb 2023 11:46:37 +0100 Subject: [PATCH 03/19] XrdHttp: Supports non-natively supported checksum in the case a user provides a checksum computation program Solves issue #1901 --- src/XrdXrootd/XrdXrootdConfig.cc | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/XrdXrootd/XrdXrootdConfig.cc b/src/XrdXrootd/XrdXrootdConfig.cc index bbe470b9667..38e42458019 100644 --- a/src/XrdXrootd/XrdXrootdConfig.cc +++ b/src/XrdXrootd/XrdXrootdConfig.cc @@ -314,23 +314,29 @@ int XrdXrootdProtocol::Configure(char *parms, XrdProtocol_Config *pi) // Check if we are going to be processing checksums locally // - if (JobCKT && JobLCL) - {XrdOucErrInfo myError("Config"); + if (JobCKT) { XrdOucString csList(1024); + XrdOucErrInfo myError("Config"); XrdOucTList *tP = JobCKTLST; int csNum = 0; - do {if (osFS->chksum(XrdSfsFileSystem::csSize,tP->text,0,myError)) - {eDest.Emsg("Config",tP->text,"checksum is not natively supported."); - return 0; - } + do { + if(JobLCL) { + // Check natively supported checksum + if (osFS->chksum(XrdSfsFileSystem::csSize, tP->text, 0, myError)) { + eDest.Emsg("Config", tP->text, "checksum is not natively supported."); + return 0; + } + } tP->ival[1] = myError.getErrInfo(); if (csNum) csList += ','; - csList.append(csNum); csList.append(':'); csList.append(tP->text); + csList.append(csNum); + csList.append(':'); + csList.append(tP->text); csNum++; tP = tP->next; - } while(tP); + } while (tP); if (csNum) XrdOucEnv::Export("XRD_CSLIST", csList.c_str()); - } + } // Initialiaze for AIO. If we are not in debug mode and aio is enabled then we // turn off async I/O if tghe filesystem requests it or if this is a caching From 5a832596a59d1055f59620d43fbb740955ce6787 Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Mon, 13 Feb 2023 14:13:17 +0100 Subject: [PATCH 04/19] Revert "[XrdCl] Make sure error message does not include a null-character." This reverts commit 22d308a3dd689607ee0396860d377145836ef55b. --- src/XrdCl/XrdClXRootDMsgHandler.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/XrdCl/XrdClXRootDMsgHandler.cc b/src/XrdCl/XrdClXRootDMsgHandler.cc index d31f050e520..9a1f433bfb9 100644 --- a/src/XrdCl/XrdClXRootDMsgHandler.cc +++ b/src/XrdCl/XrdClXRootDMsgHandler.cc @@ -1225,9 +1225,7 @@ namespace XrdCl if( pStatus.code == errErrorResponse ) { st->errNo = rsp->body.error.errnum; - // omit the last character as the string returned from the server - // (acording to protocol specs) should be null-terminated - std::string errmsg( rsp->body.error.errmsg, rsp->hdr.dlen-5 ); + std::string errmsg( rsp->body.error.errmsg, rsp->hdr.dlen-4 ); if( st->errNo == kXR_noReplicas && !pLastError.IsOK() ) errmsg += " Last seen error: " + pLastError.ToString(); st->SetErrorMessage( errmsg ); From 9987b4b41990df69ae611a523acb76c69eeccbbb Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Mon, 13 Feb 2023 14:15:06 +0100 Subject: [PATCH 05/19] [XrdCms] Remove extraneous character from error output Fixes #1501. --- src/XrdCms/XrdCmsCluster.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/XrdCms/XrdCmsCluster.cc b/src/XrdCms/XrdCmsCluster.cc index 7649ebdde6e..011bcde2813 100644 --- a/src/XrdCms/XrdCmsCluster.cc +++ b/src/XrdCms/XrdCmsCluster.cc @@ -2036,7 +2036,7 @@ int XrdCmsCluster::Unuseable(XrdCmsSelect &Sel) int n = snprintf(Sel.Resp.Data, sizeof(Sel.Resp.Data), "No servers are available to %s%s the %s.", - Xmode, Amode, EType)+1; + Xmode, Amode, EType); if (n < (int)sizeof(Sel.Resp.Data)) Sel.Resp.DLen = n+1; else Sel.Resp.DLen = sizeof(Sel.Resp.Data); From a344d5e61f775915465d551a4788891bc2c1193d Mon Sep 17 00:00:00 2001 From: David Smith Date: Tue, 14 Feb 2023 11:20:41 +0100 Subject: [PATCH 06/19] [Server] Avoid a race condition during deferred file close --- src/XrdXrootd/XrdXrootdXeq.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/XrdXrootd/XrdXrootdXeq.cc b/src/XrdXrootd/XrdXrootdXeq.cc index c4e0619ab3a..1ca6cf79d83 100644 --- a/src/XrdXrootd/XrdXrootdXeq.cc +++ b/src/XrdXrootd/XrdXrootdXeq.cc @@ -557,14 +557,24 @@ int XrdXrootdProtocol::do_Close() fp->cbArg = ReqID.getID(); fp->XrdSfsp->error.setErrCB(&closeCB, (unsigned long long)fp); +// Add a reference count to the file in case the close will be deferred. In +// the deferred case the reference is used to prevent the callback from +// deleting the file until we have done necessary processing of the object +// during its removal from the open table. +// + fp->Ref(1); + // Do an explicit close of the file here; check for exceptions. Stall requests // leave the file open as there will be a retry. Otherwise, we remove the // file from our open table but a "started" return defers the the delete. // rc = fp->XrdSfsp->close(); TRACEP(FS, " fh=" < Date: Tue, 14 Feb 2023 14:58:35 -0600 Subject: [PATCH 08/19] fix: Avoid 'may be used uninitialized' warning * Initialize all variables to avoid a potential 'may be used uninitialized' warning that will become an error with `-flto=auto` is used. Co-authored-by: Adrian Sevcenco --- src/XrdCms/XrdCmsRRQ.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/XrdCms/XrdCmsRRQ.cc b/src/XrdCms/XrdCmsRRQ.cc index 3de1d17d02a..c5d925d8561 100644 --- a/src/XrdCms/XrdCmsRRQ.cc +++ b/src/XrdCms/XrdCmsRRQ.cc @@ -360,7 +360,7 @@ void XrdCmsRRQ::sendRedResp(XrdCmsRRQSlot *rP) // EPNAME("sendRedResp"); static const int ovhd = sizeof(kXR_unt32); XrdCmsNode *nP; - int doredir, port, hlen = 0; + int doredir = 0, port = 0, hlen = 0; // Determine where the client should be redirected // From 70260556599bbe6f763e2f21fca6a1490fc21ea0 Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Fri, 17 Feb 2023 11:29:51 +0100 Subject: [PATCH 09/19] Update release notes for v5.5.3 --- docs/ReleaseNotes.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/ReleaseNotes.txt b/docs/ReleaseNotes.txt index d7632b5e91b..89b1c6b0435 100644 --- a/docs/ReleaseNotes.txt +++ b/docs/ReleaseNotes.txt @@ -5,6 +5,21 @@ XRootD Release Notes ============= +------------- +Version 5.5.3 +------------- + ++ **Minor bug fixes** + **[Pfc]** Add missing if-error for a rare direct-read error trace + **[Server]** Avoid a race condition during deferred file close + **[XrdCms]** Fix compiler warning for potentially uninitialized variables + **[XrdCms]** Remove extraneous character from error output (issue 1501) + **[XrdHttp]** Support user-provided script for computing checksums + **[XrdPosix]** Add missing include + ++ **Miscellaneous** + **[RPM]** Add g++ as build dependency + ------------- Version 5.5.2 ------------- From ad2960e6a5264ee2ccc22d04e621f23660f28101 Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Tue, 14 Feb 2023 16:48:58 +0100 Subject: [PATCH 10/19] [CMake] Add check for musl libc Out of principle musl libc provides no means for detecting it, leaving developers to figure it out for themselves. The choice here is to use the compiler to print the target triple, which contains the libc implementation as the last part. On Voidlinux it's x86_64-linux-musl, and on Alpine it's x86_64-alpine-linux-musl. This should be reliable enough to not wrongly detect other libc implementations as musl (and failure to detect will only affect platforms based on musl as well). See https://wiki.musl-libc.org/faq.html for more information. --- cmake/XRootDOSDefs.cmake | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cmake/XRootDOSDefs.cmake b/cmake/XRootDOSDefs.cmake index 8b182e61ea1..9f7c9aa5940 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() #------------------------------------------------------------------------------- From 075067321dc8fa13c6e2bf07e0d56b849e533efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20W=C3=B3jcik?= Date: Sat, 23 Jul 2022 21:37:47 +0200 Subject: [PATCH 11/19] Use standard poll.h, errno.h in place of sys/*.h --- src/Xrd/XrdPoll.hh | 2 +- src/XrdNet/XrdNetMsg.cc | 2 +- src/XrdOfs/XrdOfsHandle.cc | 2 +- src/XrdTls/XrdTlsTempCA.cc | 2 +- src/XrdVoms/XrdVomsMapfile.cc | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Xrd/XrdPoll.hh b/src/Xrd/XrdPoll.hh index 3790b03b080..d9bda5d6277 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 +#include #include "XrdSys/XrdSysPthread.hh" #define XRD_NUMPOLLERS 3 diff --git a/src/XrdNet/XrdNetMsg.cc b/src/XrdNet/XrdNetMsg.cc index fa6c16f872a..f97e1af0996 100644 --- a/src/XrdNet/XrdNetMsg.cc +++ b/src/XrdNet/XrdNetMsg.cc @@ -29,7 +29,7 @@ /******************************************************************************/ #include -#include +#include #include "XrdNet/XrdNet.hh" #include "XrdNet/XrdNetMsg.hh" diff --git a/src/XrdOfs/XrdOfsHandle.cc b/src/XrdOfs/XrdOfsHandle.cc index 963f17a5a6a..26b40ce0887 100644 --- a/src/XrdOfs/XrdOfsHandle.cc +++ b/src/XrdOfs/XrdOfsHandle.cc @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include "XrdOfs/XrdOfsHandle.hh" diff --git a/src/XrdTls/XrdTlsTempCA.cc b/src/XrdTls/XrdTlsTempCA.cc index faf69785ffc..37431dee9f3 100644 --- a/src/XrdTls/XrdTlsTempCA.cc +++ b/src/XrdTls/XrdTlsTempCA.cc @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/XrdVoms/XrdVomsMapfile.cc b/src/XrdVoms/XrdVomsMapfile.cc index 8ffbe921875..fddbfdc06fb 100644 --- a/src/XrdVoms/XrdVomsMapfile.cc +++ b/src/XrdVoms/XrdVomsMapfile.cc @@ -40,7 +40,7 @@ #include #include #include -#include +#include bool XrdVomsMapfile::tried_configure = false; std::unique_ptr XrdVomsMapfile::mapper; From e281a27f314b257cc8300035dae125c0fc7719de Mon Sep 17 00:00:00 2001 From: Ben Jargowsky Date: Tue, 14 Feb 2023 17:02:09 +0100 Subject: [PATCH 12/19] Add (partial) support for musl libc Based on work from pull request #1632. Co-authored-by: Guilherme Amadio --- src/XrdPosix/XrdPosixLinkage.hh | 1 + src/XrdPosix/XrdPosixPreload.cc | 16 ++++++++++++++++ src/XrdSys/XrdSysPlatform.hh | 10 +--------- src/XrdSys/XrdSysPthread.hh | 4 ++-- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/XrdPosix/XrdPosixLinkage.hh b/src/XrdPosix/XrdPosixLinkage.hh index 9031532524c..b5cc6d4b469 100644 --- a/src/XrdPosix/XrdPosixLinkage.hh +++ b/src/XrdPosix/XrdPosixLinkage.hh @@ -40,6 +40,7 @@ #include #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 867b7347985..e01bc8a2301 100644 --- a/src/XrdPosix/XrdPosixPreload.cc +++ b/src/XrdPosix/XrdPosixPreload.cc @@ -41,6 +41,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 a1ac544ad93..eaeaeabac58 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 17f8fd0bec8..6d980246094 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); From 0f5c2319a03ce28d2508d7ea7f08e5611fa5a829 Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Tue, 14 Feb 2023 13:12:19 +0100 Subject: [PATCH 13/19] Provide dummy implementation of innetgr() when compiling with musl --- src/XrdAcc/XrdAccGroups.cc | 8 ++++++++ src/XrdNet/XrdNetSecurity.cc | 13 ++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/XrdAcc/XrdAccGroups.cc b/src/XrdAcc/XrdAccGroups.cc index e663fdd35aa..94b8edbc75e 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/XrdNet/XrdNetSecurity.cc b/src/XrdNet/XrdNetSecurity.cc index 0f8451127ce..0faf563dd2e 100644 --- a/src/XrdNet/XrdNetSecurity.cc +++ b/src/XrdNet/XrdNetSecurity.cc @@ -40,11 +40,6 @@ #include #include #include -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 */ /******************************************************************************/ From aac3dd24c26854aeba75703cd204891bbc24b6da Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Tue, 14 Feb 2023 17:12:11 +0100 Subject: [PATCH 14/19] [XrdOssCsi] Include byteswap.h everywhere except on macOS --- src/XrdOssCsi/XrdOssCsiTagstoreFile.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh b/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh index b1a94acd668..0202579ccb4 100644 --- a/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh +++ b/src/XrdOssCsi/XrdOssCsiTagstoreFile.hh @@ -38,9 +38,7 @@ #include #include -#if defined(__GLIBC__) || defined(__BIONIC__) || defined(__CYGWIN__) -#include -#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 #endif class XrdOssCsiTagstoreFile : public XrdOssCsiTagstore From 9ff4dc1a5d1f2777b67a1687e341b3c967a803cb Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Tue, 14 Feb 2023 17:16:03 +0100 Subject: [PATCH 15/19] Include missing sys/types.h where needed to support musl --- src/Xrd/XrdConfig.hh | 2 ++ src/XrdPosix/XrdPosixFile.hh | 1 + 2 files changed, 3 insertions(+) diff --git a/src/Xrd/XrdConfig.hh b/src/Xrd/XrdConfig.hh index a06ad462f4e..2d1403a5e10 100644 --- a/src/Xrd/XrdConfig.hh +++ b/src/Xrd/XrdConfig.hh @@ -34,6 +34,8 @@ #include "Xrd/XrdProtLoad.hh" #include "Xrd/XrdProtocol.hh" +#include + class XrdSysError; class XrdTcpMonInfo; class XrdNetSecurity; diff --git a/src/XrdPosix/XrdPosixFile.hh b/src/XrdPosix/XrdPosixFile.hh index e5cc6b1bda5..4ca9679f233 100644 --- a/src/XrdPosix/XrdPosixFile.hh +++ b/src/XrdPosix/XrdPosixFile.hh @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "XrdCl/XrdClFileSystem.hh" From 9f6f473bb1bcec49784b582af9c50678744fb05b Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Tue, 14 Feb 2023 17:16:24 +0100 Subject: [PATCH 16/19] Include missing sys/time.h where needed to support musl --- src/XrdCl/XrdClFileStateHandler.hh | 1 + src/XrdCl/XrdClMonitor.hh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/XrdCl/XrdClFileStateHandler.hh b/src/XrdCl/XrdClFileStateHandler.hh index 197151321f8..f8353881950 100644 --- a/src/XrdCl/XrdClFileStateHandler.hh +++ b/src/XrdCl/XrdClFileStateHandler.hh @@ -39,6 +39,7 @@ #include #include +#include #include #include diff --git a/src/XrdCl/XrdClMonitor.hh b/src/XrdCl/XrdClMonitor.hh index 2fc7537776a..2b3a96c46fa 100644 --- a/src/XrdCl/XrdClMonitor.hh +++ b/src/XrdCl/XrdClMonitor.hh @@ -43,6 +43,8 @@ #include "XrdCl/XrdClFileSystem.hh" +#include + namespace XrdCl { class URL; From ecf528af5e152bad2c5f2c239dfe22bd1b7c75a1 Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Tue, 14 Feb 2023 11:08:00 +0100 Subject: [PATCH 17/19] [XrdOuc] Adapt XrdOucBackTrace.cc to support musl The header execinfo.h is not available on musl, so the #ifdefs needed to be adjusted accordingly. This header is available on macOS, and with both glibc and uclibc on Linux, though. --- src/XrdOuc/XrdOucBackTrace.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/XrdOuc/XrdOucBackTrace.cc b/src/XrdOuc/XrdOucBackTrace.cc index 813183c3228..c61a89b633d 100644 --- a/src/XrdOuc/XrdOucBackTrace.cc +++ b/src/XrdOuc/XrdOucBackTrace.cc @@ -34,7 +34,7 @@ #include #include -#ifdef __GNUC__ +#ifndef MUSL /* glibc, uclibc, and macOS all have execinfo.h */ #include #include #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 From 647e29428284cd5a4c313580023567a720bb8a19 Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Tue, 14 Feb 2023 17:35:56 +0100 Subject: [PATCH 18/19] [XrdPosix] Add utility functions fseterr/fseteof with musl support --- src/XrdPosix/XrdPosix.cc | 80 ++++++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 23 deletions(-) diff --git a/src/XrdPosix/XrdPosix.cc b/src/XrdPosix/XrdPosix.cc index 0f32dc2eed5..e4f020c09bf 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 +#endif + +static inline void fseterr(FILE *fp) +{ + /* Most systems provide FILE as a struct and the necessary bitmask in + , 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 + , 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; } From cfd2b1da0cff73cc93f402fac48805e86751b4ed Mon Sep 17 00:00:00 2001 From: Guilherme Amadio Date: Wed, 15 Feb 2023 09:45:59 +0100 Subject: [PATCH 19/19] [CI] Add build on Alpine Linux This covers building with musl libc. --- .github/workflows/build.yml | 85 +++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 487aac2a16a..474b44a286e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -208,6 +208,91 @@ jobs: # ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/FileSystemTest/' # ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/LocalFileHandlerTest/' + cmake-alpine-musl: + + runs-on: ubuntu-latest + container: alpine + + steps: + - name: Install external dependencies + shell: sh + run: | + apk add \ + bash \ + cmake \ + cppunit-dev \ + curl-dev \ + fuse-dev \ + fuse3-dev \ + g++ \ + git \ + json-c-dev \ + krb5-dev \ + libxml2-dev \ + linux-headers \ + make \ + openssl-dev \ + py3-pip \ + python3-dev \ + readline-dev \ + tinyxml-dev \ + util-linux-dev \ + zlib-dev + + - name: Clone repository + uses: actions/checkout@v2 + + - name: Build with cmake + run: | + cd .. + # need to fix ownership not to confuse git + chown -R -v "$( id -u; ):$( id -g; )" xrootd + cmake \ + -DCMAKE_CXX_STANDARD=17 \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DPYTHON_EXECUTABLE=$(command -v python3) \ + -DFORCE_ENABLED=ON \ + -DENABLE_HTTP=OFF \ + -DENABLE_TESTS=ON \ + -DENABLE_VOMS=OFF \ + -DENABLE_XRDEC=OFF \ + -DENABLE_XRDCLHTTP=OFF \ + -DENABLE_MACAROONS=OFF \ + -DENABLE_SCITOKENS=OFF \ + -DPIP_OPTIONS="--verbose" \ + -S xrootd \ + -B build + cmake build -LH + cmake \ + --build build \ + --clean-first \ + --parallel $(($(nproc) - 1)) + cmake --build build --target install + python3 -m pip list + + - name: Verify install + run: | + command -v xrootd + command -v xrdcp + + - name: Verify Python bindings + run: | + python3 --version --version + python3 -m pip list + python3 -m pip show xrootd + python3 -c 'import XRootD; print(XRootD)' + python3 -c 'import pyxrootd; print(pyxrootd)' + python3 -c 'from XRootD import client; print(client.FileSystem("root://someserver:1094"))' + + - name: Run libXrdCl tests + run: | + cd ../build/tests + ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/UtilsTest/' + ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/SocketTest/' + ./common/test-runner ./XrdClTests/libXrdClTests.so 'All Tests/PollerTest/' + cmake-centos7: runs-on: ubuntu-latest