embox
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
20extern const struct idesc_ops idesc_file_ops;
21
22static void idesc_file_ops_close(struct idesc *idesc) {
23assert(idesc);
24
25kclose((struct file_desc *)idesc);
26}
27
28static ssize_t idesc_file_ops_read(struct idesc *idesc, const struct iovec *iov,
29int cnt) {
30void *buf;
31size_t nbyte;
32
33assert(idesc);
34assert(idesc->idesc_ops == &idesc_file_ops);
35
36assert(iov);
37assert(cnt == 1);
38
39buf = iov->iov_base;
40nbyte = iov->iov_len;
41
42return kread((struct file_desc *)idesc, buf, nbyte);
43}
44
45static ssize_t idesc_file_ops_write(struct idesc *idesc,
46const struct iovec *iov, int cnt) {
47void *buf;
48size_t nbyte;
49
50assert(idesc);
51assert(idesc->idesc_ops == &idesc_file_ops);
52
53assert(iov);
54assert(cnt == 1);
55
56buf = iov->iov_base;
57nbyte = iov->iov_len;
58
59return kwrite((struct file_desc *)idesc, (char *)buf, nbyte);
60}
61
62static int idesc_file_ops_stat(struct idesc *idesc, struct stat *stat) {
63assert(idesc);
64assert(idesc->idesc_ops == &idesc_file_ops);
65
66return kfstat((struct file_desc *)idesc, stat);
67}
68
69static int idesc_file_ops_ioctl(struct idesc *idesc, int request, void *data) {
70assert(idesc);
71assert(idesc->idesc_ops == &idesc_file_ops);
72
73return kioctl((struct file_desc *)idesc, request, data);
74}
75
76static int idesc_file_ops_status(struct idesc *idesc, int mask) {
77assert(idesc);
78assert(idesc->idesc_ops == &idesc_file_ops);
79
80return 1;
81}
82
83const 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