vi: failure to open file is not an error when initialising buffer
authorRon Yorston <rmy@tigress.co.uk>
Sun, 30 Nov 2014 20:39:25 +0000 (20:39 +0000)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 7 Jan 2015 16:00:48 +0000 (17:00 +0100)
Commit 32afd3a introduced these regressions on the master branch:

Starting vi with no filename on the command line gives the status message
"'(null)' Bad address" instead of "- No file 1/1 100%".

Starting vi with a non-existent file on the command line gives the status
message "'new.txt' No such file or directory" instead of "- new.txt 1/1 100%"

Signed-off-by: Ron Yorston <rmy@tigress.co.uk>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/vi.c

index 70bdbab07b09c03bab33a00ccaece41ec05a0e00..7b88e8e1739248b1c56ebb6dd45ad324ce69dd3f 100644 (file)
@@ -542,9 +542,6 @@ static void cookmode(void); // return to "cooked" mode on tty
 static int mysleep(int);
 static int readit(void);       // read (maybe cursor) key from stdin
 static int get_one_char(void); // read 1 char from stdin
-#if !ENABLE_FEATURE_VI_READONLY
-#define file_insert(fn, p, update_ro_status) file_insert(fn, p)
-#endif
 // file_insert might reallocate text[]!
 static int file_insert(const char *, char *, int);
 static int file_write(char *, char *, char *);
@@ -1325,7 +1322,7 @@ static void colon(char *buf)
                        q = next_line(q);
                { // dance around potentially-reallocated text[]
                        uintptr_t ofs = q - text;
-                       size = file_insert(fn, q, /*update_ro:*/ 0);
+                       size = file_insert(fn, q, 0);
                        q = text + ofs;
                }
                if (size < 0)
@@ -2905,7 +2902,7 @@ static char *get_input_line(const char *prompt)
 }
 
 // might reallocate text[]!
-static int file_insert(const char *fn, char *p, int update_ro_status)
+static int file_insert(const char *fn, char *p, int initial)
 {
        int cnt = -1;
        int fd, size;
@@ -2918,7 +2915,8 @@ static int file_insert(const char *fn, char *p, int update_ro_status)
 
        fd = open(fn, O_RDONLY);
        if (fd < 0) {
-               status_line_bold_errno(fn);
+               if (!initial)
+                       status_line_bold_errno(fn);
                return cnt;
        }
 
@@ -2946,7 +2944,7 @@ static int file_insert(const char *fn, char *p, int update_ro_status)
        close(fd);
 
 #if ENABLE_FEATURE_VI_READONLY
-       if (update_ro_status
+       if (initial
         && ((access(fn, W_OK) < 0) ||
                /* root will always have access()
                 * so we check fileperms too */