File synchronization fixes.

* admin/CPP-DEFINES (BSD_SYSTEM, HAVE_FSYNC): Remove.
* admin/merge-gnulib (GNULIB_MODULES): Add fsync, fdatasync.
* configure.ac (BSD_SYSTEM, BSD_SYSTEM_AHB): Remove; no longer needed.
(fsync): Remove check; now done by gnulib.
* lib/fdatasync.c, lib/fsync.c, m4/fdatasync.m4, m4/fsync.m4:
New files, from gnulib.
* lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
* lib-src/Makefile.in (LIB_FDATASYNC): New macro.
(emacsclient${EXEEXT}): Use it.
* lib-src/emacsclient.c (main): Use fdatasync, not fsync, since we don't
care about metadata.  Keep trying if interrupted.
* lib-src/movemail.c (main, popmail): Don't worry about BSD_SYSTEM, since
fsync is available everywhere (or there is a substitute).  Don't
report an error if fsync returns EINVAL.
* nt/inc/ms-w32.h (fdatasync): New macro, suggested by Eli Zaretskii.
* src/Makefile.in (LIB_FDATASYNC): New macro.
(LIBES): Use it.
* src/conf_post.h (BSD_SYSTEM, BSD_SYSTEM_AHB): Remove; no longer needed.
* src/fileio.c (Fwrite_region, write_region_inhibit_fsync):
Don't worry about HAVE_FSYNC, since a substitute fsync is
available if the system lacks one.
(Fwrite_regin): Retry fsync if interrupted.

Fixes: debbugs:13944
This commit is contained in:
Paul Eggert 2013-03-13 11:42:22 -07:00
parent c7ffccaf17
commit 47d7532e09
23 changed files with 273 additions and 76 deletions

View file

@ -1,5 +1,12 @@
2013-03-13 Paul Eggert <eggert@cs.ucla.edu> 2013-03-13 Paul Eggert <eggert@cs.ucla.edu>
File synchronization fixes (Bug#13944).
* configure.ac (BSD_SYSTEM, BSD_SYSTEM_AHB): Remove; no longer needed.
(fsync): Remove check; now done by gnulib.
* lib/fdatasync.c, lib/fsync.c, m4/fdatasync.m4, m4/fsync.m4:
New files, from gnulib.
* lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
Merge from gnulib, incorporating: Merge from gnulib, incorporating:
2013-03-13 putenv: port to Solaris 10 2013-03-13 putenv: port to Solaris 10
2013-03-12 mktime: fix configure typo 2013-03-12 mktime: fix configure typo

View file

@ -9,7 +9,6 @@ documented in config.in, and this file would not be necessary.
AIX AIX
_AIX _AIX
BSD_SYSTEM
CYGWIN Compiling the Cygwin port. CYGWIN Compiling the Cygwin port.
__CYGWIN__ Ditto __CYGWIN__ Ditto
GNU_LINUX GNU_LINUX
@ -149,7 +148,6 @@ HAVE_FORK
HAVE_FREEIFADDRS HAVE_FREEIFADDRS
HAVE_FREETYPE HAVE_FREETYPE
HAVE_FSEEKO HAVE_FSEEKO
HAVE_FSYNC
HAVE_FUTIMENS HAVE_FUTIMENS
HAVE_FUTIMES HAVE_FUTIMES
HAVE_FUTIMESAT HAVE_FUTIMESAT

View file

@ -1,3 +1,9 @@
2013-03-13 Paul Eggert <eggert@cs.ucla.edu>
File synchronization fixes (Bug#13944).
* CPP-DEFINES (BSD_SYSTEM, HAVE_FSYNC): Remove.
* merge-gnulib (GNULIB_MODULES): Add fsync, fdatasync.
2013-03-11 Paul Eggert <eggert@cs.ucla.edu> 2013-03-11 Paul Eggert <eggert@cs.ucla.edu>
* notes/unicode: Improve notes about Emacs source file encoding. * notes/unicode: Improve notes about Emacs source file encoding.

View file

@ -29,7 +29,8 @@ GNULIB_MODULES='
alloca-opt c-ctype c-strcase alloca-opt c-ctype c-strcase
careadlinkat close-stream crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 careadlinkat close-stream crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512
dtoastr dtotimespec dup2 environ execinfo faccessat dtoastr dtotimespec dup2 environ execinfo faccessat
fcntl-h fdopendir filemode fstatat getloadavg getopt-gnu gettime gettimeofday fcntl-h fdatasync fdopendir filemode fstatat fsync
getloadavg getopt-gnu gettime gettimeofday
ignore-value intprops largefile lstat ignore-value intprops largefile lstat
manywarnings memrchr mktime manywarnings memrchr mktime
pselect pthread_sigmask putenv readlink readlinkat pselect pthread_sigmask putenv readlink readlinkat

View file

@ -2872,7 +2872,7 @@ select getpagesize setlocale \
utimes getrlimit setrlimit shutdown getaddrinfo \ utimes getrlimit setrlimit shutdown getaddrinfo \
strsignal setitimer \ strsignal setitimer \
sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \ sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \
gai_strerror mkstemp getline getdelim fsync sync \ gai_strerror mkstemp getline getdelim sync \
difftime posix_memalign \ difftime posix_memalign \
getpwent endpwent getgrent endgrent \ getpwent endpwent getgrent endgrent \
touchlock \ touchlock \
@ -3774,7 +3774,6 @@ esac
dnl Define symbols to identify the version of Unix this is. dnl Define symbols to identify the version of Unix this is.
dnl Define all the symbols that apply correctly. dnl Define all the symbols that apply correctly.
AH_TEMPLATE(BSD_SYSTEM, [Define if the system is compatible with BSD 4.2.])
AH_TEMPLATE(DOS_NT, [Define if the system is MS DOS or MS Windows.]) AH_TEMPLATE(DOS_NT, [Define if the system is MS DOS or MS Windows.])
AH_TEMPLATE(MSDOS, [Define if the system is MS DOS.]) AH_TEMPLATE(MSDOS, [Define if the system is MS DOS.])
AH_TEMPLATE(USG, [Define if the system is compatible with System III.]) AH_TEMPLATE(USG, [Define if the system is compatible with System III.])
@ -3798,30 +3797,12 @@ case $opsys in
;; ;;
darwin) darwin)
dnl BSD4_3 and BSD4_4 are already defined in sys/param.h. dnl Not __APPLE__, as this may not be defined on non-OSX Darwin.
AC_DEFINE(BSD_SYSTEM, []) dnl Not DARWIN, because Panther and lower CoreFoundation.h use DARWIN to
dnl More specific than the above two. We cannot use __APPLE__ as this
dnl may not be defined on non-OSX Darwin, and we cannot define DARWIN
dnl here because Panther and lower CoreFoundation.h uses DARWIN to
dnl distinguish OS X from pure Darwin. dnl distinguish OS X from pure Darwin.
AC_DEFINE(DARWIN_OS, [], [Define if the system is Darwin.]) AC_DEFINE(DARWIN_OS, [], [Define if the system is Darwin.])
;; ;;
freebsd)
dnl Hack to avoid calling AC_PREPROC_IFELSE multiple times.
dnl Would not be needed with autoconf >= 2.67, where the
dnl preprocessed output is accessible in "conftest.i".
AC_DEFINE(BSD_SYSTEM_AHB, 1, [Define if AH_BOTTOM should change BSD_SYSTEM.])
;;
gnu | netbsd | openbsd )
AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[
#ifndef BSD_SYSTEM
# error "BSD_SYSTEM not defined"
#endif
]], [[]])], [], AC_DEFINE(BSD_SYSTEM, 43) )
;;
gnu-linux | gnu-kfreebsd ) gnu-linux | gnu-kfreebsd )
AC_DEFINE(USG, []) AC_DEFINE(USG, [])
AC_DEFINE(GNU_LINUX, [], [Define if ths system is compatible with GNU/Linux.]) AC_DEFINE(GNU_LINUX, [], [Define if ths system is compatible with GNU/Linux.])
@ -4185,15 +4166,8 @@ case "$opsys" in
LD_SWITCH_SYSTEM_TEMACS="-fno-pie -prebind $libs_nsgui -Xlinker -headerpad -Xlinker $headerpad_extra" LD_SWITCH_SYSTEM_TEMACS="-fno-pie -prebind $libs_nsgui -Xlinker -headerpad -Xlinker $headerpad_extra"
## This is here because src/Makefile.in did some extra fiddling around ## This is here because src/Makefile.in did some extra fiddling around
## with LD_SWITCH_SYSTEM. The cpp logic was: ## with LD_SWITCH_SYSTEM. It seems cleaner to put this in
## #ifndef LD_SWITCH_SYSTEM ## LD_SWITCH_SYSTEM_TEMACS instead,
## #if !defined (__GNUC__) && ((defined (BSD_SYSTEM) && !defined (COFF)))
## Since all the *bsds define LD_SWITCH_SYSTEM, this simplifies to:
## not using gcc, darwin.
## Because this was done in src/Makefile.in, the resulting part of
## LD_SWITCH_SYSTEM was not used in configure (ie, in ac_link).
## It therefore seems cleaner to put this in LD_SWITCH_SYSTEM_TEMACS,
## rather than LD_SWITCH_SYSTEM.
test "x$LD_SWITCH_SYSTEM" = "x" && test "x$GCC" != "xyes" && \ test "x$LD_SWITCH_SYSTEM" = "x" && test "x$GCC" != "xyes" && \
LD_SWITCH_SYSTEM_TEMACS="-X $LD_SWITCH_SYSTEM_TEMACS" LD_SWITCH_SYSTEM_TEMACS="-X $LD_SWITCH_SYSTEM_TEMACS"
;; ;;

View file

@ -1,5 +1,14 @@
2013-03-13 Paul Eggert <eggert@cs.ucla.edu> 2013-03-13 Paul Eggert <eggert@cs.ucla.edu>
File synchronization fixes (Bug#13944).
* Makefile.in (LIB_FDATASYNC): New macro.
(emacsclient${EXEEXT}): Use it.
* emacsclient.c (main): Use fdatasync, not fsync, since we don't
care about metadata. Keep trying if interrupted.
* movemail.c (main, popmail): Don't worry about BSD_SYSTEM, since
fsync is available everywhere (or there is a substitute). Don't
report an error if fsync returns EINVAL.
Static checking by Sun C 5.12. Static checking by Sun C 5.12.
* etags.c (analyse_regex): Omit unreachable code. * etags.c (analyse_regex): Omit unreachable code.

View file

@ -161,6 +161,8 @@ LIBRESOLV=@LIBRESOLV@
LIBS_MAIL=@LIBS_MAIL@ LIBS_MAIL=@LIBS_MAIL@
## empty or -lrt or -lposix4 if HAVE_CLOCK_GETTIME ## empty or -lrt or -lposix4 if HAVE_CLOCK_GETTIME
LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@ LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
## empty or -lrt or -lposix4 if HAVE_FDATASYNC
LIB_FDATASYNC = @LIB_FDATASYNC@
## Extra libraries to use when linking movemail. ## Extra libraries to use when linking movemail.
LIBS_MOVE = $(LIBS_MAIL) $(KRB4LIB) $(DESLIB) $(KRB5LIB) $(CRYPTOLIB) \ LIBS_MOVE = $(LIBS_MAIL) $(KRB4LIB) $(DESLIB) $(KRB5LIB) $(CRYPTOLIB) \
@ -334,7 +336,7 @@ pop.o: ${srcdir}/pop.c ${srcdir}/../lib/min-max.h $(config_h)
emacsclient${EXEEXT}: ${srcdir}/emacsclient.c $(config_h) emacsclient${EXEEXT}: ${srcdir}/emacsclient.c $(config_h)
$(CC) ${ALL_CFLAGS} ${srcdir}/emacsclient.c \ $(CC) ${ALL_CFLAGS} ${srcdir}/emacsclient.c \
-DVERSION="\"${version}\"" \ -DVERSION="\"${version}\"" \
$(LOADLIBES) -o emacsclient $(LOADLIBES) $(LIB_FDATASYNC) -o emacsclient
hexl${EXEEXT}: ${srcdir}/hexl.c $(config_h) hexl${EXEEXT}: ${srcdir}/hexl.c $(config_h)
$(CC) ${ALL_CFLAGS} ${srcdir}/hexl.c $(LOADLIBES) -o hexl $(CC) ${ALL_CFLAGS} ${srcdir}/hexl.c $(LOADLIBES) -o hexl

View file

@ -1724,7 +1724,8 @@ main (int argc, char **argv)
needlf = 2; needlf = 2;
} }
fflush (stdout); fflush (stdout);
fsync (1); while (fdatasync (1) != 0 && errno == EINTR)
continue;
/* Now, wait for an answer and print any messages. */ /* Now, wait for an answer and print any messages. */
while (exit_status == EXIT_SUCCESS) while (exit_status == EXIT_SUCCESS)
@ -1825,7 +1826,8 @@ main (int argc, char **argv)
if (needlf) if (needlf)
printf ("\n"); printf ("\n");
fflush (stdout); fflush (stdout);
fsync (1); while (fdatasync (1) != 0 && errno == EINTR)
continue;
if (rl < 0) if (rl < 0)
exit_status = EXIT_FAILURE; exit_status = EXIT_FAILURE;

View file

@ -466,10 +466,8 @@ main (int argc, char **argv)
} }
} }
#ifdef BSD_SYSTEM if (fsync (outdesc) != 0 && errno != EINVAL)
if (fsync (outdesc) < 0)
pfatal_and_delete (outname); pfatal_and_delete (outname);
#endif
/* Prevent symlink attacks truncating other users' mailboxes */ /* Prevent symlink attacks truncating other users' mailboxes */
if (setregid (-1, real_gid) < 0) if (setregid (-1, real_gid) < 0)
@ -750,21 +748,14 @@ popmail (char *mailbox, char *outfile, int preserve, char *password, int reverse
} }
} }
/* On AFS, a call to write only modifies the file in the local if (fsync (mbfi) != 0 && errno != EINVAL)
* workstation's AFS cache. The changes are not written to the server
* until a call to fsync or close is made. Users with AFS home
* directories have lost mail when over quota because these checks were
* not made in previous versions of movemail. */
#ifdef BSD_SYSTEM
if (fsync (mbfi) < 0)
{ {
error ("Error in fsync: %s", strerror (errno), 0); error ("Error in fsync: %s", strerror (errno), 0);
close (mbfi);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
#endif
if (close (mbfi) == -1) if (close (mbfi) != 0)
{ {
error ("Error in close: %s", strerror (errno), 0); error ("Error in close: %s", strerror (errno), 0);
return EXIT_FAILURE; return EXIT_FAILURE;

27
lib/fdatasync.c Normal file
View file

@ -0,0 +1,27 @@
/* Emulate fdatasync on platforms that lack it.
Copyright (C) 2011-2013 Free Software Foundation, Inc.
This library 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 library 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 <unistd.h>
int
fdatasync (int fd)
{
/* This does more work than strictly necessary, but is the best we
can do portably. */
return fsync (fd);
}

83
lib/fsync.c Normal file
View file

@ -0,0 +1,83 @@
/* Emulate fsync on platforms that lack it, primarily Windows and
cross-compilers like MinGW.
This is derived from sqlite3 sources.
http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/os_win.c
http://www.sqlite.org/copyright.html
Written by Richard W.M. Jones <rjones.at.redhat.com>
Copyright (C) 2008-2013 Free Software Foundation, Inc.
This library 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 library 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 <unistd.h>
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
/* FlushFileBuffers */
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <errno.h>
/* Get _get_osfhandle. */
# include "msvc-nothrow.h"
int
fsync (int fd)
{
HANDLE h = (HANDLE) _get_osfhandle (fd);
DWORD err;
if (h == INVALID_HANDLE_VALUE)
{
errno = EBADF;
return -1;
}
if (!FlushFileBuffers (h))
{
/* Translate some Windows errors into rough approximations of Unix
* errors. MSDN is useless as usual - in this case it doesn't
* document the full range of errors.
*/
err = GetLastError ();
switch (err)
{
case ERROR_ACCESS_DENIED:
/* For a read-only handle, fsync should succeed, even though we have
no way to sync the access-time changes. */
return 0;
/* eg. Trying to fsync a tty. */
case ERROR_INVALID_HANDLE:
errno = EINVAL;
break;
default:
errno = EIO;
}
return -1;
}
return 0;
}
#else /* !Windows */
# error "This platform lacks fsync function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
#endif /* !Windows */

View file

@ -21,7 +21,7 @@
# the same distribution terms as the rest of that program. # the same distribution terms as the rest of that program.
# #
# Generated by gnulib-tool. # Generated by gnulib-tool.
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=dup --avoid=errno --avoid=fchdir --avoid=fcntl --avoid=fstat --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=open --avoid=openat-die --avoid=opendir --avoid=raise --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt c-ctype c-strcase careadlinkat close-stream crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat fcntl-h fdopendir filemode fstatat getloadavg getopt-gnu gettime gettimeofday ignore-value intprops largefile lstat manywarnings memrchr mktime pselect pthread_sigmask putenv readlink readlinkat sig2str socklen stat-time stdalign stdarg stdbool stdio strftime strtoimax strtoumax symlink sys_stat sys_time time timer-time timespec-add timespec-sub unsetenv utimens warnings # Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=dup --avoid=errno --avoid=fchdir --avoid=fcntl --avoid=fstat --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=open --avoid=openat-die --avoid=opendir --avoid=raise --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt c-ctype c-strcase careadlinkat close-stream crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat fcntl-h fdatasync fdopendir filemode fstatat fsync getloadavg getopt-gnu gettime gettimeofday ignore-value intprops largefile lstat manywarnings memrchr mktime pselect pthread_sigmask putenv readlink readlinkat sig2str socklen stat-time stdalign stdarg stdbool stdio strftime strtoimax strtoumax symlink sys_stat sys_time time timer-time timespec-add timespec-sub unsetenv utimens warnings
MOSTLYCLEANFILES += core *.stackdump MOSTLYCLEANFILES += core *.stackdump
@ -297,6 +297,15 @@ EXTRA_DIST += fcntl.in.h
## end gnulib module fcntl-h ## end gnulib module fcntl-h
## begin gnulib module fdatasync
EXTRA_DIST += fdatasync.c
EXTRA_libgnu_a_SOURCES += fdatasync.c
## end gnulib module fdatasync
## begin gnulib module fdopendir ## begin gnulib module fdopendir
@ -332,6 +341,15 @@ EXTRA_libgnu_a_SOURCES += at-func.c fstatat.c
## end gnulib module fstatat ## end gnulib module fstatat
## begin gnulib module fsync
EXTRA_DIST += fsync.c
EXTRA_libgnu_a_SOURCES += fsync.c
## end gnulib module fsync
## begin gnulib module getgroups ## begin gnulib module getgroups
if gl_GNULIB_ENABLED_getgroups if gl_GNULIB_ENABLED_getgroups

32
m4/fdatasync.m4 Normal file
View file

@ -0,0 +1,32 @@
# fdatasync.m4 serial 4
dnl Copyright (C) 2008-2013 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.
AC_DEFUN([gl_FUNC_FDATASYNC],
[
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
dnl Using AC_CHECK_FUNCS_ONCE would break our subsequent AC_SEARCH_LIBS
AC_CHECK_DECLS_ONCE([fdatasync])
LIB_FDATASYNC=
AC_SUBST([LIB_FDATASYNC])
if test $ac_cv_have_decl_fdatasync = no; then
HAVE_DECL_FDATASYNC=0
dnl Mac OS X 10.7 has fdatasync but does not declare it.
AC_CHECK_FUNCS([fdatasync])
if test $ac_cv_func_fdatasync = no; then
HAVE_FDATASYNC=0
fi
else
dnl Solaris <= 2.6 has fdatasync() in libposix4.
dnl Solaris 7..10 has it in librt.
gl_saved_libs=$LIBS
AC_SEARCH_LIBS([fdatasync], [rt posix4],
[test "$ac_cv_search_fdatasync" = "none required" ||
LIB_FDATASYNC=$ac_cv_search_fdatasync])
LIBS=$gl_saved_libs
fi
])

17
m4/fsync.m4 Normal file
View file

@ -0,0 +1,17 @@
# fsync.m4 serial 2
dnl Copyright (C) 2008-2013 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.
AC_DEFUN([gl_FUNC_FSYNC],
[
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
AC_CHECK_FUNCS_ONCE([fsync])
if test $ac_cv_func_fsync = no; then
HAVE_FSYNC=0
fi
])
# Prerequisites of lib/fsync.c.
AC_DEFUN([gl_PREREQ_FSYNC], [:])

View file

@ -63,10 +63,12 @@ AC_DEFUN([gl_EARLY],
# Code from module extern-inline: # Code from module extern-inline:
# Code from module faccessat: # Code from module faccessat:
# Code from module fcntl-h: # Code from module fcntl-h:
# Code from module fdatasync:
# Code from module fdopendir: # Code from module fdopendir:
# Code from module filemode: # Code from module filemode:
# Code from module fpending: # Code from module fpending:
# Code from module fstatat: # Code from module fstatat:
# Code from module fsync:
# Code from module getgroups: # Code from module getgroups:
# Code from module getloadavg: # Code from module getloadavg:
# Code from module getopt-gnu: # Code from module getopt-gnu:
@ -187,6 +189,11 @@ AC_DEFUN([gl_INIT],
gl_MODULE_INDICATOR([faccessat]) gl_MODULE_INDICATOR([faccessat])
gl_UNISTD_MODULE_INDICATOR([faccessat]) gl_UNISTD_MODULE_INDICATOR([faccessat])
gl_FCNTL_H gl_FCNTL_H
gl_FUNC_FDATASYNC
if test $HAVE_FDATASYNC = 0; then
AC_LIBOBJ([fdatasync])
fi
gl_UNISTD_MODULE_INDICATOR([fdatasync])
gl_FUNC_FDOPENDIR gl_FUNC_FDOPENDIR
if test $HAVE_FDOPENDIR = 0 || test $REPLACE_FDOPENDIR = 1; then if test $HAVE_FDOPENDIR = 0 || test $REPLACE_FDOPENDIR = 1; then
AC_LIBOBJ([fdopendir]) AC_LIBOBJ([fdopendir])
@ -204,6 +211,12 @@ AC_DEFUN([gl_INIT],
AC_LIBOBJ([fstatat]) AC_LIBOBJ([fstatat])
fi fi
gl_SYS_STAT_MODULE_INDICATOR([fstatat]) gl_SYS_STAT_MODULE_INDICATOR([fstatat])
gl_FUNC_FSYNC
if test $HAVE_FSYNC = 0; then
AC_LIBOBJ([fsync])
gl_PREREQ_FSYNC
fi
gl_UNISTD_MODULE_INDICATOR([fsync])
gl_GETLOADAVG gl_GETLOADAVG
if test $HAVE_GETLOADAVG = 0; then if test $HAVE_GETLOADAVG = 0; then
AC_LIBOBJ([getloadavg]) AC_LIBOBJ([getloadavg])
@ -743,12 +756,14 @@ AC_DEFUN([gl_FILE_LIST], [
lib/execinfo.in.h lib/execinfo.in.h
lib/faccessat.c lib/faccessat.c
lib/fcntl.in.h lib/fcntl.in.h
lib/fdatasync.c
lib/fdopendir.c lib/fdopendir.c
lib/filemode.c lib/filemode.c
lib/filemode.h lib/filemode.h
lib/fpending.c lib/fpending.c
lib/fpending.h lib/fpending.h
lib/fstatat.c lib/fstatat.c
lib/fsync.c
lib/ftoastr.c lib/ftoastr.c
lib/ftoastr.h lib/ftoastr.h
lib/getgroups.c lib/getgroups.c
@ -842,10 +857,12 @@ AC_DEFUN([gl_FILE_LIST], [
m4/faccessat.m4 m4/faccessat.m4
m4/fcntl-o.m4 m4/fcntl-o.m4
m4/fcntl_h.m4 m4/fcntl_h.m4
m4/fdatasync.m4
m4/fdopendir.m4 m4/fdopendir.m4
m4/filemode.m4 m4/filemode.m4
m4/fpending.m4 m4/fpending.m4
m4/fstatat.m4 m4/fstatat.m4
m4/fsync.m4
m4/getgroups.m4 m4/getgroups.m4
m4/getloadavg.m4 m4/getloadavg.m4
m4/getopt.m4 m4/getopt.m4

View file

@ -1,3 +1,8 @@
2013-03-13 Paul Eggert <eggert@cs.ucla.edu>
File synchronization fixes (Bug#13944).
* inc/ms-w32.h (fdatasync): New macro, suggested by Eli Zaretskii.
2013-03-05 Paul Eggert <eggert@cs.ucla.edu> 2013-03-05 Paul Eggert <eggert@cs.ucla.edu>
FILE's lock is now always .#FILE and may be a regular file (Bug#13807). FILE's lock is now always .#FILE and may be a regular file (Bug#13807).

View file

@ -220,6 +220,7 @@ extern int sys_unlink (const char *);
/* Map to MSVC names. */ /* Map to MSVC names. */
#define execlp _execlp #define execlp _execlp
#define execvp _execvp #define execvp _execvp
#define fdatasync _commit
#define fdopen _fdopen #define fdopen _fdopen
#ifndef fileno #ifndef fileno
#define fileno _fileno #define fileno _fileno

View file

@ -1,3 +1,14 @@
2013-03-13 Paul Eggert <eggert@cs.ucla.edu>
File synchronization fixes (Bug#13944).
* Makefile.in (LIB_FDATASYNC): New macro.
(LIBES): Use it.
* conf_post.h (BSD_SYSTEM, BSD_SYSTEM_AHB): Remove; no longer needed.
* fileio.c (Fwrite_region, write_region_inhibit_fsync):
Don't worry about HAVE_FSYNC, since a substitute fsync is
available if the system lacks one.
(Fwrite_regin): Retry fsync if interrupted.
2013-03-13 Eli Zaretskii <eliz@gnu.org> 2013-03-13 Eli Zaretskii <eliz@gnu.org>
* w32term.c (w32_read_socket): If we Emacs frame is being * w32term.c (w32_read_socket): If we Emacs frame is being

View file

@ -139,6 +139,7 @@ M17N_FLT_LIBS = @M17N_FLT_LIBS@
LIB_CLOCK_GETTIME=@LIB_CLOCK_GETTIME@ LIB_CLOCK_GETTIME=@LIB_CLOCK_GETTIME@
LIB_EACCESS=@LIB_EACCESS@ LIB_EACCESS=@LIB_EACCESS@
LIB_FDATASYNC=@LIB_FDATASYNC@
LIB_TIMER_TIME=@LIB_TIMER_TIME@ LIB_TIMER_TIME=@LIB_TIMER_TIME@
DBUS_CFLAGS = @DBUS_CFLAGS@ DBUS_CFLAGS = @DBUS_CFLAGS@
@ -391,7 +392,7 @@ ALLOBJS = $(VMLIMIT_OBJ) $(obj) $(otherobj)
LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(LIBX_BASE) $(LIBIMAGE) \ LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(LIBX_BASE) $(LIBIMAGE) \
$(LIBX_OTHER) $(LIBSOUND) \ $(LIBX_OTHER) $(LIBSOUND) \
$(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) \ $(RSVG_LIBS) $(IMAGEMAGICK_LIBS) $(LIB_CLOCK_GETTIME) \
$(LIB_EACCESS) $(LIB_TIMER_TIME) $(DBUS_LIBS) \ $(LIB_EACCESS) $(LIB_FDATASYNC) $(LIB_TIMER_TIME) $(DBUS_LIBS) \
$(LIB_EXECINFO) \ $(LIB_EXECINFO) \
$(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \ $(LIBXML2_LIBS) $(LIBGPM) $(LIBRESOLV) $(LIBS_SYSTEM) \
$(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \ $(LIBS_TERMCAP) $(GETLOADAVG_LIBS) $(SETTINGS_LIBS) $(LIBSELINUX_LIBS) \

View file

@ -44,19 +44,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
# define __has_attribute(a) 0 /* non-clang */ # define __has_attribute(a) 0 /* non-clang */
#endif #endif
/* This silences a few compilation warnings on FreeBSD. */
#ifdef BSD_SYSTEM_AHB
#undef BSD_SYSTEM_AHB
#undef BSD_SYSTEM
#if __FreeBSD__ == 1
#define BSD_SYSTEM 199103
#elif __FreeBSD__ == 2
#define BSD_SYSTEM 199306
#elif __FreeBSD__ >= 3
#define BSD_SYSTEM 199506
#endif
#endif
#ifdef DARWIN_OS #ifdef DARWIN_OS
#ifdef emacs #ifdef emacs
#define malloc unexec_malloc #define malloc unexec_malloc

View file

@ -4959,20 +4959,23 @@ This calls `write-region-annotate-functions' at the start, and
immediate_quit = 0; immediate_quit = 0;
#ifdef HAVE_FSYNC
/* fsync appears to change the modtime on BSD4.2. /* fsync appears to change the modtime on BSD4.2.
Disk full in NFS may be reported here. */ Disk full in NFS may be reported here. */
/* mib says that closing the file will try to write as fast as NFS can do /* mib says that closing the file will try to write as fast as NFS can do
it, and that means the fsync here is not crucial for autosave files. */ it, and that means the fsync here is not crucial for autosave files. */
if (!auto_saving && !write_region_inhibit_fsync && fsync (desc) < 0) if (!auto_saving && !write_region_inhibit_fsync)
{ {
/* If fsync fails with EINTR, don't treat that as serious. Also /* Transfer data and metadata to disk, retrying if interrupted. Also,
ignore EINVAL which happens when fsync is not supported on this ignore EINVAL which happens when fsync is not supported on this
file. */ file. */
if (errno != EINTR && errno != EINVAL) while (fsync (desc) != 0)
ok = 0, save_errno = errno; if (errno != EINTR)
{
if (errno != EINVAL)
ok = 0, save_errno = errno;
break;
}
} }
#endif
modtime = invalid_emacs_time (); modtime = invalid_emacs_time ();
if (visiting) if (visiting)
@ -6046,13 +6049,11 @@ in the buffer; this is the default behavior, because the auto-save
file is usually more useful if it contains the deleted text. */); file is usually more useful if it contains the deleted text. */);
Vauto_save_include_big_deletions = Qnil; Vauto_save_include_big_deletions = Qnil;
#ifdef HAVE_FSYNC
DEFVAR_BOOL ("write-region-inhibit-fsync", write_region_inhibit_fsync, DEFVAR_BOOL ("write-region-inhibit-fsync", write_region_inhibit_fsync,
doc: /* Non-nil means don't call fsync in `write-region'. doc: /* Non-nil means don't call fsync in `write-region'.
This variable affects calls to `write-region' as well as save commands. This variable affects calls to `write-region' as well as save commands.
A non-nil value may result in data loss! */); A non-nil value may result in data loss! */);
write_region_inhibit_fsync = 0; write_region_inhibit_fsync = 0;
#endif
DEFVAR_BOOL ("delete-by-moving-to-trash", delete_by_moving_to_trash, DEFVAR_BOOL ("delete-by-moving-to-trash", delete_by_moving_to_trash,
doc: /* Specifies whether to use the system's trash can. doc: /* Specifies whether to use the system's trash can.

View file

@ -437,6 +437,14 @@ create_lock_file (char *lfname, char *lock_info_str, bool force)
if (emacs_write (fd, lock_info_str, lock_info_len) != lock_info_len if (emacs_write (fd, lock_info_str, lock_info_len) != lock_info_len
|| (need_fchmod && fchmod (fd, world_readable) != 0)) || (need_fchmod && fchmod (fd, world_readable) != 0))
err = errno; err = errno;
else
while (fsync (fd) != 0)
if (errno != EINTR)
{
if (errno != EINVAL)
err = errno;
break;
}
if (emacs_close (fd) != 0) if (emacs_close (fd) != 0)
err = errno; err = errno;
if (!err && rename_lock_file (nonce, lfname, force) != 0) if (!err && rename_lock_file (nonce, lfname, force) != 0)

View file

@ -1289,10 +1289,9 @@ reset_sys_modes (struct tty_display_info *tty_out)
if (tty_out->terminal->reset_terminal_modes_hook) if (tty_out->terminal->reset_terminal_modes_hook)
tty_out->terminal->reset_terminal_modes_hook (tty_out->terminal); tty_out->terminal->reset_terminal_modes_hook (tty_out->terminal);
#ifdef BSD_SYSTEM
/* Avoid possible loss of output when changing terminal modes. */ /* Avoid possible loss of output when changing terminal modes. */
fsync (fileno (tty_out->output)); while (fdatasync (fileno (tty_out->output)) != 0 && errno == EINTR)
#endif continue;
#ifndef DOS_NT #ifndef DOS_NT
#ifdef F_SETOWN #ifdef F_SETOWN