summaryrefslogtreecommitdiff
path: root/editors/vi.c
diff options
context:
space:
mode:
authorPaul Fox2005-10-09 14:43:22 +0000
committerPaul Fox2005-10-09 14:43:22 +0000
commit61e45dbb2f55dfcebf874c6ec3d41f50b284590f (patch)
tree8fd46347494d70bd0927066e349d7d375f01e66b /editors/vi.c
parent90372ed51a4a396715dfefef4c3716e6b2ceca11 (diff)
downloadbusybox-61e45dbb2f55dfcebf874c6ec3d41f50b284590f.zip
busybox-61e45dbb2f55dfcebf874c6ec3d41f50b284590f.tar.gz
catch and report errors from file_write()
Diffstat (limited to 'editors/vi.c')
-rw-r--r--editors/vi.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/editors/vi.c b/editors/vi.c
index cc23325..1cc1270 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 {