This diff makes mg behave more like emacs with regards to opening
a new buffer in two ways:

1. If parent directory is read-only, make buffer read-only.
2. If parent doesn't exist; give user a message and create buffer
   as readable.

For point 2, emacs acutally suggests that the user use the
"make-directory" command to make the directory, however, mg doesn't
implement that command (yet), so I have amended the message from
emacs. 

ok? 

-lum

Index: file.c
===================================================================
RCS file: /cvs/src/usr.bin/mg/file.c,v
retrieving revision 1.81
diff -u -p -r1.81 file.c
--- file.c      18 Jun 2012 09:19:21 -0000      1.81
+++ file.c      27 Aug 2012 18:45:18 -0000
@@ -207,8 +207,10 @@ int
 readin(char *fname)
 {
        struct mgwin    *wp;
+       struct stat      statbuf;
        int      status, i, ro = FALSE;
        PF      *ael;
+       char    *dp;
 
        /* might be old */
        if (bclear(curbp) != TRUE)
@@ -242,13 +244,29 @@ readin(char *fname)
        curbp->b_flag &= ~BFCHG;
 
        /*
-        * We need to set the READONLY flag after we insert the file,
-        * unless the file is a directory.
+        * Set the buffer READONLY flag if any of following are true:
+        *   1. file is a directory.
+        *   2. file is read-only.
+        *   3. file doesn't exist and directory is read-only.
         */
-       if (access(fname, W_OK) && errno != ENOENT)
-               ro = TRUE;
-       if (fisdir(fname) == TRUE)
+       if (fisdir(fname) == TRUE) {
                ro = TRUE;
+       } else if (access(fname, W_OK) == -1) {
+               if (errno != ENOENT)
+                       ro = TRUE;
+               else if (errno == ENOENT) {
+                       dp = dirname(fname);
+                       if (stat(dp, &statbuf) == -1 && errno == ENOENT) {
+                               /* no read-only; like emacs */
+                               ewprintf("Parent directory missing");
+                       } else if (access(dp, W_OK) == -1 && 
+                           errno == EACCES) {
+                               ewprintf("File not found and directory"
+                                   " write-protected");
+                               ro = TRUE;
+                       } 
+               }
+       }
        if (ro == TRUE)
                curbp->b_flag |= BFREADONLY;

Reply via email to