|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 2/2] lib/vfscore: Add stdin fop
Hi,
now it is a bit too much of type casting. Makes it bit hard to
read. Here is an idea how to avoid implicit type casting at all.
static ssize_t stdin_read(struct vfscore_file *vfscore_file __unused,
void *_buf, size_t count)
{
ssize_t bytes_read;
size_t bytes_total = 0;
char *buf = _buf;
do {
while ((bytes_read = ukplat_cink(buf,
count - bytes_total)) <= 0)
;
buf = buf + bytes_read;
*(buf - 1) = *(buf - 1) == '\r' ?
'\n' : *(buf - 1);
stdout_write(vfscore_file, (buf - bytes_read),
bytes_read);
bytes_total += bytes_read;
} while (bytes_total < count && *(buf - 1) != '\n'
&& *(buf - 1) != VEOF);
return bytes_total;
}
BR, Yuri.
"Vlad-Andrei BĂDOIU (78692)" <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
writes:
> From: Vlad-Andrei BĂDOIU (78692) <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
>
> This patch adds the stdin operation inside lib/vfscore/stdio.c.
>
> The stdio is mapped by default to fd 0. This implementation mimics
> the normal read behaviour.(read until count bytes or read until VEOF or
> \n is met). The '\r' is replaced with '\n' because ukplat_cink returns
> '\r' on KVM and Xen.
>
> For every successful call of ukplat_cink the input is printed
> to the stdout.
>
> Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
> ---
> lib/vfscore/stdio.c | 41 ++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 38 insertions(+), 3 deletions(-)
>
> diff --git a/lib/vfscore/stdio.c b/lib/vfscore/stdio.c
> index c631f5f..66898c1 100644
> --- a/lib/vfscore/stdio.c
> +++ b/lib/vfscore/stdio.c
> @@ -35,19 +35,53 @@
>
> #include <vfscore/file.h>
> #include <uk/plat/console.h>
> +#include <uk/essentials.h>
> +#include <termios.h>
>
> /* One function for stderr and stdout */
> -static ssize_t stdout_write(struct vfscore_file *vfscore_file, const void
> *buf,
> - size_t count)
> +static ssize_t stdout_write(struct vfscore_file *vfscore_file __unused,
> + const void *buf, size_t count)
> {
> - (void) vfscore_file;
> return ukplat_coutk(buf, count);
> }
>
> +static ssize_t stdin_read(struct vfscore_file *vfscore_file __unused,
> + void *buf, size_t count)
> +{
> + ssize_t bytes_read, bytes_total = 0;
> +
> + do {
> + while ((bytes_read = ukplat_cink(buf,
> + count - bytes_total)) <= 0)
> + ;
> +
> + buf = (char *)buf + bytes_read;
> + *((char *)buf - 1) = *((char *)buf - 1) == '\r' ?
> + '\n' : *((char *)buf - 1);
> +
> + stdout_write(vfscore_file, ((char *)buf - bytes_read),
> + bytes_read);
> + bytes_total += bytes_read;
> +
> + } while ((size_t)bytes_total < count && *((char *)buf - 1) != '\n'
> + && *((char *)buf - 1) != VEOF);
> +
> + return bytes_total;
> +}
> +
> +static struct vfscore_fops stdin_fops = {
> + .read = stdin_read,
> +};
> +
> static struct vfscore_fops stdout_fops = {
> .write = stdout_write,
> };
>
> +static struct vfscore_file stdin_file = {
> + .fd = 0,
> + .fops = &stdin_fops,
> +};
> +
> static struct vfscore_file stdout_file = {
> .fd = 1,
> .fops = &stdout_fops,
> @@ -61,6 +95,7 @@ static struct vfscore_file stderr_file = {
>
> void init_stdio(void)
> {
> + vfscore_install_fd(0, &stdin_file);
> vfscore_install_fd(1, &stdout_file);
> vfscore_install_fd(2, &stderr_file);
> }
> --
> 2.19.2
>
--
Yuri Volchkov
Software Specialist
NEC Europe Ltd
Kurfürsten-Anlage 36
D-69115 Heidelberg
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |