/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
/*
 * uio for NOLIBC
 * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
 * Copyright (C) 2025 Intel Corporation
 */

/* make sure to include all global symbols */
#include "../nolibc.h"

#ifndef _NOLIBC_SYS_UIO_H
#define _NOLIBC_SYS_UIO_H

#include "../sys.h"
#include <linux/uio.h>


/*
 * ssize_t readv(int fd, const struct iovec *iovec, int count);
 */
static __attribute__((unused))
ssize_t _sys_readv(int fd, const struct iovec *iovec, int count)
{
	return __nolibc_syscall3(__NR_readv, fd, iovec, count);
}

static __attribute__((unused))
ssize_t readv(int fd, const struct iovec *iovec, int count)
{
	return __sysret(_sys_readv(fd, iovec, count));
}

/*
 * ssize_t writev(int fd, const struct iovec *iovec, int count);
 */
static __attribute__((unused))
ssize_t _sys_writev(int fd, const struct iovec *iovec, int count)
{
	return __nolibc_syscall3(__NR_writev, fd, iovec, count);
}

static __attribute__((unused))
ssize_t writev(int fd, const struct iovec *iovec, int count)
{
	return __sysret(_sys_writev(fd, iovec, count));
}


#endif /* _NOLIBC_SYS_UIO_H */
