18b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Platform specific code for POSIX goes here. This is not a platform on its 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// own but contains the parts which are the same across POSIX platforms Linux, 30d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// Mac OS, FreeBSD and OpenBSD. 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "platform-posix.h" 333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <unistd.h> 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <errno.h> 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <time.h> 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include <sys/mman.h> 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <sys/socket.h> 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <sys/resource.h> 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <sys/time.h> 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <sys/types.h> 433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include <sys/stat.h> 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <arpa/inet.h> 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <netinet/in.h> 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <netdb.h> 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#undef MAP_TYPE 503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define LOG_TAG "v8" 533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include <android/log.h> 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h" 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "codegen.h" 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "platform.h" 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Maximum size of the virtual memory. 0 means there is no artificial 663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// limit. 673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochintptr_t OS::MaxVirtualMemory() { 693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch struct rlimit limit; 703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int result = getrlimit(RLIMIT_DATA, &limit); 713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (result != 0) return 0; 723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return limit.rlim_cur; 733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochintptr_t OS::CommitPageSize() { 773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static intptr_t page_size = getpagesize(); 783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return page_size; 793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#ifndef __CYGWIN__ 833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Get rid of writable permission on code allocations. 843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid OS::ProtectCode(void* address, const size_t size) { 853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch mprotect(address, size, PROT_READ | PROT_EXEC); 863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Create guard pages. 903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid OS::Guard(void* address, const size_t size) { 913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch mprotect(address, size, PROT_NONE); 923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 9369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#endif // __CYGWIN__ 943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid* OS::GetRandomMmapAddr() { 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Isolate* isolate = Isolate::UncheckedCurrent(); 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Note that the current isolate isn't set up in a call path via 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // CpuFeatures::Probe. We don't care about randomization in this case because 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the code page is immediately freed. 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (isolate != NULL) { 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef V8_TARGET_ARCH_X64 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint64_t rnd1 = V8::RandomPrivate(isolate); 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint64_t rnd2 = V8::RandomPrivate(isolate); 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint64_t raw_addr = (rnd1 << 32) ^ rnd2; 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Currently available CPUs have 48 bits of virtual addressing. Truncate 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the hint address to 46 bits to give the kernel a fighting chance of 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // fulfilling our placement request. 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch raw_addr &= V8_UINT64_C(0x3ffffffff000); 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#else 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t raw_addr = V8::RandomPrivate(isolate); 1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The range 0x20000000 - 0x60000000 is relatively unpopulated across a 1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // variety of ASLR modes (PAE kernel, NX compat mode, etc) and on macos 1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // 10.6 and 10.7. 1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch raw_addr &= 0x3ffff000; 1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch raw_addr += 0x20000000; 1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<void*>(raw_addr); 1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return NULL; 1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// ---------------------------------------------------------------------------- 1253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Math functions 1263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 1273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockdouble modulo(double x, double y) { 1283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return fmod(x, y); 1293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 131d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define UNARY_MATH_FUNCTION(name, generator) \ 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochstatic UnaryMathFunction fast_##name##_function = NULL; \ 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid init_fast_##name##_function() { \ 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fast_##name##_function = generator; \ 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} \ 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdouble fast_##name(double x) { \ 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (*fast_##name##_function)(x); \ 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochUNARY_MATH_FUNCTION(sin, CreateTranscendentalFunction(TranscendentalCache::SIN)) 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochUNARY_MATH_FUNCTION(cos, CreateTranscendentalFunction(TranscendentalCache::COS)) 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochUNARY_MATH_FUNCTION(tan, CreateTranscendentalFunction(TranscendentalCache::TAN)) 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochUNARY_MATH_FUNCTION(log, CreateTranscendentalFunction(TranscendentalCache::LOG)) 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochUNARY_MATH_FUNCTION(sqrt, CreateSqrtFunction()) 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef MATH_FUNCTION 1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid MathSetup() { 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch init_fast_sin_function(); 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch init_fast_cos_function(); 1533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch init_fast_tan_function(); 1543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch init_fast_log_function(); 1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch init_fast_sqrt_function(); 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 159d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockdouble OS::nan_value() { 160d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // NAN from math.h is defined in C99 and not in POSIX. 161d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return NAN; 162d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 163d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 164d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// POSIX date/time support. 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct rusage usage; 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (getrusage(RUSAGE_SELF, &usage) < 0) return -1; 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *secs = usage.ru_utime.tv_sec; 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *usecs = usage.ru_utime.tv_usec; 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble OS::TimeCurrentMillis() { 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct timeval tv; 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (gettimeofday(&tv, NULL) < 0) return 0.0; 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (static_cast<double>(tv.tv_sec) * 1000) + 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (static_cast<double>(tv.tv_usec) / 1000); 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint64_t OS::Ticks() { 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // gettimeofday has microsecond resolution. 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct timeval tv; 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (gettimeofday(&tv, NULL) < 0) 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (static_cast<int64_t>(tv.tv_sec) * 1000000) + tv.tv_usec; 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble OS::DaylightSavingsOffset(double time) { 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (isnan(time)) return nan_value(); 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block time_t tv = static_cast<time_t>(floor(time/msPerSecond)); 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct tm* t = localtime(&tv); 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (NULL == t) return nan_value(); 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return t->tm_isdst > 0 ? 3600 * msPerSecond : 0; 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 205756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint OS::GetLastError() { 206756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return errno; 207756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 208756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 209756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// POSIX stdio support. 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFILE* OS::FOpen(const char* path, const char* mode) { 2153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch FILE* file = fopen(path, mode); 2163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (file == NULL) return NULL; 2173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch struct stat file_stat; 2183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (fstat(fileno(file), &file_stat) != 0) return NULL; 2193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool is_regular_file = ((file_stat.st_mode & S_IFREG) != 0); 2203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (is_regular_file) return file; 2213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch fclose(file); 2223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockbool OS::Remove(const char* path) { 2271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return (remove(path) == 0); 2281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 2291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2313fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFILE* OS::OpenTemporaryFile() { 2323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return tmpfile(); 2333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 2343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 23644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockconst char* const OS::LogFileOpenMode = "w"; 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid OS::Print(const char* format, ...) { 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_list args; 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_start(args, format); 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block VPrint(format, args); 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_end(args); 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid OS::VPrint(const char* format, va_list args) { 24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) 2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format, args); 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block vprintf(format, args); 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid OS::FPrint(FILE* out, const char* format, ...) { 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch va_list args; 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch va_start(args, format); 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch VFPrint(out, format, args); 260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch va_end(args); 261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid OS::VFPrint(FILE* out, const char* format, va_list args) { 26544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format, args); 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#else 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch vfprintf(out, format, args); 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid OS::PrintError(const char* format, ...) { 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_list args; 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_start(args, format); 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block VPrintError(format, args); 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_end(args); 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid OS::VPrintError(const char* format, va_list args) { 28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch __android_log_vprint(ANDROID_LOG_ERROR, LOG_TAG, format, args); 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block vfprintf(stderr, format, args); 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint OS::SNPrintF(Vector<char> str, const char* format, ...) { 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_list args; 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_start(args, format); 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int result = VSNPrintF(str, format, args); 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_end(args); 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint OS::VSNPrintF(Vector<char> str, 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* format, 301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block va_list args) { 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int n = vsnprintf(str.start(), str.length(), format, args); 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (n < 0 || n >= str.length()) { 304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If the length is zero, the assignment fails. 305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (str.length() > 0) 306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch str[str.length() - 1] = '\0'; 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return -1; 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return n; 310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#if defined(V8_TARGET_ARCH_IA32) 3158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochstatic OS::MemCopyFunction memcopy_function = NULL; 3163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochstatic LazyMutex memcopy_function_mutex = LAZY_MUTEX_INITIALIZER; 3178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Defined in codegen-ia32.cc. 3188b112d2025046f85ef7f6be087c6129c872ebad2Ben MurdochOS::MemCopyFunction CreateMemCopyFunction(); 3198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Copy memory area to disjoint memory area. 3218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid OS::MemCopy(void* dest, const void* src, size_t size) { 3228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (memcopy_function == NULL) { 3233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ScopedLock lock(memcopy_function_mutex.Pointer()); 3248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (memcopy_function == NULL) { 3258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch OS::MemCopyFunction temp = CreateMemCopyFunction(); 3268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch MemoryBarrier(); 3278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch memcopy_function = temp; 3288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 3298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 3308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Note: here we rely on dependent reads being ordered. This is true 3318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // on all architectures we currently support. 3328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch (*memcopy_function)(dest, src, size); 3338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#ifdef DEBUG 3348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch CHECK_EQ(0, memcmp(dest, src, size)); 3358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#endif 3368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 3378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#endif // V8_TARGET_ARCH_IA32 3388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// POSIX string support. 341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* OS::StrChr(char* str, int c) { 344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return strchr(str, c); 345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid OS::StrNCpy(Vector<char> dest, const char* src, size_t n) { 349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block strncpy(dest.start(), src, n); 350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ---------------------------------------------------------------------------- 354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// POSIX socket support. 355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass POSIXSocket : public Socket { 358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit POSIXSocket() { 360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create the socket. 361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (IsValid()) { 363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Allow rapid reuse. 364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kOn = 1; 365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ret = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, 366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch &kOn, sizeof(kOn)); 367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(ret == 0); 368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch USE(ret); 369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit POSIXSocket(int socket): socket_(socket) { } 372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~POSIXSocket() { Shutdown(); } 373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Server initialization. 375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool Bind(const int port); 376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool Listen(int backlog) const; 377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Socket* Accept() const; 378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Client initialization. 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool Connect(const char* host, const char* port); 381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Shutdown socket for both read and write. 383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool Shutdown(); 384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Data Transimission 386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int Send(const char* data, int len) const; 387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int Receive(char* data, int len) const; 388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool SetReuseAddress(bool reuse_address); 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool IsValid() const { return socket_ != -1; } 392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int socket_; 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool POSIXSocket::Bind(const int port) { 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsValid()) { 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block sockaddr_in addr; 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memset(&addr, 0, sizeof(addr)); 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block addr.sin_family = AF_INET; 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block addr.sin_port = htons(port); 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int status = bind(socket_, 409756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick BitCast<struct sockaddr *>(&addr), 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block sizeof(addr)); 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return status == 0; 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool POSIXSocket::Listen(int backlog) const { 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsValid()) { 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int status = listen(socket_, backlog); 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return status == 0; 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSocket* POSIXSocket::Accept() const { 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsValid()) { 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return NULL; 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int socket = accept(socket_, NULL, NULL); 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (socket == -1) { 432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return NULL; 433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return new POSIXSocket(socket); 435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool POSIXSocket::Connect(const char* host, const char* port) { 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsValid()) { 441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Lookup host and port. 445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct addrinfo *result = NULL; 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block struct addrinfo hints; 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block memset(&hints, 0, sizeof(addrinfo)); 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block hints.ai_family = AF_INET; 449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block hints.ai_socktype = SOCK_STREAM; 450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block hints.ai_protocol = IPPROTO_TCP; 451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int status = getaddrinfo(host, port, &hints, &result); 452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (status != 0) { 453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Connect. 457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block status = connect(socket_, result->ai_addr, result->ai_addrlen); 458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block freeaddrinfo(result); 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return status == 0; 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool POSIXSocket::Shutdown() { 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (IsValid()) { 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Shutdown socket for both read and write. 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int status = shutdown(socket_, SHUT_RDWR); 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block close(socket_); 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block socket_ = -1; 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return status == 0; 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint POSIXSocket::Send(const char* data, int len) const { 476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int status = send(socket_, data, len, 0); 477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return status; 478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint POSIXSocket::Receive(char* data, int len) const { 482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int status = recv(socket_, data, len, 0); 483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return status; 484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool POSIXSocket::SetReuseAddress(bool reuse_address) { 488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int on = reuse_address ? 1 : 0; 489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int status = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); 490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return status == 0; 491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Socket::SetUp() { 495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Nothing to do on POSIX. 496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Socket::LastError() { 501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return errno; 502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t Socket::HToN(uint16_t value) { 506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return htons(value); 507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t Socket::NToH(uint16_t value) { 511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ntohs(value); 512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t Socket::HToN(uint32_t value) { 516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return htonl(value); 517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t Socket::NToH(uint32_t value) { 521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ntohl(value); 522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSocket* OS::CreateSocket() { 526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return new POSIXSocket(); 527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 531