00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "includes.h"
00016
00017 #include "common.h"
00018
00019
00020 static int hex2num(char c)
00021 {
00022 if (c >= '0' && c <= '9')
00023 return c - '0';
00024 if (c >= 'a' && c <= 'f')
00025 return c - 'a' + 10;
00026 if (c >= 'A' && c <= 'F')
00027 return c - 'A' + 10;
00028 return -1;
00029 }
00030
00031
00032 static int hex2byte(const char *hex)
00033 {
00034 int a, b;
00035 a = hex2num(*hex++);
00036 if (a < 0)
00037 return -1;
00038 b = hex2num(*hex++);
00039 if (b < 0)
00040 return -1;
00041 return (a << 4) | b;
00042 }
00043
00044
00051 int hwaddr_aton(const char *txt, u8 *addr)
00052 {
00053 int i;
00054
00055 for (i = 0; i < 6; i++) {
00056 int a, b;
00057
00058 a = hex2num(*txt++);
00059 if (a < 0)
00060 return -1;
00061 b = hex2num(*txt++);
00062 if (b < 0)
00063 return -1;
00064 *addr++ = (a << 4) | b;
00065 if (i < 5 && *txt++ != ':')
00066 return -1;
00067 }
00068
00069 return 0;
00070 }
00071
00072
00079 int hwaddr_aton2(const char *txt, u8 *addr)
00080 {
00081 int i;
00082 const char *pos = txt;
00083
00084 for (i = 0; i < 6; i++) {
00085 int a, b;
00086
00087 while (*pos == ':' || *pos == '.' || *pos == '-')
00088 pos++;
00089
00090 a = hex2num(*pos++);
00091 if (a < 0)
00092 return -1;
00093 b = hex2num(*pos++);
00094 if (b < 0)
00095 return -1;
00096 *addr++ = (a << 4) | b;
00097 }
00098
00099 return pos - txt;
00100 }
00101
00102
00111 int hexstr2bin(const char *hex, u8 *buf, size_t len)
00112 {
00113 size_t i;
00114 int a;
00115 const char *ipos = hex;
00116 u8 *opos = buf;
00117
00118 for (i = 0; i < len; i++) {
00119 a = hex2byte(ipos);
00120 if (a < 0)
00121 return -1;
00122 *opos++ = a;
00123 ipos += 2;
00124 }
00125 return 0;
00126 }
00127
00128
00138 void inc_byte_array(u8 *counter, size_t len)
00139 {
00140 int pos = len - 1;
00141 while (pos >= 0) {
00142 counter[pos]++;
00143 if (counter[pos] != 0)
00144 break;
00145 pos--;
00146 }
00147 }
00148
00149
00150 void wpa_get_ntp_timestamp(u8 *buf)
00151 {
00152 struct os_time now;
00153 u32 sec, usec;
00154 be32 tmp;
00155
00156
00157 os_get_time(&now);
00158 sec = now.sec + 2208988800U;
00159
00160 usec = now.usec;
00161 usec = 4295 * usec - (usec >> 5) - (usec >> 9);
00162 tmp = host_to_be32(sec);
00163 os_memcpy(buf, (u8 *) &tmp, 4);
00164 tmp = host_to_be32(usec);
00165 os_memcpy(buf + 4, (u8 *) &tmp, 4);
00166 }
00167
00168
00169 static inline int _wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data,
00170 size_t len, int uppercase)
00171 {
00172 size_t i;
00173 char *pos = buf, *end = buf + buf_size;
00174 int ret;
00175 if (buf_size == 0)
00176 return 0;
00177 for (i = 0; i < len; i++) {
00178 ret = os_snprintf(pos, end - pos, uppercase ? "%02X" : "%02x",
00179 data[i]);
00180 if (ret < 0 || ret >= end - pos) {
00181 end[-1] = '\0';
00182 return pos - buf;
00183 }
00184 pos += ret;
00185 }
00186 end[-1] = '\0';
00187 return pos - buf;
00188 }
00189
00198 int wpa_snprintf_hex(char *buf, size_t buf_size, const u8 *data, size_t len)
00199 {
00200 return _wpa_snprintf_hex(buf, buf_size, data, len, 0);
00201 }
00202
00203
00212 int wpa_snprintf_hex_uppercase(char *buf, size_t buf_size, const u8 *data,
00213 size_t len)
00214 {
00215 return _wpa_snprintf_hex(buf, buf_size, data, len, 1);
00216 }
00217
00218
00219 #ifdef CONFIG_ANSI_C_EXTRA
00220
00221 #ifdef _WIN32_WCE
00222 void perror(const char *s)
00223 {
00224 wpa_printf(MSG_ERROR, "%s: GetLastError: %d",
00225 s, (int) GetLastError());
00226 }
00227 #endif
00228
00229
00230 int optind = 1;
00231 int optopt;
00232 char *optarg;
00233
00234 int getopt(int argc, char *const argv[], const char *optstring)
00235 {
00236 static int optchr = 1;
00237 char *cp;
00238
00239 if (optchr == 1) {
00240 if (optind >= argc) {
00241
00242 return EOF;
00243 }
00244
00245 if (argv[optind][0] != '-' || argv[optind][1] == '\0') {
00246
00247 return EOF;
00248 }
00249 }
00250
00251 if (os_strcmp(argv[optind], "--") == 0) {
00252
00253 optind++;
00254 return EOF;
00255 }
00256
00257 optopt = argv[optind][optchr];
00258 cp = os_strchr(optstring, optopt);
00259 if (cp == NULL || optopt == ':') {
00260 if (argv[optind][++optchr] == '\0') {
00261 optchr = 1;
00262 optind++;
00263 }
00264 return '?';
00265 }
00266
00267 if (cp[1] == ':') {
00268
00269 optchr = 1;
00270 if (argv[optind][optchr + 1]) {
00271
00272 optarg = &argv[optind++][optchr + 1];
00273 } else if (++optind >= argc) {
00274
00275 return '?';
00276 } else {
00277
00278 optarg = argv[optind++];
00279 }
00280 } else {
00281
00282 if (argv[optind][++optchr] == '\0') {
00283 optchr = 1;
00284 optind++;
00285 }
00286 optarg = NULL;
00287 }
00288 return *cp;
00289 }
00290 #endif
00291
00292
00293 #ifdef CONFIG_NATIVE_WINDOWS
00294
00302 void wpa_unicode2ascii_inplace(TCHAR *str)
00303 {
00304 #ifdef UNICODE
00305 char *dst = (char *) str;
00306 while (*str)
00307 *dst++ = (char) *str++;
00308 *dst = '\0';
00309 #endif
00310 }
00311
00312
00313 TCHAR * wpa_strdup_tchar(const char *str)
00314 {
00315 #ifdef UNICODE
00316 TCHAR *buf;
00317 buf = os_malloc((strlen(str) + 1) * sizeof(TCHAR));
00318 if (buf == NULL)
00319 return NULL;
00320 wsprintf(buf, L"%S", str);
00321 return buf;
00322 #else
00323 return os_strdup(str);
00324 #endif
00325 }
00326 #endif
00327
00328
00343 const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len)
00344 {
00345 static char ssid_txt[33];
00346 char *pos;
00347
00348 if (ssid_len > 32)
00349 ssid_len = 32;
00350 os_memcpy(ssid_txt, ssid, ssid_len);
00351 ssid_txt[ssid_len] = '\0';
00352 for (pos = ssid_txt; *pos != '\0'; pos++) {
00353 if ((u8) *pos < 32 || (u8) *pos >= 127)
00354 *pos = '_';
00355 }
00356 return ssid_txt;
00357 }
00358
00359
00360 void * __hide_aliasing_typecast(void *foo)
00361 {
00362 return foo;
00363 }