embox

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

8
#include <stddef.h>
9
#include <assert.h>
10
#include <errno.h>
11

12
#include <util/err.h>
13

14
#include <fs/inode.h>
15
#include <fs/file_desc.h>
16
#include <fs/kfile.h>
17

18
struct idesc *kopen(struct inode *node, int flag) {
19
	struct super_block *sb;
20
	struct file_desc *desc;
21
	const struct file_operations *ops;
22
	int ret;
23
	struct idesc *idesc;
24

25
	assert(node);
26
	assertf(!(flag & (O_CREAT | O_EXCL)), "use kcreat() instead kopen()");
27
	assertf(!(flag & O_DIRECTORY), "use mkdir() instead kopen()");
28

29

30
	sb = node->i_sb;
31
	/* if we try open a file (not special) we must have the file system */
32
	if (NULL == sb) {
33
		SET_ERRNO(ENOSUPP);
34
		return NULL;
35
	}
36

37
	if (S_ISDIR(node->i_mode)) {
38
		ops = sb->sb_fops;
39
	} else {
40
		if (NULL == sb->sb_fops) {
41
			SET_ERRNO(ENOSUPP);
42
			return NULL;
43
		}
44

45
		ops = sb->sb_fops;
46

47
		if (S_ISCHR(node->i_mode)) {
48
			/* Note: we suppose this node belongs to devfs */
49
			idesc = ops->open(node, NULL, flag);
50
			idesc->idesc_flags = flag;
51
			return idesc;
52
		}
53
	}
54

55
	if(ops == NULL) {
56
		SET_ERRNO(ENOSUPP);
57
		return NULL;
58
	}
59

60
	desc = file_desc_create(node, flag);
61
	if (0 != ptr2err(desc)) {
62
		SET_ERRNO(-(uintptr_t)desc);
63
		return NULL;
64
	}
65
	desc->f_ops = ops;
66

67
	if (desc->f_ops->open != NULL) {
68
		idesc = desc->f_ops->open(node, &desc->f_idesc, flag);
69
		if (ptr2err(idesc)){
70
			ret = (uintptr_t)idesc;
71
			goto free_out;
72
		}
73
	} else {
74
		idesc = &desc->f_idesc;
75
	}
76

77
	if ((struct idesc *)idesc == &desc->f_idesc) {
78
		goto out;
79
	} else {
80
		file_desc_destroy(desc);
81
		return idesc;
82
	}
83

84
free_out:
85
	if (ret < 0) {
86
		file_desc_destroy(desc);
87
		SET_ERRNO(-ret);
88
		return NULL;
89
	}
90

91
out:
92
	return &desc->f_idesc;
93
}
94

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

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

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

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