RPA Toolkit
moved file operations to separate platform specific file.
[rpatk.git] / rjs / linux / rjsfile.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <sys/types.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <sys/mman.h>
7
8 #include "rlib/rmem.h"
9 #include "rjs/rjsfile.h"
10
11 void rjs_file_unmap(rstr_t *buf)
12 {
13         if (buf) {
14                 munmap(buf->str, buf->size);
15                 r_free(buf);
16         }
17 }
18
19
20 rstr_t *rjs_file_map(const char *filename)
21 {
22         struct stat st;
23         rstr_t *str;
24         char *buffer;
25
26
27         int fd = open(filename, O_RDONLY);
28         if (fd < 0) {
29                 return (void*)0;
30         }
31         if (fstat(fd, &st) < 0) {
32                 close(fd);
33                 return (void*)0;
34         }
35         buffer = (char*)mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
36         if (buffer == (void*)-1) {
37                 close(fd);
38                 return (void*)0;
39         }
40         str = (rstr_t *)r_malloc(sizeof(*str));
41         if (!str)
42                 goto error;
43         r_memset(str, 0, sizeof(*str));
44         str->str = buffer;
45         str->size = st.st_size;
46         close(fd);
47         return str;
48
49 error:
50         munmap(buffer, st.st_size);
51         close(fd);
52         return str;
53 }