aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--doc/index.html15
-rw-r--r--doc/libstddjb/djbunix.html62
-rw-r--r--doc/license.html2
-rw-r--r--doc/upgrade.html6
-rw-r--r--package/deps.mak10
-rw-r--r--package/info2
-rw-r--r--src/include/skalibs/djbunix.h6
-rw-r--r--src/include/skalibs/unix-transactional.h3
-rw-r--r--src/libstddjb/waitn.c11
-rw-r--r--src/libstddjb/waitn_posix.c21
-rw-r--r--src/libstddjb/waitn_reap.c11
-rw-r--r--src/libstddjb/waitn_reap_posix.c22
-rw-r--r--src/libunixonacid/openslurpnclose_at.c (renamed from src/libunixonacid/openslurpclose_at.c)4
14 files changed, 56 insertions, 123 deletions
diff --git a/NEWS b/NEWS
index 2cc65ea..5c3e1d5 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,6 @@
Changelog for skalibs.
-In 2.15.2.0
+In 2.16.0.0
-----------
- Bugfixes.
@@ -8,6 +8,8 @@ In 2.15.2.0
(to avoid mallocing the arg when creating a thread)
- New functions: waitpid_nohang, waitpids_nohang
(to only reap the listed pids and ignore others)
+ - New function: openslurpnclose_at. openslurpclose_at is now a macro.
+ - Removed functions: waitn*
In 2.15.1.0
diff --git a/doc/index.html b/doc/index.html
index 4980b35..1da38d9 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -61,8 +61,8 @@ with a standard C development environment </li>
<h3> Download </h3>
<ul>
- <li> The current released version of skalibs is <a href="skalibs-2.15.2.0.tar.gz">2.15.2.0</a>.
-You can access its checksum <a href="skalibs-2.15.2.0.tar.gz.sha256">here</a>. </li>
+ <li> The current released version of skalibs is <a href="skalibs-2.16.0.0.tar.gz">2.16.0.0</a>.
+You can access its checksum <a href="skalibs-2.16.0.0.tar.gz.sha256">here</a>. </li>
<li> Alternatively, you can checkout a copy of the
<a href="//git.skarnet.org/cgit/skalibs/">skalibs
git repository</a>:
@@ -138,5 +138,16 @@ includes libraries for Scheme programming </li>
<a href="//skarnet.org/lists/#skaware">skaware</a> mailing-list. </li>
</ul>
+<h2> Support this work </h2>
+
+<p>
+ If you like this skarnet.org project, you can donate to the author via Liberapay,
+by clicking the following button:
+<script src="https://liberapay.com/skarnet/widgets/button.js"></script>
+<noscript>
+<a href="https://liberapay.com/skarnet/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a>
+</noscript>
+</p>
+
</body>
</html>
diff --git a/doc/libstddjb/djbunix.html b/doc/libstddjb/djbunix.html
index ba9e692..0850dd6 100644
--- a/doc/libstddjb/djbunix.html
+++ b/doc/libstddjb/djbunix.html
@@ -364,6 +364,8 @@ The <tt>child_spawn</tt> family of functions has been moved to the
<h3> Waiting for children </h3>
+<h4> Including bastards (children a process doesn't know it has) </h4>
+
<p>
<code> unsigned int wait_reap () </code> <br />
Instantly reaps all the pending zombies, without blocking, without a look at
@@ -372,36 +374,6 @@ Returns the number of reaped zombies.
</p>
<p>
-<code> int waitn (pid_t *pids, unsigned int n) </code> <br />
-Waits until all processes whose PIDs are stored in the
-<em>pids</em> array, of size <em>n</em>, have died.
-Returns 1 if it succeeds, and 0 (and sets errno) if it fails. The
-<em>pid</em> array is not guaranteed to be unchanged.
-</p>
-
-<p>
-<code> int waitn_posix (pid_t *pids, unsigned int n, int *wstat) </code> <br />
-Like <tt>waitn</tt>, but stores into <em>*wstat</em> the status
-of the last process in the <em>pids</em> array (i.e. <tt>pids[n-1]</tt>).
-</p>
-
-<p>
-<code> int waitn_reap (pid_t *pids, unsigned int n) </code> <br />
-Instantly reaps all zombies whose PIDs are stored in the
-<em>pids</em> array, of size <em>n</em>.
-Returns -1 (and sets errno) if it fails, and the number of reaped
-zombies if it succeeds. The <em>pid</em> array is not guaranteed to
-be unchanged.
-</p>
-
-<p>
-<code> int waitn_reap_posix (pid_t *pids, unsigned int n, int *wstat) </code> <br />
-Like <tt>waitn_reap</tt>, but stores into <em>*wstat</em> the status
-of the last process in the <em>pids</em> array (i.e. <tt>pids[n-1]</tt>),
-if applicable; otherwise <em>*wstat</em> is unchanged.
-</p>
-
-<p>
<code> pid_t wait_nohang (int *wstat) </code> <br />
Instantly reaps one zombie, and stores the status information into
*<em>wstat</em>.
@@ -448,15 +420,39 @@ function over the basic Unix APIs. This allows a program to:
</p>
<ul>
- <li> Automatically and silently take care of children it does not know
-it has. This situation can happen when a process forks and the parent
+ <li> Automatically and silently take care of bastards (children it does not know
+it has). This situation can happen when a process forks and the parent
execs. When the child dies, the new parent process has to drag the
-"zombie bastard" along, which is ugly; <tt>wait_pids_nohang()</tt>
+zombie bastard along, which is ugly; <tt>wait_pids_nohang()</tt>
prevents this. </li>
<li> Still take appropriate care of its legitimate children, in
any order. </li>
</ul>
+<h4> Excluding bastards </h4>
+
+<p>
+<code> size_t waitpids (pid_t const *pids, size_t n, int *wstat) </code> <br />
+Blockingly waits until it has reapt all the pids in array <em>pids</em> of
+size <em>n</em>, or an error occurs; does not reap any zombie that is not
+listed in <em>pids</em>. On success, it returns <em>n</em>.
+On error, it returns an integer <em>i</em> lesser than <em>n</em>, which
+is the position of the error in array <em>pids</em>, and sets errno.
+All the pids before
+<tt><em>pids</em>[<em>i</em>]</tt> have been properly reapt, and *<em>wstat</em>
+contains the status for the last reapt process, <tt><em>pids</em>[<em>i</em>-1]</tt>.
+</p>
+
+<p>
+<code> int waitpids_nohang (pid_t const *pids, size_t n, int *wstat, size_t *i) </code> <br />
+Instantly reaps one zombie among the pids listed in array <em>pids</em> of
+size <em>n</em>. If an error occurs, returns -1, sets errno, and writes the
+index (in the <em>pids</em> array) of the incriminated process in *<em>i</em>.
+If it finds a zombie, it writes the index of the found and reapt process
+in *<em>i</em> and returns 1. If no zombie is found in the list, it
+returns 0. Any zombie not listed remains untouched.
+</p>
+
<h3> Reading and writing whole files </h3>
<p>
diff --git a/doc/license.html b/doc/license.html
index e92da26..62cee6f 100644
--- a/doc/license.html
+++ b/doc/license.html
@@ -75,7 +75,7 @@ color, or different text font. </li>
<p>
<em>I am aware that the previous restrictions sound completely
ridiculous while the official skalibs documentation is incomplete.
-As of 2.15.2.0, I'm not going to enforce those restrictions, but if you're
+As of 2.16.0.0, I'm not going to enforce those restrictions, but if you're
going to provide documentation for skalibs, don't keep it to yourself,
please send it to me instead. :-) </em>
</p>
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 74e9776..3a429da 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -17,10 +17,12 @@
<a href="//skarnet.org/">skarnet.org</a>
</p>
-<h2> in 2.15.2.0 </h2>
+<h2> in 2.16.0.0 </h2>
<ul>
- <li> New functions: pthread_create_flat, waitpid_nohang, waitpids_nohang </li>
+ <li> New functions: pthread_create_flat, waitpid_nohang, waitpids_nohang, openslurpnclose_at </li>
+ <li> <tt>openslurpclose_at()</tt> is now a macro. </li>
+ <li> The waitn* functions have been removed. </li>
</ul>
<h2> in 2.15.1.0 </h2>
diff --git a/package/deps.mak b/package/deps.mak
index 8fcf861..0595646 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -31,7 +31,6 @@ src/include/skalibs/genset.h: src/include/skalibs/functypes.h
src/include/skalibs/gensetdyn.h: src/include/skalibs/functypes.h src/include/skalibs/genalloc.h src/include/skalibs/stralloc.h
src/include/skalibs/gol.h: src/include/skalibs/uint64.h
src/include/skalibs/iopause.h: src/include/skalibs/tai.h
-src/include/skalibs/ip46.h: src/include/skalibs/fmtscan.h src/include/skalibs/socket.h src/include/skalibs/tai.h
src/include/skalibs/keventbridge.h: src/include/skalibs/sysdeps.h
src/include/skalibs/kolbak.h: src/include/skalibs/unixmessage.h
src/include/skalibs/lolstdio.h: src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/strerr.h
@@ -59,9 +58,6 @@ src/include/skalibs/strerr.h: src/include/skalibs/gccattributes.h src/include/sk
src/include/skalibs/tai.h: src/include/skalibs/gccattributes.h src/include/skalibs/uint64.h
src/include/skalibs/textclient.h: src/include/skalibs/allreadwrite.h src/include/skalibs/tai.h src/include/skalibs/textmessage.h
src/include/skalibs/textmessage.h: src/include/skalibs/allreadwrite.h src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h src/include/skalibs/tai.h
-src/include/skalibs/types.h: src/include/skalibs/uint16.h src/include/skalibs/uint32.h src/include/skalibs/uint64.h
-src/include/skalibs/uint16.h: src/include/skalibs/uint64.h
-src/include/skalibs/uint32.h: src/include/skalibs/uint64.h
src/include/skalibs/unix-timed.h: src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/functypes.h src/include/skalibs/stralloc.h src/include/skalibs/tai.h
src/include/skalibs/unix-transactional.h: src/include/skalibs/direntry.h src/include/skalibs/gccattributes.h src/include/skalibs/stralloc.h
src/include/skalibs/unixconnection.h: src/include/skalibs/unixmessage.h
@@ -763,10 +759,6 @@ src/libstddjb/wait_nointr.o src/libstddjb/wait_nointr.lo: src/libstddjb/wait_noi
src/libstddjb/wait_pid_nohang.o src/libstddjb/wait_pid_nohang.lo: src/libstddjb/wait_pid_nohang.c src/include/skalibs/djbunix.h
src/libstddjb/wait_pids_nohang.o src/libstddjb/wait_pids_nohang.lo: src/libstddjb/wait_pids_nohang.c src/include/skalibs/djbunix.h
src/libstddjb/wait_reap.o src/libstddjb/wait_reap.lo: src/libstddjb/wait_reap.c src/include/skalibs/djbunix.h
-src/libstddjb/waitn.o src/libstddjb/waitn.lo: src/libstddjb/waitn.c src/include/skalibs/djbunix.h
-src/libstddjb/waitn_posix.o src/libstddjb/waitn_posix.lo: src/libstddjb/waitn_posix.c src/include/skalibs/djbunix.h
-src/libstddjb/waitn_reap.o src/libstddjb/waitn_reap.lo: src/libstddjb/waitn_reap.c src/include/skalibs/djbunix.h
-src/libstddjb/waitn_reap_posix.o src/libstddjb/waitn_reap_posix.lo: src/libstddjb/waitn_reap_posix.c src/include/skalibs/djbunix.h
src/libstddjb/waitpid_nointr.o src/libstddjb/waitpid_nointr.lo: src/libstddjb/waitpid_nointr.c src/include/skalibs/djbunix.h
src/libstddjb/waitpids.o src/libstddjb/waitpids.lo: src/libstddjb/waitpids.c src/include/skalibs/djbunix.h
src/libstddjb/waitpids_nohang.o src/libstddjb/waitpids_nohang.lo: src/libstddjb/waitpids_nohang.c src/include/skalibs/djbunix.h
@@ -818,7 +810,7 @@ src/libunixonacid/opendir_at.o src/libunixonacid/opendir_at.lo: src/libunixonaci
src/libunixonacid/opengetlnclose.o src/libunixonacid/opengetlnclose.lo: src/libunixonacid/opengetlnclose.c src/include/skalibs/allreadwrite.h src/include/skalibs/buffer.h src/include/skalibs/djbunix.h src/include/skalibs/skamisc.h src/include/skalibs/unix-transactional.h
src/libunixonacid/opengetlnclose_at.o src/libunixonacid/opengetlnclose_at.lo: src/libunixonacid/opengetlnclose_at.c src/include/skalibs/allreadwrite.h src/include/skalibs/buffer.h src/include/skalibs/djbunix.h src/include/skalibs/skamisc.h src/include/skalibs/unix-transactional.h
src/libunixonacid/openreadnclose_at.o src/libunixonacid/openreadnclose_at.lo: src/libunixonacid/openreadnclose_at.c src/include/skalibs/djbunix.h src/include/skalibs/unix-transactional.h
-src/libunixonacid/openslurpclose_at.o src/libunixonacid/openslurpclose_at.lo: src/libunixonacid/openslurpclose_at.c src/include/skalibs/djbunix.h src/include/skalibs/unix-transactional.h
+src/libunixonacid/openslurpnclose_at.o src/libunixonacid/openslurpnclose_at.lo: src/libunixonacid/openslurpnclose_at.c src/include/skalibs/djbunix.h src/include/skalibs/unix-transactional.h
src/libunixonacid/openwritenclose_at.o src/libunixonacid/openwritenclose_at.lo: src/libunixonacid/openwritenclose_at.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/unix-transactional.h
src/libunixonacid/openwritevnclose_at.o src/libunixonacid/openwritevnclose_at.lo: src/libunixonacid/openwritevnclose_at.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/siovec.h src/include/skalibs/unix-transactional.h
src/libunixonacid/sassclient_ack.o src/libunixonacid/sassclient_ack.lo: src/libunixonacid/sassclient_ack.c src/include/skalibs/genqdyn.h src/include/skalibs/sassclient.h src/include/skalibs/uint32.h
diff --git a/package/info b/package/info
index ee6e127..546b096 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=skalibs
-version=2.15.2.0
+version=2.16.0.0
category=prog
package_macro_name=SKALIBS
diff --git a/src/include/skalibs/djbunix.h b/src/include/skalibs/djbunix.h
index 0bba29a..51be4aa 100644
--- a/src/include/skalibs/djbunix.h
+++ b/src/include/skalibs/djbunix.h
@@ -74,13 +74,7 @@ extern pid_t wait_nointr (int *) ;
#define wait_nohang(wstat) waitpid_nohang(-1, (wstat))
extern pid_t wait_pid_nohang (pid_t, int *) ;
extern int wait_pids_nohang (pid_t const *, unsigned int, int *) ;
-
-/* These will disappear or be refactored */
extern unsigned int wait_reap (void) ;
-extern int waitn (pid_t *, unsigned int) ;
-extern int waitn_posix (pid_t *, unsigned int, int *) ;
-extern int waitn_reap (pid_t *, unsigned int) ;
-extern int waitn_reap_posix (pid_t *, unsigned int, int *) ;
extern int fd_chdir (int) ;
diff --git a/src/include/skalibs/unix-transactional.h b/src/include/skalibs/unix-transactional.h
index 9b884f9..ae8a263 100644
--- a/src/include/skalibs/unix-transactional.h
+++ b/src/include/skalibs/unix-transactional.h
@@ -40,7 +40,8 @@ extern int openc_appendat (int, char const *) ;
extern int openc_appendatb (int, char const *) ;
extern ssize_t openreadnclose_at (int, char const *, char *, size_t) ;
-extern int openslurpclose_at (int, char const *, stralloc *) ;
+#define openslurpclose_at(dirfd, fn, sa) openslurpnclose_at(dirfd, fn, (sa), 0)
+extern int openslurpnclose_at (int, char const *, stralloc *, size_t) ;
extern int opengetlnclose_at (int, char const *, stralloc *, int) ;
extern size_t openwritenclose_at (int, char const *, char const *, size_t) ;
diff --git a/src/libstddjb/waitn.c b/src/libstddjb/waitn.c
deleted file mode 100644
index 4d980cc..0000000
--- a/src/libstddjb/waitn.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* ISC license. */
-
-#include <sys/wait.h>
-
-#include <skalibs/djbunix.h>
-
-int waitn (pid_t *pids, unsigned int n)
-{
- int dummy ;
- return waitn_posix(pids, n, &dummy) ;
-}
diff --git a/src/libstddjb/waitn_posix.c b/src/libstddjb/waitn_posix.c
deleted file mode 100644
index ea5935d..0000000
--- a/src/libstddjb/waitn_posix.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* ISC license. */
-
-#include <sys/wait.h>
-
-#include <skalibs/djbunix.h>
-
-int waitn_posix (pid_t *pids, unsigned int n, int *w)
-{
- pid_t wanted = n ? pids[n-1] : 0 ;
- while (n)
- {
- int wstat ;
- unsigned int i = 0 ;
- pid_t pid = wait_nointr(&wstat) ;
- if (pid < 0) return 0 ;
- for (; i < n ; i++) if (pid == pids[i]) break ;
- if (i < n) pids[i] = pids[--n] ;
- if (pid == wanted) *w = wstat ;
- }
- return 1 ;
-}
diff --git a/src/libstddjb/waitn_reap.c b/src/libstddjb/waitn_reap.c
deleted file mode 100644
index 2c4ebe8..0000000
--- a/src/libstddjb/waitn_reap.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* ISC license. */
-
-#include <sys/wait.h>
-
-#include <skalibs/djbunix.h>
-
-int waitn_reap (pid_t *pids, unsigned int len)
-{
- int dummy ;
- return waitn_reap_posix(pids, len, &dummy) ;
-}
diff --git a/src/libstddjb/waitn_reap_posix.c b/src/libstddjb/waitn_reap_posix.c
deleted file mode 100644
index 4a6994f..0000000
--- a/src/libstddjb/waitn_reap_posix.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* ISC license. */
-
-#include <sys/wait.h>
-
-#include <skalibs/djbunix.h>
-
-int waitn_reap_posix (pid_t *pids, unsigned int len, int *w)
-{
- pid_t wanted = len ? pids[len-1] : 0 ;
- unsigned int n = 0 ;
- while (len)
- {
- int wstat ;
- int r = wait_pids_nohang(pids, len, &wstat) ;
- if (r < 0) return r ;
- else if (!r) break ;
- if (pids[r-1] == wanted) *w = wstat ;
- pids[r-1] = pids[--len] ;
- n++ ;
- }
- return n ;
-}
diff --git a/src/libunixonacid/openslurpclose_at.c b/src/libunixonacid/openslurpnclose_at.c
index 4ab6fa5..8880a71 100644
--- a/src/libunixonacid/openslurpclose_at.c
+++ b/src/libunixonacid/openslurpnclose_at.c
@@ -3,11 +3,11 @@
#include <skalibs/djbunix.h>
#include <skalibs/unix-transactional.h>
-int openslurpclose_at (int dirfd, char const *fn, stralloc *sa)
+int openslurpnclose_at (int dirfd, char const *fn, stralloc *sa, size_t n)
{
int fd = openc_readatb(dirfd, fn) ;
if (fd < 0) return 0 ;
- if (!slurp(sa, fd))
+ if (!slurpn(fd, sa, n))
{
fd_close(fd) ;
return 0 ;