module: added support for multiple USERSPACE receivers
[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 void p2pkp_close_file(struct file *file)
15 {
16         filp_close(file,NULL);
17 }
18
19 int p2pkp_read_from_file(struct file *file, char *buffer, int len)
20 {
21         // Create variables
22         int read_bytes, offset;
23         mm_segment_t fs;
24
25         // To see in /var/log/messages that the module is operating
26         if(file == NULL) {
27                 ERROR("filp_open error!!");
28                 return -EINVAL;
29         }
30         DEBUG("Changinig segment descriptor");
31         // Get current segment descriptor
32         fs = get_fs();
33         // Set segment descriptor associated to kernel space
34         set_fs(get_ds());
35         DEBUG("Changed segment descriptor - buffer is %p", buffer);
36
37         offset = 0;
38         do {
39                 read_bytes = file->f_op->read(file, buffer + offset, len, &file->f_pos);
40                 if (read_bytes > 0) {
41                         offset += read_bytes;
42                         len -= read_bytes;
43                 }
44         } while (/*(read_bytes < 0 && errno == EINVAL)||*/(read_bytes > 0 && len > 0));
45
46         set_fs(fs);
47
48         if (read_bytes < 0) {
49                 ERROR("error while reading from file!");
50         }
51
52         return offset;
53 }
54