aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstddjb
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-01-01 13:47:45 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-01-01 13:47:45 +0000
commite99182dab3093f1645f9e4ff216aa752d7443fb1 (patch)
tree175a373c32a58783edd41901d4baf6e68626c7ec /src/libstddjb
parent45137c6466050c9468931713a7504eae3d08bfce (diff)
downloadskalibs-e99182dab3093f1645f9e4ff216aa752d7443fb1.tar.gz
Save/restore errno in all safe wrappers
Diffstat (limited to 'src/libstddjb')
-rw-r--r--src/libstddjb/dir_close.c1
-rw-r--r--src/libstddjb/fd_chdir.c8
-rw-r--r--src/libstddjb/fd_chmod.c10
-rw-r--r--src/libstddjb/fd_chown.c8
-rw-r--r--src/libstddjb/fd_copy.c8
-rw-r--r--src/libstddjb/fd_move.c7
-rw-r--r--src/libstddjb/fd_read.c5
-rw-r--r--src/libstddjb/fd_readv.c3
-rw-r--r--src/libstddjb/fd_recv.c5
-rw-r--r--src/libstddjb/fd_send.c5
-rw-r--r--src/libstddjb/fd_sync.c2
-rw-r--r--src/libstddjb/fd_write.c5
-rw-r--r--src/libstddjb/fd_writev.c5
-rw-r--r--src/libstddjb/iopause_stamp.c17
-rw-r--r--src/libstddjb/ipc_accept.c13
-rw-r--r--src/libstddjb/ipc_connect.c1
-rw-r--r--src/libstddjb/ipc_recv.c7
-rw-r--r--src/libstddjb/open2.c4
-rw-r--r--src/libstddjb/open3.c4
-rw-r--r--src/libstddjb/socket_accept4.c10
-rw-r--r--src/libstddjb/socket_accept6.c10
-rw-r--r--src/libstddjb/socket_connect4.c6
-rw-r--r--src/libstddjb/socket_connect6.c6
-rw-r--r--src/libstddjb/socket_recv4.c4
-rw-r--r--src/libstddjb/socket_recv6.c4
-rw-r--r--src/libstddjb/socket_send4.c4
-rw-r--r--src/libstddjb/socket_send6.c4
-rw-r--r--src/libstddjb/wait_nointr.c8
-rw-r--r--src/libstddjb/wait_reap.c4
-rw-r--r--src/libstddjb/waitpid_nointr.c5
30 files changed, 125 insertions, 58 deletions
diff --git a/src/libstddjb/dir_close.c b/src/libstddjb/dir_close.c
index 4c5d0cf..946f512 100644
--- a/src/libstddjb/dir_close.c
+++ b/src/libstddjb/dir_close.c
@@ -1,6 +1,7 @@
/* ISC license. */
#include <errno.h>
+
#include <skalibs/direntry.h>
void dir_close (DIR *dir)
diff --git a/src/libstddjb/fd_chdir.c b/src/libstddjb/fd_chdir.c
index f506ccc..e295017 100644
--- a/src/libstddjb/fd_chdir.c
+++ b/src/libstddjb/fd_chdir.c
@@ -2,13 +2,15 @@
#include <unistd.h>
#include <errno.h>
+
#include <skalibs/djbunix.h>
int fd_chdir (int d)
{
+ int e = errno ;
int r ;
- do
- r = fchdir(d) ;
- while ((r == -1) && (errno == EINTR)) ;
+ do r = fchdir(d) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_chmod.c b/src/libstddjb/fd_chmod.c
index be0e0b8..e882711 100644
--- a/src/libstddjb/fd_chmod.c
+++ b/src/libstddjb/fd_chmod.c
@@ -1,16 +1,20 @@
/* ISC license. */
/* OpenBSD manages to bork the fchmod declaration */
+
#include <skalibs/nonposix.h>
+
#include <sys/stat.h>
#include <errno.h>
+
#include <skalibs/djbunix.h>
int fd_chmod (int fd, unsigned int mode)
{
+ int e = errno ;
int r ;
- do
- r = fchmod(fd, (mode_t)mode) ;
- while ((r == -1) && (errno == EINTR)) ;
+ do r = fchmod(fd, (mode_t)mode) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_chown.c b/src/libstddjb/fd_chown.c
index 80e98c7..7f2fcab 100644
--- a/src/libstddjb/fd_chown.c
+++ b/src/libstddjb/fd_chown.c
@@ -2,13 +2,15 @@
#include <unistd.h>
#include <errno.h>
+
#include <skalibs/djbunix.h>
int fd_chown (int fd, uid_t uid, gid_t gid)
{
+ int e = errno ;
int r ;
- do
- r = fchown(fd, uid, gid) ;
- while ((r == -1) && (errno == EINTR)) ;
+ do r = fchown(fd, uid, gid) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_copy.c b/src/libstddjb/fd_copy.c
index 80b887e..1afad1f 100644
--- a/src/libstddjb/fd_copy.c
+++ b/src/libstddjb/fd_copy.c
@@ -2,14 +2,16 @@
#include <unistd.h>
#include <errno.h>
+
#include <skalibs/djbunix.h>
int fd_copy (int to, int from)
{
+ int e = errno ;
int r ;
if (to == from) return (errno = EINVAL, -1) ;
- do
- r = dup2(from, to) ;
- while ((r == -1) && (errno == EINTR)) ;
+ do r = dup2(from, to) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_move.c b/src/libstddjb/fd_move.c
index c35e4d6..09662aa 100644
--- a/src/libstddjb/fd_move.c
+++ b/src/libstddjb/fd_move.c
@@ -7,12 +7,13 @@
int fd_move (int to, int from)
{
+ int e = errno ;
int r ;
if (to == from) return uncoe(to) ;
- do
- r = dup2(from, to) ;
- while ((r == -1) && (errno == EINTR)) ;
+ do r = dup2(from, to) ;
+ while (r == -1 && errno == EINTR) ;
if (r < 0) return r ;
+ errno = e ;
fd_close(from) ;
return 0 ;
}
diff --git a/src/libstddjb/fd_read.c b/src/libstddjb/fd_read.c
index 43453b8..dc6f985 100644
--- a/src/libstddjb/fd_read.c
+++ b/src/libstddjb/fd_read.c
@@ -2,12 +2,15 @@
#include <unistd.h>
#include <errno.h>
+
#include <skalibs/allreadwrite.h>
ssize_t fd_read (int fd, char *buf, size_t len)
{
+ int e = errno ;
ssize_t r ;
do r = read(fd, buf, len) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_readv.c b/src/libstddjb/fd_readv.c
index 0d384a4..10f2374 100644
--- a/src/libstddjb/fd_readv.c
+++ b/src/libstddjb/fd_readv.c
@@ -2,12 +2,15 @@
#include <sys/uio.h>
#include <errno.h>
+
#include <skalibs/allreadwrite.h>
ssize_t fd_readv (int fd, struct iovec const *v, unsigned int vlen)
{
+ int e = errno ;
ssize_t r ;
do r = readv(fd, v, vlen) ;
while ((r == -1) && (errno == EINTR)) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_recv.c b/src/libstddjb/fd_recv.c
index 7cca4de..dd56c73 100644
--- a/src/libstddjb/fd_recv.c
+++ b/src/libstddjb/fd_recv.c
@@ -2,12 +2,15 @@
#include <sys/socket.h>
#include <errno.h>
+
#include <skalibs/allreadwrite.h>
ssize_t fd_recv (int fd, char *buf, size_t len, unsigned int flags)
{
+ int e = errno ;
ssize_t r ;
do r = recv(fd, buf, len, flags) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_send.c b/src/libstddjb/fd_send.c
index 6b6cd02..8727afa 100644
--- a/src/libstddjb/fd_send.c
+++ b/src/libstddjb/fd_send.c
@@ -2,12 +2,15 @@
#include <sys/socket.h>
#include <errno.h>
+
#include <skalibs/allreadwrite.h>
ssize_t fd_send (int fd, char const *buf, size_t len, unsigned int flags)
{
+ int e = errno ;
ssize_t r ;
do r = send(fd, buf, len, flags) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_sync.c b/src/libstddjb/fd_sync.c
index 4506523..45247fe 100644
--- a/src/libstddjb/fd_sync.c
+++ b/src/libstddjb/fd_sync.c
@@ -7,8 +7,10 @@
int fd_sync (int fd)
{
+ int e = errno ;
int r ;
do r = fsync(fd) ;
while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_write.c b/src/libstddjb/fd_write.c
index a93c2d9..96bdaf6 100644
--- a/src/libstddjb/fd_write.c
+++ b/src/libstddjb/fd_write.c
@@ -2,12 +2,15 @@
#include <unistd.h>
#include <errno.h>
+
#include <skalibs/allreadwrite.h>
ssize_t fd_write (int fd, char const *buf, size_t len)
{
+ int e = errno ;
ssize_t r ;
do r = write(fd, buf, len) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/fd_writev.c b/src/libstddjb/fd_writev.c
index 61f7132..ce9dd17 100644
--- a/src/libstddjb/fd_writev.c
+++ b/src/libstddjb/fd_writev.c
@@ -2,12 +2,15 @@
#include <sys/uio.h>
#include <errno.h>
+
#include <skalibs/allreadwrite.h>
ssize_t fd_writev (int fd, struct iovec const *v, unsigned int vlen)
{
+ int e = errno ;
ssize_t r ;
do r = writev(fd, v, vlen) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/iopause_stamp.c b/src/libstddjb/iopause_stamp.c
index a2ac8fa..890909b 100644
--- a/src/libstddjb/iopause_stamp.c
+++ b/src/libstddjb/iopause_stamp.c
@@ -1,22 +1,17 @@
/* ISC license. */
#include <errno.h>
+
#include <skalibs/tai.h>
#include <skalibs/iopause.h>
int iopause_stamp (iopause_fd *x, unsigned int n, tain const *deadline, tain *stamp)
{
+ int e = errno ;
int r ;
- do
- {
- r = iopause(x, n, deadline, stamp) ;
- if (stamp)
- {
- int e = errno ;
- tain_now(stamp) ;
- errno = e ;
- }
- }
- while ((r < 0) && (errno == EINTR)) ;
+ do r = iopause(x, n, deadline, stamp) ;
+ while (r == -1 && errno == EINTR) ;
+ if (stamp) tain_now(stamp) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/ipc_accept.c b/src/libstddjb/ipc_accept.c
index 83886ff..1a6f48d 100644
--- a/src/libstddjb/ipc_accept.c
+++ b/src/libstddjb/ipc_accept.c
@@ -2,6 +2,7 @@
#include <skalibs/sysdeps.h>
#include <skalibs/nonposix.h>
+
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
@@ -14,33 +15,35 @@
int ipc_accept_internal (int s, char *p, size_t l, int *trunc, unsigned int options)
{
+ int e = errno ;
struct sockaddr_un sa ;
socklen_t dummy = sizeof sa ;
int fd ;
memset(&sa, 0, dummy) ;
do
#ifdef SKALIBS_HASACCEPT4
- fd = accept4(s, (struct sockaddr *)&sa, &dummy, ((options & O_NONBLOCK) ? SOCK_NONBLOCK : 0) | ((options & O_CLOEXEC) ? SOCK_CLOEXEC : 0)) ;
+ fd = accept4(s, (struct sockaddr *)&sa, &dummy, (options & O_NONBLOCK ? SOCK_NONBLOCK : 0) | (options & O_CLOEXEC ? SOCK_CLOEXEC : 0)) ;
#else
fd = accept(s, (struct sockaddr *)&sa, &dummy) ;
#endif
- while ((fd == -1) && (errno == EINTR)) ;
+ while (fd == -1 && errno == EINTR) ;
if (fd == -1) return -1 ;
#ifndef SKALIBS_HASACCEPT4
- if ((((options & O_NONBLOCK) ? ndelay_on(fd) : ndelay_off(fd)) < 0)
- || (((options & O_CLOEXEC) ? coe(fd) : uncoe(fd)) < 0))
+ if (((options & O_NONBLOCK ? ndelay_on(fd) : ndelay_off(fd)) == -1)
+ || ((options & O_CLOEXEC ? coe(fd) : uncoe(fd)) == -1))
{
fd_close(fd) ;
return -1 ;
}
#endif
+ errno = e ;
if (p)
{
dummy = byte_chr(sa.sun_path, dummy, 0) ;
*trunc = 1 ;
if (!l) return fd ;
- if (l < (dummy + 1)) dummy = l - 1 ;
+ if (l < dummy + 1) dummy = l - 1 ;
else *trunc = 0 ;
memcpy(p, sa.sun_path, dummy) ;
p[dummy] = 0 ;
diff --git a/src/libstddjb/ipc_connect.c b/src/libstddjb/ipc_connect.c
index 7ccba09..339a0f0 100644
--- a/src/libstddjb/ipc_connect.c
+++ b/src/libstddjb/ipc_connect.c
@@ -1,6 +1,7 @@
/* ISC license. */
#include <skalibs/nonposix.h>
+
#include <errno.h>
#include <sys/socket.h>
#include <sys/un.h>
diff --git a/src/libstddjb/ipc_recv.c b/src/libstddjb/ipc_recv.c
index 407b3cc..695a524 100644
--- a/src/libstddjb/ipc_recv.c
+++ b/src/libstddjb/ipc_recv.c
@@ -1,6 +1,7 @@
/* ISC license. */
#include <skalibs/nonposix.h>
+
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
@@ -11,14 +12,16 @@
ssize_t ipc_recv (int fd, char *s, size_t len, char *path)
{
+ int e = errno ;
struct sockaddr_un sa = { .sun_family = AF_UNIX } ;
socklen_t total = sizeof sa ;
char tmp[len] ;
ssize_t r ;
do r = recvfrom(fd, tmp, len, 0, (struct sockaddr *)&sa, &total) ;
- while ((r == -1) && (errno == EINTR)) ;
- if (r < 0) return r ;
+ while (r == -1 && errno == EINTR) ;
+ if (r == -1) return r ;
if (sa.sun_family != AF_UNIX) return (errno = EPROTO, -1) ;
+ errno = e ;
if (path)
{
if (total == sizeof(sa_family_t)) path[0] = 0 ;
diff --git a/src/libstddjb/open2.c b/src/libstddjb/open2.c
index 0f23183..cf3e740 100644
--- a/src/libstddjb/open2.c
+++ b/src/libstddjb/open2.c
@@ -13,9 +13,11 @@
int open2 (char const *s, unsigned int flags)
{
+ int e = errno ;
int r ;
do r = open(s, flags) ;
while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
@@ -23,6 +25,7 @@ int open2 (char const *s, unsigned int flags)
int open2 (char const *s, unsigned int flags)
{
+ int e = errno ;
int fd ;
do fd = open(s, flags & ~O_CLOEXEC) ;
while (fd == -1 && errno == EINTR) ;
@@ -32,6 +35,7 @@ int open2 (char const *s, unsigned int flags)
fd_close(fd) ;
return -1 ;
}
+ errno = e ;
return fd ;
}
diff --git a/src/libstddjb/open3.c b/src/libstddjb/open3.c
index a9ff9e6..b7e5a4e 100644
--- a/src/libstddjb/open3.c
+++ b/src/libstddjb/open3.c
@@ -13,9 +13,11 @@
int open3 (char const *s, unsigned int flags, unsigned int mode)
{
+ int e = errno ;
int r ;
do r = open(s, flags, mode) ;
while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
@@ -23,6 +25,7 @@ int open3 (char const *s, unsigned int flags, unsigned int mode)
int open3 (char const *s, unsigned int flags, unsigned int mode)
{
+ int e = errno ;
int fd ;
do fd = open(s, flags & ~O_CLOEXEC, mode) ;
while (fd == -1 && errno == EINTR) ;
@@ -32,6 +35,7 @@ int open3 (char const *s, unsigned int flags, unsigned int mode)
fd_close(fd) ;
return -1 ;
}
+ errno = e ;
return fd ;
}
diff --git a/src/libstddjb/socket_accept4.c b/src/libstddjb/socket_accept4.c
index 0c11023..8045092 100644
--- a/src/libstddjb/socket_accept4.c
+++ b/src/libstddjb/socket_accept4.c
@@ -15,25 +15,27 @@
int socket_accept4_internal (int s, char *ip, uint16_t *port, unsigned int options)
{
+ int e = errno ;
int fd ;
struct sockaddr_in sa ;
socklen_t dummy = sizeof sa ;
do
#ifdef SKALIBS_HASACCEPT4
- fd = accept4(s, (struct sockaddr *)&sa, &dummy, ((options & O_NONBLOCK) ? SOCK_NONBLOCK : 0) | ((options & O_CLOEXEC) ? SOCK_CLOEXEC : 0)) ;
+ fd = accept4(s, (struct sockaddr *)&sa, &dummy, (options & O_NONBLOCK ? SOCK_NONBLOCK : 0) | (options & O_CLOEXEC ? SOCK_CLOEXEC : 0)) ;
#else
fd = accept(s, (struct sockaddr *)&sa, &dummy) ;
#endif
- while ((fd < 0) && (errno == EINTR)) ;
+ while (fd == -1 && errno == EINTR) ;
if (fd < 0) return -1 ;
#ifndef SKALIBS_HASACCEPT4
- if ((((options & O_NONBLOCK) ? ndelay_on(fd) : ndelay_off(fd)) < 0)
- || (((options & O_CLOEXEC) ? coe(fd) : uncoe(fd)) < 0))
+ if (((options & O_NONBLOCK ? ndelay_on(fd) : ndelay_off(fd)) == -1)
+ || ((options & O_CLOEXEC ? coe(fd) : uncoe(fd)) == -1))
{
fd_close(fd) ;
return -1 ;
}
#endif
+ errno = e ;
memcpy(ip, &sa.sin_addr.s_addr, 4) ;
*port = uint16_big(sa.sin_port) ;
return fd ;
diff --git a/src/libstddjb/socket_accept6.c b/src/libstddjb/socket_accept6.c
index 229178d..c20b8b1 100644
--- a/src/libstddjb/socket_accept6.c
+++ b/src/libstddjb/socket_accept6.c
@@ -18,25 +18,27 @@
int socket_accept6_internal (int s, char *ip6, uint16_t *port, unsigned int options)
{
+ int e = errno ;
int fd ;
struct sockaddr_in6 sa ;
socklen_t dummy = sizeof sa ;
do
#ifdef SKALIBS_HASACCEPT4
- fd = accept4(s, (struct sockaddr *)&sa, &dummy, ((options & O_NONBLOCK) ? SOCK_NONBLOCK : 0) | ((options & O_CLOEXEC) ? SOCK_CLOEXEC : 0)) ;
+ fd = accept4(s, (struct sockaddr *)&sa, &dummy, (options & O_NONBLOCK ? SOCK_NONBLOCK : 0) | (options & O_CLOEXEC ? SOCK_CLOEXEC : 0)) ;
#else
fd = accept(s, (struct sockaddr *)&sa, &dummy) ;
#endif
- while ((fd < 0) && (errno == EINTR)) ;
+ while (fd == -1 && errno == EINTR) ;
if (fd < 0) return -1 ;
#ifndef SKALIBS_HASACCEPT4
- if ((((options & O_NONBLOCK) ? ndelay_on(fd) : ndelay_off(fd)) < 0)
- || (((options & O_CLOEXEC) ? coe(fd) : uncoe(fd)) < 0))
+ if (((options & O_NONBLOCK ? ndelay_on(fd) : ndelay_off(fd)) == -1)
+ || ((options & O_CLOEXEC ? coe(fd) : uncoe(fd)) == -1))
{
fd_close(fd) ;
return -1 ;
}
#endif
+ errno = e ;
memcpy(ip6, sa.sin6_addr.s6_addr, 16) ;
*port = uint16_big(sa.sin6_port) ;
return fd ;
diff --git a/src/libstddjb/socket_connect4.c b/src/libstddjb/socket_connect4.c
index a6dcadf..634044e 100644
--- a/src/libstddjb/socket_connect4.c
+++ b/src/libstddjb/socket_connect4.c
@@ -12,6 +12,7 @@
int socket_connect4 (int s, char const *ip, uint16_t port)
{
+ int e = errno ;
int r ;
struct sockaddr_in sa ;
memset(&sa, 0, sizeof sa) ;
@@ -19,7 +20,8 @@ int socket_connect4 (int s, char const *ip, uint16_t port)
sa.sin_port = uint16_big(port) ;
memcpy(&sa.sin_addr.s_addr, ip, 4) ;
do r = connect(s, (struct sockaddr *)&sa, sizeof sa) ;
- while ((r == -1) && (errno == EINTR)) ;
- if ((r == -1) && (errno == EALREADY)) errno = EINPROGRESS ;
+ while (r == -1 && errno == EINTR) ;
+ if (r == -1 && errno == EALREADY) errno = EINPROGRESS ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/socket_connect6.c b/src/libstddjb/socket_connect6.c
index f5186e0..93bb164 100644
--- a/src/libstddjb/socket_connect6.c
+++ b/src/libstddjb/socket_connect6.c
@@ -15,6 +15,7 @@
int socket_connect6 (int s, char const *ip6, uint16_t port)
{
+ int e = errno ;
struct sockaddr_in6 sa ;
int r ;
memset(&sa, 0, sizeof sa) ;
@@ -22,8 +23,9 @@ int socket_connect6 (int s, char const *ip6, uint16_t port)
sa.sin6_port = uint16_big(port) ;
memcpy(sa.sin6_addr.s6_addr, ip6, 16) ;
do r = connect(s, (struct sockaddr *)&sa, sizeof sa) ;
- while ((r == -1) && (errno == EINTR)) ;
- if ((r == -1) && (errno == EALREADY)) errno = EINPROGRESS ;
+ while (r == -1 && errno == EINTR) ;
+ if (r == -1 && errno == EALREADY) errno = EINPROGRESS ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/socket_recv4.c b/src/libstddjb/socket_recv4.c
index afaaa9a..d9484bf 100644
--- a/src/libstddjb/socket_recv4.c
+++ b/src/libstddjb/socket_recv4.c
@@ -12,12 +12,14 @@
ssize_t socket_recv4 (int s, char *buf, size_t len, char *ip, uint16_t *port)
{
+ int e = errno ;
ssize_t r ;
struct sockaddr_in sa ;
socklen_t dummy = sizeof sa ;
do r = recvfrom(s, buf, len, 0, (struct sockaddr *)&sa, &dummy) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
if (r == -1) return -1 ;
+ errno = e ;
memcpy(ip, &sa.sin_addr, 4) ;
*port = uint16_big(sa.sin_port) ;
return r ;
diff --git a/src/libstddjb/socket_recv6.c b/src/libstddjb/socket_recv6.c
index fccb4f5..0c2112f 100644
--- a/src/libstddjb/socket_recv6.c
+++ b/src/libstddjb/socket_recv6.c
@@ -15,12 +15,14 @@
ssize_t socket_recv6 (int s, char *buf, size_t len, char *ip6, uint16_t *port)
{
+ int e = errno ;
struct sockaddr_in6 sa ;
socklen_t dummy = sizeof sa ;
ssize_t r ;
do r = recvfrom(s, buf, len, 0, (struct sockaddr *)&sa, &dummy) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
if (r == -1) return -1 ;
+ errno = e ;
memcpy(ip6, sa.sin6_addr.s6_addr, 16) ;
*port = uint16_big(sa.sin6_port) ;
return r ;
diff --git a/src/libstddjb/socket_send4.c b/src/libstddjb/socket_send4.c
index 81e991f..9252b11 100644
--- a/src/libstddjb/socket_send4.c
+++ b/src/libstddjb/socket_send4.c
@@ -12,6 +12,7 @@
ssize_t socket_send4 (int s, char const *buf, size_t len, char const *ip, uint16_t port)
{
+ int e = errno ;
ssize_t r ;
struct sockaddr_in sa ;
memset(&sa, 0, sizeof sa) ;
@@ -19,6 +20,7 @@ ssize_t socket_send4 (int s, char const *buf, size_t len, char const *ip, uint16
sa.sin_port = uint16_big(port) ;
memcpy(&sa.sin_addr, ip, 4) ;
do r = sendto(s, buf, len, 0, (struct sockaddr *)&sa, sizeof sa) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/socket_send6.c b/src/libstddjb/socket_send6.c
index 6eb276b..aa3b159 100644
--- a/src/libstddjb/socket_send6.c
+++ b/src/libstddjb/socket_send6.c
@@ -15,6 +15,7 @@
ssize_t socket_send6 (int s, char const *buf, size_t len, char const *ip6, uint16_t port)
{
+ int e = errno ;
ssize_t r ;
struct sockaddr_in6 sa ;
memset(&sa, 0, sizeof sa) ;
@@ -22,7 +23,8 @@ ssize_t socket_send6 (int s, char const *buf, size_t len, char const *ip6, uint1
sa.sin6_port = uint16_big(port) ;
memcpy(sa.sin6_addr.s6_addr, ip6, 16) ;
do r = sendto(s, buf, len, 0, (struct sockaddr *)&sa, sizeof sa) ;
- while ((r == -1) && (errno == EINTR)) ;
+ while (r == -1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/wait_nointr.c b/src/libstddjb/wait_nointr.c
index 4e7a17a..6b7d606 100644
--- a/src/libstddjb/wait_nointr.c
+++ b/src/libstddjb/wait_nointr.c
@@ -2,13 +2,15 @@
#include <sys/wait.h>
#include <errno.h>
+
#include <skalibs/djbunix.h>
pid_t wait_nointr (int *wstat)
{
+ int e = errno ;
pid_t r ;
- do
- r = wait(wstat) ;
- while ((r == (pid_t)-1) && (errno == EINTR)) ;
+ do r = wait(wstat) ;
+ while (r == (pid_t)-1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}
diff --git a/src/libstddjb/wait_reap.c b/src/libstddjb/wait_reap.c
index 051b11e..e0de653 100644
--- a/src/libstddjb/wait_reap.c
+++ b/src/libstddjb/wait_reap.c
@@ -1,11 +1,15 @@
/* ISC license. */
+#include <errno.h>
+
#include <skalibs/djbunix.h>
unsigned int wait_reap ()
{
+ int e = errno ;
unsigned int n = 0 ;
int wstat ;
while (wait_nohang(&wstat) > 0) n++ ;
+ errno = e ;
return n ;
}
diff --git a/src/libstddjb/waitpid_nointr.c b/src/libstddjb/waitpid_nointr.c
index 838359f..aa30342 100644
--- a/src/libstddjb/waitpid_nointr.c
+++ b/src/libstddjb/waitpid_nointr.c
@@ -2,12 +2,15 @@
#include <sys/wait.h>
#include <errno.h>
+
#include <skalibs/djbunix.h>
pid_t waitpid_nointr (pid_t pid, int *wstat, int flags)
{
+ int e = errno ;
pid_t r ;
do r = waitpid(pid, wstat, flags) ;
- while ((r == (pid_t)-1) && (errno == EINTR)) ;
+ while (r == (pid_t)-1 && errno == EINTR) ;
+ if (r >= 0) errno = e ;
return r ;
}