OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 17 matching lines...) Expand all Loading... |
28 static int inet_pton_v4(const char* src, void* dst); | 28 static int inet_pton_v4(const char* src, void* dst); |
29 static int inet_pton_v6(const char* src, void* dst); | 29 static int inet_pton_v6(const char* src, void* dst); |
30 | 30 |
31 // Implementation of inet_ntop (create a printable representation of an | 31 // Implementation of inet_ntop (create a printable representation of an |
32 // ip address). XP doesn't have its own inet_ntop, and | 32 // ip address). XP doesn't have its own inet_ntop, and |
33 // WSAAddressToString requires both IPv6 to be installed and for Winsock | 33 // WSAAddressToString requires both IPv6 to be installed and for Winsock |
34 // to be initialized. | 34 // to be initialized. |
35 const char* win32_inet_ntop(int af, const void *src, | 35 const char* win32_inet_ntop(int af, const void *src, |
36 char* dst, socklen_t size) { | 36 char* dst, socklen_t size) { |
37 if (!src || !dst) { | 37 if (!src || !dst) { |
38 return NULL; | 38 return nullptr; |
39 } | 39 } |
40 switch (af) { | 40 switch (af) { |
41 case AF_INET: { | 41 case AF_INET: { |
42 return inet_ntop_v4(src, dst, size); | 42 return inet_ntop_v4(src, dst, size); |
43 } | 43 } |
44 case AF_INET6: { | 44 case AF_INET6: { |
45 return inet_ntop_v6(src, dst, size); | 45 return inet_ntop_v6(src, dst, size); |
46 } | 46 } |
47 } | 47 } |
48 return NULL; | 48 return nullptr; |
49 } | 49 } |
50 | 50 |
51 // As above, but for inet_pton. Implements inet_pton for v4 and v6. | 51 // As above, but for inet_pton. Implements inet_pton for v4 and v6. |
52 // Note that our inet_ntop will output normal 'dotted' v4 addresses only. | 52 // Note that our inet_ntop will output normal 'dotted' v4 addresses only. |
53 int win32_inet_pton(int af, const char* src, void* dst) { | 53 int win32_inet_pton(int af, const char* src, void* dst) { |
54 if (!src || !dst) { | 54 if (!src || !dst) { |
55 return 0; | 55 return 0; |
56 } | 56 } |
57 if (af == AF_INET) { | 57 if (af == AF_INET) { |
58 return inet_pton_v4(src, dst); | 58 return inet_pton_v4(src, dst); |
59 } else if (af == AF_INET6) { | 59 } else if (af == AF_INET6) { |
60 return inet_pton_v6(src, dst); | 60 return inet_pton_v6(src, dst); |
61 } | 61 } |
62 return -1; | 62 return -1; |
63 } | 63 } |
64 | 64 |
65 // Helper function for inet_ntop for IPv4 addresses. | 65 // Helper function for inet_ntop for IPv4 addresses. |
66 // Outputs "dotted-quad" decimal notation. | 66 // Outputs "dotted-quad" decimal notation. |
67 const char* inet_ntop_v4(const void* src, char* dst, socklen_t size) { | 67 const char* inet_ntop_v4(const void* src, char* dst, socklen_t size) { |
68 if (size < INET_ADDRSTRLEN) { | 68 if (size < INET_ADDRSTRLEN) { |
69 return NULL; | 69 return nullptr; |
70 } | 70 } |
71 const struct in_addr* as_in_addr = | 71 const struct in_addr* as_in_addr = |
72 reinterpret_cast<const struct in_addr*>(src); | 72 reinterpret_cast<const struct in_addr*>(src); |
73 rtc::sprintfn(dst, size, "%d.%d.%d.%d", | 73 rtc::sprintfn(dst, size, "%d.%d.%d.%d", |
74 as_in_addr->S_un.S_un_b.s_b1, | 74 as_in_addr->S_un.S_un_b.s_b1, |
75 as_in_addr->S_un.S_un_b.s_b2, | 75 as_in_addr->S_un.S_un_b.s_b2, |
76 as_in_addr->S_un.S_un_b.s_b3, | 76 as_in_addr->S_un.S_un_b.s_b3, |
77 as_in_addr->S_un.S_un_b.s_b4); | 77 as_in_addr->S_un.S_un_b.s_b4); |
78 return dst; | 78 return dst; |
79 } | 79 } |
80 | 80 |
81 // Helper function for inet_ntop for IPv6 addresses. | 81 // Helper function for inet_ntop for IPv6 addresses. |
82 const char* inet_ntop_v6(const void* src, char* dst, socklen_t size) { | 82 const char* inet_ntop_v6(const void* src, char* dst, socklen_t size) { |
83 if (size < INET6_ADDRSTRLEN) { | 83 if (size < INET6_ADDRSTRLEN) { |
84 return NULL; | 84 return nullptr; |
85 } | 85 } |
86 const uint16_t* as_shorts = reinterpret_cast<const uint16_t*>(src); | 86 const uint16_t* as_shorts = reinterpret_cast<const uint16_t*>(src); |
87 int runpos[8]; | 87 int runpos[8]; |
88 int current = 1; | 88 int current = 1; |
89 int max = 0; | 89 int max = 0; |
90 int maxpos = -1; | 90 int maxpos = -1; |
91 int run_array_size = arraysize(runpos); | 91 int run_array_size = arraysize(runpos); |
92 // Run over the address marking runs of 0s. | 92 // Run over the address marking runs of 0s. |
93 for (int i = 0; i < run_array_size; ++i) { | 93 for (int i = 0; i < run_array_size; ++i) { |
94 if (as_shorts[i] == 0) { | 94 if (as_shorts[i] == 0) { |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 // FILETIME of that time/date, then we add/subtract in appropriate units to | 311 // FILETIME of that time/date, then we add/subtract in appropriate units to |
312 // convert to/from unix time. | 312 // convert to/from unix time. |
313 // The units of FILETIME are 100ns intervals, so by multiplying by or dividing | 313 // The units of FILETIME are 100ns intervals, so by multiplying by or dividing |
314 // by 10000000, we can convert to/from seconds. | 314 // by 10000000, we can convert to/from seconds. |
315 // | 315 // |
316 // FileTime = UnixTime*10000000 + FileTime(1970) | 316 // FileTime = UnixTime*10000000 + FileTime(1970) |
317 // UnixTime = (FileTime-FileTime(1970))/10000000 | 317 // UnixTime = (FileTime-FileTime(1970))/10000000 |
318 // | 318 // |
319 | 319 |
320 void FileTimeToUnixTime(const FILETIME& ft, time_t* ut) { | 320 void FileTimeToUnixTime(const FILETIME& ft, time_t* ut) { |
321 RTC_DCHECK(NULL != ut); | 321 RTC_DCHECK(nullptr != ut); |
322 | 322 |
323 // FILETIME has an earlier date base than time_t (1/1/1970), so subtract off | 323 // FILETIME has an earlier date base than time_t (1/1/1970), so subtract off |
324 // the difference. | 324 // the difference. |
325 SYSTEMTIME base_st; | 325 SYSTEMTIME base_st; |
326 memset(&base_st, 0, sizeof(base_st)); | 326 memset(&base_st, 0, sizeof(base_st)); |
327 base_st.wDay = 1; | 327 base_st.wDay = 1; |
328 base_st.wMonth = 1; | 328 base_st.wMonth = 1; |
329 base_st.wYear = 1970; | 329 base_st.wYear = 1970; |
330 | 330 |
331 FILETIME base_ft; | 331 FILETIME base_ft; |
332 SystemTimeToFileTime(&base_st, &base_ft); | 332 SystemTimeToFileTime(&base_st, &base_ft); |
333 | 333 |
334 ULARGE_INTEGER base_ul, current_ul; | 334 ULARGE_INTEGER base_ul, current_ul; |
335 memcpy(&base_ul, &base_ft, sizeof(FILETIME)); | 335 memcpy(&base_ul, &base_ft, sizeof(FILETIME)); |
336 memcpy(¤t_ul, &ft, sizeof(FILETIME)); | 336 memcpy(¤t_ul, &ft, sizeof(FILETIME)); |
337 | 337 |
338 // Divide by big number to convert to seconds, then subtract out the 1970 | 338 // Divide by big number to convert to seconds, then subtract out the 1970 |
339 // base date value. | 339 // base date value. |
340 const ULONGLONG RATIO = 10000000; | 340 const ULONGLONG RATIO = 10000000; |
341 *ut = static_cast<time_t>((current_ul.QuadPart - base_ul.QuadPart) / RATIO); | 341 *ut = static_cast<time_t>((current_ul.QuadPart - base_ul.QuadPart) / RATIO); |
342 } | 342 } |
343 | 343 |
344 void UnixTimeToFileTime(const time_t& ut, FILETIME* ft) { | 344 void UnixTimeToFileTime(const time_t& ut, FILETIME* ft) { |
345 RTC_DCHECK(NULL != ft); | 345 RTC_DCHECK(nullptr != ft); |
346 | 346 |
347 // FILETIME has an earlier date base than time_t (1/1/1970), so add in | 347 // FILETIME has an earlier date base than time_t (1/1/1970), so add in |
348 // the difference. | 348 // the difference. |
349 SYSTEMTIME base_st; | 349 SYSTEMTIME base_st; |
350 memset(&base_st, 0, sizeof(base_st)); | 350 memset(&base_st, 0, sizeof(base_st)); |
351 base_st.wDay = 1; | 351 base_st.wDay = 1; |
352 base_st.wMonth = 1; | 352 base_st.wMonth = 1; |
353 base_st.wYear = 1970; | 353 base_st.wYear = 1970; |
354 | 354 |
355 FILETIME base_ft; | 355 FILETIME base_ft; |
(...skipping 10 matching lines...) Expand all Loading... |
366 memcpy(ft, ¤t_ul, sizeof(FILETIME)); | 366 memcpy(ft, ¤t_ul, sizeof(FILETIME)); |
367 } | 367 } |
368 | 368 |
369 bool Utf8ToWindowsFilename(const std::string& utf8, std::wstring* filename) { | 369 bool Utf8ToWindowsFilename(const std::string& utf8, std::wstring* filename) { |
370 // TODO: Integrate into fileutils.h | 370 // TODO: Integrate into fileutils.h |
371 // TODO: Handle wide and non-wide cases via TCHAR? | 371 // TODO: Handle wide and non-wide cases via TCHAR? |
372 // TODO: Skip \\?\ processing if the length is not > MAX_PATH? | 372 // TODO: Skip \\?\ processing if the length is not > MAX_PATH? |
373 // TODO: Write unittests | 373 // TODO: Write unittests |
374 | 374 |
375 // Convert to Utf16 | 375 // Convert to Utf16 |
376 int wlen = ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), | 376 int wlen = |
377 static_cast<int>(utf8.length() + 1), NULL, | 377 ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), |
378 0); | 378 static_cast<int>(utf8.length() + 1), nullptr, 0); |
379 if (0 == wlen) { | 379 if (0 == wlen) { |
380 return false; | 380 return false; |
381 } | 381 } |
382 wchar_t* wfilename = STACK_ARRAY(wchar_t, wlen); | 382 wchar_t* wfilename = STACK_ARRAY(wchar_t, wlen); |
383 if (0 == ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), | 383 if (0 == ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), |
384 static_cast<int>(utf8.length() + 1), | 384 static_cast<int>(utf8.length() + 1), |
385 wfilename, wlen)) { | 385 wfilename, wlen)) { |
386 return false; | 386 return false; |
387 } | 387 } |
388 // Replace forward slashes with backslashes | 388 // Replace forward slashes with backslashes |
389 std::replace(wfilename, wfilename + wlen, L'/', L'\\'); | 389 std::replace(wfilename, wfilename + wlen, L'/', L'\\'); |
390 // Convert to complete filename | 390 // Convert to complete filename |
391 DWORD full_len = ::GetFullPathName(wfilename, 0, NULL, NULL); | 391 DWORD full_len = ::GetFullPathName(wfilename, 0, nullptr, nullptr); |
392 if (0 == full_len) { | 392 if (0 == full_len) { |
393 return false; | 393 return false; |
394 } | 394 } |
395 wchar_t* filepart = NULL; | 395 wchar_t* filepart = nullptr; |
396 wchar_t* full_filename = STACK_ARRAY(wchar_t, full_len + 6); | 396 wchar_t* full_filename = STACK_ARRAY(wchar_t, full_len + 6); |
397 wchar_t* start = full_filename + 6; | 397 wchar_t* start = full_filename + 6; |
398 if (0 == ::GetFullPathName(wfilename, full_len, start, &filepart)) { | 398 if (0 == ::GetFullPathName(wfilename, full_len, start, &filepart)) { |
399 return false; | 399 return false; |
400 } | 400 } |
401 // Add long-path prefix | 401 // Add long-path prefix |
402 const wchar_t kLongPathPrefix[] = L"\\\\?\\UNC"; | 402 const wchar_t kLongPathPrefix[] = L"\\\\?\\UNC"; |
403 if ((start[0] != L'\\') || (start[1] != L'\\')) { | 403 if ((start[0] != L'\\') || (start[1] != L'\\')) { |
404 // Non-unc path: <pathname> | 404 // Non-unc path: <pathname> |
405 // Becomes: \\?\<pathname> | 405 // Becomes: \\?\<pathname> |
(...skipping 23 matching lines...) Expand all Loading... |
429 return true; | 429 return true; |
430 } | 430 } |
431 return false; | 431 return false; |
432 } | 432 } |
433 | 433 |
434 bool GetCurrentProcessIntegrityLevel(int* level) { | 434 bool GetCurrentProcessIntegrityLevel(int* level) { |
435 bool ret = false; | 435 bool ret = false; |
436 HANDLE process = ::GetCurrentProcess(), token; | 436 HANDLE process = ::GetCurrentProcess(), token; |
437 if (OpenProcessToken(process, TOKEN_QUERY | TOKEN_QUERY_SOURCE, &token)) { | 437 if (OpenProcessToken(process, TOKEN_QUERY | TOKEN_QUERY_SOURCE, &token)) { |
438 DWORD size; | 438 DWORD size; |
439 if (!GetTokenInformation(token, TokenIntegrityLevel, NULL, 0, &size) && | 439 if (!GetTokenInformation(token, TokenIntegrityLevel, nullptr, 0, &size) && |
440 GetLastError() == ERROR_INSUFFICIENT_BUFFER) { | 440 GetLastError() == ERROR_INSUFFICIENT_BUFFER) { |
441 | |
442 char* buf = STACK_ARRAY(char, size); | 441 char* buf = STACK_ARRAY(char, size); |
443 TOKEN_MANDATORY_LABEL* til = | 442 TOKEN_MANDATORY_LABEL* til = |
444 reinterpret_cast<TOKEN_MANDATORY_LABEL*>(buf); | 443 reinterpret_cast<TOKEN_MANDATORY_LABEL*>(buf); |
445 if (GetTokenInformation(token, TokenIntegrityLevel, til, size, &size)) { | 444 if (GetTokenInformation(token, TokenIntegrityLevel, til, size, &size)) { |
446 | 445 |
447 DWORD count = *GetSidSubAuthorityCount(til->Label.Sid); | 446 DWORD count = *GetSidSubAuthorityCount(til->Label.Sid); |
448 *level = *GetSidSubAuthority(til->Label.Sid, count - 1); | 447 *level = *GetSidSubAuthority(til->Label.Sid, count - 1); |
449 ret = true; | 448 ret = true; |
450 } | 449 } |
451 } | 450 } |
452 CloseHandle(token); | 451 CloseHandle(token); |
453 } | 452 } |
454 return ret; | 453 return ret; |
455 } | 454 } |
456 | 455 |
457 } // namespace rtc | 456 } // namespace rtc |
OLD | NEW |