tools/nolibc/stdio: add fwrite() to stdio
authorWilly Tarreau <w@1wt.eu>
Mon, 7 Feb 2022 16:23:32 +0000 (17:23 +0100)
committerPaul E. McKenney <paulmck@kernel.org>
Thu, 21 Apr 2022 00:05:44 +0000 (17:05 -0700)
We'll use it to write substrings. It relies on a simpler _fwrite() that
only takes one size. fputs() was also modified to rely on it.

Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
tools/include/nolibc/stdio.h

index 149c5ca59aad2fec802feaa8dcbb8cd532a7d55e..996bf89a30d25cbe980acb2389090ab9b2c7be36 100644 (file)
@@ -84,12 +84,14 @@ int putchar(int c)
 }
 
 
-/* puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
+/* fwrite(), puts(), fputs(). Note that puts() emits '\n' but not fputs(). */
 
+/* internal fwrite()-like function which only takes a size and returns 0 on
+ * success or EOF on error. It automatically retries on short writes.
+ */
 static __attribute__((unused))
-int fputs(const char *s, FILE *stream)
+int _fwrite(const void *buf, size_t size, FILE *stream)
 {
-       size_t len = strlen(s);
        ssize_t ret;
        int fd;
 
@@ -98,16 +100,35 @@ int fputs(const char *s, FILE *stream)
 
        fd = 3 + (long)stream;
 
-       while (len > 0) {
-               ret = write(fd, s, len);
+       while (size) {
+               ret = write(fd, buf, size);
                if (ret <= 0)
                        return EOF;
-               s += ret;
-               len -= ret;
+               size -= ret;
+               buf += ret;
        }
        return 0;
 }
 
+static __attribute__((unused))
+size_t fwrite(const void *s, size_t size, size_t nmemb, FILE *stream)
+{
+       size_t written;
+
+       for (written = 0; written < nmemb; written++) {
+               if (_fwrite(s, size, stream) != 0)
+                       break;
+               s += size;
+       }
+       return written;
+}
+
+static __attribute__((unused))
+int fputs(const char *s, FILE *stream)
+{
+       return _fwrite(s, strlen(s), stream);
+}
+
 static __attribute__((unused))
 int puts(const char *s)
 {