diff --git a/src/json.c b/src/json.c index adc491e..636f174 100644 --- a/src/json.c +++ b/src/json.c @@ -93,8 +93,8 @@ write_iov ( while (1) { ssize_t nbytes = writev(fd, bufv, bufcnt); if (unlikely(nbytes < 0)) { - int err = errno; - log_printf("writev(): %s", xstrerror(err)); + int err; + log_printf("writev(): %s", xstrerror_save(&err)); switch (err) { case EIO: diff --git a/src/xstd.c b/src/xstd.c index ee2b7b0..dc770d7 100644 --- a/src/xstd.c +++ b/src/xstd.c @@ -66,8 +66,8 @@ xfsync ( int fd ) { while (unlikely(0 != fsync(fd))) { - int err = errno; - log_printf("fsync(): %s", xstrerror(err)); + int err; + log_printf("fsync(): %s", xstrerror_save(&err)); switch (err) { case EIO: @@ -170,3 +170,13 @@ xstrerror ( } return err_str; } + +char const * +xstrerror_save ( + int *errnum_ptr +) { + int err = errno; + + *errnum_ptr = err; + return xstrerror(err); +} diff --git a/src/xstd.h b/src/xstd.h index 9720be3..0320d7d 100644 --- a/src/xstd.h +++ b/src/xstd.h @@ -169,4 +169,15 @@ xstrerror ( int errnum ); +/** + * Like xstrerror(), but takes `errno` as error number, + * and saves its value to `err_ptr`. + */ +BOOKMARKFS_INTERNAL +FUNCATTR_RETURNS_NONNULL +char const * +xstrerror_save ( + int *errnum_ptr +); + #endif /* !defined(BOOKMARKFS_XSTD_H_) */