Commit e3e19052 authored by Willy Tarreau's avatar Willy Tarreau Committed by Paul E. McKenney

tools/nolibc/stdio: add fwrite() to stdio

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: default avatarWilly Tarreau <w@1wt.eu>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 99b037cb
...@@ -84,12 +84,14 @@ int putchar(int c) ...@@ -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)) 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; ssize_t ret;
int fd; int fd;
...@@ -98,16 +100,35 @@ int fputs(const char *s, FILE *stream) ...@@ -98,16 +100,35 @@ int fputs(const char *s, FILE *stream)
fd = 3 + (long)stream; fd = 3 + (long)stream;
while (len > 0) { while (size) {
ret = write(fd, s, len); ret = write(fd, buf, size);
if (ret <= 0) if (ret <= 0)
return EOF; return EOF;
s += ret; size -= ret;
len -= ret; buf += ret;
} }
return 0; 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)) static __attribute__((unused))
int puts(const char *s) int puts(const char *s)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment