• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * OS specific functions for UNIX/POSIX systems
3  * Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8 
9 #include "time.h"
10 #include "os.h"
11 #include "utils/common.h"
12 #include "utils/list.h"
13 #include "malloc.h"
14 #include "securec.h"
15 #include "crypto.h"
16 
os_get_ticks(void)17 unsigned long os_get_ticks(void)
18 {
19 	return (unsigned long)os_tick_cnt_get();
20 }
21 
os_sleep(os_time_t sec,os_time_t usec)22 void os_sleep(os_time_t sec, os_time_t usec)
23 {
24 	if (sec)
25 		(void)sleep(sec);
26 	if (usec)
27 		(void)usleep(usec);
28 }
29 
os_get_time(struct os_time * t)30 int os_get_time(struct os_time *t)
31 {
32 	int res;
33 	struct timeval tv;
34 	if (t ==  NULL)
35 		return -1;
36 	res = gettimeofday(&tv, NULL);
37 	t->sec = tv.tv_sec;
38 	t->usec = tv.tv_usec;
39 	return res;
40 }
41 
os_get_reltime(struct os_reltime * t)42 int os_get_reltime(struct os_reltime *t)
43 {
44 #if defined(CLOCK_BOOTTIME)
45 	static clockid_t clock_id = CLOCK_BOOTTIME;
46 #elif defined(CLOCK_MONOTONIC)
47 	static clockid_t clock_id = CLOCK_MONOTONIC;
48 #else
49 	static clockid_t clock_id = CLOCK_REALTIME;
50 #endif
51 	struct timespec ts;
52 	int res;
53 	if (t == NULL)
54 		return -1;
55 	while (1) {
56 		res = clock_gettime(clock_id, &ts);
57 		if (res == 0) {
58 			t->sec = ts.tv_sec;
59 			t->usec = ts.tv_nsec / 1000;
60 			return 0;
61 		}
62 		switch (clock_id) {
63 #ifdef CLOCK_BOOTTIME
64 			case CLOCK_BOOTTIME:
65 				clock_id = CLOCK_MONOTONIC;
66 				break;
67 #endif
68 #ifdef CLOCK_MONOTONIC
69 			case CLOCK_MONOTONIC:
70 				clock_id = CLOCK_REALTIME;
71 				break;
72 #endif
73 			case CLOCK_REALTIME:
74 				return -1;
75 			default:
76 				return -1;
77 		}
78 	}
79 }
80 
81 #ifdef LOS_INLINE_FUNC_CROP
os_reltime_before(struct os_reltime * a,struct os_reltime * b)82 int os_reltime_before(struct os_reltime *a,
83 				    struct os_reltime *b)
84 {
85 	if ((a == NULL) || (b == NULL))
86 		return 0;
87 	return (a->sec < b->sec) ||
88 	       (a->sec == b->sec && a->usec < b->usec);
89 }
90 
os_reltime_sub(struct os_reltime * a,struct os_reltime * b,struct os_reltime * res)91 void os_reltime_sub(struct os_reltime *a, struct os_reltime *b,
92 				  struct os_reltime *res)
93 {
94 	if ((a != NULL) && (b != NULL) && (res != NULL)) {
95 		res->sec = a->sec - b->sec;
96 		res->usec = a->usec - b->usec;
97 		if (res->usec < 0) {
98 			res->sec--;
99 			res->usec += 1000000;
100 		}
101 	}
102 }
103 #endif /* LOS_INLINE_FUNC_CROP */
104 
os_mktime(int year,int month,int day,int hour,int min,int sec,os_time_t * t)105 int os_mktime(int year, int month, int day, int hour, int min, int sec,
106 		  os_time_t *t)
107 {
108 	struct tm tm;
109 	struct tm *tm1 = NULL;
110 	time_t t_local, t1, t2;
111 	os_time_t tz_offset;
112 	if (t == NULL)
113 		return -1;
114 	if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
115 		hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
116 		sec > 60)
117 		return -1;
118 
119 	(void)os_memset(&tm, 0, sizeof(tm));
120 	tm.tm_year = year - 1900;
121 	tm.tm_mon = month - 1;
122 	tm.tm_mday = day;
123 	tm.tm_hour = hour;
124 	tm.tm_min = min;
125 	tm.tm_sec = sec;
126 
127 	t_local = mktime(&tm);
128 
129 	/* figure out offset to UTC */
130 	tm1 = localtime(&t_local);
131 	if (tm1 != NULL) {
132 		t1 = mktime(tm1);
133 		tm1 = gmtime(&t_local);
134 		if (tm1) {
135 			t2 = mktime(tm1);
136 			tz_offset = t2 - t1;
137 		} else
138 			tz_offset = 0;
139 	} else
140 		tz_offset = 0;
141 
142 	*t = (os_time_t)t_local - tz_offset;
143 	return 0;
144 }
145 
os_gmtime(os_time_t t,struct os_tm * tm)146 int os_gmtime(os_time_t t, struct os_tm *tm)
147 {
148 	struct tm *tm2 = NULL;
149 	time_t t2 = t;
150 
151 	tm2 = gmtime(&t2);
152 	if ((tm2 == NULL) || (tm == NULL))
153 		return -1;
154 	tm->sec = tm2->tm_sec;
155 	tm->min = tm2->tm_min;
156 	tm->hour = tm2->tm_hour;
157 	tm->day = tm2->tm_mday;
158 	tm->month = tm2->tm_mon + 1;
159 	tm->year = tm2->tm_year + 1900;
160 	return 0;
161 }
162 
os_get_random(unsigned char * buf,size_t len)163 int os_get_random(unsigned char *buf, size_t len)
164 {
165 	if (crypto_get_random(buf, len) != 0)
166 		return -1;
167 	return 0;
168 }
169 
os_random(void)170 unsigned long os_random(void)
171 {
172 	return rand();
173 }
174 
os_rel2abs_path(const char * rel_path)175 char * os_rel2abs_path(const char *rel_path)
176 {
177 	(void)rel_path;
178 	return NULL;
179 }
180 
os_setenv(const char * name,const char * value,int overwrite)181 int os_setenv(const char *name, const char *value, int overwrite)
182 {
183 	(void)name;
184 	(void)value;
185 	(void)overwrite;
186 	return 0;
187 }
188 
os_unsetenv(const char * name)189 int os_unsetenv(const char *name)
190 {
191 	(void)name;
192 	return 0;
193 }
194 
os_readfile(const char * name,size_t * len)195 char * os_readfile(const char *name, size_t *len)
196 {
197 	(void)name;
198 	(void)len;
199 	return NULL;
200 }
201 
os_file_exists(const char * fname)202 int os_file_exists(const char *fname)
203 {
204 	(void)fname;
205 	return 1;
206 }
207 
os_strlcpy(char * dst,const char * src,size_t n)208 size_t os_strlcpy(char *dst, const char *src, size_t n)
209 {
210 	return strlcpy(dst, src, n);
211 }
212 
os_malloc(size_t size)213 void *os_malloc(size_t size)
214 {
215 	void *ptr = malloc(size);
216 	return ptr;
217 }
218 
os_realloc(void * ptr,size_t size)219 void *os_realloc(void *ptr, size_t size)
220 {
221 	void *reptr = realloc(ptr, size);
222 	return reptr;
223 }
224 
os_free(void * ptr)225 void os_free(void *ptr)
226 {
227 	if (ptr != NULL)
228 		free(ptr);
229 }
230 
os_free_drv_scan_bss(void * ptr)231 __attribute__((weak)) void os_free_drv_scan_bss(void *ptr)
232 {
233     return;
234 }
235 
os_zalloc(size_t size)236 void *os_zalloc(size_t size)
237 {
238 	void *ptr = malloc(size);
239     if (ptr != NULL) {
240         memset(ptr, 0, size);
241     }
242 	return ptr;
243 }
244 
245 #ifdef LOS_INLINE_FUNC_CROP
os_calloc(size_t nmemb,size_t size)246 void * os_calloc(size_t nmemb, size_t size)
247 {
248 	if (size && nmemb > (~(size_t)0) / size)
249 		return NULL;
250 	return os_zalloc(nmemb * size);
251 }
252 #endif /* LOS_INLINE_FUNC_CROP */
253 
os_strdup(const char * src)254 char *os_strdup(const char *src)
255 {
256 	void *ptr = strdup(src);
257 	return ptr;
258 }
259 
os_memcmp(const void * s1,const void * s2,size_t n)260 int os_memcmp(const void *s1, const void *s2, size_t n)
261 {
262 	return memcmp(s1, s2, n);
263 }
264 
os_memset(void * dst,int c,size_t n)265 void *os_memset(void*  dst, int c, size_t n)
266 {
267 	return memset(dst, c, n);
268 }
269 
os_memcpy(void * dst,const void * src,size_t n)270 void *os_memcpy(void *dst, const void *src, size_t n)
271 {
272 	return memcpy(dst, src, n);
273 }
274 
os_memdup(const void * src,size_t len)275 void * os_memdup(const void *src, size_t len)
276 {
277 	void *r = os_malloc(len);
278 	if (r != NULL)
279 		(void)os_memcpy(r, src, len);
280 	return r;
281 }
282 
os_strcmp(const char * str1,const char * str2)283 int os_strcmp(const char *str1, const char *str2)
284 {
285 	return strcmp(str1, str2);
286 }
287 
os_strcasecmp(const char * str1,const char * str2)288 int os_strcasecmp(const char *str1, const char *str2)
289 {
290 	return strcmp(str1, str2);
291 }
292 
os_strncmp(const char * str1,const char * str2,size_t n)293 int os_strncmp(const char *str1, const char *str2, size_t n)
294 {
295 	return strncmp(str1, str2, n);
296 }
297 
os_memcmp_const(const void * a,const void * b,size_t len)298 int os_memcmp_const(const void *a, const void *b, size_t len)
299 {
300 	const u8 *aa = a;
301 	const u8 *bb = b;
302 	size_t i;
303 	u8 res;
304 	if ((aa == NULL) || (bb == NULL))
305 		return -1;
306 	for (res = 0, i = 0; i < len; i++)
307 		res |= aa[i] ^ bb[i];
308 
309 	return res;
310 }
311 
os_strstr(const char * str1,const char * str2)312 char *os_strstr(const char *str1, const char *str2)
313 {
314 	return strstr(str1, str2);
315 }
316 
os_strchr(const char * src,int c)317 char *os_strchr(const char *src, int c)
318 {
319 	return strchr(src, c);
320 }
321 
os_strrchr(const char * src,int c)322 char *os_strrchr(const char *src, int c)
323 {
324 	return strrchr(src, c);
325 }
326 
os_memmove(void * dst,const void * src,size_t n)327 void *os_memmove(void *dst, const void *src, size_t n)
328 {
329 	return memmove(dst, src, n);
330 }
331 
os_strlen(const char * src)332 size_t os_strlen(const char *src)
333 {
334 	return strlen(src);
335 }
336 
os_strncasecmp(const char * s1,const char * s2,size_t n)337 int os_strncasecmp(const char *s1, const char *s2, size_t n)
338 {
339 	return strncasecmp(s1, s2, n);
340 }
341