annotate src/filelock.c @ 25427:dde5fcbfa2af

(Info-tagify): Don't insert more than one newline before the tag table. (Info-tagify): Start by widening. Match node headers that don't list the file name, and more kinds of page separations. Strip properties during tagification. Use start of node header line as tag's position. Fix the "done" message. (Info-validate): Save and restore match data around narrowing down.
author Richard M. Stallman <rms@gnu.org>
date Sun, 29 Aug 1999 19:19:00 +0000
parents 824b89fca192
children 0a7261c1d487
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
1 /* Lock files for editing.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
2 Copyright (C) 1985, 86, 87, 93, 94, 96, 98, 1999 Free Software Foundation, Inc.
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 any later version.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14075
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14075
diff changeset
19 Boston, MA 02111-1307, USA. */
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 #include <sys/types.h>
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 #include <sys/stat.h>
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
24 #include <signal.h>
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 4680
diff changeset
25 #include <config.h>
25322
824b89fca192 Use stdlib.h.
Dave Love <fx@gnu.org>
parents: 25156
diff changeset
26 #ifdef HAVE_STDLIB_H
824b89fca192 Use stdlib.h.
Dave Love <fx@gnu.org>
parents: 25156
diff changeset
27 #include <stdlib.h>
824b89fca192 Use stdlib.h.
Dave Love <fx@gnu.org>
parents: 25156
diff changeset
28 #endif
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
29
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
30 #ifdef VMS
559
65e7f842d017 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
31 #include "vms-pwd.h"
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
32 #else
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 #include <pwd.h>
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
34 #endif /* not VMS */
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
35
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 #include <sys/file.h>
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 #ifdef USG
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 #include <fcntl.h>
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
39 #include <string.h>
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 #endif /* USG */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
42 #ifdef HAVE_UNISTD_H
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
43 #include <unistd.h>
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
44 #endif
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
45
24424
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
46 #ifdef __FreeBSD__
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
47 #include <sys/time.h>
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
48 #include <sys/types.h>
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
49 #include <sys/sysctl.h>
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
50 #endif /* __FreeBSD__ */
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
51
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 #include "lisp.h"
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 #include "buffer.h"
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
54 #include "charset.h"
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
55 #include "coding.h"
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
56 #include "systime.h"
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
58 #include <time.h>
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
59 #include <errno.h>
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
60 #ifndef errno
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 extern int errno;
4272
41c85882768c (getpwuid): Declare at top level, and not if __386bsd__.
Richard M. Stallman <rms@gnu.org>
parents: 3602
diff changeset
62 #endif
41c85882768c (getpwuid): Declare at top level, and not if __386bsd__.
Richard M. Stallman <rms@gnu.org>
parents: 3602
diff changeset
63
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 #ifdef CLASH_DETECTION
21413
edf1091d8a60 Include <utmp.h> only if CLASH_DETECTION is
Karl Heuer <kwzh@gnu.org>
parents: 21244
diff changeset
65
edf1091d8a60 Include <utmp.h> only if CLASH_DETECTION is
Karl Heuer <kwzh@gnu.org>
parents: 21244
diff changeset
66 #include <utmp.h>
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
67
24869
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
68 /* A file whose last-modified time is just after the most recent boot.
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
69 Define this to be NULL to disable checking for this file. */
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
70 #ifndef BOOT_TIME_FILE
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
71 #define BOOT_TIME_FILE "/var/run/random-seed"
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
72 #endif
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
73
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
74 #ifndef WTMP_FILE
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
75 #define WTMP_FILE "/var/log/wtmp"
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
76 #endif
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
78 /* The strategy: to lock a file FN, create a symlink .#FN in FN's
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
79 directory, with link data `user@host.pid'. This avoids a single
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
80 mount (== failure) point for lock files.
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
82 When the host in the lock data is the current host, we can check if
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
83 the pid is valid with kill.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
84
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
85 Otherwise, we could look at a separate file that maps hostnames to
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
86 reboot times to see if the remote pid can possibly be valid, since we
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
87 don't want Emacs to have to communicate via pipes or sockets or
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
88 whatever to other processes, either locally or remotely; rms says
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
89 that's too unreliable. Hence the separate file, which could
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
90 theoretically be updated by daemons running separately -- but this
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
91 whole idea is unimplemented; in practice, at least in our
17165
f36d8f965ab5 Fix typos in comment.
Karl Heuer <kwzh@gnu.org>
parents: 16844
diff changeset
92 environment, it seems such stale locks arise fairly infrequently, and
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
93 Emacs' standard methods of dealing with clashes suffice.
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
94
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
95 We use symlinks instead of normal files because (1) they can be
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
96 stored more efficiently on the filesystem, since the kernel knows
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
97 they will be small, and (2) all the info about the lock can be read
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
98 in a single system call (readlink). Although we could use regular
17165
f36d8f965ab5 Fix typos in comment.
Karl Heuer <kwzh@gnu.org>
parents: 16844
diff changeset
99 files to be useful on old systems lacking symlinks, nowadays
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
100 virtually all such systems are probably single-user anyway, so it
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
101 didn't seem worth the complication.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
102
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
103 Similarly, we don't worry about a possible 14-character limit on
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
104 file names, because those are all the same systems that don't have
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
105 symlinks.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
106
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
107 This is compatible with the locking scheme used by Interleaf (which
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
108 has contributed this implementation for Emacs), and was designed by
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
109 Ethan Jacobson, Kimbo Mundy, and others.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
110
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
111 --karl@cs.umb.edu/karl@hq.ileaf.com. */
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
112
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
113
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
114 /* Return the time of the last system boot. */
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
115
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
116 static time_t boot_time;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
117 static int boot_time_initialized;
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
118
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
119 extern Lisp_Object Vshell_file_name;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
120
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
121 static time_t
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
122 get_boot_time ()
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
123 {
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
124 int counter;
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
125
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
126 if (boot_time_initialized)
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
127 return boot_time;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
128 boot_time_initialized = 1;
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
129
24424
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
130 #if defined (CTL_KERN) && defined (KERN_BOOTTIME)
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
131 {
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
132 int mib[2];
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
133 size_t size;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
134 struct timeval boottime_val;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
135
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
136 mib[0] = CTL_KERN;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
137 mib[1] = KERN_BOOTTIME;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
138 size = sizeof (boottime_val);
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
139
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
140 if (sysctl (mib, 2, &boottime_val, &size, NULL, 0) >= 0)
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
141 {
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
142 boot_time = boottime_val.tv_sec;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
143 return boot_time;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
144 }
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
145 }
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
146 #endif /* defined (CTL_KERN) && defined (KERN_BOOTTIME) */
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
147
24869
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
148 if (BOOT_TIME_FILE)
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
149 {
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
150 struct stat st;
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
151 if (stat (BOOT_TIME_FILE, &st) == 0)
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
152 {
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
153 boot_time = st.st_mtime;
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
154 return boot_time;
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
155 }
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
156 }
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
157
24704
c5be96c5a5c1 (get_boot_time): Handle NO_WTMP_FILE.
Karl Heuer <kwzh@gnu.org>
parents: 24499
diff changeset
158 #if defined (BOOT_TIME) && ! defined (NO_WTMP_FILE)
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
159 #ifndef CANNOT_DUMP
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
160 /* The utmp routines maintain static state.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
161 Don't touch that state unless we are initialized,
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
162 since it might not survive dumping. */
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
163 if (! initialized)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
164 return boot_time;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
165 #endif /* not CANNOT_DUMP */
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
166
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
167 /* Try to get boot time from utmp before wtmp,
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
168 since utmp is typically much smaller than wtmp.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
169 Passing a null pointer causes get_boot_time_1
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
170 to inspect the default file, namely utmp. */
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
171 get_boot_time_1 ((char *) 0, 0);
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
172 if (boot_time)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
173 return boot_time;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
174
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
175 /* Try to get boot time from the current wtmp file. */
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
176 get_boot_time_1 (WTMP_FILE, 1);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
177
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
178 /* If we did not find a boot time in wtmp, look at wtmp, and so on. */
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
179 for (counter = 0; counter < 20 && ! boot_time; counter++)
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
180 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
181 char cmd_string[100];
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
182 Lisp_Object tempname, filename;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
183 int delete_flag = 0;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
184
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
185 filename = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
186
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
187 sprintf (cmd_string, "%s.%d", WTMP_FILE, counter);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
188 tempname = build_string (cmd_string);
24499
e5b719c6fd51 (get_boot_time): Test tempname, not filename.
Karl Heuer <kwzh@gnu.org>
parents: 24465
diff changeset
189 if (! NILP (Ffile_exists_p (tempname)))
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
190 filename = tempname;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
191 else
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
192 {
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
193 sprintf (cmd_string, "%s.%d.gz", WTMP_FILE, counter);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
194 tempname = build_string (cmd_string);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
195 if (! NILP (Ffile_exists_p (tempname)))
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
196 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
197 Lisp_Object args[6];
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
198 tempname = Fmake_temp_name (build_string ("wtmp"));
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
199 args[0] = Vshell_file_name;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
200 args[1] = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
201 args[2] = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
202 args[3] = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
203 args[4] = build_string ("-c");
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
204 sprintf (cmd_string, "gunzip < %s.%d.gz > %s",
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
205 WTMP_FILE, counter, XSTRING (tempname)->data);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
206 args[5] = build_string (cmd_string);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
207 Fcall_process (6, args);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
208 filename = tempname;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
209 delete_flag = 1;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
210 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
211 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
212
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
213 if (! NILP (filename))
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
214 {
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
215 get_boot_time_1 (XSTRING (filename)->data, 1);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
216 if (delete_flag)
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
217 unlink (XSTRING (filename)->data);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
218 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
219 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
220
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
221 return boot_time;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
222 #else
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
223 return 0;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
224 #endif
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
225 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
226
24369
8cbfa7848416 (get_boot_time_1): Put this in #ifdef BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 24349
diff changeset
227 #ifdef BOOT_TIME
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
228 /* Try to get the boot time from wtmp file FILENAME.
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
229 This succeeds if that file contains a reboot record.
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
230
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
231 If FILENAME is zero, use the same file as before;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
232 if no FILENAME has ever been specified, this is the utmp file.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
233 Use the newest reboot record if NEWEST is nonzero,
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
234 the first reboot record otherwise.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
235 Ignore all reboot records on or before BOOT_TIME.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
236 Success is indicated by setting BOOT_TIME to a larger value. */
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
237
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
238 get_boot_time_1 (filename, newest)
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
239 char *filename;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
240 int newest;
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
241 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
242 struct utmp ut, *utp;
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
243 int desc;
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
244
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
245 if (filename)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
246 {
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
247 /* On some versions of IRIX, opening a nonexistent file name
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
248 is likely to crash in the utmp routines. */
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
249 desc = open (filename, O_RDONLY);
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
250 if (desc < 0)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
251 return;
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
252
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
253 close (desc);
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
254
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
255 utmpname (filename);
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
256 }
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
257
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
258 setutent ();
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
259
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
260 while (1)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
261 {
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
262 /* Find the next reboot record. */
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
263 ut.ut_type = BOOT_TIME;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
264 utp = getutid (&ut);
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
265 if (! utp)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
266 break;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
267 /* Compare reboot times and use the newest one. */
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
268 if (utp->ut_time > boot_time)
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
269 {
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
270 boot_time = utp->ut_time;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
271 if (! newest)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
272 break;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
273 }
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
274 /* Advance on element in the file
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
275 so that getutid won't repeat the same one. */
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
276 utp = getutent ();
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
277 if (! utp)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
278 break;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
279 }
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
280 endutent ();
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
281 }
24369
8cbfa7848416 (get_boot_time_1): Put this in #ifdef BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 24349
diff changeset
282 #endif /* BOOT_TIME */
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
283
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
284 /* Here is the structure that stores information about a lock. */
3537
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
285
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
286 typedef struct
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
287 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
288 char *user;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
289 char *host;
16816
9bdccdf9388b (lock_info_type): Declare pid as unsigned long instead of int.
Richard M. Stallman <rms@gnu.org>
parents: 16802
diff changeset
290 unsigned long pid;
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
291 time_t boot_time;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
292 } lock_info_type;
3537
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
293
16844
f919de623142 (LOCK_PID_MAX): Use sizeof (unsigned long) instead of hardwiring 21.
Richard M. Stallman <rms@gnu.org>
parents: 16816
diff changeset
294 /* When we read the info back, we might need this much more,
f919de623142 (LOCK_PID_MAX): Use sizeof (unsigned long) instead of hardwiring 21.
Richard M. Stallman <rms@gnu.org>
parents: 16816
diff changeset
295 enough for decimal representation plus null. */
f919de623142 (LOCK_PID_MAX): Use sizeof (unsigned long) instead of hardwiring 21.
Richard M. Stallman <rms@gnu.org>
parents: 16816
diff changeset
296 #define LOCK_PID_MAX (4 * sizeof (unsigned long))
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
297
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
298 /* Free the two dynamically-allocated pieces in PTR. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
299 #define FREE_LOCK_INFO(i) do { xfree ((i).user); xfree ((i).host); } while (0)
3537
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
300
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
301
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
302 /* Write the name of the lock file for FN into LFNAME. Length will be
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
303 that of FN plus two more for the leading `.#' plus one for the null. */
9996
478f14a61aba (lock_dir, superlock_file, MAKE_LOCK_NAME):
Richard M. Stallman <rms@gnu.org>
parents: 9992
diff changeset
304 #define MAKE_LOCK_NAME(lock, file) \
21244
50929073a0ba Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents: 21223
diff changeset
305 (lock = (char *) alloca (STRING_BYTES (XSTRING (file)) + 2 + 1), \
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
306 fill_in_lock_file_name (lock, (file)))
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
307
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
308 static void
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
309 fill_in_lock_file_name (lockfile, fn)
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
310 register char *lockfile;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
311 register Lisp_Object fn;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
312 {
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
313 register char *p;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
314
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
315 strcpy (lockfile, XSTRING (fn)->data);
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
316
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
317 /* Shift the nondirectory part of the file name (including the null)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
318 right two characters. Here is one of the places where we'd have to
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
319 do something to support 14-character-max file names. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
320 for (p = lockfile + strlen (lockfile); p != lockfile && *p != '/'; p--)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
321 p[2] = *p;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
322
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
323 /* Insert the `.#'. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
324 p[1] = '.';
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
325 p[2] = '#';
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
326 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
327
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
328 /* Lock the lock file named LFNAME.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
329 If FORCE is nonzero, we do so even if it is already locked.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
330 Return 1 if successful, 0 if not. */
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
331
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
332 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
333 lock_file_1 (lfname, force)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
334 char *lfname;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
335 int force;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
337 register int err;
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
338 time_t boot_time;
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
339 char *user_name;
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
340 char *host_name;
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
341 char *lock_info_str;
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
342
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
343 if (STRINGP (Fuser_login_name (Qnil)))
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
344 user_name = (char *)XSTRING (Fuser_login_name (Qnil))->data;
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
345 else
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
346 user_name = "";
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
347 if (STRINGP (Fsystem_name ()))
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
348 host_name = (char *)XSTRING (Fsystem_name ())->data;
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
349 else
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
350 host_name = "";
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
351 lock_info_str = (char *)alloca (strlen (user_name) + strlen (host_name)
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
352 + LOCK_PID_MAX + 5);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
354 boot_time = get_boot_time ();
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
355 if (boot_time)
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
356 sprintf (lock_info_str, "%s@%s.%lu:%lu", user_name, host_name,
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
357 (unsigned long) getpid (), (unsigned long) boot_time);
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
358 else
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
359 sprintf (lock_info_str, "%s@%s.%lu", user_name, host_name,
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
360 (unsigned long) getpid ());
15797
24c31fcbcf97 (lock_file_owner_name): Always initialize the_pw.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
361
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
362 err = symlink (lock_info_str, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
363 if (errno == EEXIST && force)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
364 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
365 unlink (lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
366 err = symlink (lock_info_str, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
367 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
368
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
369 return err == 0;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
372 /* Return 1 if times A and B are no more than one second apart. */
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
374 int
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
375 within_one_second (a, b)
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
376 time_t a, b;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
377 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
378 return (a - b >= -1 && a - b <= 1);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
379 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
380
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
381 /* Return 0 if nobody owns the lock file LFNAME or the lock is obsolete,
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
382 1 if another process owns it (and set OWNER (if non-null) to info),
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
383 2 if the current process owns it,
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
384 or -1 if something is wrong with the locking mechanism. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
385
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
386 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
387 current_lock_owner (owner, lfname)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
388 lock_info_type *owner;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
389 char *lfname;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
390 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
391 #ifndef index
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
392 extern char *rindex (), *index ();
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
393 #endif
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
394 int o, p, len, ret;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
395 int local_owner = 0;
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
396 char *at, *dot, *colon;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
397 char *lfinfo = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
398 int bufsize = 50;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
399 /* Read arbitrarily-long contents of symlink. Similar code in
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
400 file-symlink-p in fileio.c. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
401 do
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
402 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
403 bufsize *= 2;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
404 lfinfo = (char *) xrealloc (lfinfo, bufsize);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
405 len = readlink (lfname, lfinfo, bufsize);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
406 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
407 while (len >= bufsize);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
408
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
409 /* If nonexistent lock file, all is well; otherwise, got strange error. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
410 if (len == -1)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
411 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
412 xfree (lfinfo);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
413 return errno == ENOENT ? 0 : -1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
414 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
415
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
416 /* Link info exists, so `len' is its length. Null terminate. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
417 lfinfo[len] = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
418
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
419 /* Even if the caller doesn't want the owner info, we still have to
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
420 read it to determine return value, so allocate it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
421 if (!owner)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
422 {
18707
23039b06955a (current_lock_owner, lock_file_1): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 17165
diff changeset
423 owner = (lock_info_type *) alloca (sizeof (lock_info_type));
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
424 local_owner = 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
425 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
426
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
427 /* Parse USER@HOST.PID:BOOT_TIME. If can't parse, return -1. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
428 /* The USER is everything before the first @. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
429 at = index (lfinfo, '@');
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
430 dot = rindex (lfinfo, '.');
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
431 if (!at || !dot)
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
432 {
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
433 xfree (lfinfo);
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
434 return -1;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
435 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
436 len = at - lfinfo;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
437 owner->user = (char *) xmalloc (len + 1);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
438 strncpy (owner->user, lfinfo, len);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
439 owner->user[len] = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
440
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
441 /* The PID is everything from the last `.' to the `:'. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
442 owner->pid = atoi (dot + 1);
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
443 colon = dot;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
444 while (*colon && *colon != ':')
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
445 colon++;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
446 /* After the `:', if there is one, comes the boot time. */
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
447 if (*colon == ':')
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
448 owner->boot_time = atoi (colon + 1);
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
449 else
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
450 owner->boot_time = 0;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
451
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
452 /* The host is everything in between. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
453 len = dot - at - 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
454 owner->host = (char *) xmalloc (len + 1);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
455 strncpy (owner->host, at + 1, len);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
456 owner->host[len] = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
457
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
458 /* We're done looking at the link info. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
459 xfree (lfinfo);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
460
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
461 /* On current host? */
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
462 if (STRINGP (Fsystem_name ())
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
463 && strcmp (owner->host, XSTRING (Fsystem_name ())->data) == 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
464 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
465 if (owner->pid == getpid ())
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
466 ret = 2; /* We own it. */
19058
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
467 else if (owner->pid > 0
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
468 && (kill (owner->pid, 0) >= 0 || errno == EPERM)
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
469 && (owner->boot_time == 0
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
470 || within_one_second (owner->boot_time, get_boot_time ())))
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
471 ret = 1; /* An existing process on this machine owns it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
472 /* The owner process is dead or has a strange pid (<=0), so try to
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
473 zap the lockfile. */
19058
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
474 else if (unlink (lfname) < 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
475 ret = -1;
19058
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
476 else
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
477 ret = 0;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
478 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
479 else
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
480 { /* If we wanted to support the check for stale locks on remote machines,
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
481 here's where we'd do it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
482 ret = 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
483 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
484
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
485 /* Avoid garbage. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
486 if (local_owner || ret <= 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
487 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
488 FREE_LOCK_INFO (*owner);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
489 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
490 return ret;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
491 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
492
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
493
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
494 /* Lock the lock named LFNAME if possible.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
495 Return 0 in that case.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
496 Return positive if some other process owns the lock, and info about
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
497 that process in CLASHER.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
498 Return -1 if cannot lock for any other reason. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
499
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
500 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
501 lock_if_free (clasher, lfname)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
502 lock_info_type *clasher;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
503 register char *lfname;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
504 {
24768
0895c669be5e (lock_if_free): After deleting a stale lock,
Richard M. Stallman <rms@gnu.org>
parents: 24746
diff changeset
505 while (lock_file_1 (lfname, 0) == 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
506 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
507 int locker;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
508
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
509 if (errno != EEXIST)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
510 return -1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
511
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
512 locker = current_lock_owner (clasher, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
513 if (locker == 2)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
514 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
515 FREE_LOCK_INFO (*clasher);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
516 return 0; /* We ourselves locked it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
517 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
518 else if (locker == 1)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
519 return 1; /* Someone else has it. */
25040
a3b19ebb46f9 (lock_if_free): Return -1 if check_lock_owner()
Karl Heuer <kwzh@gnu.org>
parents: 24949
diff changeset
520 else if (locker == -1)
25156
11333159bd0a Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 25125
diff changeset
521 return -1; /* current_lock_owner returned strange error. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
522
24768
0895c669be5e (lock_if_free): After deleting a stale lock,
Richard M. Stallman <rms@gnu.org>
parents: 24746
diff changeset
523 /* We deleted a stale lock; try again to lock the file. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
524 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
525 return 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
526 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
527
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
528 /* lock_file locks file FN,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 meaning it serves notice on the world that you intend to edit that file.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 This should be done only when about to modify a file-visiting
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 buffer previously unmodified.
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
532 Do not (normally) call this for a buffer already modified,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 as either the file is already locked, or the user has already
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 decided to go ahead without locking.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
536 When this returns, either the lock is locked for us,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 or the user has said to go ahead without locking.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
539 If the file is locked by someone else, this calls
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 ask-user-about-lock (a Lisp function) with two arguments,
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
541 the file name and info about the user who did the locking.
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 This function can signal an error, or return t meaning
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 take away the lock, or return nil meaning ignore the lock. */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 lock_file (fn)
21820
75f04f235df1 Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 21818
diff changeset
547 Lisp_Object fn;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 {
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
549 register Lisp_Object attack, orig_fn, encoded_fn;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
550 register char *lfname, *locker;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
551 lock_info_type lock_info;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552
24949
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
553 /* Don't do locking while dumping Emacs.
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
554 Uncompressing wtmp files uses call-process, which does not work
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
555 in an uninitialized Emacs. */
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
556 if (! NILP (Vpurify_flag))
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
557 return;
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
558
12811
11f5ce737c57 (lock_file): Use get_truename_buffer.
Richard M. Stallman <rms@gnu.org>
parents: 12104
diff changeset
559 orig_fn = fn;
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
560 fn = Fexpand_file_name (fn, Qnil);
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
561 encoded_fn = ENCODE_FILE (fn);
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
562
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
563 /* Create the name of the lock-file for file fn */
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
564 MAKE_LOCK_NAME (lfname, encoded_fn);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
566 /* See if this file is visited and has changed on disk since it was
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
567 visited. */
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 {
6499
e0bef61003ae (lock_file): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents: 6300
diff changeset
569 register Lisp_Object subject_buf;
21820
75f04f235df1 Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 21818
diff changeset
570 struct gcpro gcpro1;
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
571
12811
11f5ce737c57 (lock_file): Use get_truename_buffer.
Richard M. Stallman <rms@gnu.org>
parents: 12104
diff changeset
572 subject_buf = get_truename_buffer (orig_fn);
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
573 GCPRO1 (fn);
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
574
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
575 if (!NILP (subject_buf)
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
576 && NILP (Fverify_visited_file_modtime (subject_buf))
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
577 && !NILP (Ffile_exists_p (fn)))
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 call1 (intern ("ask-user-about-supersession-threat"), fn);
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
579
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
580 UNGCPRO;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 /* Try to lock the lock. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
584 if (lock_if_free (&lock_info, lfname) <= 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
585 /* Return now if we have locked it, or if lock creation failed */
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 return;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 /* Else consider breaking the lock */
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
589 locker = (char *) alloca (strlen (lock_info.user) + strlen (lock_info.host)
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
590 + LOCK_PID_MAX + 9);
19335
e33cf4ba547c (lock_file): Use %lu instead of %d in sprintf because
Richard M. Stallman <rms@gnu.org>
parents: 19216
diff changeset
591 sprintf (locker, "%s@%s (pid %lu)", lock_info.user, lock_info.host,
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
592 lock_info.pid);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
593 FREE_LOCK_INFO (lock_info);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
594
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
595 attack = call2 (intern ("ask-user-about-lock"), fn, build_string (locker));
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
596 if (!NILP (attack))
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 /* User says take the lock */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
599 lock_file_1 (lfname, 1);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 return;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
602 /* User says ignore the lock */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 unlock_file (fn)
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607 register Lisp_Object fn;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609 register char *lfname;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
610
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
611 fn = Fexpand_file_name (fn, Qnil);
22029
7620443f1878 (unlock_file): Encode the file name.
Richard M. Stallman <rms@gnu.org>
parents: 21902
diff changeset
612 fn = ENCODE_FILE (fn);
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
613
9996
478f14a61aba (lock_dir, superlock_file, MAKE_LOCK_NAME):
Richard M. Stallman <rms@gnu.org>
parents: 9992
diff changeset
614 MAKE_LOCK_NAME (lfname, fn);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
615
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
616 if (current_lock_owner (0, lfname) == 2)
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 unlink (lfname);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
618 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 unlock_all_files ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
623 register Lisp_Object tail;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624 register struct buffer *b;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625
9949
e9d341f235ee (unlock_all_files): Use the new type-test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9130
diff changeset
626 for (tail = Vbuffer_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr)
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
627 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
628 b = XBUFFER (XCONS (XCONS (tail)->car)->cdr);
10752
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
629 if (STRINGP (b->file_truename) && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b))
20131
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
630 {
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
631 register char *lfname;
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
632
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
633 MAKE_LOCK_NAME (lfname, b->file_truename);
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
634
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
635 if (current_lock_owner (0, lfname) == 2)
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
636 unlink (lfname);
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
637 }
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
638 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
641 DEFUN ("lock-buffer", Flock_buffer, Slock_buffer,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
642 0, 1, 0,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 "Lock FILE, if current buffer is modified.\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 FILE defaults to current buffer's visited file,\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 or else nothing is done if current buffer isn't visiting a file.")
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
646 (file)
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
647 Lisp_Object file;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
648 {
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
649 if (NILP (file))
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
650 file = current_buffer->file_truename;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
651 else
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
652 CHECK_STRING (file, 0);
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
653 if (SAVE_MODIFF < MODIFF
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
654 && !NILP (file))
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
655 lock_file (file);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
656 return Qnil;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
657 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
658
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
659 DEFUN ("unlock-buffer", Funlock_buffer, Sunlock_buffer,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
660 0, 0, 0,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
661 "Unlock the file visited in the current buffer,\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 if it should normally be locked.")
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663 ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 {
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
665 if (SAVE_MODIFF < MODIFF
10752
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
666 && STRINGP (current_buffer->file_truename))
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
667 unlock_file (current_buffer->file_truename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
668 return Qnil;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
669 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
670
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
671 /* Unlock the file visited in buffer BUFFER. */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
672
20369
37caaa295d69 (unlock_buffer): Declare it as void.
Kenichi Handa <handa@m17n.org>
parents: 20131
diff changeset
673 void
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
674 unlock_buffer (buffer)
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 struct buffer *buffer;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676 {
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
677 if (BUF_SAVE_MODIFF (buffer) < BUF_MODIFF (buffer)
10752
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
678 && STRINGP (buffer->file_truename))
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
679 unlock_file (buffer->file_truename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
680 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
681
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
682 DEFUN ("file-locked-p", Ffile_locked_p, Sfile_locked_p, 0, 1, 0,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
683 "Return nil if the FILENAME is not locked,\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
684 t if it is locked by you, else a string of the name of the locker.")
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
685 (filename)
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
686 Lisp_Object filename;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
687 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
688 Lisp_Object ret;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
689 register char *lfname;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
690 int owner;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
691 lock_info_type locker;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
692
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
693 filename = Fexpand_file_name (filename, Qnil);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
694
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
695 MAKE_LOCK_NAME (lfname, filename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
697 owner = current_lock_owner (&locker, lfname);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
698 if (owner <= 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
699 ret = Qnil;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
700 else if (owner == 2)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
701 ret = Qt;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
702 else
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
703 ret = build_string (locker.user);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
704
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
705 if (owner > 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
706 FREE_LOCK_INFO (locker);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
707
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
708 return ret;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 }
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
710
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
711 /* Initialization functions. */
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
712
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
713 void
24465
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
714 init_filelock ()
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
715 {
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
716 boot_time = 0;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
717 boot_time_initialized = 0;
24465
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
718 }
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
719
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
720 void
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
721 syms_of_filelock ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
722 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
723 defsubr (&Sunlock_buffer);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
724 defsubr (&Slock_buffer);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
725 defsubr (&Sfile_locked_p);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
727
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
728 #endif /* CLASH_DETECTION */