/* Write the name of the lock file for FN into LFNAME. Length will be
that of FN plus two more for the leading `.#' plus one for the null. */
#define MAKE_LOCK_NAME(lock, file) \
- (lock = (char *) alloca (XSTRING (file)->size + 2 + 1), \
+ (lock = (char *) alloca (XSTRING (file)->size_byte + 2 + 1), \
fill_in_lock_file_name (lock, (file)))
static void
int force;
{
register int err;
- char *user_name = XSTRING (Fuser_login_name (Qnil))->data;
- char *host_name = XSTRING (Fsystem_name ())->data;
- char *lock_info_str = alloca (strlen (user_name) + strlen (host_name)
- + LOCK_PID_MAX + 5);
+ char *user_name;
+ char *host_name;
+ char *lock_info_str;
+
+ if (STRINGP (Fuser_login_name (Qnil)))
+ user_name = (char *)XSTRING (Fuser_login_name (Qnil))->data;
+ else
+ user_name = "";
+ if (STRINGP (Fsystem_name ()))
+ host_name = (char *)XSTRING (Fsystem_name ())->data;
+ else
+ host_name = "";
+ lock_info_str = (char *)alloca (strlen (user_name) + strlen (host_name)
+ + LOCK_PID_MAX + 5);
sprintf (lock_info_str, "%s@%s.%lu", user_name, host_name,
(unsigned long) getpid ());
read it to determine return value, so allocate it. */
if (!owner)
{
- owner = alloca (sizeof (lock_info_type));
+ owner = (lock_info_type *) alloca (sizeof (lock_info_type));
local_owner = 1;
}
xfree (lfinfo);
/* On current host? */
- if (strcmp (owner->host, XSTRING (Fsystem_name ())->data) == 0)
+ if (STRINGP (Fsystem_name ())
+ && strcmp (owner->host, XSTRING (Fsystem_name ())->data) == 0)
{
if (owner->pid == getpid ())
ret = 2; /* We own it. */
-
- if (owner->pid > 0
+ else if (owner->pid > 0
&& (kill (owner->pid, 0) >= 0 || errno == EPERM))
ret = 1; /* An existing process on this machine owns it. */
-
/* The owner process is dead or has a strange pid (<=0), so try to
zap the lockfile. */
- if (unlink (lfname) < 0)
+ else if (unlink (lfname) < 0)
ret = -1;
-
- ret = 0;
+ else
+ ret = 0;
}
else
{ /* If we wanted to support the check for stale locks on remote machines,
lock_info_type *clasher;
register char *lfname;
{
- while (lock_file_1 (lfname, 0) == 0)
+ if (lock_file_1 (lfname, 0) == 0)
{
int locker;
}
else if (locker == 1)
return 1; /* Someone else has it. */
- else if (locker == -1)
- return -1; /* Something's wrong. */
- /* If some other error, or no such lock, try to lock again. */
- /* Is there a case where we loop forever? */
+ return -1; /* Something's wrong. */
}
return 0;
}
return;
/* Else consider breaking the lock */
- locker = alloca (strlen (lock_info.user) + strlen (lock_info.host)
- + LOCK_PID_MAX + 9);
- sprintf (locker, "%s@%s (pid %d)", lock_info.user, lock_info.host,
+ locker = (char *) alloca (strlen (lock_info.user) + strlen (lock_info.host)
+ + LOCK_PID_MAX + 9);
+ sprintf (locker, "%s@%s (pid %lu)", lock_info.user, lock_info.host,
lock_info.pid);
FREE_LOCK_INFO (lock_info);
{
b = XBUFFER (XCONS (XCONS (tail)->car)->cdr);
if (STRINGP (b->file_truename) && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b))
- unlock_file (b->file_truename);
+ {
+ register char *lfname;
+
+ MAKE_LOCK_NAME (lfname, b->file_truename);
+
+ if (current_lock_owner (0, lfname) == 2)
+ unlink (lfname);
+ }
}
}
\f
/* Unlock the file visited in buffer BUFFER. */
+void
unlock_buffer (buffer)
struct buffer *buffer;
{
\f
/* Initialization functions. */
-init_filelock ()
-{
-#if 0
- char *new_name;
-
- lock_dir = egetenv ("EMACSLOCKDIR");
- if (! lock_dir)
- lock_dir = PATH_LOCK;
-
- /* Copy the name in case egetenv got it from a Lisp string. */
- new_name = (char *) xmalloc (strlen (lock_dir) + 2);
- strcpy (new_name, lock_dir);
- lock_dir = new_name;
-
- /* Make sure it ends with a slash. */
- if (lock_dir[strlen (lock_dir) - 1] != '/')
- strcat (lock_dir, "/");
-
- superlock_file = (char *) xmalloc ((strlen (lock_dir)
- + sizeof (SUPERLOCK_NAME)));
- strcpy (superlock_file, lock_dir);
- strcat (superlock_file, SUPERLOCK_NAME);
-#endif
-}
-
syms_of_filelock ()
{
defsubr (&Sunlock_buffer);