From 834f256ec9907ed34d3be2d3541e2af7723b6352 Mon Sep 17 00:00:00 2001 From: nick black Date: Wed, 9 Jun 2021 22:35:09 -0400 Subject: [PATCH] notcurses-info: be reliable in the face of output EAGAIN --- src/info/main.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/info/main.c b/src/info/main.c index 239fe5be9..5426805ec 100644 --- a/src/info/main.c +++ b/src/info/main.c @@ -1,7 +1,32 @@ +#include +#include #include #include +// write(2) with retry on partial write or interrupted write +static inline ssize_t +writen(int fd, const void* buf, size_t len){ + ssize_t r; + size_t w = 0; + while(w < len){ + if((r = write(fd, (const char*)buf + w, len - w)) < 0){ + if(errno == EAGAIN || errno == EBUSY || errno == EINTR){ + continue; + } + return -1; + } + w += r; + } + return w; +} + int main(void){ + char* mbuf = NULL; + size_t len = 0; + FILE* mstream; + if((mstream = open_memstream(&mbuf, &len)) == NULL){ + return EXIT_FAILURE; + } notcurses_options nopts = { .flags = NCOPTION_NO_ALTERNATE_SCREEN, }; @@ -10,6 +35,17 @@ int main(void){ return EXIT_FAILURE; } notcurses_check_pixel_support(nc); - notcurses_debug_caps(nc, stdout); + notcurses_debug_caps(nc, mstream); + if(fclose(mstream)){ + notcurses_stop(nc); + fprintf(stderr, "Error closing memstream after %zuB\n", len); + return EXIT_FAILURE; + } + if(writen(fileno(stdout), mbuf, len) < 0){ + notcurses_stop(nc); + fprintf(stderr, "Error writing %zuB memstream\n", len); + return EXIT_FAILURE; + } + free(mbuf); return notcurses_stop(nc) ? EXIT_FAILURE : EXIT_SUCCESS; }