summaryrefslogtreecommitdiff
path: root/m4
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2012-11-03 11:54:17 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2012-11-03 11:54:17 -0700
commit7ccfb720b477df05042729e0e300bae5922f5120 (patch)
treed5bfded71b48dfefbc4e3334c0ae586de29ab7bc /m4
parent376a8e83bb3438f77dadf2d9910ef7baabcc82c2 (diff)
downloademacs-7ccfb720b477df05042729e0e300bae5922f5120.tar.gz
Fix data-loss with --batch.
* admin/merge-gnulib (GNULIB_MODULES): Add close-stream. * lib/close-stream.c, lib/close-stream.h, lib/fpending.c * lib/fpending.h, m4/close-stream.m4, m4/fpending.m4: New files, from gnulib. * lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate. * src/emacs.c: Include <close-stream.h>. (close_output_streams): New function. (main): Pass it to atexit, so that Emacs closes stdout and stderr and handles errors appropriately. (Fkill_emacs): Don't worry about flushing, as close_output_stream does that now. Fixes: debbugs:9574
Diffstat (limited to 'm4')
-rw-r--r--m4/close-stream.m411
-rw-r--r--m4/fpending.m490
-rw-r--r--m4/gnulib-comp.m415
3 files changed, 116 insertions, 0 deletions
diff --git a/m4/close-stream.m4 b/m4/close-stream.m4
new file mode 100644
index 00000000000..be0c8a22979
--- /dev/null
+++ b/m4/close-stream.m4
@@ -0,0 +1,11 @@
+#serial 4
+dnl Copyright (C) 2006-2007, 2009-2012 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Prerequisites of lib/close-stream.c.
+AC_DEFUN([gl_CLOSE_STREAM],
+[
+ :
+])
diff --git a/m4/fpending.m4 b/m4/fpending.m4
new file mode 100644
index 00000000000..33a5c94c3a3
--- /dev/null
+++ b/m4/fpending.m4
@@ -0,0 +1,90 @@
+# serial 19
+
+# Copyright (C) 2000-2001, 2004-2012 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+dnl From Jim Meyering
+dnl Using code from emacs, based on suggestions from Paul Eggert
+dnl and Ulrich Drepper.
+
+dnl Find out how to determine the number of pending output bytes on a stream.
+dnl glibc (2.1.93 and newer) and Solaris provide __fpending. On other systems,
+dnl we have to grub around in the FILE struct.
+
+AC_DEFUN([gl_FUNC_FPENDING],
+[
+ AC_CHECK_HEADERS_ONCE([stdio_ext.h])
+ AC_CHECK_FUNCS_ONCE([__fpending])
+ fp_headers='
+# include <stdio.h>
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+'
+ AC_CHECK_DECLS([__fpending], , , $fp_headers)
+])
+
+AC_DEFUN([gl_PREREQ_FPENDING],
+[
+ AC_CACHE_CHECK(
+ [how to determine the number of pending output bytes on a stream],
+ ac_cv_sys_pending_output_n_bytes,
+ [
+ for ac_expr in \
+ \
+ '# glibc2' \
+ 'fp->_IO_write_ptr - fp->_IO_write_base' \
+ \
+ '# traditional Unix' \
+ 'fp->_ptr - fp->_base' \
+ \
+ '# BSD' \
+ 'fp->_p - fp->_bf._base' \
+ \
+ '# SCO, Unixware' \
+ '(fp->__ptr ? fp->__ptr - fp->__base : 0)' \
+ \
+ '# QNX' \
+ '(fp->_Mode & 0x2000 /*_MWRITE*/ ? fp->_Next - fp->_Buf : 0)' \
+ \
+ '# old glibc?' \
+ 'fp->__bufp - fp->__buffer' \
+ \
+ '# old glibc iostream?' \
+ 'fp->_pptr - fp->_pbase' \
+ \
+ '# emx+gcc' \
+ 'fp->_ptr - fp->_buffer' \
+ \
+ '# Minix' \
+ 'fp->_ptr - fp->_buf' \
+ \
+ '# Plan9' \
+ 'fp->wp - fp->buf' \
+ \
+ '# VMS' \
+ '(*fp)->_ptr - (*fp)->_base' \
+ \
+ '# e.g., DGUX R4.11; the info is not available' \
+ 1 \
+ ; do
+
+ # Skip each embedded comment.
+ case "$ac_expr" in '#'*) continue;; esac
+
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],
+ [[FILE *fp = stdin; (void) ($ac_expr);]])],
+ [fp_done=yes]
+ )
+ test "$fp_done" = yes && break
+ done
+
+ ac_cv_sys_pending_output_n_bytes=$ac_expr
+ ]
+ )
+ AC_DEFINE_UNQUOTED([PENDING_OUTPUT_N_BYTES],
+ $ac_cv_sys_pending_output_n_bytes,
+ [the number of pending output bytes on stream 'fp'])
+])
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
index de2355d87c3..5cd278454e7 100644
--- a/m4/gnulib-comp.m4
+++ b/m4/gnulib-comp.m4
@@ -44,6 +44,7 @@ AC_DEFUN([gl_EARLY],
# Code from module c-strcase:
# Code from module careadlinkat:
# Code from module clock-time:
+ # Code from module close-stream:
# Code from module crypto/md5:
# Code from module crypto/sha1:
# Code from module crypto/sha256:
@@ -58,6 +59,7 @@ AC_DEFUN([gl_EARLY],
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
# Code from module extern-inline:
# Code from module filemode:
+ # Code from module fpending:
# Code from module getloadavg:
# Code from module getopt-gnu:
# Code from module getopt-posix:
@@ -141,6 +143,8 @@ AC_DEFUN([gl_INIT],
gl_FUNC_ALLOCA
AC_CHECK_FUNCS_ONCE([readlinkat])
gl_CLOCK_TIME
+ gl_CLOSE_STREAM
+ gl_MODULE_INDICATOR([close-stream])
gl_MD5
gl_SHA1
gl_SHA256
@@ -157,6 +161,11 @@ AC_DEFUN([gl_INIT],
gl_EXECINFO_H
AC_REQUIRE([gl_EXTERN_INLINE])
gl_FILEMODE
+ gl_FUNC_FPENDING
+ if test $ac_cv_func___fpending = no; then
+ AC_LIBOBJ([fpending])
+ gl_PREREQ_FPENDING
+ fi
gl_GETLOADAVG
if test $HAVE_GETLOADAVG = 0; then
AC_LIBOBJ([getloadavg])
@@ -534,6 +543,8 @@ AC_DEFUN([gl_FILE_LIST], [
lib/c-strncasecmp.c
lib/careadlinkat.c
lib/careadlinkat.h
+ lib/close-stream.c
+ lib/close-stream.h
lib/dosname.h
lib/dtoastr.c
lib/dtotimespec.c
@@ -542,6 +553,8 @@ AC_DEFUN([gl_FILE_LIST], [
lib/execinfo.in.h
lib/filemode.c
lib/filemode.h
+ lib/fpending.c
+ lib/fpending.h
lib/ftoastr.c
lib/ftoastr.h
lib/getloadavg.c
@@ -609,12 +622,14 @@ AC_DEFUN([gl_FILE_LIST], [
m4/alloca.m4
m4/c-strtod.m4
m4/clock_time.m4
+ m4/close-stream.m4
m4/dup2.m4
m4/environ.m4
m4/execinfo.m4
m4/extensions.m4
m4/extern-inline.m4
m4/filemode.m4
+ m4/fpending.m4
m4/getloadavg.m4
m4/getopt.m4
m4/gettime.m4