Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1662)

Unified Diff: src/platform-macos.cc

Issue 27085: Add socket support to platform code.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/platform-linux.cc ('k') | src/platform-win32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/platform-macos.cc
===================================================================
--- src/platform-macos.cc (revision 1344)
+++ src/platform-macos.cc (working copy)
@@ -45,9 +45,16 @@
#include <mach/task.h>
#include <sys/time.h>
#include <sys/resource.h>
+#include <sys/socket.h>
+#include <sys/types.h>
#include <stdarg.h>
#include <stdlib.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <errno.h>
+
#undef MAP_TYPE
#include "v8.h"
@@ -569,6 +576,178 @@
return new MacOSSemaphore(count);
}
+
+// ----------------------------------------------------------------------------
+// MacOS socket support.
+//
+
+class MacOSSocket : public Socket {
+ public:
+ explicit MacOSSocket() {
+ // Create the socket.
+ socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ }
+ explicit MacOSSocket(int socket): socket_(socket) { }
+
+
+ virtual ~MacOSSocket() {
+ if (IsValid()) {
+ // Close socket.
+ close(socket_);
+ }
+ }
+
+ // Server initialization.
+ bool Bind (const int port);
+ bool Listen(int backlog) const;
+ Socket* Accept () const;
+
+ // Client initialization.
+ bool Connect(const char* host, const char* port);
+
+ // Data Transimission
+ int Send(const char* data, int len) const;
+ bool SendAll(const char* data, int len) const;
+ int Receive(char* data, int len) const;
+
+ bool IsValid() const { return socket_ != -1; }
+
+ private:
+ int socket_;
+};
+
+
+bool MacOSSocket::Bind(const int port) {
+ if (!IsValid()) {
+ return false;
+ }
+
+ int on = 1;
+ int status = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
+ if (status != 0) {
+ return false;
+ }
+
+ sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ addr.sin_port = htons(port);
+ status = bind(socket_,
+ reinterpret_cast<struct sockaddr *>(&addr),
+ sizeof (addr));
+ return status == 0;
+}
+
+
+bool MacOSSocket::Listen(int backlog) const {
+ if (!IsValid()) {
+ return false;
+ }
+
+ int status = listen(socket_, backlog);
+ return status == 0;
+}
+
+
+Socket* MacOSSocket::Accept() const {
+ if (!IsValid()) {
+ return NULL;
+ }
+
+ int socket = accept(socket_, NULL, NULL);
+ if (socket == -1) {
+ return NULL;
+ } else {
+ return new MacOSSocket(socket);
+ }
+}
+
+
+bool MacOSSocket::Connect(const char* host, const char* port) {
+ if (!IsValid()) {
+ return false;
+ }
+
+ // Lookup host and port.
+ struct addrinfo *result = NULL;
+ struct addrinfo hints;
+ memset(&hints, 0, sizeof(addrinfo));
+ hints.ai_family = AF_INET;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ int status = getaddrinfo(host, port, &hints, &result);
+ if (status != 0) {
+ return false;
+ }
+
+ // Connect.
+ status = connect(socket_, result->ai_addr, result->ai_addrlen);
+ return status == 0;
+}
+
+
+int MacOSSocket::Send(const char* data, int len) const {
+ int status = send(socket_, data, len, 0);
+ return status;
+}
+
+
+bool MacOSSocket::SendAll(const char* data, int len) const {
+ int sent_len = 0;
+ while (sent_len < len) {
+ int status = Send(data, len);
+ if (status <= 0) {
+ return false;
+ }
+ sent_len += status;
+ }
+ return true;
+}
+
+
+int MacOSSocket::Receive(char* data, int len) const {
+ int status = recv(socket_, data, len, 0);
+ return status;
+}
+
+
+bool Socket::Setup() {
+ // Nothing to do on MacOS.
+ return true;
+}
+
+
+int Socket::LastError() {
+ return errno;
+}
+
+
+uint16_t Socket::HToN(uint16_t value) {
+ return htons(value);
+}
+
+
+uint16_t Socket::NToH(uint16_t value) {
+ return ntohs(value);
+}
+
+
+uint32_t Socket::HToN(uint32_t value) {
+ return htonl(value);
+}
+
+
+uint32_t Socket::NToH(uint32_t value) {
+ return ntohl(value);
+}
+
+
+Socket* OS::CreateSocket() {
+ return new MacOSSocket();
+}
+
+
#ifdef ENABLE_LOGGING_AND_PROFILING
static Sampler* active_sampler_ = NULL;
« no previous file with comments | « src/platform-linux.cc ('k') | src/platform-win32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698