2d206a46e6f82aec8bd942fa25c899d8b043990b
[p2p-kernel-protocol.git] / module / p2pkp_file.c
1 #include <asm/uaccess.h>
2 #include <linux/fs.h>
3
4 #include "p2pkp_file.h"
5 #include "p2pkp_debug.h"
6
7 struct file* p2pkp_open_file_read(const char *filename)
8 {
9         struct file * file;
10         file = filp_open(filename, O_RDONLY, 0);
11         return IS_ERR_OR_NULL(file) ? NULL : file;
12 }
13
14 struct file* p2pkp_open_file_write(const char *filename, mode_t mode)
15 {
16         struct file * file;
17         file = filp_open(filename, O_CREAT|O_TRUNC, mode);
18         return IS_ERR_OR_NULL(file) ? NULL : file;
19 }
20
21 void p2pkp_close_file(struct file *file)
22 {
23         filp_close(file,NULL);
24 }
25
26 int p2pkp_write_in_file(struct file *file, char *buffer, int len)
27 {
28         // Create variables
29         int bytes_written, ret;
30         mm_segment_t fs;
31
32         if(file == NULL) {
33                 ERROR("filp_open error!!");
34                 return -EINVAL;
35         }
36         DEBUG("Changinig segment descriptor");
37         // Get current segment descriptor
38         fs = get_fs();
39         // Set segment descriptor associated to kernel space
40         set_fs(get_ds());
41         DEBUG("Changed segment descriptor - buffer is %p", buffer);
42
43         bytes_written = 0;
44         do {
45                 ret = file->f_op->write(file, buffer + bytes_written, len, &file->f_pos);
46                 if (ret < 0) {
47                         ERROR("error while reading from file");
48                         break;
49                 }
50                 len -= ret;
51                 bytes_written += ret;
52         } while (len > 0);
53
54         set_fs(fs);
55
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