diff --git a/tests/common/open_RDWR_failure.c b/tests/common/open_RDWR_failure.c new file mode 100644 index 00000000..b2ff8eb2 --- /dev/null +++ b/tests/common/open_RDWR_failure.c @@ -0,0 +1,51 @@ +/* + * gcc open_RDWR_failure.c -o open_RDWR_failure.so -shared -ldl + * LD_PRELOAD=./open_RDWR_failure.so FAILURE_PATH=/etc/shadow ./test /etc/shadow + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +typedef int (*open_type) (const char *pathname, int flag, ...); +static open_type next_open; + +static const char *failure_path = NULL; + +int open64 (const char *pathname, int flag, ...) +{ + if (NULL == next_open) + { + next_open = dlsym (RTLD_NEXT, "open64"); + assert (NULL != next_open); + } + if (NULL == failure_path) { + failure_path = getenv ("FAILURE_PATH"); + if (NULL == failure_path) { + fputs ("No FAILURE_PATH defined\n", stderr); + } + } + + if ( (NULL != pathname) + && (flag & O_RDWR) + && (NULL != failure_path) + && (strcmp (pathname, failure_path) == 0)) + { + fprintf (stderr, "open FAILURE %s %x ...\n", pathname, flag); + errno = EIO; + return -1; + } + + return next_open (pathname, flag); +} + diff --git a/tests/common/time_0.c b/tests/common/time_0.c new file mode 100644 index 00000000..6937361e --- /dev/null +++ b/tests/common/time_0.c @@ -0,0 +1,16 @@ +/* + * gcc time_0.c -o time_0.so -shared + * LD_PRELOAD=./time_0.so ./test + */ + +#include +#include + + +time_t time (time_t *t) +{ + fprintf (stderr, "time 0\n"); + + return (time_t)0; +} +