embox

Форк
0
/
file_desc_oldfs.c 
129 строк · 2.5 Кб
1
/**
2
 * @file
3
 *
4
 * @brief
5
 *
6
 * @date 14.09.2011
7
 * @author Anton Bondarev
8
 */
9

10
#include <errno.h>
11
#include <fcntl.h>
12
#include <assert.h>
13
#include <sys/stat.h>
14

15
#include <fs/perm.h>
16
#include <mem/objalloc.h>
17

18
#include <fs/file_desc.h>
19
#include <kernel/task.h>
20
#include <kernel/task/resource/idesc_table.h>
21
#include <embox/unit.h>
22
#include <util/err.h>
23
#include <fs/inode.h>
24

25
extern const struct idesc_xattrops file_idesc_xattrops;
26

27
OBJALLOC_DEF(desc_pool, struct file_desc, OPTION_GET(NUMBER,fdesc_quantity));
28

29
static struct file_desc *file_desc_alloc(void) {
30
	return objalloc(&desc_pool);
31
}
32

33
static void file_desc_free(struct file_desc *desc) {
34
	objfree(&desc_pool, desc);
35
}
36

37
extern const struct idesc_ops idesc_file_ops;
38

39
struct file_desc *file_desc_create(struct inode *node, int flag) {
40
	struct file_desc *desc;
41
	int perm_flags;
42
	int ret;
43

44
	/* allocate new descriptor */
45
	if (NULL == (desc = file_desc_alloc())) {
46
		return err2ptr(ENOMEM);
47
	}
48
	/* setup access mode */
49
	perm_flags = 0;
50
	if ((flag & O_WRONLY) || (flag & O_RDWR)) {
51
		perm_flags |= S_IWOTH;
52
	}
53
	if (!(flag & O_WRONLY)) {
54
		perm_flags |= S_IROTH;
55
	}
56

57
	if (0 > (ret = fs_perm_check(node, perm_flags))) {
58
		file_desc_free(desc);
59
		return err2ptr(EACCES);
60
	}
61

62
	desc->f_inode = node;
63
	desc->f_pos = 0;
64

65
	idesc_init(&desc->f_idesc, &idesc_file_ops, flag);
66
	desc->f_idesc.idesc_xattrops = &file_idesc_xattrops;
67

68
	return desc;
69
}
70

71
int file_desc_destroy(struct file_desc *fdesc) {
72
	assert(fdesc);
73

74
	inode_del(fdesc->f_inode);
75

76
	file_desc_free(fdesc);
77
	return 0;
78
}
79

80
struct file_desc *file_desc_get(int idx) {
81
	struct idesc *idesc;
82
	struct idesc_table *it;
83

84
	assert(idesc_index_valid(idx));
85

86
	it = task_resource_idesc_table(task_self());
87
	assert(it);
88

89
	idesc = idesc_table_get(it, idx);
90
	assert(idesc);
91

92
	if (idesc->idesc_ops != &idesc_file_ops) {
93
		return NULL;
94
	}
95

96
	return (struct file_desc *) idesc;
97
}
98

99
off_t file_get_pos(struct file_desc * file) {
100
	return file->f_pos;
101
}
102

103
off_t file_set_pos(struct file_desc *file, off_t off) {
104
	file->f_pos = off;
105

106
	return file->f_pos;
107
}
108

109
size_t file_get_size(struct file_desc *file) {
110
	return file->f_inode->i_size;
111
}
112

113
void file_set_size(struct file_desc *file, size_t size) {
114
	file->f_inode->i_size = size;
115
}
116

117
void *file_get_inode_data(struct file_desc *file) {
118
	assert(file->f_inode);
119

120
	return file->f_inode->i_privdata;
121
}
122

123
struct file_desc *file_desc_from_idesc(struct idesc *idesc) {
124
	return (struct file_desc *)idesc;
125
}
126

127
void file_desc_set_file_info(struct file_desc *file, void *fi) {
128
	file->file_info = fi;
129
}
130

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

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

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

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