[PATCH] Editor file locking

Adam Byrtek / alpha alpha at student.uci.agh.edu.pl
Wed Apr 2 22:12:05 UTC 2003


On Wed, Apr 02, 2003 at 02:48:07PM -0500, Pavel Roskin wrote:
> I've applied your patch.  The snapshot is ready.

After ten times of 'cvs up' I can see it now :)

> differently.  Ideally, mc should show all the data separately - host, user
> and PID (and maybe timestamp).

Ok, see the attached patch.
BTW I don't see a point in dividing host and user. Why?

> One bug that needs to be fixed - if I use Enter to modify the file and I
> get a "file locked" message, the old current line is not repainted.  Try
> it to see what I mean.

I see. I don't know why it happens. I haven't changed anything in
editor main code. It has to have something to do with
edit_query_dialog. I don't have time to debug it now...

Regards
Adam

-- 

  _.|._ |_  _.   :  Adam Byrtek /alpha               alpha at debian.org
 (_|||_)| |(_|   :  http://krakow.linux.org.pl/        pgp 0xB25952C0
     |           
-------------- next part --------------
? .project.sl
? mc.prj
? mc.pws
Index: edit/editlock.c
===================================================================
RCS file: /cvs/gnome/mc/edit/editlock.c,v
retrieving revision 1.1
diff -u -r1.1 editlock.c
--- edit/editlock.c	2 Apr 2003 19:36:10 -0000	1.1
+++ edit/editlock.c	2 Apr 2003 22:07:20 -0000
@@ -30,6 +30,11 @@
 #define BUF_SIZE 255
 #define PID_BUF_SIZE 10
 
+struct lock_s {
+    char *who;
+    pid_t pid;
+};
+
 /* Locking scheme used in mcedit is based on a documentation found
    in JED editor sources. Abstract from lock.c file (by John E. Davis):
 
@@ -61,24 +66,34 @@
 }
 
 /* Extract pid from user at host.domain.pid string */
-static pid_t
-lock_extract_pid (char *str)
+static struct lock_s *
+lock_extract_info (char *str)
 {
     int i;
-    char *p, pid[PID_BUF_SIZE];
+    char *p, *s;
+    static char pid[PID_BUF_SIZE], who[BUF_SIZE];
+    static struct lock_s lock;
 
-    /* Treat text between '.' and ':' or '\0' as pid */
     for (p = str + strlen (str) - 1; p >= str; p--)
 	if (*p == '.')
 	    break;
 
+    /* Everything before last '.' is user at host */
+    i = 0;
+    for (s = str; s < p && i < BUF_SIZE; s++)
+	who[i++] = *s;
+    who[i] = '\0';
+    
+    /* Treat text between '.' and ':' or '\0' as pid */
     i = 0;
     for (p = p + 1;
 	 p < str + strlen (str) && *p != ':' && i < PID_BUF_SIZE; p++)
 	pid[i++] = *p;
     pid[i] = '\0';
-
-    return (pid_t) atol (pid);
+    
+    lock.pid = (pid_t) atol (pid);
+    lock.who = who;
+    return &lock;
 }
 
 /* Extract user at host.domain.pid from lock file (static string)  */
@@ -103,7 +118,7 @@
 {
     char *lockfname, *newlock, *msg, *lock;
     struct stat statbuf;
-    pid_t pid;
+    struct lock_s *lockinfo;
 
     /* Just to be sure (and don't lock new file) */
     if (!fname || !*fname)
@@ -117,13 +132,13 @@
 	    g_free (lockfname);
 	    return 0;
 	}
-	pid = lock_extract_pid (lock);
+	lockinfo = lock_extract_info (lock);
 
 	/* Check if locking process alive, ask user if required */
-	if (!pid || !(kill (pid, 0) == -1 && errno == ESRCH)) {
+	if (!lockinfo->pid || !(kill (lockinfo->pid, 0) == -1 && errno == ESRCH)) {
 	    msg =
-		g_strdup_printf (_("File %s is locked by lock %s"), fname,
-				 lock);
+		g_strdup_printf (_("File %s is locked by %s (pid %d)"), 
+				 fname, lockinfo->who, lockinfo->pid);
 	    /* TODO: Implement "Abort" - needs to rewind undo stack */
 	    switch (edit_query_dialog2
 		    (_("File locked"), msg, _("&Grab lock"),
@@ -177,7 +192,7 @@
     lock = lock_get_info (lockfname);
     if (lock) {
 	/* Don't touch if lock is not ours */
-	if (lock_extract_pid (lock) != getpid ()) {
+	if (lock_extract_info (lock)->pid != getpid ()) {
 	    g_free (lockfname);
 	    return 0;
 	}


More information about the mc-devel mailing list