From 61e45dbb2f55dfcebf874c6ec3d41f50b284590f Mon Sep 17 00:00:00 2001 From: Paul Fox Date: Sun, 9 Oct 2005 14:43:22 +0000 Subject: catch and report errors from file_write() --- editors/vi.c | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/editors/vi.c b/editors/vi.c index cc2332543..1cc127036 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -283,7 +283,6 @@ static void refresh(int); // update the terminal from screen[] static void Indicate_Error(void); // use flash or beep to indicate error #define indicate_error(c) Indicate_Error() - static void Hit_Return(void); #ifdef CONFIG_FEATURE_VI_SEARCH @@ -1113,13 +1112,18 @@ static void colon(Byte * buf) // system(syscmd); forced = FALSE; } - psb("\"%s\" %dL, %dC", fn, li, l); - if (q == text && r == end - 1 && l == ch) { - file_modified = 0; - last_file_modified = -1; - } - if ((cmd[0] == 'x' || cmd[1] == 'q') && l == ch) { - editing = 0; + if (l < 0) { + if (l == -1) + psbs("Write error: %s", strerror(errno)); + } else { + psb("\"%s\" %dL, %dC", fn, li, l); + if (q == text && r == end - 1 && l == ch) { + file_modified = 0; + last_file_modified = -1; + } + if ((cmd[0] == 'x' || cmd[1] == 'q') && l == ch) { + editing = 0; + } } #ifdef CONFIG_FEATURE_VI_READONLY vc3:; @@ -1147,6 +1151,7 @@ colon_s_fail: psb(":s expression missing delimiters"); #endif } + #endif /* CONFIG_FEATURE_VI_COLON */ static void Hit_Return(void) @@ -2516,7 +2521,7 @@ static int file_write(Byte * fn, Byte * first, Byte * last) if (fn == 0) { psbs("No current filename"); - return (-1); + return (-2); } charcnt = 0; // FIXIT- use the correct umask() @@ -3440,11 +3445,16 @@ key_cmd_mode: strncasecmp((char *) p, "wq", cnt) == 0 || strncasecmp((char *) p, "x", cnt) == 0) { cnt = file_write(cfn, text, end - 1); - file_modified = 0; - last_file_modified = -1; - psb("\"%s\" %dL, %dC", cfn, count_lines(text, end - 1), cnt); - if (p[0] == 'x' || p[1] == 'q') { - editing = 0; + if (cnt < 0) { + if (cnt == -1) + psbs("Write error: %s", strerror(errno)); + } else { + file_modified = 0; + last_file_modified = -1; + psb("\"%s\" %dL, %dC", cfn, count_lines(text, end - 1), cnt); + if (p[0] == 'x' || p[1] == 'q') { + editing = 0; + } } } else if (strncasecmp((char *) p, "file", cnt) == 0 ) { last_status_cksum = 0; // force status update @@ -3630,7 +3640,10 @@ key_cmd_mode: #endif /* CONFIG_FEATURE_VI_READONLY */ ) { cnt = file_write(cfn, text, end - 1); - if (cnt == (end - 1 - text + 1)) { + if (cnt < 0) { + if (cnt == -1) + psbs("Write error: %s", strerror(errno)); + } else if (cnt == (end - 1 - text + 1)) { editing = 0; } } else { -- cgit v1.2.3