Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Make node work on Openshift
Browse files Browse the repository at this point in the history
Dennis Richie would turn over in his grave.
  • Loading branch information
piscisaureus committed Jun 19, 2012
1 parent debf552 commit cd23e6d
Show file tree
Hide file tree
Showing 10 changed files with 161 additions and 18 deletions.
20 changes: 20 additions & 0 deletions deps/openshift/Makefile
@@ -0,0 +1,20 @@
CFLAGS =-Wall -Wextra

BUILDTYPE ?= Release

ifeq ($(BUILDTYPE),Release)
CFLAGS += -O3
else
CFLAGS += -O0 -g
endif

.PHONY: all clean

all: openshift.o

clean:
@rm -f *.o *.a

openshift.o: openshift.c
$(CC) $(CFLAGS) -o openshift.o -c openshift.c

57 changes: 57 additions & 0 deletions deps/openshift/openshift.c
@@ -0,0 +1,57 @@

#include <arpa/inet.h>
#include <pthread.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#include "openshift.h"


/* Init to defaults; override only if OPENSHIFT_INTERNAL_IP is set; */
static const char* openshift_loopback_name_ = "127.0.0.1";
static uint32_t openshift_loopback_addr_ = (uint32_t) 0x7f000001;

static pthread_once_t openshift_loopback_addr_init_guard_ = PTHREAD_ONCE_INIT;


static void openshift_loopback_addr_init(void) {
const char* name;
const uint32_t addr;

name = getenv("OPENSHIFT_INTERNAL_IP");
if (name == NULL) {
/* Env var not found - stick to 127.0.0.1. */
return;
}

if (!inet_pton(AF_INET, name, (void*) &addr)) {
/* Env var was not a valid IP - stick to 127.0.0.1. */
return;
}

/* Convert to machine byte order. */
openshift_loopback_addr_ = ntohl(addr);

openshift_loopback_name_ = strdup(name);
if (openshift_loopback_name_ == NULL) {
/* Out of memory */
abort();
}
}


uint32_t openshift_loopback_addr(void) {
pthread_once(&openshift_loopback_addr_init_guard_,
openshift_loopback_addr_init);

return openshift_loopback_addr_;
}

const char* openshift_loopback_name(void) {
pthread_once(&openshift_loopback_addr_init_guard_,
openshift_loopback_addr_init);

return openshift_loopback_name_;
}

26 changes: 26 additions & 0 deletions deps/openshift/openshift.h
@@ -0,0 +1,26 @@

#ifndef OPENSHIFT_H_
#define OPENSHIFT_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <arpa/inet.h>
#include <stdint.h>


uint32_t openshift_loopback_addr(void);
const char* openshift_loopback_name(void);


/* Redefine INADDR_LOOPBACK to use the openshift loopback address. */
#undef INADDR_LOOPBACK
#define INADDR_LOOPBACK (openshift_loopback_addr())


#ifdef __cplusplus
}
#endif

#endif
10 changes: 8 additions & 2 deletions deps/v8/SConstruct
Expand Up @@ -33,6 +33,7 @@ import os
from os.path import join, dirname, abspath
from types import DictType, StringTypes
root_dir = dirname(File('SConstruct').rfile().abspath)

sys.path.insert(0, join(root_dir, 'tools'))
import js2c, utils

Expand All @@ -51,9 +52,10 @@ else:
GCC_EXTRA_CCFLAGS = []
GCC_DTOA_EXTRA_CCFLAGS = []


LIBRARY_FLAGS = {
'all': {
'CPPPATH': [join(root_dir, 'src')],
'CPPPATH': [join(root_dir, 'src'), ARGUMENTS['openshift_dir']],
'regexp:interpreted': {
'CPPDEFINES': ['V8_INTERPRETED_REGEXP']
},
Expand Down Expand Up @@ -344,6 +346,9 @@ V8_EXTRA_FLAGS = {

MKSNAPSHOT_EXTRA_FLAGS = {
'gcc': {
'all': {
'LINKFLAGS': [ARGUMENTS['openshift_obj']]
},
'os:linux': {
'LIBS': ['pthread'],
},
Expand Down Expand Up @@ -1103,7 +1108,6 @@ SIMPLE_OPTIONS = {
'default': 'on',
'help': 'use vfp3 instructions when building the snapshot [Arm only]'
},

}

ALL_OPTIONS = dict(PLATFORM_OPTIONS, **SIMPLE_OPTIONS)
Expand All @@ -1130,6 +1134,8 @@ def GetOptions():
result.Add('cache', 'directory to use for scons build cache', '')
result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
result.Add('openshift_dir', '');
result.Add('openshift_obj', '');
AddOptions(PLATFORM_OPTIONS, result)
AddOptions(SIMPLE_OPTIONS, result)
return result
Expand Down
2 changes: 2 additions & 0 deletions deps/v8/src/platform-posix.cc
Expand Up @@ -44,6 +44,8 @@
#include <netinet/in.h>
#include <netdb.h>

#include "openshift.h"

#undef MAP_TYPE

#if defined(ANDROID)
Expand Down
2 changes: 1 addition & 1 deletion lib/_debugger.js
Expand Up @@ -1525,7 +1525,7 @@ Interface.prototype.trySpawn = function(cb) {
var self = this,
breakpoints = this.breakpoints || [],
port = exports.port,
host = 'localhost';
host = process._loopbackAddress();

this.killChild();

Expand Down
4 changes: 2 additions & 2 deletions lib/dns.js
Expand Up @@ -118,8 +118,8 @@ exports.lookup = function(domain, family, callback) {
// localhost entry from c:\WINDOWS\system32\drivers\etc\hosts
// See http://daniel.haxx.se/blog/2011/02/21/localhost-hack-on-windows/
// TODO Remove this once c-ares handles this problem.
if (process.platform == 'win32' && domain == 'localhost') {
callback(null, '127.0.0.1', 4);
if (domain == 'localhost') {
callback(null, process._loopbackAddress(), 4);
return {};
}

Expand Down
4 changes: 2 additions & 2 deletions lib/net.js
Expand Up @@ -602,15 +602,15 @@ Socket.prototype.connect = function(port /* [host], [cb] */) {

// node_net.cc handles null host names graciously but user land
// expects remoteAddress to have a meaningful value
ip = ip || (addressType === 4 ? '127.0.0.1' : '0:0:0:0:0:0:0:1');
ip = ip || (addressType === 4 ? process._loopbackAddress() : '0:0:0:0:0:0:0:1');

connect(self, ip, port, addressType);
}
});

} else {
debug('connect: missing host');
connect(self, '127.0.0.1', port, 4);
connect(self, process._loopbackAddress(), port, 4);
}
return self;
};
Expand Down
11 changes: 11 additions & 0 deletions src/node.cc
Expand Up @@ -56,6 +56,8 @@ typedef int mode_t;
#include <errno.h>
#include <sys/types.h>

#include "openshift.h"

#if defined(__MINGW32__) || defined(_MSC_VER)
# include <platform_win32.h> /* winapi_perror() */
#endif
Expand Down Expand Up @@ -1263,6 +1265,13 @@ static Handle<Value> Cwd(const Arguments& args) {
}


static Handle<Value> LoopbackAddress(const Arguments& args) {
HandleScope scope;
Local<String> v = String::New(openshift_loopback_name());
return scope.Close(v);
}


static Handle<Value> Umask(const Arguments& args) {
HandleScope scope;
unsigned int old;
Expand Down Expand Up @@ -2078,6 +2087,8 @@ Handle<Object> SetupProcessObject(int argc, char *argv[]) {
NODE_SET_METHOD(process, "chdir", Chdir);
NODE_SET_METHOD(process, "cwd", Cwd);

NODE_SET_METHOD(process, "_loopbackAddress", LoopbackAddress);

NODE_SET_METHOD(process, "umask", Umask);

#ifdef __POSIX__
Expand Down
43 changes: 32 additions & 11 deletions wscript
Expand Up @@ -571,7 +571,7 @@ def v8_cmd(bld, variant):
else:
snapshot = ""

cmd_R = sys.executable + ' "%s" -j %d -C "%s" -Y "%s" visibility=default mode=%s %s toolchain=%s library=static %s'
cmd_R = sys.executable + ' "%s" -j %d -C "%s" -Y "%s" visibility=default mode=%s %s toolchain=%s openshift_dir=%s openshift_obj=%s library=static %s'

cmd = cmd_R % ( scons
, Options.options.jobs
Expand All @@ -580,6 +580,8 @@ def v8_cmd(bld, variant):
, mode
, arch
, toolchain
, safe_path(join(deps_src, 'openshift'))
, safe_path(join(bld.srcnode.abspath(bld.env_of_name(variant)), 'deps', 'openshift', 'openshift_1.o'))
, snapshot
)

Expand All @@ -590,17 +592,18 @@ def v8_cmd(bld, variant):
cmd += ' toolchain=gcc strictaliasing=off'



return ("echo '%s' && " % cmd) + cmd


def build_v8(bld):
v8 = bld.new_task_gen(
name = 'v8',
source = 'deps/v8/SConstruct '
+ bld.path.ant_glob('v8/include/*')
+ bld.path.ant_glob('v8/src/*'),
target = bld.env["staticlib_PATTERN"] % "v8",
rule = v8_cmd(bld, "Release"),
add_objects = "openshift",
before = "cxx",
install_path = None)

Expand Down Expand Up @@ -702,11 +705,28 @@ def build(bld):
print "Parallel Jobs: " + str(Options.options.jobs)
print "Product type: " + product_type

### openshift
openshift = bld.new_task_gen(
"cc",
always = True,
source = "deps/openshift/openshift.c",
includes = "deps/openshift/",
name = "openshift",
target = "openshift",
install_path = None,
before = "v8"
)
if bld.env["USE_DEBUG"]:
openshift.clone("Debug")
if product_type_is_lib:
openshift.ccflags = '-fPIC'

### libuv
build_uv(bld)

### v8
if not bld.env['USE_SHARED_V8']: build_v8(bld)


### http_parser
http_parser = bld.new_task_gen("cc")
http_parser.source = "deps/http_parser/http_parser.c"
Expand Down Expand Up @@ -842,13 +862,13 @@ def build(bld):
Utils.exec_command(cmd)

dtrace_ustack = bld.new_task_gen(
name = "dtrace_ustack-postprocess",
source = "src/v8ustack.d",
target = "v8ustack.o",
always = True,
before = "cxx_link",
after = "cxx",
rule = dtrace_do_ustack
name = "dtrace_ustack-postprocess",
source = "src/v8ustack.d",
target = "v8ustack.o",
always = True,
before = "cxx_link",
after = "cxx",
rule = dtrace_do_ustack
)

dtracepost = bld.new_task_gen(
Expand Down Expand Up @@ -887,7 +907,7 @@ def build(bld):
node.name = "node"
node.target = "node"
node.uselib = 'RT OPENSSL ZLIB CARES EXECINFO DL KVM SOCKET NSL KSTAT UTIL OPROFILE'
node.add_objects = 'http_parser'
node.add_objects = 'http_parser openshift'
if product_type_is_lib:
node.install_path = '${LIBDIR}'
else:
Expand Down Expand Up @@ -936,6 +956,7 @@ def build(bld):
node.includes = """
src/
deps/http_parser
deps/openshift
deps/uv/include
deps/uv/src/ev
deps/uv/src/ares
Expand Down

0 comments on commit cd23e6d

Please sign in to comment.