As soon as mmap() is done, we can close the fd. xmmap() also will exit
rather than return failure so we can remove that check, and fdlength()
will fall back to lseek() so there's no need to have the fallback in vi
itself.

Spotted because the `TT.fd = 0` in linelist_unload() seemed suspicious;
-1 would have been more natural.
---
 toys/pending/vi.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)
From 74301218a6221f6121c631031a408ca1d1ac4271 Mon Sep 17 00:00:00 2001
From: Elliott Hughes <[email protected]>
Date: Wed, 11 Mar 2020 10:07:27 -0700
Subject: [PATCH] vi: don't keep fd open unnecessarily.

As soon as mmap() is done, we can close the fd. xmmap() also will exit
rather than return failure so we can remove that check, and fdlength()
will fall back to lseek() so there's no need to have the fallback in vi
itself.

Spotted because the `TT.fd = 0` in linelist_unload() seemed suspicious;
-1 would have been more natural.
---
 toys/pending/vi.c | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/toys/pending/vi.c b/toys/pending/vi.c
index b5f34e21..62cbbab0 100644
--- a/toys/pending/vi.c
+++ b/toys/pending/vi.c
@@ -41,7 +41,7 @@ GLOBALS(
     char* data;
   } yank;
 
-  int modified, fd;
+  int modified;
   size_t filesize;
 // mem_block contains RO data that is either original file as mmap
 // or heap allocated inserted data
@@ -509,8 +509,7 @@ static void linelist_unload()
 {
   llist_traverse((void *)TT.slices, llist_free_double);
   llist_traverse((void *)TT.text, block_list_free);
-  if (TT.fd) xclose(TT.fd);
-  TT.slices = 0, TT.text = 0, TT.fd = 0;
+  TT.slices = 0, TT.text = 0;
 }
 
 static int linelist_load(char *filename)
@@ -518,20 +517,15 @@ static int linelist_load(char *filename)
   if (!filename) filename = (char*)*toys.optargs;
 
   if (filename) {
-    int fd;
-    size_t len, size;
+    int fd = open(filename, O_RDONLY);
+    size_t size;
     char *data;
-    if ( (fd = open(filename, O_RDONLY)) <0) return 0;
 
-    size = fdlength(fd);
-    if (!(len = lseek(fd, 0, SEEK_END))) len = size;
-    lseek(fd, 0, SEEK_SET);
-
-    data = xmmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
-    if (data == MAP_FAILED) return 0;
-    insert_str(data, 0, size, len, MMAP);
+    if (fd == -1) return 0;
+    data = xmmap(0, size = fdlength(fd), PROT_READ, MAP_SHARED, fd, 0);
+    xclose(fd);
+    insert_str(data, 0, size, size, MMAP);
     TT.filesize = text_filesize();
-    TT.fd = fd;
   }
 
   return 1;
-- 
2.25.1.481.gfbce0eb801-goog

_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to