annotate src/filelock.c @ 95767:efe53e2a05b0

Correct copyright years to reflect the original newsticker.el from which most of this code was extracted, not the year it was moved into this file. Header formatting fix.
author Glenn Morris <rgm@gnu.org>
date Tue, 10 Jun 2008 03:21:37 +0000
parents 8971ddf55736
children e038c1a8307c
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.
64770
a0d1312ede66 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64084
diff changeset
2 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1996, 1998, 1999, 2000, 2001,
79759
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78260
diff changeset
3 2002, 2003, 2004, 2005, 2006, 2007, 2008
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78260
diff changeset
4 Free Software Foundation, Inc.
163
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 This file is part of GNU Emacs.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92159
diff changeset
8 GNU Emacs is free software: you can redistribute it and/or modify
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92159
diff changeset
10 the Free Software Foundation, either version 3 of the License, or
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92159
diff changeset
11 (at your option) any later version.
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 GNU Emacs is distributed in the hope that it will be useful,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 GNU General Public License for more details.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92159
diff changeset
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
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
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26012
diff changeset
22 #include <config.h>
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 #include <sys/types.h>
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 #include <sys/stat.h>
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
25 #include <signal.h>
25784
fe4ca7eaee87 (get_boot_time): Put local variable used in
Gerd Moellmann <gerd@gnu.org>
parents: 25743
diff changeset
26 #include <stdio.h>
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
27
61700
8a54ce1fae6a Remove reference to defunct vms-pwd.h.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 58592
diff changeset
28 #ifdef HAVE_PWD_H
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 #include <pwd.h>
61700
8a54ce1fae6a Remove reference to defunct vms-pwd.h.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 58592
diff changeset
30 #endif
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
31
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 #include <sys/file.h>
29910
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
33 #ifdef HAVE_FCNTL_H
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 #include <fcntl.h>
29910
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
35 #endif
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
36 #ifdef HAVE_STRING_H
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
37 #include <string.h>
29910
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
38 #endif
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
40 #ifdef HAVE_UNISTD_H
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
41 #include <unistd.h>
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
42 #endif
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
43
24424
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
44 #ifdef __FreeBSD__
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
45 #include <sys/sysctl.h>
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
46 #endif /* __FreeBSD__ */
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
47
29910
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
48 #include <errno.h>
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
49 #ifndef errno
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
50 extern int errno;
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
51 #endif
e5461cec39b8 Use feature tests for fcntl.h, string.h. Don't include time.h, done by
Dave Love <fx@gnu.org>
parents: 28927
diff changeset
52
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 #include "lisp.h"
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 #include "buffer.h"
88352
509c3faec8b6 Include "character.h".
Kenichi Handa <handa@m17n.org>
parents: 43138
diff changeset
55 #include "character.h"
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
56 #include "coding.h"
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
57 #include "systime.h"
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58
25743
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
59 /* The directory for writing temporary files. */
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
60
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
61 Lisp_Object Vtemporary_file_directory;
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
62
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 #ifdef CLASH_DETECTION
21413
edf1091d8a60 Include <utmp.h> only if CLASH_DETECTION is
Karl Heuer <kwzh@gnu.org>
parents: 21244
diff changeset
64
edf1091d8a60 Include <utmp.h> only if CLASH_DETECTION is
Karl Heuer <kwzh@gnu.org>
parents: 21244
diff changeset
65 #include <utmp.h>
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
66
43138
a3df29430166 (S_ISLNK): Define if not defined.
Richard M. Stallman <rms@gnu.org>
parents: 41031
diff changeset
67 #if !defined (S_ISLNK) && defined (S_IFLNK)
a3df29430166 (S_ISLNK): Define if not defined.
Richard M. Stallman <rms@gnu.org>
parents: 41031
diff changeset
68 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
a3df29430166 (S_ISLNK): Define if not defined.
Richard M. Stallman <rms@gnu.org>
parents: 41031
diff changeset
69 #endif
a3df29430166 (S_ISLNK): Define if not defined.
Richard M. Stallman <rms@gnu.org>
parents: 41031
diff changeset
70
24869
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
71 /* 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
72 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
73 #ifndef BOOT_TIME_FILE
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
74 #define BOOT_TIME_FILE "/var/run/random-seed"
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
75 #endif
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
76
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
77 #ifndef WTMP_FILE
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
78 #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
79 #endif
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
80
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
81 /* 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
82 directory, with link data `user@host.pid'. This avoids a single
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
83 mount (== failure) point for lock files.
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
85 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
86 the pid is valid with kill.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
87
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
88 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
89 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
90 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
91 whatever to other processes, either locally or remotely; rms says
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
92 that's too unreliable. Hence the separate file, which could
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
93 theoretically be updated by daemons running separately -- but this
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
94 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
95 environment, it seems such stale locks arise fairly infrequently, and
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
96 Emacs' standard methods of dealing with clashes suffice.
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
97
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
98 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
99 stored more efficiently on the filesystem, since the kernel knows
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
100 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
101 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
102 files to be useful on old systems lacking symlinks, nowadays
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
103 virtually all such systems are probably single-user anyway, so it
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
104 didn't seem worth the complication.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
105
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
106 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
107 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
108 symlinks.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
109
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
110 This is compatible with the locking scheme used by Interleaf (which
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
111 has contributed this implementation for Emacs), and was designed by
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
112 Ethan Jacobson, Kimbo Mundy, and others.
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
113
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
114 --karl@cs.umb.edu/karl@hq.ileaf.com. */
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
115
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
116
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
117 /* 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
118
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
119 static time_t boot_time;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
120 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
121
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
122 extern Lisp_Object Vshell_file_name;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
123
26501
e6e6add72493 Add forward declaration for get_boot_time_1.
Dave Love <fx@gnu.org>
parents: 26361
diff changeset
124 #ifdef BOOT_TIME
e6e6add72493 Add forward declaration for get_boot_time_1.
Dave Love <fx@gnu.org>
parents: 26361
diff changeset
125 static void get_boot_time_1 P_ ((char *, int));
e6e6add72493 Add forward declaration for get_boot_time_1.
Dave Love <fx@gnu.org>
parents: 26361
diff changeset
126 #endif
e6e6add72493 Add forward declaration for get_boot_time_1.
Dave Love <fx@gnu.org>
parents: 26361
diff changeset
127
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
128 static time_t
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
129 get_boot_time ()
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
130 {
92159
9ed7610349d3 * configure.in: Remove references to obsolete variables and
Dan Nicolaescu <dann@ics.uci.edu>
parents: 91327
diff changeset
131 #if defined (BOOT_TIME)
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
132 int counter;
25784
fe4ca7eaee87 (get_boot_time): Put local variable used in
Gerd Moellmann <gerd@gnu.org>
parents: 25743
diff changeset
133 #endif
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
134
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
135 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
136 return boot_time;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
137 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
138
24424
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
139 #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
140 {
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
141 int mib[2];
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
142 size_t size;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
143 struct timeval boottime_val;
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 mib[0] = CTL_KERN;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
146 mib[1] = KERN_BOOTTIME;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
147 size = sizeof (boottime_val);
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
148
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
149 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
150 {
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
151 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
152 return boot_time;
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
153 }
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
154 }
520e8f39c1f8 (get_boot_time): Support FreeBSD way to read boot-time.
Karl Heuer <kwzh@gnu.org>
parents: 24406
diff changeset
155 #endif /* defined (CTL_KERN) && defined (KERN_BOOTTIME) */
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
156
24869
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
157 if (BOOT_TIME_FILE)
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
158 {
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
159 struct stat st;
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
160 if (stat (BOOT_TIME_FILE, &st) == 0)
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
161 {
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
162 boot_time = st.st_mtime;
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
163 return boot_time;
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
164 }
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
165 }
28e022c50e4f (BOOT_TIME_FILE): New macro.
Paul Eggert <eggert@twinsun.com>
parents: 24816
diff changeset
166
92159
9ed7610349d3 * configure.in: Remove references to obsolete variables and
Dan Nicolaescu <dann@ics.uci.edu>
parents: 91327
diff changeset
167 #if defined (BOOT_TIME)
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
168 #ifndef CANNOT_DUMP
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
169 /* The utmp routines maintain static state.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
170 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
171 since it might not survive dumping. */
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
172 if (! initialized)
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 #endif /* not CANNOT_DUMP */
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
175
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
176 /* 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
177 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
178 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
179 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
180 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
181 if (boot_time)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
182 return boot_time;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
183
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
184 /* 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
185 get_boot_time_1 (WTMP_FILE, 1);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
186
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
187 /* 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
188 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
189 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
190 char cmd_string[100];
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
191 Lisp_Object tempname, filename;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
192 int delete_flag = 0;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
193
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
194 filename = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
195
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
196 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
197 tempname = build_string (cmd_string);
24499
e5b719c6fd51 (get_boot_time): Test tempname, not filename.
Karl Heuer <kwzh@gnu.org>
parents: 24465
diff changeset
198 if (! NILP (Ffile_exists_p (tempname)))
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
199 filename = tempname;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
200 else
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
201 {
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
202 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
203 tempname = build_string (cmd_string);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
204 if (! NILP (Ffile_exists_p (tempname)))
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
205 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
206 Lisp_Object args[6];
28927
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
207
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
208 /* The utmp functions on mescaline.gnu.org accept only
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
209 file names up to 8 characters long. Choose a 2
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
210 character long prefix, and call make_temp_file with
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
211 second arg non-zero, so that it will add not more
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
212 than 6 characters to the prefix. */
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
213 tempname = Fexpand_file_name (build_string ("wt"),
25743
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
214 Vtemporary_file_directory);
28927
a06e82e2ffc8 (get_boot_time): To obtain an 8 char file name, which
Gerd Moellmann <gerd@gnu.org>
parents: 28589
diff changeset
215 tempname = make_temp_name (tempname, 1);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
216 args[0] = Vshell_file_name;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
217 args[1] = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
218 args[2] = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
219 args[3] = Qnil;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
220 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
221 sprintf (cmd_string, "gunzip < %s.%d.gz > %s",
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
222 WTMP_FILE, counter, SDATA (tempname));
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
223 args[5] = build_string (cmd_string);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
224 Fcall_process (6, args);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
225 filename = tempname;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
226 delete_flag = 1;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
227 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
228 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
229
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
230 if (! NILP (filename))
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
231 {
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
232 get_boot_time_1 (SDATA (filename), 1);
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
233 if (delete_flag)
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
234 unlink (SDATA (filename));
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
235 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
236 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
237
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
238 return boot_time;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
239 #else
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
240 return 0;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
241 #endif
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
242 }
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
243
24369
8cbfa7848416 (get_boot_time_1): Put this in #ifdef BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 24349
diff changeset
244 #ifdef BOOT_TIME
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
245 /* 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
246 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
247
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
248 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
249 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
250 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
251 the first reboot record otherwise.
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
252 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
253 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
254
26501
e6e6add72493 Add forward declaration for get_boot_time_1.
Dave Love <fx@gnu.org>
parents: 26361
diff changeset
255 void
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
256 get_boot_time_1 (filename, newest)
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
257 char *filename;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
258 int newest;
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
259 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
260 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
261 int desc;
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
262
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
263 if (filename)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
264 {
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
265 /* 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
266 is likely to crash in the utmp routines. */
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26012
diff changeset
267 desc = emacs_open (filename, O_RDONLY, 0);
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
268 if (desc < 0)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
269 return;
24406
76205fb50ca1 (get_boot_time): Use WTMP_FILE for file name.
Richard M. Stallman <rms@gnu.org>
parents: 24386
diff changeset
270
26088
b7aa6ac26872 Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents: 26012
diff changeset
271 emacs_close (desc);
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
272
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
273 utmpname (filename);
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
274 }
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
275
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
276 setutent ();
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
277
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
278 while (1)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
279 {
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
280 /* Find the next reboot record. */
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
281 ut.ut_type = BOOT_TIME;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
282 utp = getutid (&ut);
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
283 if (! utp)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
284 break;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
285 /* 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
286 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
287 {
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
288 boot_time = utp->ut_time;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
289 if (! newest)
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
290 break;
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
291 }
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
292 /* 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
293 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
294 utp = getutent ();
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
295 if (! utp)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
296 break;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
297 }
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
298 endutent ();
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
299 }
24369
8cbfa7848416 (get_boot_time_1): Put this in #ifdef BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 24349
diff changeset
300 #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
301
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
302 /* 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
303
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
304 typedef struct
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
305 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
306 char *user;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
307 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
308 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
309 time_t boot_time;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
310 } lock_info_type;
3537
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
311
16844
f919de623142 (LOCK_PID_MAX): Use sizeof (unsigned long) instead of hardwiring 21.
Richard M. Stallman <rms@gnu.org>
parents: 16816
diff changeset
312 /* 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
313 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
314 #define LOCK_PID_MAX (4 * sizeof (unsigned long))
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
315
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
316 /* Free the two dynamically-allocated pieces in PTR. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
317 #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
318
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
319
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
320 /* Write the name of the lock file for FN into LFNAME. Length will be
28589
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
321 that of FN plus two more for the leading `.#' plus 1 for the
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
322 trailing period plus one for the digit after it plus one for the
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
323 null. */
9996
478f14a61aba (lock_dir, superlock_file, MAKE_LOCK_NAME):
Richard M. Stallman <rms@gnu.org>
parents: 9992
diff changeset
324 #define MAKE_LOCK_NAME(lock, file) \
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
325 (lock = (char *) alloca (SBYTES (file) + 2 + 1 + 1 + 1), \
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
326 fill_in_lock_file_name (lock, (file)))
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
327
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
328 static void
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
329 fill_in_lock_file_name (lockfile, fn)
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
330 register char *lockfile;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
331 register Lisp_Object fn;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
332 {
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
333 register char *p;
28589
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
334 struct stat st;
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
335 int count = 0;
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
336
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
337 strcpy (lockfile, SDATA (fn));
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
338
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
339 /* Shift the nondirectory part of the file name (including the null)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
340 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
341 do something to support 14-character-max file names. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
342 for (p = lockfile + strlen (lockfile); p != lockfile && *p != '/'; p--)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
343 p[2] = *p;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
344
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
345 /* Insert the `.#'. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
346 p[1] = '.';
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
347 p[2] = '#';
28589
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
348
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
349 p = p + strlen (p);
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
350
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
351 while (lstat (lockfile, &st) == 0 && !S_ISLNK (st.st_mode))
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
352 {
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
353 if (count > 9)
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
354 {
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
355 *p = '\0';
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
356 return;
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
357 }
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
358 sprintf (p, ".%d", count++);
f10b492946d2 (MAKE_LOCK_NAME): Allocate 2 more bytes.
Gerd Moellmann <gerd@gnu.org>
parents: 26501
diff changeset
359 }
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
360 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
361
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
362 /* Lock the lock file named LFNAME.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
363 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
364 Return 1 if successful, 0 if not. */
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
365
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
366 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
367 lock_file_1 (lfname, force)
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
368 char *lfname;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
369 int force;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
371 register int err;
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
372 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
373 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
374 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
375 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
376
58592
7c0aad26b8bb (lock_file_1): Call get_boot_time early. Increase
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
377 /* Call this first because it can GC. */
7c0aad26b8bb (lock_file_1): Call get_boot_time early. Increase
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
378 boot_time = get_boot_time ();
7c0aad26b8bb (lock_file_1): Call get_boot_time early. Increase
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
379
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
380 if (STRINGP (Fuser_login_name (Qnil)))
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
381 user_name = (char *)SDATA (Fuser_login_name (Qnil));
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
382 else
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
383 user_name = "";
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
384 if (STRINGP (Fsystem_name ()))
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
385 host_name = (char *)SDATA (Fsystem_name ());
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
386 else
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
387 host_name = "";
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
388 lock_info_str = (char *)alloca (strlen (user_name) + strlen (host_name)
58592
7c0aad26b8bb (lock_file_1): Call get_boot_time early. Increase
Andreas Schwab <schwab@suse.de>
parents: 52401
diff changeset
389 + LOCK_PID_MAX + 30);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
391 if (boot_time)
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
392 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
393 (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
394 else
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
395 sprintf (lock_info_str, "%s@%s.%lu", user_name, host_name,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
396 (unsigned long) getpid ());
15797
24c31fcbcf97 (lock_file_owner_name): Always initialize the_pw.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
397
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
398 err = symlink (lock_info_str, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
399 if (errno == EEXIST && force)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
400 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
401 unlink (lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
402 err = symlink (lock_info_str, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
403 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
404
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
405 return err == 0;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
408 /* 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
409
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
410 int
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
411 within_one_second (a, b)
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
412 time_t a, b;
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
413 {
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
414 return (a - b >= -1 && a - b <= 1);
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
415 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
416
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
417 /* 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
418 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
419 2 if the current process owns it,
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
420 or -1 if something is wrong with the locking mechanism. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
421
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
422 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
423 current_lock_owner (owner, lfname)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
424 lock_info_type *owner;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
425 char *lfname;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
426 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
427 #ifndef index
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
428 extern char *rindex (), *index ();
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
429 #endif
25743
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
430 int len, ret;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
431 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
432 char *at, *dot, *colon;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
433 char *lfinfo = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
434 int bufsize = 50;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
435 /* Read arbitrarily-long contents of symlink. Similar code in
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
436 file-symlink-p in fileio.c. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
437 do
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
438 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
439 bufsize *= 2;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
440 lfinfo = (char *) xrealloc (lfinfo, bufsize);
39284
27f628743baa Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents: 39283
diff changeset
441 errno = 0;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
442 len = readlink (lfname, lfinfo, bufsize);
39283
ba947b6fd6ae (current_lock_owner): If readlink returns ERANGE,
Gerd Moellmann <gerd@gnu.org>
parents: 32833
diff changeset
443 #ifdef ERANGE
ba947b6fd6ae (current_lock_owner): If readlink returns ERANGE,
Gerd Moellmann <gerd@gnu.org>
parents: 32833
diff changeset
444 /* HP-UX reports ERANGE if the buffer is too small. */
ba947b6fd6ae (current_lock_owner): If readlink returns ERANGE,
Gerd Moellmann <gerd@gnu.org>
parents: 32833
diff changeset
445 if (len == -1 && errno == ERANGE)
39290
c5853621fe9b (current_lock_owner): Fix last change.
Gerd Moellmann <gerd@gnu.org>
parents: 39284
diff changeset
446 len = bufsize;
39283
ba947b6fd6ae (current_lock_owner): If readlink returns ERANGE,
Gerd Moellmann <gerd@gnu.org>
parents: 32833
diff changeset
447 #endif
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
448 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
449 while (len >= bufsize);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
450
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
451 /* If nonexistent lock file, all is well; otherwise, got strange error. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
452 if (len == -1)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
453 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
454 xfree (lfinfo);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
455 return errno == ENOENT ? 0 : -1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
456 }
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 /* Link info exists, so `len' is its length. Null terminate. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
459 lfinfo[len] = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
460
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
461 /* 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
462 read it to determine return value, so allocate it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
463 if (!owner)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
464 {
18707
23039b06955a (current_lock_owner, lock_file_1): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 17165
diff changeset
465 owner = (lock_info_type *) alloca (sizeof (lock_info_type));
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
466 local_owner = 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
467 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
468
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
469 /* Parse USER@HOST.PID:BOOT_TIME. If can't parse, return -1. */
78201
f85d926dbc61 (current_lock_owner): Allow for @ sign in username.
Jason Rumney <jasonr@gnu.org>
parents: 75348
diff changeset
470 /* The USER is everything before the last @. */
f85d926dbc61 (current_lock_owner): Allow for @ sign in username.
Jason Rumney <jasonr@gnu.org>
parents: 75348
diff changeset
471 at = rindex (lfinfo, '@');
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
472 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
473 if (!at || !dot)
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
474 {
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
475 xfree (lfinfo);
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
476 return -1;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
477 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
478 len = at - lfinfo;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
479 owner->user = (char *) xmalloc (len + 1);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
480 strncpy (owner->user, lfinfo, len);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
481 owner->user[len] = 0;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
482
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
483 /* The PID is everything from the last `.' to the `:'. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
484 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
485 colon = dot;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
486 while (*colon && *colon != ':')
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
487 colon++;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
488 /* 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
489 if (*colon == ':')
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
490 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
491 else
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
492 owner->boot_time = 0;
16802
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 /* The host is everything in between. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
495 len = dot - at - 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
496 owner->host = (char *) xmalloc (len + 1);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
497 strncpy (owner->host, at + 1, len);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
498 owner->host[len] = 0;
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 /* We're done looking at the link info. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
501 xfree (lfinfo);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
502
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
503 /* 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
504 if (STRINGP (Fsystem_name ())
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 43138
diff changeset
505 && strcmp (owner->host, SDATA (Fsystem_name ())) == 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 if (owner->pid == getpid ())
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
508 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
509 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
510 && (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
511 && (owner->boot_time == 0
24349
b6c16b67b735 (within_one_second): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22115
diff changeset
512 || within_one_second (owner->boot_time, get_boot_time ())))
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
513 ret = 1; /* An existing process on this machine owns it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
514 /* 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
515 zap the lockfile. */
19058
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
516 else if (unlink (lfname) < 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
517 ret = -1;
19058
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
518 else
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
519 ret = 0;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
520 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
521 else
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
522 { /* 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
523 here's where we'd do it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
524 ret = 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
525 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
526
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
527 /* Avoid garbage. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
528 if (local_owner || ret <= 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
529 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
530 FREE_LOCK_INFO (*owner);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
531 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
532 return ret;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
533 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
534
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
535
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
536 /* Lock the lock named LFNAME if possible.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
537 Return 0 in that case.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
538 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
539 that process in CLASHER.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
540 Return -1 if cannot lock for any other reason. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
541
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
542 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
543 lock_if_free (clasher, lfname)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
544 lock_info_type *clasher;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
545 register char *lfname;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
546 {
24768
0895c669be5e (lock_if_free): After deleting a stale lock,
Richard M. Stallman <rms@gnu.org>
parents: 24746
diff changeset
547 while (lock_file_1 (lfname, 0) == 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
548 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
549 int locker;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
550
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
551 if (errno != EEXIST)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
552 return -1;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
553
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
554 locker = current_lock_owner (clasher, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
555 if (locker == 2)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
556 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
557 FREE_LOCK_INFO (*clasher);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
558 return 0; /* We ourselves locked it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
559 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
560 else if (locker == 1)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
561 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
562 else if (locker == -1)
25156
11333159bd0a Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 25125
diff changeset
563 return -1; /* current_lock_owner returned strange error. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
564
24768
0895c669be5e (lock_if_free): After deleting a stale lock,
Richard M. Stallman <rms@gnu.org>
parents: 24746
diff changeset
565 /* 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
566 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
567 return 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
568 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
569
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
570 /* lock_file locks file FN,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 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
572 This should be done only when about to modify a file-visiting
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 buffer previously unmodified.
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
574 Do not (normally) call this for a buffer already modified,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 as either the file is already locked, or the user has already
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 decided to go ahead without locking.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
578 When this returns, either the lock is locked for us,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 or the user has said to go ahead without locking.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
581 If the file is locked by someone else, this calls
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 ask-user-about-lock (a Lisp function) with two arguments,
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
583 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
584 This function can signal an error, or return t meaning
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 take away the lock, or return nil meaning ignore the lock. */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 lock_file (fn)
21820
75f04f235df1 Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 21818
diff changeset
589 Lisp_Object fn;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
590 {
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
591 register Lisp_Object attack, orig_fn, encoded_fn;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
592 register char *lfname, *locker;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
593 lock_info_type lock_info;
26012
7c6e372f60a9 (lock_file): Fix previous change.
Dave Love <fx@gnu.org>
parents: 26006
diff changeset
594 struct gcpro gcpro1;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595
24949
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
596 /* Don't do locking while dumping Emacs.
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
597 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
598 in an uninitialized Emacs. */
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
599 if (! NILP (Vpurify_flag))
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
600 return;
1dfff6fa0f05 (lock_file): Do nothing if purifying.
Richard M. Stallman <rms@gnu.org>
parents: 24869
diff changeset
601
12811
11f5ce737c57 (lock_file): Use get_truename_buffer.
Richard M. Stallman <rms@gnu.org>
parents: 12104
diff changeset
602 orig_fn = fn;
26006
ca384fd94454 (lock_file): Move gcpro of `fn'.
Dave Love <fx@gnu.org>
parents: 25784
diff changeset
603 GCPRO1 (fn);
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
604 fn = Fexpand_file_name (fn, Qnil);
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
605 encoded_fn = ENCODE_FILE (fn);
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
606
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
607 /* 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
608 MAKE_LOCK_NAME (lfname, encoded_fn);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
610 /* 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
611 visited. */
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 {
6499
e0bef61003ae (lock_file): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents: 6300
diff changeset
613 register Lisp_Object subject_buf;
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
614
12811
11f5ce737c57 (lock_file): Use get_truename_buffer.
Richard M. Stallman <rms@gnu.org>
parents: 12104
diff changeset
615 subject_buf = get_truename_buffer (orig_fn);
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
616
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
617 if (!NILP (subject_buf)
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
618 && NILP (Fverify_visited_file_modtime (subject_buf))
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
619 && !NILP (Ffile_exists_p (fn)))
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 call1 (intern ("ask-user-about-supersession-threat"), fn);
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
621
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
622 }
26006
ca384fd94454 (lock_file): Move gcpro of `fn'.
Dave Love <fx@gnu.org>
parents: 25784
diff changeset
623 UNGCPRO;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
624
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625 /* Try to lock the lock. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
626 if (lock_if_free (&lock_info, lfname) <= 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
627 /* 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
628 return;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
629
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
630 /* Else consider breaking the lock */
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
631 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
632 + 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
633 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
634 lock_info.pid);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
635 FREE_LOCK_INFO (lock_info);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
636
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
637 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
638 if (!NILP (attack))
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
639 /* User says take the lock */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
640 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
641 lock_file_1 (lfname, 1);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
642 return;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
643 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
644 /* User says ignore the lock */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
645 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
646
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
647 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
648 unlock_file (fn)
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
649 register Lisp_Object fn;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
650 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
651 register char *lfname;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
652
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
653 fn = Fexpand_file_name (fn, Qnil);
22029
7620443f1878 (unlock_file): Encode the file name.
Richard M. Stallman <rms@gnu.org>
parents: 21902
diff changeset
654 fn = ENCODE_FILE (fn);
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
655
9996
478f14a61aba (lock_dir, superlock_file, MAKE_LOCK_NAME):
Richard M. Stallman <rms@gnu.org>
parents: 9992
diff changeset
656 MAKE_LOCK_NAME (lfname, fn);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
657
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
658 if (current_lock_owner (0, lfname) == 2)
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
659 unlink (lfname);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
660 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
661
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
662 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
663 unlock_all_files ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
664 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
665 register Lisp_Object tail;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
666 register struct buffer *b;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
667
90970
3371fc48749b Replace uses of GC_* macros with the non-GC_ versions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 90737
diff changeset
668 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
669 {
25662
0a7261c1d487 Use XCAR, XCDR, and XFLOAT_DATA instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents: 25322
diff changeset
670 b = XBUFFER (XCDR (XCAR (tail)));
10752
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
671 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
672 {
32833
ee1e731661c6 (unlock_all_files): Use unlock_file to expand each
Gerd Moellmann <gerd@gnu.org>
parents: 29910
diff changeset
673 unlock_file(b->file_truename);
20131
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
674 }
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
675 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
676 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
677
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
678 DEFUN ("lock-buffer", Flock_buffer, Slock_buffer,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
679 0, 1, 0,
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
680 doc: /* Lock FILE, if current buffer is modified.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
681 FILE defaults to current buffer's visited file,
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
682 or else nothing is done if current buffer isn't visiting a file. */)
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
683 (file)
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
684 Lisp_Object file;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
685 {
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
686 if (NILP (file))
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
687 file = current_buffer->file_truename;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
688 else
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39290
diff changeset
689 CHECK_STRING (file);
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
690 if (SAVE_MODIFF < MODIFF
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
691 && !NILP (file))
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
692 lock_file (file);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 46370
diff changeset
693 return Qnil;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
694 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
695
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
696 DEFUN ("unlock-buffer", Funlock_buffer, Sunlock_buffer,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
697 0, 0, 0,
41031
708f79243258 (Funlock_buffer, Ffile_locked_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 41001
diff changeset
698 doc: /* Unlock the file visited in the current buffer.
708f79243258 (Funlock_buffer, Ffile_locked_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 41001
diff changeset
699 If the buffer is not modified, this does nothing because the file
708f79243258 (Funlock_buffer, Ffile_locked_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 41001
diff changeset
700 should not be locked in that case. */)
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
701 ()
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
702 {
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
703 if (SAVE_MODIFF < MODIFF
10752
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
704 && STRINGP (current_buffer->file_truename))
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
705 unlock_file (current_buffer->file_truename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
706 return Qnil;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
707 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
708
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
709 /* Unlock the file visited in buffer BUFFER. */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
710
20369
37caaa295d69 (unlock_buffer): Declare it as void.
Kenichi Handa <handa@m17n.org>
parents: 20131
diff changeset
711 void
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
712 unlock_buffer (buffer)
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
713 struct buffer *buffer;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
714 {
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
715 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
716 && STRINGP (buffer->file_truename))
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
717 unlock_file (buffer->file_truename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
718 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
719
26361
95491c6d08de (Ffile_locked_p): Make FILENAME a required argument.
Gerd Moellmann <gerd@gnu.org>
parents: 26088
diff changeset
720 DEFUN ("file-locked-p", Ffile_locked_p, Sfile_locked_p, 1, 1, 0,
41031
708f79243258 (Funlock_buffer, Ffile_locked_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 41001
diff changeset
721 doc: /* Return a value indicating whether FILENAME is locked.
708f79243258 (Funlock_buffer, Ffile_locked_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 41001
diff changeset
722 The value is nil if the FILENAME is not locked,
708f79243258 (Funlock_buffer, Ffile_locked_p): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 41001
diff changeset
723 t if it is locked by you, else a string saying which user has locked it. */)
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
724 (filename)
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
725 Lisp_Object filename;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
726 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
727 Lisp_Object ret;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
728 register char *lfname;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
729 int owner;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
730 lock_info_type locker;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
731
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
732 filename = Fexpand_file_name (filename, Qnil);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
733
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
734 MAKE_LOCK_NAME (lfname, filename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
735
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
736 owner = current_lock_owner (&locker, lfname);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
737 if (owner <= 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
738 ret = Qnil;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
739 else if (owner == 2)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
740 ret = Qt;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
741 else
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
742 ret = build_string (locker.user);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
743
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
744 if (owner > 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
745 FREE_LOCK_INFO (locker);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
746
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
747 return ret;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
748 }
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
749
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
750 /* Initialization functions. */
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
751
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
752 void
24465
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
753 init_filelock ()
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
754 {
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
755 boot_time = 0;
24744
0e99bc70cf07 Fix performance bug on hosts with large
Richard M. Stallman <rms@gnu.org>
parents: 24704
diff changeset
756 boot_time_initialized = 0;
24465
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
757 }
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
758
b285eda48e4c (init_filelock): New function.
Karl Heuer <kwzh@gnu.org>
parents: 24459
diff changeset
759 void
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
760 syms_of_filelock ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
761 {
25743
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
762 DEFVAR_LISP ("temporary-file-directory", &Vtemporary_file_directory,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
763 doc: /* The directory for writing temporary files. */);
25743
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
764 Vtemporary_file_directory = Qnil;
e6246adc8a35 (Vtemporary_file_directory): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 25662
diff changeset
765
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
766 defsubr (&Sunlock_buffer);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
767 defsubr (&Slock_buffer);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
768 defsubr (&Sfile_locked_p);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
769 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
770
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
771 #endif /* CLASH_DETECTION */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
772
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
773 /* arch-tag: e062676d-50b2-4be0-ab96-197c81b181a1
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
774 (do not change this comment) */