If you C-x C-c out of emacs and there are unsaved buffers, emacs asks if you want to save them (mg behaves the same). If there is a write error (permissions or non-existant parent directory) emacs stops exiting. This allows the user to decide what to do with these buffers. In mg, the contents of these buffers are lost while mg continues to exit.
This diff bring mg more into line with emacs. ok? -lum Index: buffer.c =================================================================== RCS file: /cvs/src/usr.bin/mg/buffer.c,v retrieving revision 1.78 diff -u -p -r1.78 buffer.c --- buffer.c 14 Mar 2012 13:56:35 -0000 1.78 +++ buffer.c 28 Aug 2012 14:54:26 -0000 @@ -449,7 +449,7 @@ int anycb(int f) { struct buffer *bp; - int s = FALSE, save = FALSE, ret; + int s = FALSE, save = FALSE, save2 = FALSE, ret; char pbuf[NFILEN + 11]; for (bp = bheadp; bp != NULL; bp = bp->b_bufp) { @@ -462,11 +462,14 @@ anycb(int f) return (ABORT); } if ((f == TRUE || (save = eyorn(pbuf)) == TRUE) && - buffsave(bp) == TRUE) { + (save2 = buffsave(bp)) == TRUE) { bp->b_flag &= ~BFCHG; upmodes(bp); - } else + } else { + if (save2 == FIOERR) + return (save2); s = TRUE; + } if (save == ABORT) return (save); save = TRUE; Index: file.c =================================================================== RCS file: /cvs/src/usr.bin/mg/file.c,v retrieving revision 1.82 diff -u -p -r1.82 file.c --- file.c 28 Aug 2012 11:37:49 -0000 1.82 +++ file.c 28 Aug 2012 14:54:26 -0000 @@ -662,8 +662,23 @@ makebkfile(int f, int n) int writeout(FILE ** ffp, struct buffer *bp, char *fn) { + struct stat statbuf; int s; + char *dp; + dp = dirname(fn); + + if (stat(fn, &statbuf) == -1 && errno == ENOENT) { + if (access(dp, W_OK) && errno == EACCES) { + ewprintf("Directory %s%s write-protected", dp, + (dp[0] == '/' && dp[1] == '\0') ? "" : "/"); + return (FIOERR); + } else if (errno == ENOENT) { + ewprintf("%s%s: no such directory", dp, + (dp[0] == '/' && dp[1] == '\0') ? "" : "/"); + return (FIOERR); + } + } /* open writes message */ if ((s = ffwopen(ffp, fn, bp)) != FIOSUC) return (FALSE); Index: main.c =================================================================== RCS file: /cvs/src/usr.bin/mg/main.c,v retrieving revision 1.67 diff -u -p -r1.67 main.c --- main.c 29 May 2012 06:08:48 -0000 1.67 +++ main.c 28 Aug 2012 14:54:26 -0000 @@ -224,6 +224,8 @@ quit(int f, int n) if ((s = anycb(FALSE)) == ABORT) return (ABORT); + if (s == FIOERR) + return (FALSE); if (s == FALSE || eyesno("Modified buffers exist; really exit") == TRUE) { vttidy();