embox

Форк
0
/
idesc_file_ops.c 
90 строк · 2.0 Кб
1
/**
2
 * @file
3
 * @brief File descriptor (fd) abstraction over FILE *
4
 * @details Provide POSIX kernel support to operate with flides (int)
5
 * instead of FILE *. Rewritten from old VFS.
6
 * @date 20.05.15
7
 * @author Anton Kozlov
8
 * @author Denis Deryugin
9
 */
10

11
#include <assert.h>
12
#include <errno.h>
13
#include <stddef.h>
14
#include <sys/types.h>
15
#include <sys/uio.h>
16

17
#include <fs/kfile.h>
18
#include <kernel/task/resource/idesc.h>
19

20
extern const struct idesc_ops idesc_file_ops;
21

22
static void idesc_file_ops_close(struct idesc *idesc) {
23
	assert(idesc);
24

25
	kclose((struct file_desc *)idesc);
26
}
27

28
static ssize_t idesc_file_ops_read(struct idesc *idesc, const struct iovec *iov,
29
    int cnt) {
30
	void *buf;
31
	size_t nbyte;
32

33
	assert(idesc);
34
	assert(idesc->idesc_ops == &idesc_file_ops);
35

36
	assert(iov);
37
	assert(cnt == 1);
38

39
	buf = iov->iov_base;
40
	nbyte = iov->iov_len;
41

42
	return kread((struct file_desc *)idesc, buf, nbyte);
43
}
44

45
static ssize_t idesc_file_ops_write(struct idesc *idesc,
46
    const struct iovec *iov, int cnt) {
47
	void *buf;
48
	size_t nbyte;
49

50
	assert(idesc);
51
	assert(idesc->idesc_ops == &idesc_file_ops);
52

53
	assert(iov);
54
	assert(cnt == 1);
55

56
	buf = iov->iov_base;
57
	nbyte = iov->iov_len;
58

59
	return kwrite((struct file_desc *)idesc, (char *)buf, nbyte);
60
}
61

62
static int idesc_file_ops_stat(struct idesc *idesc, struct stat *stat) {
63
	assert(idesc);
64
	assert(idesc->idesc_ops == &idesc_file_ops);
65

66
	return kfstat((struct file_desc *)idesc, stat);
67
}
68

69
static int idesc_file_ops_ioctl(struct idesc *idesc, int request, void *data) {
70
	assert(idesc);
71
	assert(idesc->idesc_ops == &idesc_file_ops);
72

73
	return kioctl((struct file_desc *)idesc, request, data);
74
}
75

76
static int idesc_file_ops_status(struct idesc *idesc, int mask) {
77
	assert(idesc);
78
	assert(idesc->idesc_ops == &idesc_file_ops);
79

80
	return 1;
81
}
82

83
const struct idesc_ops idesc_file_ops = {
84
    .close = idesc_file_ops_close,
85
    .id_readv = idesc_file_ops_read,
86
    .id_writev = idesc_file_ops_write,
87
    .ioctl = idesc_file_ops_ioctl,
88
    .fstat = idesc_file_ops_stat,
89
    .status = idesc_file_ops_status,
90
};
91

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.