doc: final revise of the document
[p2p-kernel-protocol.git] / module / p2pkp_file.c
1 #include <asm/uaccess.h>
2 #include <linux/fs.h>
3 #include <linux/buffer_head.h>
4
5 #include "p2pkp_file.h"
6 #include "p2pkp_debug.h"
7
8 struct file* p2pkp_open_file_read(const char *filename)
9 {
10         struct file * file;
11         file = filp_open(filename, O_RDONLY, 0);
12         return IS_ERR_OR_NULL(file) ? NULL : file;
13 }
14
15 struct file* p2pkp_open_file_write(const char *filename, mode_t mode)
16 {
17         struct file * file;
18         file = filp_open(filename, O_CREAT|O_TRUNC, mode);
19         return IS_ERR_OR_NULL(file) ? NULL : file;
20 }
21
22 void p2pkp_close_file(struct file *file)
23 {
24         file_fsync(file, 0);
25         filp_close(file,NULL);
26 }
27
28 int p2pkp_write_in_file(struct file *file, char *buffer, int len)
29 {
30         // Create variables
31         int bytes_written, ret;
32         mm_segment_t fs;
33
34         if(file == NULL) {
35                 ERROR("filp_open error!!");
36                 return -EINVAL;
37         }
38         DEBUG("Changinig segment descriptor");
39         // Get current segment descriptor
40         fs = get_fs();
41         // Set segment descriptor associated to kernel space
42         set_fs(get_ds());
43         DEBUG("Changed segment descriptor - buffer is %p", buffer);
44
45         bytes_written = 0;
46         do {
47                 ret = file->f_op->write(file, buffer + bytes_written, len, &file->f_pos);
48                 if (ret < 0) {
49                         ERROR("error while reading from file");
50                         break;
51                 }
52                 len -= ret;
53                 bytes_written += ret;
54         } while (len > 0);
55         set_fs(fs);
56         return ret < 0 ? ret : bytes_written;
57 }
58
59
60
61 int p2pkp_read_from_file(struct file *file, char *buffer, int len)
62 {
63         // Create variables
64         int read_bytes, offset;
65         mm_segment_t fs;
66
67         if(file == NULL) {
68                 ERROR("filp_open error!!");
69                 return -EINVAL;
70         }
71         DEBUG("Changinig segment descriptor");
72         // Get current segment descriptor
73         fs = get_fs();
74         // Set segment descriptor associated to kernel space
75         set_fs(get_ds());
76         DEBUG("Changed segment descriptor - buffer is %p", buffer);
77
78         offset = 0;
79         do {
80                 read_bytes = file->f_op->read(file, buffer + offset, len, &file->f_pos);
81                 if (read_bytes > 0) {
82                         offset += read_bytes;
83                         len -= read_bytes;
84                 }
85         } while (/*(read_bytes < 0 && errno == EINVAL)||*/(read_bytes > 0 && len > 0));
86
87         set_fs(fs);
88
89         if (read_bytes < 0) {
90                 ERROR("error while reading from file!");
91         }
92
93         return offset;
94 }
95