+ char const *, s)
+
+/* err(3), non standard BSD extension */
+#ifdef HAVE_ERR_H
+HOOK_VAR_VOID2(void, err, STDERR_FILENO, verr,
+ int, eval, char const *, fmt)
+HOOK_VAR_VOID2(void, errx, STDERR_FILENO, verrx,
+ int, eval, char const *, fmt)
+HOOK_VAR_VOID1(void, warn, STDERR_FILENO, vwarn,
+ char const *, fmt)
+HOOK_VAR_VOID1(void, warnx, STDERR_FILENO, vwarnx,
+ char const *, fmt)
+HOOK_FUNC_SIMPLE3(void, verr, int, eval, const char *, fmt, va_list, args) {
+ /* Can't use verr() directly as it terminates the process which prevents
+ * the post string from being printed. */
+ vwarn(fmt, args);
+ exit(eval);
+}
+HOOK_FUNC_SIMPLE3(void, verrx, int, eval, const char *, fmt, va_list, args) {
+ /* See verr(). */
+ vwarnx(fmt, args);
+ exit(eval);
+}
+HOOK_VOID2(void, vwarn, STDERR_FILENO,
+ char const *, fmt, va_list, args)
+HOOK_VOID2(void, vwarnx, STDERR_FILENO,
+ char const *, fmt, va_list, args)
+#endif
+
+/* error(3), non-standard GNU extension */
+#ifdef HAVE_ERROR_H
+static void error_vararg(int status, int errnum,
+ char const *filename, unsigned int linenum,
+ char const *format, va_list ap) {
+ static char const *last_filename;
+ static unsigned int last_linenum;
+
+ /* Skip this error message if requested and if there was already an error
+ * in the same file/line. */
+ if (error_one_per_line
+ && filename != NULL && linenum != 0
+ && filename == last_filename && linenum == last_linenum) {
+ return;
+ }
+ last_filename = filename;
+ last_linenum = linenum;
+
+ error_message_count++;
+
+ fflush(stdout);
+
+ if (error_print_progname) {
+ error_print_progname();
+ } else {
+ fprintf(stderr, "%s:", program_invocation_name);
+ }
+ if (filename != NULL && linenum != 0) {
+ fprintf(stderr, "%s:%u:", filename, linenum);
+ if (error_print_progname) {
+ fprintf(stderr, " ");
+ }
+ }
+ if (!error_print_progname) {
+ fprintf(stderr, " ");
+ }
+
+
+ vfprintf(stderr, format, ap);
+
+ if (errnum != 0) {
+ fprintf(stderr, ": %s", strerror(errnum));
+ }
+
+ fprintf(stderr, "\n");
+
+ if (status != 0) {
+ exit(status);
+ }
+}
+void error_at_line(int status, int errnum,
+ char const *filename, unsigned int linenum,
+ char const *format, ...) {
+ va_list ap;
+
+ va_start(ap, format);
+ error_vararg(status, errnum, filename, linenum, format, ap);
+ va_end(ap);
+}
+void error(int status, int errnum, char const *format, ...) {
+ va_list ap;
+
+ va_start(ap, format);
+ error_vararg(status, errnum, NULL, 0, format, ap);
+ va_end(ap);
+}
+#endif