embox

Форк
0
/
oldfs_kfile.c 
118 строк · 1.8 Кб
1
/**
2
 * @file
3
 *
4
 * @date 06.08.09
5
 * @author Anton Bondarev
6
 */
7

8
#include <stddef.h>
9
#include <stdio.h>
10
#include <errno.h>
11
#include <fcntl.h>
12
#include <unistd.h>
13
#include <sys/stat.h>
14

15
#include <fs/inode.h>
16
#include <fs/file_desc.h>
17
#include <fs/kfile.h>
18
#include <fs/kfsop.h>
19

20
ssize_t kwrite(struct file_desc *file, const void *buf, size_t size) {
21
	ssize_t ret;
22

23
	if (!file) {
24
		ret = -EBADF;
25
		goto end;
26
	}
27

28
	if (idesc_check_mode(&file->f_idesc, O_RDONLY)) {
29
		ret = -EBADF;
30
		goto end;
31
	}
32

33
	if (NULL == file->f_ops->write) {
34
		ret = -EBADF;
35
		goto end;
36
	}
37

38
	ret = file->f_ops->write(file, (void *)buf, size);
39
	if (ret > 0) {
40
		file_set_pos(file, file_get_pos(file) + ret);
41
	}
42

43
end:
44
	return ret;
45
}
46

47
ssize_t kread(struct file_desc *desc, void *buf, size_t size) {
48
	ssize_t ret;
49

50
	if (NULL == desc) {
51
		ret = -EBADF;
52
		goto end;
53
	}
54

55
	if (idesc_check_mode(&desc->f_idesc, O_WRONLY)) {
56
		ret = -EBADF;
57
		goto end;
58
	}
59

60
	if (NULL == desc->f_ops->read) {
61
		ret = -EBADF;
62
		goto end;
63
	}
64

65
	/* Don't try to read past EOF */
66
	if (size > desc->f_inode->i_size - file_get_pos(desc)) {
67
		size = desc->f_inode->i_size - file_get_pos(desc);
68
	}
69

70
	ret = desc->f_ops->read(desc, buf, size);
71
	if (ret > 0) {
72
		file_set_pos(desc, file_get_pos(desc) + ret);
73
	}
74

75
end:
76
	return ret;
77
}
78

79
void kclose(struct file_desc *desc) {
80
	assert(desc);
81
	assert(desc->f_ops);
82

83
	if (desc->f_ops->close) {
84
		desc->f_ops->close(desc);
85
	}
86

87
	file_desc_destroy(desc);
88
}
89

90
int kfstat(struct file_desc *desc, struct stat *stat_buff) {
91
	if ((NULL == desc) || (stat_buff == NULL)) {
92
		return -EBADF;
93
	}
94

95
	kfile_fill_stat(desc->f_inode, stat_buff);
96

97
	return 0;
98
}
99

100
int kioctl(struct file_desc *desc, int request, void *data) {
101
	int ret;
102

103
	if (NULL == desc) {
104
		return -EBADF;
105
	}
106

107
	if (NULL == desc->f_ops->ioctl) {
108
		return -ENOSUPP;
109
	}
110

111
	ret = desc->f_ops->ioctl(desc, request, data);
112

113
	if (ret < 0) {
114
		return ret;
115
	}
116

117
	return 0;
118
}
119

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

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

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

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