From 79c4ec1102d1749ba2e05780158457fd27b0fcf9 Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Mon, 16 Nov 2015 07:40:20 +0200
Subject: [PATCH] unix/input: Switch to POSIX I/O for history reading/writing.

---
 unix/input.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/unix/input.c b/unix/input.c
index a38b63ae3..b2cf8efa8 100644
--- a/unix/input.c
+++ b/unix/input.c
@@ -27,6 +27,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <fcntl.h>
 
 #include "py/mpstate.h"
 #include "py/mphal.h"
@@ -100,14 +101,18 @@ void prompt_read_history(void) {
         vstr_t vstr;
         vstr_init(&vstr, 50);
         vstr_printf(&vstr, "%s/.micropython.history", home);
-        FILE *fp = fopen(vstr_null_terminated_str(&vstr), "r");
-        if (fp != NULL) {
+        int fd = open(vstr_null_terminated_str(&vstr), O_RDONLY);
+        if (fd != -1) {
             vstr_reset(&vstr);
             for (;;) {
-                int c = fgetc(fp);
-                if (c == EOF || c == '\n') {
+                char c;
+                int sz = read(fd, &c, 1);
+                if (sz < 0) {
+                    break;
+                }
+                if (sz == 0 || c == '\n') {
                     readline_push_history(vstr_null_terminated_str(&vstr));
-                    if (c == EOF) {
+                    if (sz == 0) {
                         break;
                     }
                     vstr_reset(&vstr);
@@ -115,7 +120,7 @@ void prompt_read_history(void) {
                     vstr_add_byte(&vstr, c);
                 }
             }
-            fclose(fp);
+            close(fd);
         }
         vstr_clear(&vstr);
     }
@@ -133,16 +138,18 @@ void prompt_write_history(void) {
         vstr_t vstr;
         vstr_init(&vstr, 50);
         vstr_printf(&vstr, "%s/.micropython.history", home);
-        FILE *fp = fopen(vstr_null_terminated_str(&vstr), "w");
-        if (fp != NULL) {
+        int fd = open(vstr_null_terminated_str(&vstr), O_CREAT | O_TRUNC | O_WRONLY, 0644);
+        if (fd != -1) {
             for (int i = MP_ARRAY_SIZE(MP_STATE_PORT(readline_hist)) - 1; i >= 0; i--) {
                 const char *line = MP_STATE_PORT(readline_hist)[i];
                 if (line != NULL) {
-                    fwrite(line, 1, strlen(line), fp);
-                    fputc('\n', fp);
+                    int res;
+                    res = write(fd, line, strlen(line));
+                    res = write(fd, "\n", 1);
+                    (void)res;
                 }
             }
-            fclose(fp);
+            close(fd);
         }
     }
     #elif MICROPY_USE_READLINE == 2
-- 
GitLab