summaryrefslogtreecommitdiff
path: root/lib/libc/stdio/setvbuf.c
blob: 02928a35efd318d28d2f0f80cf8dbb75518ef63f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stddef.h" // for NULL

#include <libc.h>  // for __IMPL
#include <stdio.h> // for _IONBF, FILE, _IOFBF, _IOLBF, setvbuf, size_t

int setvbuf(FILE *restrict stream, char *restrict buf, int type, size_t size)
{
	if (type != _IOFBF && type != _IOLBF && type != _IONBF)
		return -1;
	if (type != _IONBF && (buf == NULL || size == 0))
		return -1;

	if (__IMPL(stream)->fd < 0)
		return -1;

	__IMPL(stream)->buf = buf;
	__IMPL(stream)->buf_size = size;
	__IMPL(stream)->buf_pos = 0;
	__IMPL(stream)->type = type;

	return 0;
}