• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdlib.h>
2 #include <string.h>
3 #include <sys/mman.h>
4 #include <fcntl.h>
5 #include <sys/stat.h>
6 #include "syscall.h"
7 
8 static const size_t index_offset_offset = 12;
9 static const size_t data_offset_offset = 16;
10 static const size_t per_index_size = 48;
11 
__map_file(const char * pathname,size_t * size)12 const char unsigned *__map_file(const char *pathname, size_t *size)
13 {
14 	struct stat st;
15 	const unsigned char *map = MAP_FAILED;
16 	int fd = sys_open(pathname, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
17 	if (fd < 0) return 0;
18 	if (!__fstat(fd, &st)) {
19 		map = __mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
20 		*size = st.st_size;
21 	}
22 #ifdef __LITEOS_A__
23 	if (map == MAP_FAILED) {
24 		__syscall(SYS_close, fd);
25 	}
26 #else
27 	__syscall(SYS_close, fd);
28 #endif
29 
30 	return map == MAP_FAILED ? 0 : map;
31 }
32 
convert_byte_to_size_t(const unsigned char * map)33 static size_t convert_byte_to_size_t(const unsigned char *map)
34 {
35 	/* Parse 4 continue bytes to size_t. 0, 1, 2, 3 is the index of bytes, 24, 16, 8 is the offset of byte in size_t*/
36 	return ((size_t)map[0] << 24) + ((size_t)map[1] << 16) + ((size_t)map[2] << 8) + (size_t)map[3];
37 }
38 
__map_tzdata_file(const char * tzdata_path,const char * tz_id,size_t * tzdata_size,size_t * offset,size_t * size)39 const char unsigned *__map_tzdata_file(const char * tzdata_path, const char *tz_id, size_t *tzdata_size,
40 	size_t *offset, size_t *size)
41 {
42 	struct stat st;
43 	const unsigned char *map = MAP_FAILED;
44 	int fd = sys_open(tzdata_path, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
45 	if (fd < 0) return 0;
46 	if (!__fstat(fd, &st)) {
47 		map = __mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
48 		*tzdata_size = st.st_size;
49 	}
50 	if (map == MAP_FAILED) {
51 		__syscall(SYS_close, fd);
52 		return 0;
53 	}
54 	size_t index_offset = convert_byte_to_size_t(map + index_offset_offset);
55 	size_t data_offset = convert_byte_to_size_t(map + data_offset_offset);
56 	int flag = 0;
57 	while (index_offset < data_offset) {
58 		if (!strncmp((const char *)map + index_offset, tz_id, strlen(tz_id))) {
59 			/* 40 is the offset of file offset value in per index data*/
60 			*offset = data_offset + convert_byte_to_size_t(map + index_offset + 40);
61 			/* 44 is the offset of file length value in per index data*/
62 			*size = convert_byte_to_size_t(map + index_offset + 44);
63 			flag = 1;
64 			break;
65 		}
66 		index_offset += per_index_size;
67 	}
68 	__syscall(SYS_close, fd);
69 	if (flag) {
70 		return map;
71 	}
72 	__munmap((void *)map, st.st_size);
73 	return 0;
74 }
75