2 * wpa_supplicant/hostapd / OS specific functions for UNIX/POSIX systems
3 * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
19 void os_sleep(os_time_t sec
, os_time_t usec
)
28 int os_get_time(struct os_time
*t
)
32 res
= gettimeofday(&tv
, NULL
);
39 int os_mktime(int year
, int month
, int day
, int hour
, int min
, int sec
,
43 time_t t_local
, t1
, t2
;
46 if (year
< 1970 || month
< 1 || month
> 12 || day
< 1 || day
> 31 ||
47 hour
< 0 || hour
> 23 || min
< 0 || min
> 59 || sec
< 0 ||
51 memset(&tm
, 0, sizeof(tm
));
52 tm
.tm_year
= year
- 1900;
53 tm
.tm_mon
= month
- 1;
59 t_local
= mktime(&tm
);
61 /* figure out offset to UTC */
62 tm1
= localtime(&t_local
);
65 tm1
= gmtime(&t_local
);
74 *t
= (os_time_t
) t_local
- tz_offset
;
79 int os_daemonize(const char *pid_file
)
90 FILE *f
= fopen(pid_file
, "w");
92 fprintf(f
, "%u\n", getpid());
98 #endif /* __uclinux */
102 void os_daemonize_terminate(const char *pid_file
)
109 int os_get_random(unsigned char *buf
, size_t len
)
114 f
= fopen("/dev/urandom", "rb");
116 printf("Could not open /dev/urandom.\n");
120 rc
= fread(buf
, 1, len
, f
);
123 return rc
!= len
? -1 : 0;
127 unsigned long os_random(void)
133 char * os_rel2abs_path(const char *rel_path
)
135 char *buf
= NULL
, *cwd
, *ret
;
136 size_t len
= 128, cwd_len
, rel_len
, ret_len
;
139 if (rel_path
[0] == '/')
140 return strdup(rel_path
);
146 cwd
= getcwd(buf
, len
);
150 if (last_errno
!= ERANGE
)
161 cwd_len
= strlen(cwd
);
162 rel_len
= strlen(rel_path
);
163 ret_len
= cwd_len
+ 1 + rel_len
+ 1;
164 ret
= malloc(ret_len
);
166 memcpy(ret
, cwd
, cwd_len
);
168 memcpy(ret
+ cwd_len
+ 1, rel_path
, rel_len
);
169 ret
[ret_len
- 1] = '\0';
176 int os_program_init(void)
182 void os_program_deinit(void)
187 int os_setenv(const char *name
, const char *value
, int overwrite
)
189 return setenv(name
, value
, overwrite
);
193 int os_unsetenv(const char *name
)
195 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__APPLE__)
199 return unsetenv(name
);
204 char * os_readfile(const char *name
, size_t *len
)
209 f
= fopen(name
, "rb");
213 fseek(f
, 0, SEEK_END
);
215 fseek(f
, 0, SEEK_SET
);
223 fread(buf
, 1, *len
, f
);
230 void * os_zalloc(size_t size
)
232 return calloc(1, size
);
236 size_t os_strlcpy(char *dest
, const char *src
, size_t siz
)
242 /* Copy string up to the maximum size of the dest buffer */
243 while (--left
!= 0) {
244 if ((*dest
++ = *s
++) == '\0')
250 /* Not enough room for the string; force NUL-termination */
254 ; /* determine total src string length */