diff --git a/configure.ac b/configure.ac index e704168..7878743 100644 --- a/configure.ac +++ b/configure.ac @@ -257,6 +257,8 @@ AC_CHECK_FUNCS([\ need_arc4random=yes need_bsd_getopt=yes +need_err=yes +need_errc=yes need_progname=yes need_md5=yes need_nlist=yes @@ -271,6 +273,7 @@ AS_CASE([$host_os], # On glibc >= 2.38, strlcpy() and strlcat() got added, # so these could then be dropped on the next SOVERSION bump. #need_strl=no + need_err=no ], [*-musl*], [ # On musl >= 0.5.0, strlcpy() and strlcat() were already implemented, @@ -279,6 +282,7 @@ AS_CASE([$host_os], # On musl >= 0.9.7, optreset got implemented, so bsd_getopt() can then # be dropped on the next SOVERSION bump. #need_bsd_getopt=no + need_err=no # On musl >= 1.1.19, fopencookie() got implemented, and because we were # checking for its presence to decide whether to build funopen(), it got # included in builds even when previously it had not been included, which @@ -292,6 +296,8 @@ AS_CASE([$host_os], # there, so we can avoid providing these with no ABI breakage. need_arc4random=no need_bsd_getopt=no + need_err=no + need_errc=no need_progname=no need_transparent_libmd=no need_md5=no @@ -310,6 +316,8 @@ AM_CONDITIONAL([HAVE_GETENTROPY], [test "x$ac_cv_func_getentropy" = "xyes"]) AM_CONDITIONAL([NEED_ARC4RANDOM], [test "x$need_arc4random" = "xyes"]) AM_CONDITIONAL([NEED_BSD_GETOPT], [test "x$need_bsd_getopt" = "xyes"]) +AM_CONDITIONAL([NEED_ERR], [test "x$need_err" = "xyes"]) +AM_CONDITIONAL([NEED_ERRC], [test "x$need_errc" = "xyes"]) AM_CONDITIONAL([NEED_PROGNAME], [test "x$need_progname" = "xyes"]) AM_CONDITIONAL([NEED_TRANSPARENT_LIBMD], [test "x$need_transparent_libmd" = "xyes"]) AM_CONDITIONAL([NEED_MD5], [test "x$need_md5" = "xyes"]) diff --git a/man/Makefile.am b/man/Makefile.am index 1223557..b878fef 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -168,7 +168,6 @@ dist_man_MANS = \ byteorder.3bsd \ closefrom.3bsd \ dehumanize_number.3bsd \ - errc.3bsd \ expand_number.3bsd \ explicit_bzero.3bsd \ fgetln.3bsd \ @@ -238,6 +237,12 @@ dist_man_MANS = \ vis.3bsd \ # EOL +if NEED_ERRC +dist_man_MANS += \ + errc.3bsd \ + # EOL +endif + if NEED_PROGNAME dist_man_MANS += \ getprogname.3bsd \ diff --git a/src/Makefile.am b/src/Makefile.am index 1c350b8..1877ad6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -78,7 +78,6 @@ endif libbsd_la_SOURCES = \ closefrom.c \ dehumanize_number.c \ - err.c \ expand_number.c \ explicit_bzero.c \ fgetln.c \ @@ -114,6 +113,18 @@ libbsd_la_SOURCES = \ vis.c \ # EOL +if NEED_ERR +libbsd_la_SOURCES += \ + err.c \ + # EOL +endif + +if NEED_ERRC +libbsd_la_SOURCES += \ + errc.c \ + # EOL +endif + if NEED_PROGNAME libbsd_la_SOURCES += \ progname.c \ diff --git a/src/err.c b/src/err.c index 8f09972..44359e8 100644 --- a/src/err.c +++ b/src/err.c @@ -1,6 +1,5 @@ /* - * Copyright © 2006 Robert Millan - * Copyright © 2011, 2019 Guillem Jover + * Copyright © 2019 Guillem Jover * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,58 +25,12 @@ */ #include -#ifdef LIBBSD_NEED_ERR_H_FUNCS #include -#endif #include #include #include #include -void -vwarnc(int code, const char *format, va_list ap) -{ - fprintf(stderr, "%s: ", getprogname()); - if (format) { - vfprintf(stderr, format, ap); - fprintf(stderr, ": "); - } - fprintf(stderr, "%s\n", strerror(code)); -} - -void -warnc(int code, const char *format, ...) -{ - va_list ap; - - va_start(ap, format); - vwarnc(code, format, ap); - va_end(ap); -} - -void -verrc(int status, int code, const char *format, va_list ap) -{ - fprintf(stderr, "%s: ", getprogname()); - if (format) { - vfprintf(stderr, format, ap); - fprintf(stderr, ": "); - } - fprintf(stderr, "%s\n", strerror(code)); - exit(status); -} - -void -errc(int status, int code, const char *format, ...) -{ - va_list ap; - - va_start(ap, format); - verrc(status, code, format, ap); - va_end(ap); -} - -#ifdef LIBBSD_NEED_ERR_H_FUNCS void vwarn(const char *format, va_list ap) { @@ -148,4 +101,3 @@ errx(int eval, const char *format, ...) verrx(eval, format, ap); va_end(ap); } -#endif diff --git a/src/errc.c b/src/errc.c new file mode 100644 index 0000000..45f1b61 --- /dev/null +++ b/src/errc.c @@ -0,0 +1,75 @@ +/* + * Copyright © 2006 Robert Millan + * Copyright © 2011, 2019 Guillem Jover + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +void +vwarnc(int code, const char *format, va_list ap) +{ + fprintf(stderr, "%s: ", getprogname()); + if (format) { + vfprintf(stderr, format, ap); + fprintf(stderr, ": "); + } + fprintf(stderr, "%s\n", strerror(code)); +} + +void +warnc(int code, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + vwarnc(code, format, ap); + va_end(ap); +} + +void +verrc(int status, int code, const char *format, va_list ap) +{ + fprintf(stderr, "%s: ", getprogname()); + if (format) { + vfprintf(stderr, format, ap); + fprintf(stderr, ": "); + } + fprintf(stderr, "%s\n", strerror(code)); + exit(status); +} + +void +errc(int status, int code, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + verrc(status, code, format, ap); + va_end(ap); +}