s6

Mirror/fork of https://skarnet.org/software/s6/
git clone https://ccx.te2000.cz/git/s6
Log | Files | Refs | README | LICENSE

commit 65e6a29abd7413e21cc45470561e0eee2b24549e
parent 7d992838c709b6caada3c0b6134a969ba185f42f
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Mon, 26 Oct 2020 09:33:06 +0000

 Prepare for 2.9.2.1; add dangling symlink support

Diffstat:
MINSTALL | 4++--
MNEWS | 6++++++
Mdoc/index.html | 6+++---
Mdoc/upgrade.html | 10++++++++++
Mpackage/info | 2+-
Msrc/libs6/s6_supervise_lock_mode.c | 44++++++++++++++++++++++++++++++++++++--------
Msrc/libs6/s6_svc_lock_take.c | 6++++--
7 files changed, 62 insertions(+), 16 deletions(-)

diff --git a/INSTALL b/INSTALL @@ -6,8 +6,8 @@ Build Instructions - A POSIX-compliant C development environment - GNU make version 3.81 or later - - skalibs version 2.9.2.1 or later: http://skarnet.org/software/skalibs/ - - Optional: execline version 2.6.0.1 or later: http://skarnet.org/software/execline/ + - skalibs version 2.9.4.0 or later: http://skarnet.org/software/skalibs/ + - Optional: execline version 2.6.1.1 or later: http://skarnet.org/software/execline/ This software will run on any operating system that implements POSIX.1-2008, available at: diff --git a/NEWS b/NEWS @@ -1,5 +1,11 @@ Changelog for s6. +In 2.9.2.1 +---------- + + - Bugfixes. + + In 2.9.2.0 ---------- diff --git a/doc/index.html b/doc/index.html @@ -83,11 +83,11 @@ with s6</a> </li> <li> A POSIX-compliant system with a standard C development environment </li> <li> GNU make, version 3.81 or later </li> <li> <a href="//skarnet.org/software/skalibs/">skalibs</a> version -2.9.2.1 or later. It's a build-time requirement. It's also a run-time +2.9.4.0 or later. It's a build-time requirement. It's also a run-time requirement if you link against the shared version of the skalibs library. </li> <li> Optional: <a href="//skarnet.org/software/execline/">execline</a> version -2.6.0.1 or later. When s6 is built with execline support (which is the default), +2.6.1.1 or later. When s6 is built with execline support (which is the default), execline is a build-time requirement, and also a run-time requirement for certain binaries that spawn scripts interpreted with <a href="//skarnet.org/software/execline/execlineb.html">execlineb</a>. </li> @@ -103,7 +103,7 @@ certain binaries that spawn scripts interpreted with <h3> Download </h3> <ul> - <li> The current released version of s6 is <a href="s6-2.9.2.0.tar.gz">2.9.2.0</a>. </li> + <li> The current released version of s6 is <a href="s6-2.9.2.1.tar.gz">2.9.2.1</a>. </li> <li> Alternatively, you can checkout a copy of the <a href="//git.skarnet.org/cgi-bin/cgit.cgi/s6/">s6 git repository</a>: diff --git a/doc/upgrade.html b/doc/upgrade.html @@ -18,6 +18,16 @@ <h1> What has changed in s6 </h1> +<h2> in 2.9.2.1 </h2> + +<ul> + <li> <a href="//skarnet.org/software/skalibs/">skalibs</a> +dependency bumped to 2.9.4.0. </li> + <li> <a href="//skarnet.org/software/execline/">execline</a> +dependency bumped to 2.6.1.1. </li> + <li> New <tt>-d</tt> option to <a href="s6-sudod.html">s6-sudod</a>. </li> +</ul> + <h2> in 2.9.2.0 </h2> <ul> diff --git a/package/info b/package/info @@ -1,4 +1,4 @@ package=s6 -version=2.9.2.0 +version=2.9.2.1 category=admin package_macro_name=S6 diff --git a/src/libs6/s6_supervise_lock_mode.c b/src/libs6/s6_supervise_lock_mode.c @@ -1,12 +1,22 @@ /* ISC license. */ +#include <limits.h> +#include <unistd.h> #include <sys/stat.h> #include <string.h> #include <errno.h> + #include <skalibs/strerr2.h> #include <skalibs/djbunix.h> + #include <s6/s6-supervise.h> +#ifdef PATH_MAX +# define S6_PATH_MAX PATH_MAX +#else +# define S6_PATH_MAX 4096 +#endif + int s6_supervise_lock_mode (char const *subdir, unsigned int subdirmode, unsigned int controlmode) { size_t subdirlen = strlen(subdir) ; @@ -17,8 +27,28 @@ int s6_supervise_lock_mode (char const *subdir, unsigned int subdirmode, unsigne memcpy(control + subdirlen, "/control", 9) ; memcpy(lock, subdir, subdirlen) ; memcpy(lock + subdirlen, "/lock", 6) ; - if ((mkdir(subdir, (mode_t)subdirmode) == -1) && (errno != EEXIST)) - strerr_diefu2sys(111, "mkdir ", subdir) ; + if (mkdir(subdir, (mode_t)subdirmode) == -1) + { + if (errno != EEXIST) strerr_diefu2sys(111, "mkdir ", subdir) ; + else + { + char buf[S6_PATH_MAX] ; + ssize_t r = readlink(subdir, buf, S6_PATH_MAX) ; + if (r < 0) + { + errno = EEXIST ; + strerr_diefu2sys(111, "mkdir ", subdir) ; + } + if (r == S6_PATH_MAX) + { + errno = ENAMETOOLONG ; + strerr_diefu2sys(111, "readlink ", subdir) ; + } + buf[r] = 0 ; + if (mkdir(buf, (mode_t)subdirmode) == -1) + strerr_diefu2sys(111, "mkdir ", buf) ; + } + } if (mkfifo(control, controlmode) < 0) { struct stat st ; @@ -29,24 +59,22 @@ int s6_supervise_lock_mode (char const *subdir, unsigned int subdirmode, unsigne if (!S_ISFIFO(st.st_mode)) strerr_diefu2x(100, control, " is not a FIFO") ; } - fdlock = open_create(lock) ; + fdlock = open_createcoe(lock) ; if (fdlock < 0) strerr_diefu2sys(111, "open_create ", lock) ; if (lock_ex(fdlock) < 0) strerr_diefu2sys(111, "lock ", lock) ; - fdctlw = open_write(control) ; + fdctlw = open_writecoe(control) ; if (fdctlw >= 0) strerr_dief1x(100, "directory already locked") ; if (errno != ENXIO) strerr_diefu2sys(111, "open_write ", control) ; - fdctl = open_read(control) ; + fdctl = open_readcoe(control) ; if (fdctl < 0) strerr_diefu2sys(111, "open_read ", control) ; - fdctlw = open_write(control) ; + fdctlw = open_writecoe(control) ; if (fdctlw < 0) strerr_diefu2sys(111, "open_write ", control) ; fd_close(fdlock) ; - if ((coe(fdctlw) < 0) || (coe(fdctl) < 0)) - strerr_diefu2sys(111, "coe ", control) ; return fdctl ; /* fdctlw is leaking. That's okay, it's coe. */ diff --git a/src/libs6/s6_svc_lock_take.c b/src/libs6/s6_svc_lock_take.c @@ -6,6 +6,8 @@ #include <skalibs/djbunix.h> #include <s6/s6-supervise.h> + /* XXX: does not work with dangling S6_SUPERVISE_CTLDIR symlinks */ + int s6_svc_lock_take (char const *dir) { size_t dirlen = strlen(dir) ; @@ -15,9 +17,9 @@ int s6_svc_lock_take (char const *dir) memcpy(lock + dirlen, "/" S6_SUPERVISE_CTLDIR, sizeof(S6_SUPERVISE_CTLDIR) + 1) ; if ((mkdir(lock, S_IRWXU) < 0) && (errno != EEXIST)) return -1 ; memcpy(lock + dirlen + sizeof(S6_SUPERVISE_CTLDIR), "/lock", 6) ; - fdlock = open_create(lock) ; + fdlock = open_createcoe(lock) ; if (fdlock < 0) return -1 ; - if (coe(fdlock) < 0 || lock_ex(fdlock) < 0) + if (lock_ex(fdlock) < 0) { fd_close(fdlock) ; return -1 ;