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

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
Loading
Loading
Loading
Loading
+28 −7
Original line number Diff line number Diff line
@@ -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)
{