Boston, MA 02111-1307, USA. */
+#include <config.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
-#include <config.h>
+#include <stdio.h>
#ifdef VMS
#include "vms-pwd.h"
extern int errno;
#endif
+/* The directory for writing temporary files. */
+
+Lisp_Object Vtemporary_file_directory;
+
#ifdef CLASH_DETECTION
#include <utmp.h>
static time_t
get_boot_time ()
{
+#if defined (BOOT_TIME) && ! defined (NO_WTMP_FILE)
int counter;
+#endif
if (boot_time_initialized)
return boot_time;
if (! NILP (Ffile_exists_p (tempname)))
{
Lisp_Object args[6];
- tempname = Fmake_temp_name (build_string ("wtmp"));
+ tempname = Fexpand_file_name (build_string ("wtmp"),
+ Vtemporary_file_directory);
+ tempname = Fmake_temp_name (tempname);
args[0] = Vshell_file_name;
args[1] = Qnil;
args[2] = Qnil;
{
/* On some versions of IRIX, opening a nonexistent file name
is likely to crash in the utmp routines. */
- desc = open (filename, O_RDONLY);
+ desc = emacs_open (filename, O_RDONLY, 0);
if (desc < 0)
return;
- close (desc);
+ emacs_close (desc);
utmpname (filename);
}
#ifndef index
extern char *rindex (), *index ();
#endif
- int o, p, len, ret;
+ int len, ret;
int local_owner = 0;
char *at, *dot, *colon;
char *lfinfo = 0;
}
else if (locker == 1)
return 1; /* Someone else has it. */
+ else if (locker == -1)
+ return -1; /* current_lock_owner returned strange error. */
/* We deleted a stale lock; try again to lock the file. */
}
register Lisp_Object attack, orig_fn, encoded_fn;
register char *lfname, *locker;
lock_info_type lock_info;
+ struct gcpro gcpro1;
+
+ /* Don't do locking while dumping Emacs.
+ Uncompressing wtmp files uses call-process, which does not work
+ in an uninitialized Emacs. */
+ if (! NILP (Vpurify_flag))
+ return;
orig_fn = fn;
+ GCPRO1 (fn);
fn = Fexpand_file_name (fn, Qnil);
encoded_fn = ENCODE_FILE (fn);
visited. */
{
register Lisp_Object subject_buf;
- struct gcpro gcpro1;
subject_buf = get_truename_buffer (orig_fn);
- GCPRO1 (fn);
if (!NILP (subject_buf)
&& NILP (Fverify_visited_file_modtime (subject_buf))
&& !NILP (Ffile_exists_p (fn)))
call1 (intern ("ask-user-about-supersession-threat"), fn);
- UNGCPRO;
}
+ UNGCPRO;
/* Try to lock the lock. */
if (lock_if_free (&lock_info, lfname) <= 0)
register Lisp_Object tail;
register struct buffer *b;
- for (tail = Vbuffer_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr)
+ for (tail = Vbuffer_alist; GC_CONSP (tail); tail = XCDR (tail))
{
- b = XBUFFER (XCONS (XCONS (tail)->car)->cdr);
+ b = XBUFFER (XCDR (XCAR (tail)));
if (STRINGP (b->file_truename) && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b))
{
register char *lfname;
void
syms_of_filelock ()
{
+ DEFVAR_LISP ("temporary-file-directory", &Vtemporary_file_directory,
+ "The directory for writing temporary files.");
+ Vtemporary_file_directory = Qnil;
+
defsubr (&Sunlock_buffer);
defsubr (&Slock_buffer);
defsubr (&Sfile_locked_p);