diff options
Diffstat (limited to 'sysutils/slurm-wlm')
-rw-r--r-- | sysutils/slurm-wlm/Makefile | 11 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_common_conmgr.c | 40 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_common_net.c | 68 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_common_sack__api.c | 28 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c | 98 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_common_stepd__api.c | 36 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_common_xsystemd.c | 25 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_interfaces_cgroup.c | 6 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_plugins_auth_slurm_sack.c | 17 | ||||
-rw-r--r-- | sysutils/slurm-wlm/files/patch-src_slurmd_slurmstepd_req.c | 15 | ||||
-rw-r--r-- | sysutils/slurm-wlm/pkg-plist | 1 |
11 files changed, 338 insertions, 7 deletions
diff --git a/sysutils/slurm-wlm/Makefile b/sysutils/slurm-wlm/Makefile index 4db32cacac65..e79c304832ae 100644 --- a/sysutils/slurm-wlm/Makefile +++ b/sysutils/slurm-wlm/Makefile @@ -1,11 +1,11 @@ PORTNAME= slurm DISTVERSION= 23.11.7 -PORTREVISION= 4 +PORTREVISION= 9 CATEGORIES= sysutils MASTER_SITES= https://download.schedmd.com/slurm/ PKGNAMESUFFIX= -wlm -MAINTAINER= ports@FreeBSD.org +MAINTAINER= rikka.goering@outlook.de COMMENT= Simple Linux Utility for Resource Management WWW= https://slurm.schedmd.com/ @@ -43,7 +43,8 @@ GNU_CONFIGURE= yes GNU_CONFIGURE_MANPREFIX=${PREFIX}/share INSTALL_TARGET= install-strip TEST_TARGET= check -PLIST_SUB= PORTVERSION="${DISTVERSION}" VER="${DISTVERSION:R}" +PLIST_SUB= PORTVERSION="${DISTVERSION}" VER="${DISTVERSION:R}" \ + USERS=${USERS} GROUPS=${GROUPS} SHEBANG_FILES= doc/html/shtml2html.py doc/man/man2html.py PORTDOCS= * @@ -114,6 +115,8 @@ PROC2FIX= common/callerid.c common/fd.c common/fetch_config.c \ plugins/switch/cray_aries/scaling.c \ plugins/task/affinity/affinity.c slurmd/common/set_oomadj.c \ slurmd/common/xcpuinfo.c slurmd/slurmstepd/pdebug.c \ + slurmctld/controller.c \ + slurmd/slurmd/slurmd.c \ slurmd/slurmstepd/req.c LLD2FIX= api plugins/openapi sacctmgr sackd scontrol scrontab scrun \ @@ -162,6 +165,8 @@ pre-configure: ${REINPLACE_CMD} -e 's|htmldir = \$${datadir.*$$|htmldir = @htmldir@|' post-install: + @${MKDIR} ${STAGEDIR}/var/spool/slurmctld + @${CHMOD} 700 ${STAGEDIR}/var/spool/slurmctld ${INSTALL_DATA} ${WRKSRC}/etc/slurm.conf.example \ ${STAGEDIR}${PREFIX}/etc/slurm.conf.sample diff --git a/sysutils/slurm-wlm/files/patch-src_common_conmgr.c b/sysutils/slurm-wlm/files/patch-src_common_conmgr.c index 4a536f2854cc..4c2b9a256d57 100644 --- a/sysutils/slurm-wlm/files/patch-src_common_conmgr.c +++ b/sysutils/slurm-wlm/files/patch-src_common_conmgr.c @@ -1,4 +1,4 @@ ---- src/common/conmgr.c.orig 2023-11-21 22:33:29 UTC +--- src/common/conmgr.c.orig 2024-05-21 17:19:51 UTC +++ src/common/conmgr.c @@ -47,6 +47,8 @@ #include <sys/stat.h> @@ -9,3 +9,41 @@ #include <time.h> #include <unistd.h> +@@ -2616,8 +2618,15 @@ static int _create_socket(void *x, void *arg) + + /* set value of socket path */ + strlcpy(addr.sun_path, unixsock, sizeof(addr.sun_path)); +- if ((rc = bind(fd, (const struct sockaddr *) &addr, +- sizeof(addr)))) ++ /* Bind UNIX socket: compute correct length */ ++ { ++ socklen_t len = SUN_LEN(&addr); ++ #if defined(__FreeBSD__) ++ addr.sun_len = (uint8_t)len; ++ #endif ++ rc = bind(fd, (const struct sockaddr *)&addr, len); ++ } ++ if (rc) + fatal("%s: [%s] Unable to bind UNIX socket: %m", + __func__, hostport); + +@@ -2675,6 +2684,19 @@ static int _create_socket(void *x, void *arg) + &one, sizeof(one))) + fatal("%s: [%s] setsockopt(SO_REUSEADDR) failed: %m", + __func__, addrinfo_to_string(addr)); ++ ++ /* For INET/INET6, set *_len on FreeBSD; ai_addrlen is already correct */ ++ #if defined(__FreeBSD__) ++ if (addr->ai_addr) { ++ if (addr->ai_addr->sa_family == AF_INET) { ++ ((struct sockaddr_in *)addr->ai_addr)->sin_len = ++ (uint8_t)sizeof(struct sockaddr_in); ++ } else if (addr->ai_addr->sa_family == AF_INET6) { ++ ((struct sockaddr_in6 *)addr->ai_addr)->sin6_len = ++ (uint8_t)sizeof(struct sockaddr_in6); ++ } ++ } ++ #endif + + if (bind(fd, addr->ai_addr, addr->ai_addrlen) != 0) + fatal("%s: [%s] Unable to bind socket: %m", diff --git a/sysutils/slurm-wlm/files/patch-src_common_net.c b/sysutils/slurm-wlm/files/patch-src_common_net.c new file mode 100644 index 000000000000..8bfdea648018 --- /dev/null +++ b/sysutils/slurm-wlm/files/patch-src_common_net.c @@ -0,0 +1,68 @@ +--- src/common/net.c.orig 2024-05-21 17:19:51 UTC ++++ src/common/net.c +@@ -75,6 +75,29 @@ + #include "src/common/xstring.h" + + /* ++ * Compute correct namelen + sa_len for AF_INET/AF_INET6 ++ */ ++#if defined(__FreeBSD__) ++static inline socklen_t _bsd_sockaddr_len_fix(struct sockaddr *sa) ++{ ++ if (!sa) return 0; ++ switch (sa->sa_family) { ++ case AF_INET: { ++ struct sockaddr_in *in = (struct sockaddr_in *)sa; ++ in->sin_len = (uint8_t)sizeof(*in); ++ return sizeof(*in); ++ } ++ case AF_INET6: { ++ struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)sa; ++ in6->sin6_len = (uint8_t)sizeof(*in6); ++ return sizeof(*in6); ++ } ++ default: return sizeof(*sa); ++ } ++} ++#endif ++ ++/* + * Define slurm-specific aliases for use by plugins, see slurm_xlator.h + * for details. + */ +@@ -96,12 +119,18 @@ int net_stream_listen(int *fd, uint16_t *port) + /* bind ephemeral port */ + slurm_setup_addr(&sin, 0); + ++#if defined(__FreeBSD__) ++ socklen_t blen = _bsd_sockaddr_len_fix((struct sockaddr *)&sin); ++#else ++ socklen_t blen = sizeof(sin); ++#endif + if ((*fd = socket(sin.ss_family, SOCK_STREAM, IPPROTO_TCP)) < 0) + return -1; + + if (setsockopt(*fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0) + goto cleanup; +- if (bind(*fd, (struct sockaddr *) &sin, len) < 0) ++ /* Single bind(): pass platform-correct namelen */ ++ if (bind(*fd, (struct sockaddr *) &sin, blen) < 0) + goto cleanup; + if (getsockname(*fd, (struct sockaddr *) &sin, &len) < 0) + goto cleanup; +@@ -219,7 +248,15 @@ static bool _is_port_ok(int s, uint16_t port, bool loc + return false; + } + ++/* ++ * compute correct socket length and pass it to bind() as blen on FreeBSD ++ */ ++#if defined(__FreeBSD__) ++ socklen_t blen = _bsd_sockaddr_len_fix((struct sockaddr *)&addr); ++ if (bind(s, (struct sockaddr *) &addr, blen) < 0) { ++#else + if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) { ++#endif + log_flag(NET, "%s: bind() failed on port:%d fd:%d: %m", + __func__, port, s); + return false; diff --git a/sysutils/slurm-wlm/files/patch-src_common_sack__api.c b/sysutils/slurm-wlm/files/patch-src_common_sack__api.c new file mode 100644 index 000000000000..fe7520fde339 --- /dev/null +++ b/sysutils/slurm-wlm/files/patch-src_common_sack__api.c @@ -0,0 +1,28 @@ +--- src/common/sack_api.c.orig 2024-05-21 17:19:51 UTC ++++ src/common/sack_api.c +@@ -38,6 +38,8 @@ + #include <sys/socket.h> + #include <sys/types.h> + #include <sys/un.h> ++#include <string.h> ++#include <stddef.h> + #include <unistd.h> + + #include "src/common/fd.h" +@@ -63,7 +65,15 @@ static int _sack_try_connection(struct sockaddr_un *ad + static int _sack_try_connection(struct sockaddr_un *addr) + { + int fd; +- size_t len = strlen(addr->sun_path) + 1 + sizeof(addr->sun_family); ++ socklen_t len; ++ ++/* FreeBSD requires sun_len and a correct namelen */ ++#if defined(__FreeBSD__) ++ len = (socklen_t)SUN_LEN(addr); ++ addr->sun_len = (uint8_t)len; ++#else ++ len = (socklen_t)(strlen(addr->sun_path) + 1 + sizeof(addr->sun_family)); ++#endif + + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + debug3("%s: socket() failed: %m", __func__); diff --git a/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c b/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c new file mode 100644 index 000000000000..b4197166e32d --- /dev/null +++ b/sysutils/slurm-wlm/files/patch-src_common_slurm__protocol__socket.c @@ -0,0 +1,98 @@ +--- src/common/slurm_protocol_socket.c.orig 2024-05-21 17:19:51 UTC ++++ src/common/slurm_protocol_socket.c +@@ -53,7 +53,9 @@ + #include <sys/socket.h> + #include <sys/time.h> + #include <sys/types.h> ++#include <sys/un.h> + #include <unistd.h> ++#include <fcntl.h> + + #include "slurm/slurm_errno.h" + #include "src/common/read_config.h" +@@ -74,6 +76,28 @@ + #define RANDOM_USER_PORT ((uint16_t) ((lrand48() % \ + (MAX_USER_PORT - MIN_USER_PORT + 1)) + MIN_USER_PORT)) + ++#if defined(__FreeBSD__) ++/* Normalize sockaddr length on FreeBSD and return the proper namelen */ ++static inline socklen_t _bsd_sockaddr_len_fix(struct sockaddr *sa) ++{ ++ if (!sa) return 0; ++ switch (sa->sa_family) { ++ case AF_INET: { ++ struct sockaddr_in *in = (struct sockaddr_in *)sa; ++ in->sin_len = (uint8_t)sizeof(*in); ++ return sizeof(*in); ++ } ++ case AF_INET6: { ++ struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)sa; ++ in6->sin6_len = (uint8_t)sizeof(*in6); ++ return sizeof(*in6); ++ } ++ default: ++ return sizeof(*sa); ++ } ++} ++#endif ++ + /* Static functions */ + static int _slurm_connect(int __fd, struct sockaddr const * __addr, + socklen_t __len); +@@ -115,8 +139,13 @@ static void _sock_bind_wild(int sockfd) + + slurm_setup_addr(&sin, RANDOM_USER_PORT); + ++ socklen_t blen = _bsd_sockaddr_len_fix((struct sockaddr *)&sin); + for (retry=0; retry < PORT_RETRIES ; retry++) { ++ #if defined(__FreeBSD__) ++ rc = bind(sockfd, (struct sockaddr *) &sin, blen); ++ #else + rc = bind(sockfd, (struct sockaddr *) &sin, sizeof(sin)); ++ #endif + if (rc >= 0) + break; + slurm_set_port(&sin, RANDOM_USER_PORT); +@@ -511,7 +540,13 @@ extern int slurm_init_msg_engine(slurm_addr_t *addr, b + goto error; + } + +- rc = bind(fd, (struct sockaddr const *) addr, sizeof(*addr)); ++ #if defined(__FreeBSD__) ++ /* FreeBSD: normalize sa_len and pass the exact namelen to bind() */ ++ socklen_t bind_len = _bsd_sockaddr_len_fix((struct sockaddr *)addr); ++ rc = bind(fd, (struct sockaddr const *) addr, bind_len); ++ #else ++ rc = bind(fd, (struct sockaddr const *) addr, sizeof(*addr)); ++ #endif + if (rc < 0) { + format_print(log_lvl, "Error binding slurm stream socket: %m"); + goto error; +@@ -666,7 +701,27 @@ static int _slurm_connect (int __fd, struct sockaddr c + if (fcntl(__fd, F_SETFL, flags | O_NONBLOCK) < 0) + error("%s: fcntl(F_SETFL) error: %m", __func__); + ++/* FreeBSD requires correct sa_len/namelen; recompute here */ ++#if defined(__FreeBSD__) ++ { ++ struct sockaddr *sa = (struct sockaddr *)__addr; ++ socklen_t namelen; ++ switch (sa->sa_family) { ++ case AF_UNIX: { ++ struct sockaddr_un *un = (struct sockaddr_un *)sa; ++ namelen = (socklen_t)SUN_LEN(un); ++ un->sun_len = (uint8_t)namelen; ++ break; ++ } ++ default: ++ namelen = _bsd_sockaddr_len_fix(sa); ++ break; ++ } ++ rc = connect(__fd, sa, namelen); ++ } ++#else + rc = connect(__fd , __addr , __len); ++#endif + if ((rc < 0) && (errno != EINPROGRESS)) + return errno; + if (rc == 0) diff --git a/sysutils/slurm-wlm/files/patch-src_common_stepd__api.c b/sysutils/slurm-wlm/files/patch-src_common_stepd__api.c new file mode 100644 index 000000000000..c01bbebffe33 --- /dev/null +++ b/sysutils/slurm-wlm/files/patch-src_common_stepd__api.c @@ -0,0 +1,36 @@ +--- src/common/stepd_api.c.orig 2024-05-21 17:19:51 UTC ++++ src/common/stepd_api.c +@@ -48,6 +48,7 @@ + #include <signal.h> + #include <stdlib.h> + #include <string.h> ++#include <stddef.h> + #include <sys/socket.h> + #include <sys/stat.h> + #include <sys/time.h> +@@ -146,7 +147,7 @@ _step_connect(const char *directory, const char *noden + slurm_step_id_t *step_id) + { + int fd; +- int len; ++ socklen_t len; + struct sockaddr_un addr; + char *name = NULL, *pos = NULL; + uint32_t stepid = step_id->step_id; +@@ -177,7 +178,15 @@ _step_connect(const char *directory, const char *noden + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strlcpy(addr.sun_path, name, sizeof(addr.sun_path)); +- len = strlen(addr.sun_path) + 1 + sizeof(addr.sun_family); ++ ++#if defined(__FreeBSD__) ++ /* Compute exact namelen from the populated path */ ++ len = (socklen_t)SUN_LEN(&addr); ++ /* FreeBSD requires sun_len to match the exact length */ ++ addr.sun_len = (uint8_t)len; ++#else ++ len = (socklen_t)(strlen(addr.sun_path) + 1 + sizeof(addr.sun_family)); ++#endif + + if (connect(fd, (struct sockaddr *) &addr, len) < 0) { + /* Can indicate race condition at step termination */ diff --git a/sysutils/slurm-wlm/files/patch-src_common_xsystemd.c b/sysutils/slurm-wlm/files/patch-src_common_xsystemd.c new file mode 100644 index 000000000000..91e7dc9b41ac --- /dev/null +++ b/sysutils/slurm-wlm/files/patch-src_common_xsystemd.c @@ -0,0 +1,25 @@ +--- src/common/xsystemd.c.orig 2024-05-21 17:19:51 UTC ++++ src/common/xsystemd.c +@@ -36,6 +36,9 @@ + + #include <sys/socket.h> + #include <sys/un.h> ++#include <string.h> ++#include <stdlib.h> ++#include <stddef.h> + + #include "src/common/log.h" + #include "src/common/slurm_protocol_defs.h" +@@ -57,7 +60,12 @@ extern void xsystemd_change_mainpid(pid_t pid) + } + + strlcpy(addr.sun_path, notify_socket, sizeof(addr.sun_path)); ++#if defined(__FreeBSD__) ++ len = (socklen_t)SUN_LEN(&addr); ++ addr.sun_len = (uint8_t)len; ++#else + len = strlen(addr.sun_path) + 1 + sizeof(addr.sun_family); ++#endif + + if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) { + error("%s: socket() failed: %m", __func__); diff --git a/sysutils/slurm-wlm/files/patch-src_interfaces_cgroup.c b/sysutils/slurm-wlm/files/patch-src_interfaces_cgroup.c index 12bf2f7f5656..4b8616be9ee3 100644 --- a/sysutils/slurm-wlm/files/patch-src_interfaces_cgroup.c +++ b/sysutils/slurm-wlm/files/patch-src_interfaces_cgroup.c @@ -1,6 +1,6 @@ ---- src/interfaces/cgroup.c.orig 2023-11-21 22:33:29 UTC +--- src/interfaces/cgroup.c.orig 2024-05-21 17:19:51 UTC +++ src/interfaces/cgroup.c -@@ -419,6 +419,7 @@ extern char *autodetect_cgroup_version(void) +@@ -421,6 +421,7 @@ extern char *autodetect_cgroup_version(void) struct statfs fs; int cgroup_ver = -1; @@ -8,7 +8,7 @@ if (statfs("/sys/fs/cgroup/", &fs) < 0) { error("cgroup filesystem not mounted in /sys/fs/cgroup/"); return NULL; -@@ -451,6 +452,7 @@ extern char *autodetect_cgroup_version(void) +@@ -453,6 +454,7 @@ extern char *autodetect_cgroup_version(void) error("Unknown filesystem type mounted on /sys/fs/cgroup"); return NULL; } diff --git a/sysutils/slurm-wlm/files/patch-src_plugins_auth_slurm_sack.c b/sysutils/slurm-wlm/files/patch-src_plugins_auth_slurm_sack.c new file mode 100644 index 000000000000..f0ee2bac99e6 --- /dev/null +++ b/sysutils/slurm-wlm/files/patch-src_plugins_auth_slurm_sack.c @@ -0,0 +1,17 @@ +--- src/plugins/auth/slurm/sack.c.orig 2024-05-21 17:19:51 UTC ++++ src/plugins/auth/slurm/sack.c +@@ -278,8 +278,12 @@ extern void init_sack_conmgr(void) + + /* set value of socket path */ + mask = umask(0); +- if ((rc = bind(fd, (const struct sockaddr *) &addr, +- sizeof(addr)))) ++/* AF_UNIX length handling */ ++ socklen_t len = SUN_LEN(&addr); ++#if defined(__FreeBSD__) ++ addr.sun_len = (uint8_t)len; ++#endif ++ if ((rc = bind(fd, (const struct sockaddr *)&addr, len))) + fatal("%s: [%s] Unable to bind UNIX socket: %m", + __func__, addr.sun_path); + umask(mask); diff --git a/sysutils/slurm-wlm/files/patch-src_slurmd_slurmstepd_req.c b/sysutils/slurm-wlm/files/patch-src_slurmd_slurmstepd_req.c new file mode 100644 index 000000000000..0e5b06d1dacf --- /dev/null +++ b/sysutils/slurm-wlm/files/patch-src_slurmd_slurmstepd_req.c @@ -0,0 +1,15 @@ +--- src/slurmd/slurmstepd/req.c.orig 2024-05-21 17:19:51 UTC ++++ src/slurmd/slurmstepd/req.c +@@ -176,7 +176,11 @@ _create_socket(const char *name) + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strlcpy(addr.sun_path, name, sizeof(addr.sun_path)); +- len = strlen(addr.sun_path)+1 + sizeof(addr.sun_family); ++/* AF_UNIX length handling */ ++ len = SUN_LEN(&addr); ++#if defined(__FreeBSD__) ++ addr.sun_len = (uint8_t)len; ++#endif + + /* bind the name to the descriptor */ + if (bind(fd, (struct sockaddr *) &addr, len) < 0) { diff --git a/sysutils/slurm-wlm/pkg-plist b/sysutils/slurm-wlm/pkg-plist index 72bf05a521d4..315d8d210ce4 100644 --- a/sysutils/slurm-wlm/pkg-plist +++ b/sysutils/slurm-wlm/pkg-plist @@ -255,3 +255,4 @@ sbin/slurmctld sbin/slurmd sbin/slurmdbd sbin/slurmstepd +@dir(%%USERS%%,%%GROUPS%%,700) /var/spool/slurmctld |