annotate src/filelock.c @ 23323:0800a4f84757

(underlying_strftime): Set the buffer to a nonzero value before calling strftime, and check to see whether strftime has set the buffer to zero. This lets us distinguish between an empty buffer and an error. I'm installing this patch by hand now; it will be superseded whenever the glibc sources are propagated back to fsf.org.
author Paul Eggert <eggert@twinsun.com>
date Fri, 25 Sep 1998 21:40:23 +0000
parents b7efc1e72e26
children b6c16b67b735
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
1 /* Copyright (C) 1985, 86, 87, 93, 94, 96 Free Software Foundation, Inc.
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3 This file is part of GNU Emacs.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 GNU Emacs is free software; you can redistribute it and/or modify
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 any later version.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 GNU Emacs is distributed in the hope that it will be useful,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 GNU General Public License for more details.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14075
diff changeset
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 14075
diff changeset
18 Boston, MA 02111-1307, USA. */
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
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 #include <sys/types.h>
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 #include <sys/stat.h>
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
23 #include <signal.h>
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 4680
diff changeset
24 #include <config.h>
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
25
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
26 #ifdef VMS
559
65e7f842d017 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
27 #include "vms-pwd.h"
372
481e29c1e27e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 163
diff changeset
28 #else
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 #include <pwd.h>
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
30 #endif /* not VMS */
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>
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 #ifdef USG
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 #include <fcntl.h>
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
35 #include <string.h>
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 #endif /* USG */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
38 #ifdef HAVE_UNISTD_H
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
39 #include <unistd.h>
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
40 #endif
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
41
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 #include "lisp.h"
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 #include "buffer.h"
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
44 #include "charset.h"
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
45 #include "coding.h"
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
47 #include <time.h>
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
48 #include <errno.h>
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
49 #ifndef errno
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 extern int errno;
4272
41c85882768c (getpwuid): Declare at top level, and not if __386bsd__.
Richard M. Stallman <rms@gnu.org>
parents: 3602
diff changeset
51 #endif
41c85882768c (getpwuid): Declare at top level, and not if __386bsd__.
Richard M. Stallman <rms@gnu.org>
parents: 3602
diff changeset
52
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 #ifdef CLASH_DETECTION
21413
edf1091d8a60 Include <utmp.h> only if CLASH_DETECTION is
Karl Heuer <kwzh@gnu.org>
parents: 21244
diff changeset
54
edf1091d8a60 Include <utmp.h> only if CLASH_DETECTION is
Karl Heuer <kwzh@gnu.org>
parents: 21244
diff changeset
55 #include <utmp.h>
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
57 /* 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
58 directory, with link data `user@host.pid'. This avoids a single
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
59 mount (== failure) point for lock files.
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
61 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
62 the pid is valid with kill.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
63
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
64 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
65 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
66 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
67 whatever to other processes, either locally or remotely; rms says
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
68 that's too unreliable. Hence the separate file, which could
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
69 theoretically be updated by daemons running separately -- but this
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
70 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
71 environment, it seems such stale locks arise fairly infrequently, and
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
72 Emacs' standard methods of dealing with clashes suffice.
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
73
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
74 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
75 stored more efficiently on the filesystem, since the kernel knows
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
76 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
77 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
78 files to be useful on old systems lacking symlinks, nowadays
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
79 virtually all such systems are probably single-user anyway, so it
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
80 didn't seem worth the complication.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
81
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
82 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
83 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
84 symlinks.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
85
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
86 This is compatible with the locking scheme used by Interleaf (which
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
87 has contributed this implementation for Emacs), and was designed by
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
88 Ethan Jacobson, Kimbo Mundy, and others.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
89
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
90 --karl@cs.umb.edu/karl@hq.ileaf.com. */
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
91
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
92
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
93 /* 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
94
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
95 static time_t boot_time;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
96
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
97 static time_t
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
98 get_boot_time ()
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
99 {
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
100 #ifdef BOOT_TIME
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
101 struct utmp ut, *utp;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
102
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
103 if (boot_time)
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
104 return boot_time;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
105
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
106 utmpname ("/var/log/wtmp");
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
107 setutent ();
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
108 boot_time = 1;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
109 while (1)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
110 {
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
111 /* Find the next reboot record. */
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
112 ut.ut_type = BOOT_TIME;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
113 utp = getutid (&ut);
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
114 if (! utp)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
115 break;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
116 /* 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
117 if (utp->ut_time > boot_time)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
118 boot_time = utp->ut_time;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
119 /* 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
120 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
121 utp = getutent ();
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
122 if (! utp)
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
123 break;
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
124 }
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
125 endutent ();
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
126
22115
b7efc1e72e26 (get_boot_time): Scan the whole wtmp file
Richard M. Stallman <rms@gnu.org>
parents: 22029
diff changeset
127 return boot_time;
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
128 #else
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
129 return 0;
21712
36667ebd744e (get_boot_time): Remove extraneous semicolon.
Erik Naggum <erik@naggum.no>
parents: 21514
diff changeset
130 #endif
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
131 }
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
132
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
133 /* 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
134
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
135 typedef struct
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
136 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
137 char *user;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
138 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
139 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
140 time_t boot_time;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
141 } lock_info_type;
3537
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
142
16844
f919de623142 (LOCK_PID_MAX): Use sizeof (unsigned long) instead of hardwiring 21.
Richard M. Stallman <rms@gnu.org>
parents: 16816
diff changeset
143 /* 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
144 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
145 #define LOCK_PID_MAX (4 * sizeof (unsigned long))
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
146
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
147 /* Free the two dynamically-allocated pieces in PTR. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
148 #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
149
22055fd47b78 (MAKE_LOCK_PATH): If SHORT_FILE_NAMES allocates
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
150
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
151 /* Write the name of the lock file for FN into LFNAME. Length will be
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
152 that of FN plus two more for the leading `.#' plus one for the null. */
9996
478f14a61aba (lock_dir, superlock_file, MAKE_LOCK_NAME):
Richard M. Stallman <rms@gnu.org>
parents: 9992
diff changeset
153 #define MAKE_LOCK_NAME(lock, file) \
21244
50929073a0ba Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents: 21223
diff changeset
154 (lock = (char *) alloca (STRING_BYTES (XSTRING (file)) + 2 + 1), \
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
155 fill_in_lock_file_name (lock, (file)))
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
156
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
157 static void
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
158 fill_in_lock_file_name (lockfile, fn)
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
159 register char *lockfile;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
160 register Lisp_Object fn;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
161 {
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
162 register char *p;
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
163
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
164 strcpy (lockfile, XSTRING (fn)->data);
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
165
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
166 /* Shift the nondirectory part of the file name (including the null)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
167 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
168 do something to support 14-character-max file names. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
169 for (p = lockfile + strlen (lockfile); p != lockfile && *p != '/'; p--)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
170 p[2] = *p;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
171
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
172 /* Insert the `.#'. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
173 p[1] = '.';
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
174 p[2] = '#';
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
175 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
176
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
177 /* Lock the lock file named LFNAME.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
178 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
179 Return 1 if successful, 0 if not. */
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
180
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
181 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
182 lock_file_1 (lfname, force)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
183 char *lfname;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
184 int force;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
186 register int err;
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
187 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
188 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
189 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
190 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
191
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
192 if (STRINGP (Fuser_login_name (Qnil)))
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
193 user_name = (char *)XSTRING (Fuser_login_name (Qnil))->data;
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
194 else
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
195 user_name = "";
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
196 if (STRINGP (Fsystem_name ()))
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
197 host_name = (char *)XSTRING (Fsystem_name ())->data;
18755
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
198 else
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
199 host_name = "";
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
200 lock_info_str = (char *)alloca (strlen (user_name) + strlen (host_name)
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
201 + LOCK_PID_MAX + 5);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202
21223
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
203 boot_time = get_boot_time ();
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
204 if (boot_time)
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
205 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
206 (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
207 else
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
208 sprintf (lock_info_str, "%s@%s.%lu", user_name, host_name,
7f00d0edbd29 (get_boot_time): Conditionalize on BOOT_TIME.
Richard M. Stallman <rms@gnu.org>
parents: 21217
diff changeset
209 (unsigned long) getpid ());
15797
24c31fcbcf97 (lock_file_owner_name): Always initialize the_pw.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
210
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
211 err = symlink (lock_info_str, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
212 if (errno == EEXIST && force)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
213 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
214 unlink (lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
215 err = symlink (lock_info_str, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
216 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
217
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
218 return err == 0;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
222
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
223 /* 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
224 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
225 2 if the current process owns it,
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
226 or -1 if something is wrong with the locking mechanism. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
227
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
228 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
229 current_lock_owner (owner, lfname)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
230 lock_info_type *owner;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
231 char *lfname;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
232 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
233 #ifndef index
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
234 extern char *rindex (), *index ();
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
235 #endif
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
236 int o, p, len, ret;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
237 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
238 char *at, *dot, *colon;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
239 char *lfinfo = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
240 int bufsize = 50;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
241 /* Read arbitrarily-long contents of symlink. Similar code in
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
242 file-symlink-p in fileio.c. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
243 do
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
244 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
245 bufsize *= 2;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
246 lfinfo = (char *) xrealloc (lfinfo, bufsize);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
247 len = readlink (lfname, lfinfo, bufsize);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
248 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
249 while (len >= bufsize);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
250
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
251 /* If nonexistent lock file, all is well; otherwise, got strange error. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
252 if (len == -1)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
253 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
254 xfree (lfinfo);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
255 return errno == ENOENT ? 0 : -1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
256 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
257
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
258 /* Link info exists, so `len' is its length. Null terminate. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
259 lfinfo[len] = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
260
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
261 /* 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
262 read it to determine return value, so allocate it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
263 if (!owner)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
264 {
18707
23039b06955a (current_lock_owner, lock_file_1): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 17165
diff changeset
265 owner = (lock_info_type *) alloca (sizeof (lock_info_type));
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
266 local_owner = 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
267 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
268
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
269 /* Parse USER@HOST.PID:BOOT_TIME. If can't parse, return -1. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
270 /* The USER is everything before the first @. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
271 at = index (lfinfo, '@');
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
272 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
273 if (!at || !dot)
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
274 {
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
275 xfree (lfinfo);
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
276 return -1;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
277 }
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
278 len = at - lfinfo;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
279 owner->user = (char *) xmalloc (len + 1);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
280 strncpy (owner->user, lfinfo, len);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
281 owner->user[len] = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
282
21217
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
283 /* The PID is everything from the last `.' to the `:'. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
284 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
285 colon = dot;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
286 while (*colon && *colon != ':')
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
287 colon++;
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
288 /* 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
289 if (*colon == ':')
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
290 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
291 else
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
292 owner->boot_time = 0;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
293
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
294 /* The host is everything in between. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
295 len = dot - at - 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
296 owner->host = (char *) xmalloc (len + 1);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
297 strncpy (owner->host, at + 1, len);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
298 owner->host[len] = 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
299
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
300 /* We're done looking at the link info. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
301 xfree (lfinfo);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
302
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
303 /* 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
304 if (STRINGP (Fsystem_name ())
f2c1ffb0778a (lock_file_1): Don't crash if Fuser_login_name or
Richard M. Stallman <rms@gnu.org>
parents: 18707
diff changeset
305 && strcmp (owner->host, XSTRING (Fsystem_name ())->data) == 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
306 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
307 if (owner->pid == getpid ())
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
308 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
309 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
310 && (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
311 && (owner->boot_time == 0
18acb2723ec5 (current_lock_owner): If lock file data doesn't include
Richard M. Stallman <rms@gnu.org>
parents: 20593
diff changeset
312 || owner->boot_time == get_boot_time ()))
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
313 ret = 1; /* An existing process on this machine owns it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
314 /* 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
315 zap the lockfile. */
19058
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
316 else if (unlink (lfname) < 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
317 ret = -1;
19058
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
318 else
96413dc296fe (current_lock_owner): Don't try to delete lock
Richard M. Stallman <rms@gnu.org>
parents: 19046
diff changeset
319 ret = 0;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
320 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
321 else
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
322 { /* 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
323 here's where we'd do it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
324 ret = 1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
325 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
326
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
327 /* Avoid garbage. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
328 if (local_owner || ret <= 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
329 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
330 FREE_LOCK_INFO (*owner);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
331 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
332 return ret;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
333 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
334
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
335
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
336 /* Lock the lock named LFNAME if possible.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
337 Return 0 in that case.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
338 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
339 that process in CLASHER.
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
340 Return -1 if cannot lock for any other reason. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
341
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
342 static int
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
343 lock_if_free (clasher, lfname)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
344 lock_info_type *clasher;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
345 register char *lfname;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
346 {
19046
689f3dc973f9 (lock_if_free): Don't loop; for strange error, return -1.
Richard M. Stallman <rms@gnu.org>
parents: 18755
diff changeset
347 if (lock_file_1 (lfname, 0) == 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
348 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
349 int locker;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
350
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
351 if (errno != EEXIST)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
352 return -1;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
353
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
354 locker = current_lock_owner (clasher, lfname);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
355 if (locker == 2)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
356 {
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
357 FREE_LOCK_INFO (*clasher);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
358 return 0; /* We ourselves locked it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
359 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
360 else if (locker == 1)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
361 return 1; /* Someone else has it. */
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
362
19046
689f3dc973f9 (lock_if_free): Don't loop; for strange error, return -1.
Richard M. Stallman <rms@gnu.org>
parents: 18755
diff changeset
363 return -1; /* Something's wrong. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
364 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
365 return 0;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
366 }
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
367
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
368 /* lock_file locks file FN,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 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
370 This should be done only when about to modify a file-visiting
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 buffer previously unmodified.
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
372 Do not (normally) call this for a buffer already modified,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 as either the file is already locked, or the user has already
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 decided to go ahead without locking.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
376 When this returns, either the lock is locked for us,
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 or the user has said to go ahead without locking.
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
379 If the file is locked by someone else, this calls
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 ask-user-about-lock (a Lisp function) with two arguments,
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
381 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
382 This function can signal an error, or return t meaning
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 take away the lock, or return nil meaning ignore the lock. */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 lock_file (fn)
21820
75f04f235df1 Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 21818
diff changeset
387 Lisp_Object fn;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 {
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
389 register Lisp_Object attack, orig_fn, encoded_fn;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
390 register char *lfname, *locker;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
391 lock_info_type lock_info;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392
12811
11f5ce737c57 (lock_file): Use get_truename_buffer.
Richard M. Stallman <rms@gnu.org>
parents: 12104
diff changeset
393 orig_fn = fn;
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
394 fn = Fexpand_file_name (fn, Qnil);
21902
e40329fcfc5e Include coding.h.
Richard M. Stallman <rms@gnu.org>
parents: 21820
diff changeset
395 encoded_fn = ENCODE_FILE (fn);
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
396
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
397 /* 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
398 MAKE_LOCK_NAME (lfname, encoded_fn);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
400 /* 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
401 visited. */
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 {
6499
e0bef61003ae (lock_file): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents: 6300
diff changeset
403 register Lisp_Object subject_buf;
21820
75f04f235df1 Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 21818
diff changeset
404 struct gcpro gcpro1;
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
405
12811
11f5ce737c57 (lock_file): Use get_truename_buffer.
Richard M. Stallman <rms@gnu.org>
parents: 12104
diff changeset
406 subject_buf = get_truename_buffer (orig_fn);
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
407 GCPRO1 (fn);
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
408
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
409 if (!NILP (subject_buf)
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
410 && NILP (Fverify_visited_file_modtime (subject_buf))
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 372
diff changeset
411 && !NILP (Ffile_exists_p (fn)))
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 call1 (intern ("ask-user-about-supersession-threat"), fn);
21818
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
413
af741167f81e (lock_file): gcpro `fn'.
Richard M. Stallman <rms@gnu.org>
parents: 21712
diff changeset
414 UNGCPRO;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 /* Try to lock the lock. */
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
418 if (lock_if_free (&lock_info, lfname) <= 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
419 /* 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
420 return;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 /* Else consider breaking the lock */
19196
c48684372335 (lock_file_1, lock_file): Add casts.
Richard M. Stallman <rms@gnu.org>
parents: 19058
diff changeset
423 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
424 + 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
425 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
426 lock_info.pid);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
427 FREE_LOCK_INFO (lock_info);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
428
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
429 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
430 if (!NILP (attack))
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 /* User says take the lock */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
433 lock_file_1 (lfname, 1);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 return;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 /* User says ignore the lock */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 unlock_file (fn)
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 register Lisp_Object fn;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 register char *lfname;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
445 fn = Fexpand_file_name (fn, Qnil);
22029
7620443f1878 (unlock_file): Encode the file name.
Richard M. Stallman <rms@gnu.org>
parents: 21902
diff changeset
446 fn = ENCODE_FILE (fn);
12104
10197e4b3fb2 (unlock_file, lock_file): Call Fexpand_file_name.
Karl Heuer <kwzh@gnu.org>
parents: 10752
diff changeset
447
9996
478f14a61aba (lock_dir, superlock_file, MAKE_LOCK_NAME):
Richard M. Stallman <rms@gnu.org>
parents: 9992
diff changeset
448 MAKE_LOCK_NAME (lfname, fn);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
450 if (current_lock_owner (0, lfname) == 2)
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 unlink (lfname);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 void
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 unlock_all_files ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457 register Lisp_Object tail;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 register struct buffer *b;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459
9949
e9d341f235ee (unlock_all_files): Use the new type-test macros.
Karl Heuer <kwzh@gnu.org>
parents: 9130
diff changeset
460 for (tail = Vbuffer_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr)
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 b = XBUFFER (XCONS (XCONS (tail)->car)->cdr);
10752
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
463 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
464 {
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
465 register char *lfname;
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
466
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
467 MAKE_LOCK_NAME (lfname, b->file_truename);
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
468
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
469 if (current_lock_owner (0, lfname) == 2)
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
470 unlink (lfname);
33fbdbaf65c2 (unlock_all_files): Don't call unlock_file;
Karl Heuer <kwzh@gnu.org>
parents: 19335
diff changeset
471 }
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 DEFUN ("lock-buffer", Flock_buffer, Slock_buffer,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 0, 1, 0,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 "Lock FILE, if current buffer is modified.\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 FILE defaults to current buffer's visited file,\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 or else nothing is done if current buffer isn't visiting a file.")
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
480 (file)
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
481 Lisp_Object file;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 {
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
483 if (NILP (file))
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
484 file = current_buffer->file_truename;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 else
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
486 CHECK_STRING (file, 0);
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
487 if (SAVE_MODIFF < MODIFF
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
488 && !NILP (file))
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
489 lock_file (file);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 return Qnil;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 DEFUN ("unlock-buffer", Funlock_buffer, Sunlock_buffer,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 0, 0, 0,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 "Unlock the file visited in the current buffer,\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 if it should normally be locked.")
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 {
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
499 if (SAVE_MODIFF < MODIFF
10752
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
500 && STRINGP (current_buffer->file_truename))
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
501 unlock_file (current_buffer->file_truename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 return Qnil;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 /* Unlock the file visited in buffer BUFFER. */
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506
20369
37caaa295d69 (unlock_buffer): Declare it as void.
Kenichi Handa <handa@m17n.org>
parents: 20131
diff changeset
507 void
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 unlock_buffer (buffer)
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 struct buffer *buffer;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 {
10331
2ae69efc3e8b Use SAVE_MODIFF and BUF_SAVE_MODIFF
Richard M. Stallman <rms@gnu.org>
parents: 10017
diff changeset
511 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
512 && STRINGP (buffer->file_truename))
e4fb5e01090a (unlock_buffer, unlock_all_files, Flock_buffer)
Richard M. Stallman <rms@gnu.org>
parents: 10331
diff changeset
513 unlock_file (buffer->file_truename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 DEFUN ("file-locked-p", Ffile_locked_p, Sfile_locked_p, 0, 1, 0,
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 "Return nil if the FILENAME is not locked,\n\
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 t if it is locked by you, else a string of the name of the locker.")
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
519 (filename)
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
520 Lisp_Object filename;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 {
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
522 Lisp_Object ret;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 register char *lfname;
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 int owner;
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
525 lock_info_type locker;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
527 filename = Fexpand_file_name (filename, Qnil);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528
14075
21a86b6274e6 (Flock_buffer, Ffile_locked_p): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents: 12811
diff changeset
529 MAKE_LOCK_NAME (lfname, filename);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
531 owner = current_lock_owner (&locker, lfname);
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 if (owner <= 0)
16802
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
533 ret = Qnil;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
534 else if (owner == 2)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
535 ret = Qt;
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
536 else
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
537 ret = build_string (locker.user);
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
538
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
539 if (owner > 0)
93fc7aff4cc2 Total rewrite.
Richard M. Stallman <rms@gnu.org>
parents: 16172
diff changeset
540 FREE_LOCK_INFO (locker);
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 return ret;
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 }
624
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
544
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
545 /* Initialization functions. */
2bb7f23b7ea5 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 559
diff changeset
546
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 21413
diff changeset
547 void
163
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 syms_of_filelock ()
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 {
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 defsubr (&Sunlock_buffer);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 defsubr (&Slock_buffer);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 defsubr (&Sfile_locked_p);
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 }
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554
0f3996cb4ae5 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555 #endif /* CLASH_DETECTION */