embox
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
20ssize_t kwrite(struct file_desc *file, const void *buf, size_t size) {21ssize_t ret;22
23if (!file) {24ret = -EBADF;25goto end;26}27
28if (idesc_check_mode(&file->f_idesc, O_RDONLY)) {29ret = -EBADF;30goto end;31}32
33if (NULL == file->f_ops->write) {34ret = -EBADF;35goto end;36}37
38ret = file->f_ops->write(file, (void *)buf, size);39if (ret > 0) {40file_set_pos(file, file_get_pos(file) + ret);41}42
43end:44return ret;45}
46
47ssize_t kread(struct file_desc *desc, void *buf, size_t size) {48ssize_t ret;49
50if (NULL == desc) {51ret = -EBADF;52goto end;53}54
55if (idesc_check_mode(&desc->f_idesc, O_WRONLY)) {56ret = -EBADF;57goto end;58}59
60if (NULL == desc->f_ops->read) {61ret = -EBADF;62goto end;63}64
65/* Don't try to read past EOF */66if (size > desc->f_inode->i_size - file_get_pos(desc)) {67size = desc->f_inode->i_size - file_get_pos(desc);68}69
70ret = desc->f_ops->read(desc, buf, size);71if (ret > 0) {72file_set_pos(desc, file_get_pos(desc) + ret);73}74
75end:76return ret;77}
78
79void kclose(struct file_desc *desc) {80assert(desc);81assert(desc->f_ops);82
83if (desc->f_ops->close) {84desc->f_ops->close(desc);85}86
87file_desc_destroy(desc);88}
89
90int kfstat(struct file_desc *desc, struct stat *stat_buff) {91if ((NULL == desc) || (stat_buff == NULL)) {92return -EBADF;93}94
95kfile_fill_stat(desc->f_inode, stat_buff);96
97return 0;98}
99
100int kioctl(struct file_desc *desc, int request, void *data) {101int ret;102
103if (NULL == desc) {104return -EBADF;105}106
107if (NULL == desc->f_ops->ioctl) {108return -ENOSUPP;109}110
111ret = desc->f_ops->ioctl(desc, request, data);112
113if (ret < 0) {114return ret;115}116
117return 0;118}
119