Commit 4c7f09ab authored by Thomas Weißschuh's avatar Thomas Weißschuh
Browse files

selftests/nolibc: use a pipe to in vfprintf tests

Not all architectures implement lseek(), for example riscv32 only
implements llseek() which is not equivalent to normal lseek().
Remove the need for lseek() by using a pipe instead.

Link: https://lore.kernel.org/r/20241221-nolibc-rv32-v1-3-d9ef6dab7c63@weissschuh.net


Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
parent a0bc8947
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -1229,19 +1229,20 @@ int run_stdlib(int min, int max)

static int expect_vfprintf(int llen, int c, const char *expected, const char *fmt, ...)
{
	int ret, fd;
	int ret, pipefd[2];
	ssize_t w, r;
	char buf[100];
	FILE *memfile;
	va_list args;

	fd = open("/tmp", O_TMPFILE | O_EXCL | O_RDWR, 0600);
	if (fd == -1) {
		result(llen, SKIPPED);
		return 0;
	ret = pipe(pipefd);
	if (ret == -1) {
		llen += printf(" pipe() != %s", strerror(errno));
		result(llen, FAIL);
		return 1;
	}

	memfile = fdopen(fd, "w+");
	memfile = fdopen(pipefd[1], "w");
	if (!memfile) {
		result(llen, FAIL);
		return 1;
@@ -1257,13 +1258,10 @@ static int expect_vfprintf(int llen, int c, const char *expected, const char *fm
		return 1;
	}

	fflush(memfile);
	lseek(fd, 0, SEEK_SET);

	r = read(fd, buf, sizeof(buf) - 1);

	fclose(memfile);

	r = read(pipefd[0], buf, sizeof(buf) - 1);

	if (r != w) {
		llen += printf(" written(%d) != read(%d)", (int)w, (int)r);
		result(llen, FAIL);