2007-11-16 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+ Diagnose write errors in config.status instantiations.
+ * lib/autoconf/status.m4 (_AC_OUTPUT_FILE)
+ (_AC_OUTPUT_HEADER, _AC_OUTPUT_MAIN_LOOP): Bail out
+ on write errors.
+ * tests/torture.at (AC_CONFIG_FILES, HEADERS, LINKS and COMMANDS):
+ Extend test to also check for some write error failures, using...
+ <AT_CHECK_CONFIG_CREATION_NOWRITE>: ...this new macro.
+ Report by Bruno Haible.
+
Indentation fixups.
* lib/autotest/general.m4 (AT_INIT) <at_func_log_failure>: Fix
indentation.
])dnl
m4_ifndef([AC_DATAROOTDIR_CHECKED], [$ac_datarootdir_hack
])dnl
-" $ac_file_inputs m4_defn([_AC_SUBST_CMDS]) >$tmp/out
+" $ac_file_inputs m4_defn([_AC_SUBST_CMDS]) >$tmp/out \
+ || AC_MSG_ERROR([could not create $ac_file])
m4_ifndef([AC_DATAROOTDIR_CHECKED],
[test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
rm -f "$tmp/stdin"
case $ac_file in
- -) cat "$tmp/out"; rm -f "$tmp/out";;
- *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
- esac
+ -) cat "$tmp/out" && rm -f "$tmp/out";;
+ *) rm -f "$ac_file" && mv "$tmp/out" $ac_file;;
+ esac \
+ || AC_MSG_ERROR([could not create $ac_file])
dnl This would break Makefile dependencies:
dnl if diff $ac_file "$tmp/out" >/dev/null 2>&1; then
dnl echo "$ac_file is unchanged"
# CONFIG_HEADER
#
if test x"$ac_file" != x-; then
- AS_ECHO(["/* $configure_input */"]) >"$tmp/config.h"
- $AWK -f "$tmp/defines.awk" $ac_file_inputs >>"$tmp/config.h"
+ {
+ AS_ECHO(["/* $configure_input */"]) \
+ && $AWK -f "$tmp/defines.awk" $ac_file_inputs
+ } >"$tmp/config.h" \
+ || AC_MSG_ERROR([could not create $ac_file])
if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
AC_MSG_NOTICE([$ac_file is unchanged])
else
rm -f $ac_file
- mv "$tmp/config.h" $ac_file
+ mv "$tmp/config.h" $ac_file \
+ || AC_MSG_ERROR([could not create $ac_file])
fi
else
- AS_ECHO(["/* $configure_input */"])
- $AWK -f "$tmp/defines.awk" $ac_file_inputs
+ AS_ECHO(["/* $configure_input */"]) \
+ && $AWK -f "$tmp/defines.awk" $ac_file_inputs \
+ || AC_MSG_ERROR([could not create -])
fi
dnl If running for Automake, be ready to perform additional
dnl commands to set up the timestamp files.
fi
case $ac_tag in
- *:-:* | *:-) cat >"$tmp/stdin";;
+ *:-:* | *:-) cat >"$tmp/stdin" \
+ || AC_MSG_ERROR([could not create $ac_file]) ;;
esac
;;
esac
])# AT_CHECK_CONFIG_CREATION
+# AT_CHECK_CONFIG_CREATION_NOWRITE(THING = (header | link | file | command))
+# ------------------------------------------------------------------
+# Check that THING and var-THING (which uses variables in AC_CONFIG_THING)
+# are properly created, with the right content.
+# Use `grep OK' instead of a simple `cat' to avoid banners such as in
+# AC_CONFIG_HEADERS.
+m4_define([AT_CHECK_CONFIG_CREATION_NOWRITE],
+[AT_CHECK_CONFIGURE([what_to_test=$1])
+AT_CHECK([ls header var-header file var-file command var-command link var-link 2>/dev/null],
+ [ignore], [$1
+])
+AT_CHECK([grep OK $1], [], [OK
+])
+
+AT_CHECK_CONFIGURE([what_to_test=var-$1 --no-create])
+# config.status might be stupidly expecting data on stdin, if it's
+# really broken...
+chmod a-w .
+AT_CHECK([./config.status var-$1 </dev/null], [1], [ignore], [ignore])
+chmod u+w .
+])# AT_CHECK_CONFIG_CREATION_NOWRITE
+
+
# Create a file
AT_CHECK_CONFIG_CREATION(file)
# Create a link
AT_CHECK_CONFIG_CREATION(link)
+# Now check for write errors
+
+# Create a file
+AT_CHECK_CONFIG_CREATION_NOWRITE(file)
+AT_CHECK([./config.status --file=-:input </dev/null >/dev/full],
+ [1], [ignore], [ignore])
+
+# Create a header
+AT_CHECK_CONFIG_CREATION_NOWRITE(header)
+AT_CHECK([./config.status --header=-:input </dev/null >/dev/full],
+ [1], [ignore], [ignore])
+
+# Execute a command
+AT_CHECK_CONFIG_CREATION_NOWRITE(command)
+
+# Create a link
+AT_CHECK_CONFIG_CREATION_NOWRITE(link)
+
AT_CLEANUP