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