|
|
#!/bin/sh |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
|
|
print_ver_ csplit |
|
|
require_gcc_shared_ |
|
|
|
|
|
if ! test -w /dev/full || ! test -c /dev/full; then |
|
|
skip_ '/dev/full is required' |
|
|
fi |
|
|
|
|
|
|
|
|
LC_ALL=C |
|
|
export LC_ALL |
|
|
|
|
|
|
|
|
cat > k.c <<'EOF' || framework_failure_ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t |
|
|
fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream) |
|
|
{ |
|
|
if (stream == stderr) |
|
|
{ |
|
|
/* Perform the normal operation of fwrite. */ |
|
|
const char *p = ptr; |
|
|
size_t count = size * nitems; |
|
|
size_t i; |
|
|
for (i = 0; i < count; i++) |
|
|
if (putc ((unsigned char) *p++, stream) == EOF) |
|
|
break; |
|
|
return i / size; |
|
|
} |
|
|
else |
|
|
{ |
|
|
fclose (fopen ("preloaded","w")); /* marker for preloaded interception */ |
|
|
errno = ENOSPC; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
size_t |
|
|
fwrite_unlocked (const void *ptr, size_t size, size_t nitems, FILE *stream) |
|
|
{ |
|
|
return fwrite (ptr, size, nitems, stream); |
|
|
} |
|
|
EOF |
|
|
|
|
|
|
|
|
returns_ 1 seq 1 >/dev/full 2>msgt || framework_failure_ |
|
|
sed 's/seq: write error: //' msgt > msg || framework_failure_ |
|
|
|
|
|
|
|
|
{ printf "%s" "csplit: write error for 'xx01': " ; cat msg ; } > exp \ |
|
|
|| framework_failure_ |
|
|
|
|
|
|
|
|
gcc_shared_ k.c k.so \ |
|
|
|| skip_ 'failed to build forced-fwrite-failure shared library' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
seq 10 | |
|
|
(export LD_PRELOAD=$LD_PRELOAD:./k.so |
|
|
returns_ 1 csplit - 1 4 2>out) || fail=1 |
|
|
|
|
|
test -e preloaded || skip_ 'LD_PRELOAD interception failed' |
|
|
|
|
|
|
|
|
compare exp out || fail=1 |
|
|
|
|
|
Exit $fail |
|
|
|