X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/6ccb9cab43613632ece4f62d9ee28d694bc1d666..HEAD:/src/filelock.c
diff --git a/src/filelock.c b/src/filelock.c
index b9c991e4ba..3a268148ea 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -1,6 +1,10 @@
/* Lock files for editing.
- Copyright (C) 1985-1987, 1993-1994, 1996, 1998-2013 Free Software
- Foundation, Inc.
+
+Copyright (C) 1985-1987, 1993-1994, 1996, 1998-2014
+ Free Software Foundation, Inc.
+
+Author: Richard King
+ (according to authors.el)
This file is part of GNU Emacs.
@@ -51,8 +55,6 @@ along with GNU Emacs. If not, see . */
#include "w32.h" /* for dostounix_filename */
#endif
-#ifdef CLASH_DETECTION
-
#ifdef HAVE_UTMP_H
#include
#endif
@@ -181,7 +183,7 @@ get_boot_time (void)
since utmp is typically much smaller than wtmp.
Passing a null pointer causes get_boot_time_1
to inspect the default file, namely utmp. */
- get_boot_time_1 ((char *) 0, 0);
+ get_boot_time_1 (0, 0);
if (boot_time)
return boot_time;
@@ -411,28 +413,14 @@ create_lock_file (char *lfname, char *lock_info_str, bool force)
memcpy (nonce, lfname, lfdirlen);
strcpy (nonce + lfdirlen, nonce_base);
-#if HAVE_MKOSTEMP
- /* Prefer mkostemp to mkstemp, as it avoids a window where FD is
- temporarily open without close-on-exec. */
fd = mkostemp (nonce, O_BINARY | O_CLOEXEC);
-#elif HAVE_MKSTEMP
- /* Prefer mkstemp to mktemp, as it avoids a race between
- mktemp and emacs_open. */
- fd = mkstemp (nonce);
-#else
- mktemp (nonce);
- fd = emacs_open (nonce, O_WRONLY | O_CREAT | O_EXCL | O_BINARY,
- S_IRUSR | S_IWUSR);
-#endif
-
if (fd < 0)
err = errno;
else
{
ptrdiff_t lock_info_len;
-#if ! (HAVE_MKOSTEMP && O_CLOEXEC)
- fcntl (fd, F_SETFD, FD_CLOEXEC);
-#endif
+ if (! O_CLOEXEC)
+ fcntl (fd, F_SETFD, FD_CLOEXEC);
lock_info_len = strlen (lock_info_str);
err = 0;
/* Use 'write', not 'emacs_write', as garbage collection
@@ -473,10 +461,18 @@ lock_file_1 (char *lfname, bool force)
char lock_info_str[MAX_LFINFO + 1];
printmax_t pid = getpid ();
- if (sizeof lock_info_str
- <= snprintf (lock_info_str, sizeof lock_info_str,
- boot ? "%s@%s.%"pMd":%"pMd : "%s@%s.%"pMd,
- user_name, host_name, pid, boot))
+ if (boot)
+ {
+ if (sizeof lock_info_str
+ <= snprintf (lock_info_str, sizeof lock_info_str,
+ "%s@%s.%"pMd":%"pMd,
+ user_name, host_name, pid, boot))
+ return ENAMETOOLONG;
+ }
+ else if (sizeof lock_info_str
+ <= snprintf (lock_info_str, sizeof lock_info_str,
+ "%s@%s.%"pMd,
+ user_name, host_name, pid))
return ENAMETOOLONG;
return create_lock_file (lfname, lock_info_str, force);
@@ -695,7 +691,7 @@ lock_file (Lisp_Object fn)
/* Ensure we have only '/' separators, to avoid problems with
looking (inside fill_in_lock_file_name) for backslashes in file
names encoded by some DBCS codepage. */
- dostounix_filename (SSDATA (fn), 1);
+ dostounix_filename (SSDATA (fn));
#endif
encoded_fn = ENCODE_FILE (fn);
@@ -759,16 +755,15 @@ unlock_file (Lisp_Object fn)
void
unlock_all_files (void)
{
- register Lisp_Object tail;
+ register Lisp_Object tail, buf;
register struct buffer *b;
- for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
+ FOR_EACH_LIVE_BUFFER (tail, buf)
{
- b = XBUFFER (XCDR (XCAR (tail)));
- if (STRINGP (BVAR (b, file_truename)) && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b))
- {
- unlock_file (BVAR (b, file_truename));
- }
+ b = XBUFFER (buf);
+ if (STRINGP (BVAR (b, file_truename))
+ && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b))
+ unlock_file (BVAR (b, file_truename));
}
}
@@ -776,7 +771,9 @@ DEFUN ("lock-buffer", Flock_buffer, Slock_buffer,
0, 1, 0,
doc: /* Lock FILE, if current buffer is modified.
FILE defaults to current buffer's visited file,
-or else nothing is done if current buffer isn't visiting a file. */)
+or else nothing is done if current buffer isn't visiting a file.
+
+If the option `create-lockfiles' is nil, this does nothing. */)
(Lisp_Object file)
{
if (NILP (file))
@@ -840,11 +837,11 @@ t if it is locked by you, else a string saying which user has locked it. */)
return ret;
}
-#endif /* CLASH_DETECTION */
-
void
syms_of_filelock (void)
{
+#include "filelock.x"
+
DEFVAR_LISP ("temporary-file-directory", Vtemporary_file_directory,
doc: /* The directory for writing temporary files. */);
Vtemporary_file_directory = Qnil;
@@ -852,10 +849,4 @@ syms_of_filelock (void)
DEFVAR_BOOL ("create-lockfiles", create_lockfiles,
doc: /* Non-nil means use lockfiles to avoid editing collisions. */);
create_lockfiles = 1;
-
-#ifdef CLASH_DETECTION
- defsubr (&Sunlock_buffer);
- defsubr (&Slock_buffer);
- defsubr (&Sfile_locked_p);
-#endif
}