summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-04-07 01:17:04 +0000
committerLaurent Bercot <ska@appnovation.com>2023-04-07 01:17:04 +0000
commit51e253133a87a72cfde9ce6bd8c12544b54721cb (patch)
tree67b532e4342f569cb89967a5c2349acddbfb5133
parent1d152882ecd60c177a09e84db4ea8766945e87b2 (diff)
downloadskalibs-51e253133a87a72cfde9ce6bd8c12544b54721cb.tar.xz
Add selfpipe_fd(), refactor selfpipe
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--NEWS6
-rw-r--r--doc/index.html2
-rw-r--r--doc/libstddjb/selfpipe.html15
-rw-r--r--doc/upgrade.html6
-rw-r--r--package/deps.mak8
-rw-r--r--package/info2
-rw-r--r--src/include/skalibs/selfpipe.h1
-rw-r--r--src/libstddjb/selfpipe-internal.h28
-rw-r--r--src/libstddjb/selfpipe.c184
-rw-r--r--src/libstddjb/selfpipe_finish.c53
-rw-r--r--src/libstddjb/selfpipe_init.c36
-rw-r--r--src/libstddjb/selfpipe_internal.c33
-rw-r--r--src/libstddjb/selfpipe_read.c31
-rw-r--r--src/libstddjb/selfpipe_trap.c46
-rw-r--r--src/libstddjb/selfpipe_trapset.c72
-rw-r--r--src/libstddjb/sig_restoreto.c3
16 files changed, 218 insertions, 308 deletions
diff --git a/NEWS b/NEWS
index a10b590..cc7f57d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,11 @@
Changelog for skalibs.
+In 2.13.2.0
+-----------
+
+ - New accessor function: selfpipe_fd().
+
+
In 2.13.1.1
-----------
diff --git a/doc/index.html b/doc/index.html
index d61c875..7b7ce35 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -60,7 +60,7 @@ with a standard C development environment </li>
<h3> Download </h3>
<ul>
- <li> The current released version of skalibs is <a href="skalibs-2.13.1.1.tar.gz">2.13.1.1</a>. </li>
+ <li> The current released version of skalibs is <a href="skalibs-2.13.2.0.tar.gz">2.13.2.0</a>. </li>
<li> Alternatively, you can checkout a copy of the
<a href="//git.skarnet.org/cgi-bin/cgit.cgi/skalibs/">skalibs
git repository</a>:
diff --git a/doc/libstddjb/selfpipe.html b/doc/libstddjb/selfpipe.html
index 7c13e0e..54c0f36 100644
--- a/doc/libstddjb/selfpipe.html
+++ b/doc/libstddjb/selfpipe.html
@@ -182,6 +182,21 @@ it's a serious one and your system has become very unstable.
is positive, it is the number of the signal that was caught.
</p>
+<h3> Accessing the selfpipe </h3>
+
+<pre>
+int fd = selfpipe_fd() ;
+</pre>
+
+<p>
+ Sometimes you need to access the fd of the selfpipe in two
+very distinct translation units (typically to poll on it), and you
+rightly don't want to add a global variable to store it, especially
+since it's already stored in a global internal variable in skalibs.
+No need to bloat your binary anymore: <tt>selfpipe_fd()</tt> will
+now retrieve the value for you, wherever you are.
+</p>
+
<h3> Finishing </h3>
<pre>
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 66cecd3..ed83b9b 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -17,6 +17,12 @@
</p>
+<h2> in 2.13.2.0 </h2>
+
+<ul>
+ <li> New accessor function: <tt>selfpipe_fd()</tt> </li>
+</ul>
+
<h2> in 2.13.1.1 </h2>
<ul>
diff --git a/package/deps.mak b/package/deps.mak
index f792c63..787e042 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -65,7 +65,6 @@ src/libstdcrypto/sha512-internal.h: src/include/skalibs/sha512.h
src/libstddjb/cdb-internal.h: src/include/skalibs/cdb.h src/include/skalibs/gccattributes.h
src/libstddjb/djbtime-internal.h: src/include/skalibs/uint64.h
src/libstddjb/fmtscan-internal.h: src/include/skalibs/fmtscan.h src/include/skalibs/uint64.h
-src/libstddjb/selfpipe-internal.h: src/include/skalibs/sig.h src/include/skalibs/sysdeps.h
src/libunixonacid/skaclient-internal.h: src/include/skalibs/kolbak.h src/include/skalibs/skaclient.h src/include/skalibs/unixmessage.h
src/libdatastruct/avlnode_delete.o src/libdatastruct/avlnode_delete.lo: src/libdatastruct/avlnode_delete.c src/libdatastruct/avlnode-internal.h src/include/skalibs/avlnode.h
src/libdatastruct/avlnode_doublerotate.o src/libdatastruct/avlnode_doublerotate.lo: src/libdatastruct/avlnode_doublerotate.c src/libdatastruct/avlnode-internal.h src/include/skalibs/avlnode.h
@@ -464,12 +463,7 @@ src/libstddjb/sareadlink.o src/libstddjb/sareadlink.lo: src/libstddjb/sareadlink
src/libstddjb/sarealpath.o src/libstddjb/sarealpath.lo: src/libstddjb/sarealpath.c src/include/skalibs/djbunix.h src/include/skalibs/stralloc.h
src/libstddjb/satmp.o src/libstddjb/satmp.lo: src/libstddjb/satmp.c src/include/skalibs/skamisc.h src/include/skalibs/stralloc.h
src/libstddjb/sauniquename.o src/libstddjb/sauniquename.lo: src/libstddjb/sauniquename.c src/include/skalibs/djbunix.h src/include/skalibs/skamisc.h src/include/skalibs/stralloc.h src/include/skalibs/tai.h src/include/skalibs/types.h
-src/libstddjb/selfpipe_finish.o src/libstddjb/selfpipe_finish.lo: src/libstddjb/selfpipe_finish.c src/include/skalibs/bsdsnowflake.h src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/nsig.h src/libstddjb/selfpipe-internal.h src/include/skalibs/selfpipe.h src/include/skalibs/sig.h src/include/skalibs/sysdeps.h
-src/libstddjb/selfpipe_init.o src/libstddjb/selfpipe_init.lo: src/libstddjb/selfpipe_init.c src/include/skalibs/djbunix.h src/libstddjb/selfpipe-internal.h src/include/skalibs/selfpipe.h src/include/skalibs/sig.h src/include/skalibs/sysdeps.h
-src/libstddjb/selfpipe_internal.o src/libstddjb/selfpipe_internal.lo: src/libstddjb/selfpipe_internal.c src/include/skalibs/allreadwrite.h src/libstddjb/selfpipe-internal.h src/include/skalibs/sysdeps.h
-src/libstddjb/selfpipe_read.o src/libstddjb/selfpipe_read.lo: src/libstddjb/selfpipe_read.c src/include/skalibs/allreadwrite.h src/libstddjb/selfpipe-internal.h src/include/skalibs/selfpipe.h src/include/skalibs/sysdeps.h
-src/libstddjb/selfpipe_trap.o src/libstddjb/selfpipe_trap.lo: src/libstddjb/selfpipe_trap.c src/libstddjb/selfpipe-internal.h src/include/skalibs/selfpipe.h src/include/skalibs/sig.h src/include/skalibs/sysdeps.h
-src/libstddjb/selfpipe_trapset.o src/libstddjb/selfpipe_trapset.lo: src/libstddjb/selfpipe_trapset.c src/include/skalibs/nonposix.h src/include/skalibs/nsig.h src/libstddjb/selfpipe-internal.h src/include/skalibs/selfpipe.h src/include/skalibs/sig.h src/include/skalibs/sysdeps.h
+src/libstddjb/selfpipe.o src/libstddjb/selfpipe.lo: src/libstddjb/selfpipe.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/nonposix.h src/include/skalibs/nsig.h src/include/skalibs/sig.h src/include/skalibs/sysdeps.h
src/libstddjb/sgetopt.o src/libstddjb/sgetopt.lo: src/libstddjb/sgetopt.c src/include/skalibs/buffer.h src/include/skalibs/sgetopt.h
src/libstddjb/sig0_scan.o src/libstddjb/sig0_scan.lo: src/libstddjb/sig0_scan.c src/include/skalibs/sig.h src/include/skalibs/types.h
src/libstddjb/sig_altignore.o src/libstddjb/sig_altignore.lo: src/libstddjb/sig_altignore.c src/include/skalibs/sig.h
diff --git a/package/info b/package/info
index 0750d09..dea00a7 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=skalibs
-version=2.13.1.1
+version=2.13.2.0
category=prog
package_macro_name=SKALIBS
diff --git a/src/include/skalibs/selfpipe.h b/src/include/skalibs/selfpipe.h
index 980af90..4b453e0 100644
--- a/src/include/skalibs/selfpipe.h
+++ b/src/include/skalibs/selfpipe.h
@@ -8,6 +8,7 @@
extern int selfpipe_init (void) ;
extern int selfpipe_trap (int) ;
extern int selfpipe_trapset (sigset_t const *) ;
+extern int selfpipe_fd (void) ;
extern int selfpipe_read (void) ;
extern void selfpipe_finish (void) ;
diff --git a/src/libstddjb/selfpipe-internal.h b/src/libstddjb/selfpipe-internal.h
deleted file mode 100644
index dcde350..0000000
--- a/src/libstddjb/selfpipe-internal.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* ISC license. */
-
-/* MT-unsafe */
-
-#ifndef SELFPIPE_INTERNAL_H
-#define SELFPIPE_INTERNAL_H
-
-#include <signal.h>
-#include <skalibs/sysdeps.h>
-
-extern sigset_t selfpipe_caught ;
-
-#ifdef SKALIBS_HASSIGNALFD
-
-extern int selfpipe_fd ;
-
-#else
-
-#include <skalibs/sig.h>
-
-extern int selfpipe[2] ;
-#define selfpipe_fd selfpipe[0]
-
-extern sig_func selfpipe_tophalf ;
-
-#endif
-
-#endif
diff --git a/src/libstddjb/selfpipe.c b/src/libstddjb/selfpipe.c
new file mode 100644
index 0000000..c4609c8
--- /dev/null
+++ b/src/libstddjb/selfpipe.c
@@ -0,0 +1,184 @@
+/* ISC license. */
+
+/* MT-unsafe */
+
+#include <skalibs/sysdeps.h>
+
+#ifdef SKALIBS_HASSIGNALFD
+
+#include <errno.h>
+#include <signal.h>
+#include <sys/signalfd.h>
+
+#include <skalibs/allreadwrite.h>
+#include <skalibs/sig.h>
+#include <skalibs/djbunix.h>
+
+struct selfpipe_s
+{
+ sigset_t caught ;
+ int fd ;
+} ;
+
+static struct selfpipe_s sp = { .fd = -1 } ;
+
+int selfpipe_fd ()
+{
+ return sp.fd ;
+}
+
+int selfpipe_read ()
+{
+ struct signalfd_siginfo buf ;
+ ssize_t r = sanitize_read(fd_read(sp.fd, (char *)&buf, sizeof(struct signalfd_siginfo))) ;
+ return (r <= 0) ? r : buf.ssi_signo ;
+}
+
+int selfpipe_trap (int sig)
+{
+ sigset_t set = sp.caught ;
+ sigset_t old ;
+ if (sp.fd == -1) return (errno = EBADF, 0) ;
+ if (sigaddset(&set, sig) == -1 || sigprocmask(SIG_BLOCK, &set, &old) == -1) return 0 ;
+ if (signalfd(sp.fd, &set, SFD_NONBLOCK | SFD_CLOEXEC) == -1)
+ {
+ int e = errno ;
+ sigprocmask(SIG_SETMASK, &old, 0) ;
+ errno = e ;
+ return 0 ;
+ }
+ sp.caught = set ;
+ return 1 ;
+}
+
+int selfpipe_trapset (sigset_t const *set)
+{
+ sigset_t old ;
+ if (sp.fd == -1) return (errno = EBADF, 0) ;
+ if (sigprocmask(SIG_SETMASK, set, &old) == -1) return 0 ;
+ if (signalfd(sp.fd, set, SFD_NONBLOCK | SFD_CLOEXEC) == -1)
+ {
+ int e = errno ;
+ sigprocmask(SIG_SETMASK, &old, 0) ;
+ errno = e ;
+ return 0 ;
+ }
+ sp.caught = *set ;
+ return 1 ;
+}
+
+void selfpipe_finish ()
+{
+ int e = errno ;
+ fd_close(sp.fd) ; sp.fd = -1 ;
+ sigprocmask(SIG_UNBLOCK, &sp.caught, 0) ;
+ sigemptyset(&sp.caught) ;
+ errno = e ;
+}
+
+int selfpipe_init ()
+{
+ sigemptyset(&sp.caught) ;
+ sig_blocknone() ;
+ sp.fd = signalfd(sp.fd, &sp.caught, SFD_NONBLOCK | SFD_CLOEXEC) ;
+ return sp.fd ;
+}
+
+#else
+
+#include <skalibs/nonposix.h>
+
+#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include <skalibs/nsig.h>
+#include <skalibs/sig.h>
+#include <skalibs/allreadwrite.h>
+#include <skalibs/djbunix.h>
+
+struct selfpipe_s
+{
+ sigset_t caught ;
+ int fd[2] ;
+} ;
+
+static struct selfpipe_s sp = { .fd = { -1, -1 } } ;
+
+static void selfpipe_tophalf (int s)
+{
+ int e = errno ;
+ unsigned char c = (unsigned char)s ;
+ write(sp.fd[1], (char *)&c, 1) ;
+ errno = e ;
+}
+
+int selfpipe_fd ()
+{
+ return sp.fd[0] ;
+}
+
+int selfpipe_read ()
+{
+ char c ;
+ ssize_t r = sanitize_read((fd_read(sp.fd[0], &c, 1))) ;
+ return (r <= 0) ? r : c ;
+}
+
+int selfpipe_trap (int sig)
+{
+ if (sp.fd[0] == -1) return (errno = EBADF, 0) ;
+ if (!sig_catch(sig, &selfpipe_tophalf)) return 0 ;
+ sigaddset(&sp.caught, sig) ;
+ sig_unblock(sig) ;
+ return 1 ;
+}
+
+int selfpipe_trapset (sigset_t const *set)
+{
+ unsigned int i = 1 ;
+ if (sp.fd[0] == -1) return (errno = EBADF, 0) ;
+ for (; i < SKALIBS_NSIG ; i++)
+ {
+ int h = sigismember(set, i) ;
+ if (h < 0) continue ;
+ if (h)
+ {
+ if (!sig_catch(i, &selfpipe_tophalf)) goto err ;
+ }
+ else if (sigismember(&sp.caught, i))
+ {
+ if (!sig_restore(i)) goto err ;
+ }
+ }
+ sig_blocknone() ;
+ sp.caught = *set ;
+ return 1 ;
+
+ err:
+ sig_restoreto(set, i) ;
+ return 0 ;
+}
+
+void selfpipe_finish ()
+{
+ int e = errno ;
+ sigprocmask(SIG_BLOCK, &sp.caught, 0) ;
+ sig_restoreto(&sp.caught, SKALIBS_NSIG) ;
+ fd_close(sp.fd[1]) ;
+ fd_close(sp.fd[0]) ;
+ sigprocmask(SIG_UNBLOCK, &sp.caught, 0) ;
+ sigemptyset(&sp.caught) ;
+ sp.fd[0] = sp.fd[1] = -1 ;
+ errno = e ;
+}
+
+int selfpipe_init ()
+{
+ if (sp.fd[0] >= 0) selfpipe_finish() ;
+ else sigemptyset(&sp.caught) ;
+ sig_blocknone() ;
+ return pipenbcoe(sp.fd) < 0 ? -1 : sp.fd[0] ;
+}
+
+#endif
diff --git a/src/libstddjb/selfpipe_finish.c b/src/libstddjb/selfpipe_finish.c
deleted file mode 100644
index db42430..0000000
--- a/src/libstddjb/selfpipe_finish.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* ISC license. */
-
-/* MT-unsafe */
-
-#include <skalibs/sysdeps.h>
-
-#ifdef SKALIBS_HASSIGNALFD
-
-#include <errno.h>
-#include <signal.h>
-
-#include <skalibs/djbunix.h>
-#include <skalibs/selfpipe.h>
-#include "selfpipe-internal.h"
-
-void selfpipe_finish (void)
-{
- int e = errno ;
- fd_close(selfpipe_fd) ;
- sigprocmask(SIG_UNBLOCK, &selfpipe_caught, 0) ;
- sigemptyset(&selfpipe_caught) ;
- selfpipe_fd = -1 ;
- errno = e ;
-}
-
-#else
-
-#include <skalibs/nonposix.h>
-#include <skalibs/bsdsnowflake.h>
-
-#include <errno.h>
-#include <signal.h>
-
-#include <skalibs/nsig.h>
-#include <skalibs/sig.h>
-#include <skalibs/djbunix.h>
-#include <skalibs/selfpipe.h>
-#include "selfpipe-internal.h"
-
-void selfpipe_finish (void)
-{
- int e = errno ;
- sigprocmask(SIG_BLOCK, &selfpipe_caught, 0) ;
- sig_restoreto(&selfpipe_caught, SKALIBS_NSIG) ;
- fd_close(selfpipe[1]) ;
- fd_close(selfpipe[0]) ;
- sigprocmask(SIG_UNBLOCK, &selfpipe_caught, 0) ;
- sigemptyset(&selfpipe_caught) ;
- selfpipe[0] = selfpipe[1] = -1 ;
- errno = e ;
-}
-
-#endif
diff --git a/src/libstddjb/selfpipe_init.c b/src/libstddjb/selfpipe_init.c
deleted file mode 100644
index 8dcdcca..0000000
--- a/src/libstddjb/selfpipe_init.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* ISC license. */
-
-/* MT-unsafe */
-
-#include <signal.h>
-
-#include <skalibs/sysdeps.h>
-#include <skalibs/sig.h>
-#include <skalibs/selfpipe.h>
-#include "selfpipe-internal.h"
-
-#ifdef SKALIBS_HASSIGNALFD
-
-#include <sys/signalfd.h>
-
-int selfpipe_init (void)
-{
- sigemptyset(&selfpipe_caught) ;
- selfpipe_fd = signalfd(selfpipe_fd, &selfpipe_caught, SFD_NONBLOCK | SFD_CLOEXEC) ;
- sig_blocknone() ;
- return selfpipe_fd ;
-}
-
-#else
-
-#include <skalibs/djbunix.h>
-
-int selfpipe_init (void)
-{
- if (selfpipe_fd >= 0) selfpipe_finish() ;
- sigemptyset(&selfpipe_caught) ;
- sig_blocknone() ;
- return pipenbcoe(selfpipe) < 0 ? -1 : selfpipe_fd ;
-}
-
-#endif
diff --git a/src/libstddjb/selfpipe_internal.c b/src/libstddjb/selfpipe_internal.c
deleted file mode 100644
index 45063bc..0000000
--- a/src/libstddjb/selfpipe_internal.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* ISC license. */
-
-/* MT-unsafe */
-
-#include <signal.h>
-
-#include <skalibs/sysdeps.h>
-#include "selfpipe-internal.h"
-
-sigset_t selfpipe_caught ;
-
-#ifdef SKALIBS_HASSIGNALFD
-
-int selfpipe_fd = -1 ;
-
-#else
-
-#include <unistd.h>
-#include <errno.h>
-
-#include <skalibs/allreadwrite.h>
-
-int selfpipe[2] = { -1, -1 } ;
-
-void selfpipe_tophalf (int s)
-{
- int e = errno ;
- unsigned char c = (unsigned char)s ;
- write(selfpipe[1], (char *)&c, 1) ;
- errno = e ;
-}
-
-#endif
diff --git a/src/libstddjb/selfpipe_read.c b/src/libstddjb/selfpipe_read.c
deleted file mode 100644
index 4bf1988..0000000
--- a/src/libstddjb/selfpipe_read.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* ISC license. */
-
-/* MT-unsafe */
-
-#include <skalibs/sysdeps.h>
-#include <skalibs/allreadwrite.h>
-#include <skalibs/selfpipe.h>
-#include "selfpipe-internal.h"
-
-#ifdef SKALIBS_HASSIGNALFD
-
-#include <sys/signalfd.h>
-
-int selfpipe_read (void)
-{
- struct signalfd_siginfo buf ;
- ssize_t r = sanitize_read(fd_read(selfpipe_fd, (char *)&buf, sizeof(struct signalfd_siginfo))) ;
- return (r <= 0) ? r : buf.ssi_signo ;
-}
-
-#else
-
-int selfpipe_read (void)
-{
- char c ;
- ssize_t r = sanitize_read((fd_read(selfpipe_fd, &c, 1))) ;
- return (r <= 0) ? r : c ;
-}
-
-#endif
-
diff --git a/src/libstddjb/selfpipe_trap.c b/src/libstddjb/selfpipe_trap.c
deleted file mode 100644
index 9970e8c..0000000
--- a/src/libstddjb/selfpipe_trap.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* ISC license. */
-
-/* MT-unsafe */
-
-#include <errno.h>
-#include <signal.h>
-
-#include <skalibs/sysdeps.h>
-#include <skalibs/selfpipe.h>
-#include "selfpipe-internal.h"
-
-#ifdef SKALIBS_HASSIGNALFD
-
-#include <sys/signalfd.h>
-
-int selfpipe_trap (int sig)
-{
- sigset_t ss = selfpipe_caught ;
- sigset_t old ;
- if (selfpipe_fd < 0) return (errno = EBADF, 0) ;
- if ((sigaddset(&ss, sig) < 0) || (sigprocmask(SIG_BLOCK, &ss, &old) < 0)) return 0 ;
- if (signalfd(selfpipe_fd, &ss, SFD_NONBLOCK | SFD_CLOEXEC) < 0)
- {
- int e = errno ;
- sigprocmask(SIG_SETMASK, &old, 0) ;
- errno = e ;
- return 0 ;
- }
- selfpipe_caught = ss ;
- return 1 ;
-}
-
-#else
-
-#include <skalibs/sig.h>
-
-int selfpipe_trap (int sig)
-{
- if (selfpipe_fd < 0) return (errno = EBADF, 0) ;
- if (!sig_catch(sig, &selfpipe_tophalf)) return 0 ;
- sigaddset(&selfpipe_caught, sig) ;
- sig_unblock(sig) ;
- return 1 ;
-}
-
-#endif
diff --git a/src/libstddjb/selfpipe_trapset.c b/src/libstddjb/selfpipe_trapset.c
deleted file mode 100644
index 3bb64d4..0000000
--- a/src/libstddjb/selfpipe_trapset.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ISC license. */
-
-#include <skalibs/sysdeps.h>
-
-#ifdef SKALIBS_HASSIGNALFD
-
-#include <errno.h>
-#include <signal.h>
-#include <sys/signalfd.h>
-
-#include <skalibs/selfpipe.h>
-#include "selfpipe-internal.h"
-
-int selfpipe_trapset (sigset_t const *set)
-{
- sigset_t old ;
- if (selfpipe_fd < 0) return (errno = EBADF, 0) ;
- if (sigprocmask(SIG_SETMASK, set, &old) < 0) return 0 ;
- if (signalfd(selfpipe_fd, set, SFD_NONBLOCK | SFD_CLOEXEC) < 0)
- {
- int e = errno ;
- sigprocmask(SIG_SETMASK, &old, 0) ;
- errno = e ;
- return 0 ;
- }
- selfpipe_caught = *set ;
- return 1 ;
-}
-
-#else
-
-#include <skalibs/nonposix.h>
-
-#include <errno.h>
-#include <signal.h>
-
-#include <skalibs/nsig.h>
-#include <skalibs/sig.h>
-#include <skalibs/selfpipe.h>
-#include "selfpipe-internal.h"
-
-int selfpipe_trapset (sigset_t const *set)
-{
- unsigned int i = 1 ;
- if (selfpipe_fd < 0) return (errno = EBADF, 0) ;
- for (; i < SKALIBS_NSIG ; i++)
- {
- int h = sigismember(set, i) ;
- if (h < 0) continue ;
- if (h)
- {
- if (!sig_catch(i, &selfpipe_tophalf)) goto err ;
- }
- else if (sigismember(&selfpipe_caught, i))
- {
- if (!sig_restore(i)) goto err ;
- }
- }
- sig_blocknone() ;
- selfpipe_caught = *set ;
- return 1 ;
-
- err:
- {
- int e = errno ;
- sig_restoreto(set, i) ;
- errno = e ;
- }
- return 0 ;
-}
-
-#endif
diff --git a/src/libstddjb/sig_restoreto.c b/src/libstddjb/sig_restoreto.c
index 1a9250e..e40f75b 100644
--- a/src/libstddjb/sig_restoreto.c
+++ b/src/libstddjb/sig_restoreto.c
@@ -2,12 +2,14 @@
/* MT-unsafe */
+#include <errno.h>
#include <signal.h>
#include <skalibs/sig.h>
void sig_restoreto (sigset_t const *set, unsigned int n)
{
+ int e = errno ;
unsigned int i = 1 ;
for (; i < n ; i++)
{
@@ -15,4 +17,5 @@ void sig_restoreto (sigset_t const *set, unsigned int n)
if (h < 0) continue ;
if (h) sig_restore(i) ;
}
+ errno = e ;
}