Hook BSD err(), errx(), warn(), warnx(), etc. functions.

err(), errx(), warn(), warnx(), verr(), verrx(), vwarn(), vwarnx() are
hooked.
This commit is contained in:
Simon Ruderich
2013-06-15 02:39:52 +02:00
parent 1068648718
commit 941370dda9
9 changed files with 199 additions and 2 deletions

View File

@@ -12,6 +12,11 @@ check_PROGRAMS = example example_exec
example_SOURCES = example.c
example_exec_SOURCES = example_exec.c
if HAVE_ERR_H
TESTS += test_err.sh
check_PROGRAMS += example_err
example_error_SOURCES = example_err.c
endif
if HAVE_ERROR_H
TESTS += test_error.sh
check_PROGRAMS += example_error
@@ -24,9 +29,11 @@ if HAVE_VFORK
endif
dist_check_SCRIPTS = $(TESTS) lib.sh
dist_check_DATA = example.expected \
dist_check_DATA = example.h \
example.expected \
example_environment.expected \
example_environment_empty.expected \
example_err.expected \
example_error.expected \
example_exec.expected \
example_noforce.sh \

38
tests/example.h Normal file
View File

@@ -0,0 +1,38 @@
/*
* Helper functions/macros for example files.
*
* Copyright (C) 2013 Simon Ruderich
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define FORKED_TEST(pid) \
pid = fork(); \
if (pid == -1) { \
perror("fork"); \
exit(EXIT_FAILURE); \
} else if (pid != 0) { \
int status; \
if (waitpid(pid, &status, 0) == -1) { \
perror("waitpid"); \
exit(EXIT_FAILURE); \
} \
if (WIFEXITED(status)) { \
printf("exit code: %d\n", WEXITSTATUS(status)); \
} else { \
printf("child terminated!\n"); \
} \
fflush(stdout); \
} else

51
tests/example_err.c Normal file
View File

@@ -0,0 +1,51 @@
/*
* Test err(), verr(), ... Non-standard, BSD only.
*
* Copyright (C) 2013 Simon Ruderich
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include <err.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "../src/compiler.h"
#include "example.h"
int main(int argc unused, char **argv unused) {
pid_t pid;
FORKED_TEST(pid) { errno = ENOMEM; err(0, "error: %s", "message"); }
FORKED_TEST(pid) { errno = ENOMEM; err(1, "error: %s", "message"); }
FORKED_TEST(pid) { errx(0, "error: %s", "message"); }
FORKED_TEST(pid) { errx(1, "error: %s", "message"); }
errno = ENOMEM;
warn("warning: %s", "message");
warnx("warning: %s", "message");
/* v*() functions are implicitly tested - the implementation uses them. */
printf("\n");
return EXIT_SUCCESS;
}

View File

@@ -0,0 +1,11 @@
>STDERR>example_err: error: message: Cannot allocate memory
<STDERR<exit code: 0
>STDERR>example_err: error: message: Cannot allocate memory
<STDERR<exit code: 1
>STDERR>example_err: error: message
<STDERR<exit code: 0
>STDERR>example_err: error: message
<STDERR<exit code: 1
>STDERR>example_err: warning: message: Cannot allocate memory
<STDERR<>STDERR>example_err: warning: message
<STDERR<

23
tests/test_err.sh Executable file
View File

@@ -0,0 +1,23 @@
#!/bin/sh
# Copyright (C) 2013 Simon Ruderich
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
test "x$srcdir" = x && srcdir=.
. "$srcdir/lib.sh"
test_program example_err
test_program_subshell example_err