jruby-launcher 0.9.9-java
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +826 -0
- data/Makefile +106 -0
- data/README.txt +61 -0
- data/Rakefile +27 -0
- data/argnames.h +37 -0
- data/argparser.cpp +559 -0
- data/argparser.h +76 -0
- data/extconf.rb +6 -0
- data/inc/Makefile-conf.mk +75 -0
- data/inc/Makefile-impl.mk +107 -0
- data/inc/Makefile-rules.mk +40 -0
- data/jruby.cpp +77 -0
- data/jrubyexe.cpp +84 -0
- data/jvmlauncher.cpp +421 -0
- data/jvmlauncher.h +141 -0
- data/lib/jruby-launcher.rb +3 -0
- data/lib/rubygems/defaults/jruby_native.rb +4 -0
- data/nbexecloader.h +43 -0
- data/ng.c +642 -0
- data/platformlauncher.cpp +239 -0
- data/platformlauncher.h +73 -0
- data/rb_w32_cmdvector.h +287 -0
- data/resources/jruby.ico +0 -0
- data/resources/jruby.rc +25 -0
- data/spec/launcher_spec.rb +134 -0
- data/spec/spec_helper.rb +61 -0
- data/strlcpy.c +69 -0
- data/unixlauncher.cpp +81 -0
- data/unixlauncher.h +22 -0
- data/utilsfuncs.cpp +269 -0
- data/utilsfuncs.h +84 -0
- data/utilsfuncswin.cpp +229 -0
- metadata +96 -0
data/utilsfuncs.h
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
/*
|
2
|
+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
|
3
|
+
*
|
4
|
+
* Copyright 2009-2010 JRuby Team (www.jruby.org).
|
5
|
+
* Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved.
|
6
|
+
*
|
7
|
+
* The contents of this file are subject to the terms of either the GNU
|
8
|
+
* General Public License Version 2 only ("GPL") or the Common
|
9
|
+
* Development and Distribution License("CDDL") (collectively, the
|
10
|
+
* "License"). You may not use this file except in compliance with the
|
11
|
+
* License. You can obtain a copy of the License at
|
12
|
+
* http://www.netbeans.org/cddl-gplv2.html
|
13
|
+
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
|
14
|
+
* specific language governing permissions and limitations under the
|
15
|
+
* License. When distributing the software, include this License Header
|
16
|
+
* Notice in each file and include the License file at
|
17
|
+
* nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
|
18
|
+
* particular file as subject to the "Classpath" exception as provided
|
19
|
+
* by Sun in the GPL Version 2 section of the License file that
|
20
|
+
* accompanied this code. If applicable, add the following below the
|
21
|
+
* License Header, with the fields enclosed by brackets [] replaced by
|
22
|
+
* your own identifying information:
|
23
|
+
* "Portions Copyrighted [year] [name of copyright owner]"
|
24
|
+
*
|
25
|
+
* Contributor(s):
|
26
|
+
*
|
27
|
+
* The Original Software is NetBeans. The Initial Developer of the Original
|
28
|
+
* Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun
|
29
|
+
* Microsystems, Inc. All Rights Reserved.
|
30
|
+
*
|
31
|
+
* If you wish your version of this file to be governed by only the CDDL
|
32
|
+
* or only the GPL Version 2, indicate your decision by adding
|
33
|
+
* "[Contributor] elects to include this software in this distribution
|
34
|
+
* under the [CDDL or GPL Version 2] license." If you do not indicate a
|
35
|
+
* single choice of license, a recipient has the option to distribute
|
36
|
+
* your version of this file under either the CDDL, the GPL Version 2 or
|
37
|
+
* to extend the choice of license to its licensees as provided above.
|
38
|
+
* However, if you add GPL Version 2 code and therefore, elected the GPL
|
39
|
+
* Version 2 license, then the option applies only if the new code is
|
40
|
+
* made subject to such option by the copyright holder.
|
41
|
+
*
|
42
|
+
* Author: Tomas Holy
|
43
|
+
*/
|
44
|
+
|
45
|
+
#ifndef _UTILSFUNCS_H
|
46
|
+
#define _UTILSFUNCS_H
|
47
|
+
|
48
|
+
#include <string>
|
49
|
+
#include <list>
|
50
|
+
|
51
|
+
bool dirExists(const char *path);
|
52
|
+
bool fileExists(const char *path);
|
53
|
+
void logMsg(const char *format, ...);
|
54
|
+
void logErr(bool appendSysError, bool showMsgBox, const char *format, ...);
|
55
|
+
bool checkLoggingArg(int argc, char *argv[], bool delFile);
|
56
|
+
bool printToConsole(const char *msg);
|
57
|
+
char** convertToArgvArray(std::list<std::string> args);
|
58
|
+
void addToArgList(std::list<std::string> & args, int argc, char ** argv);
|
59
|
+
char* findOnPath(const char* name);
|
60
|
+
bool checkDirectory(const char* path);
|
61
|
+
int printArgvToConsole(char** argv);
|
62
|
+
|
63
|
+
#ifndef WIN32
|
64
|
+
#define FILE_SEP '/'
|
65
|
+
#define PATH_SEP ':'
|
66
|
+
#else // WIN32
|
67
|
+
#include <windows.h>
|
68
|
+
#define FILE_SEP '\\'
|
69
|
+
#define PATH_SEP ';'
|
70
|
+
|
71
|
+
#ifdef JRUBYW
|
72
|
+
bool setupProcess(int &argc, char *argv[], DWORD &parentProcID, const char *attachMsg = 0);
|
73
|
+
bool getParentProcessID(DWORD &id);
|
74
|
+
#endif /* JRUBYW */
|
75
|
+
|
76
|
+
bool normalizePath(char *path, int len);
|
77
|
+
bool disableFolderVirtualization(HANDLE hProcess);
|
78
|
+
char * getCurrentModulePath(char *path, int pathLen);
|
79
|
+
bool getStringFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, std::string &value);
|
80
|
+
bool getDwordFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, DWORD &value);
|
81
|
+
bool isConsoleAttached();
|
82
|
+
#endif // WIN32
|
83
|
+
|
84
|
+
#endif /* _UTILSFUNCS_H */
|
data/utilsfuncswin.cpp
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
#include "utilsfuncs.h"
|
2
|
+
#include "argnames.h"
|
3
|
+
#include <tlhelp32.h>
|
4
|
+
|
5
|
+
using namespace std;
|
6
|
+
|
7
|
+
bool normalizePath(char *path, int len) {
|
8
|
+
char tmp[MAX_PATH] = "";
|
9
|
+
int i = 0;
|
10
|
+
while (path[i] && i < MAX_PATH - 1) {
|
11
|
+
tmp[i] = path[i] == '/' ? '\\' : path[i];
|
12
|
+
i++;
|
13
|
+
}
|
14
|
+
tmp[i] = '\0';
|
15
|
+
return _fullpath(path, tmp, len) != NULL;
|
16
|
+
}
|
17
|
+
|
18
|
+
bool disableFolderVirtualization(HANDLE hProcess) {
|
19
|
+
OSVERSIONINFO osvi = {0};
|
20
|
+
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
21
|
+
if (GetVersionEx(&osvi) && osvi.dwMajorVersion == 6) // check it is Win VISTA
|
22
|
+
{
|
23
|
+
HANDLE hToken;
|
24
|
+
if (OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken)) {
|
25
|
+
DWORD tokenInfoVal = 0;
|
26
|
+
if (!SetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS) 24, &tokenInfoVal, sizeof (DWORD))) {
|
27
|
+
// invalid token information class (24) is OK, it means there is no folder virtualization on current system
|
28
|
+
if (GetLastError() != ERROR_INVALID_PARAMETER) {
|
29
|
+
logErr(true, true, "Failed to set token information.");
|
30
|
+
return false;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
CloseHandle(hToken);
|
34
|
+
} else {
|
35
|
+
logErr(true, true, "Failed to open process token.");
|
36
|
+
return false;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
return true;
|
40
|
+
}
|
41
|
+
|
42
|
+
bool getStringFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, string &value) {
|
43
|
+
logMsg("getStringFromRegistry()\n\tkeyName: %s\n\tvalueName: %s", keyName, valueName);
|
44
|
+
HKEY hKey = 0;
|
45
|
+
if (RegOpenKeyEx(rootKey, keyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
|
46
|
+
DWORD valSize = 4096;
|
47
|
+
DWORD type = 0;
|
48
|
+
char val[4096] = "";
|
49
|
+
if (RegQueryValueEx(hKey, valueName, 0, &type, (BYTE *) val, &valSize) == ERROR_SUCCESS
|
50
|
+
&& type == REG_SZ) {
|
51
|
+
logMsg("%s: %s", valueName, val);
|
52
|
+
RegCloseKey(hKey);
|
53
|
+
value = val;
|
54
|
+
return true;
|
55
|
+
} else {
|
56
|
+
logErr(true, false, "RegQueryValueEx() failed.");
|
57
|
+
}
|
58
|
+
RegCloseKey(hKey);
|
59
|
+
} else {
|
60
|
+
logErr(true, false, "RegOpenKeyEx() failed.");
|
61
|
+
}
|
62
|
+
return false;
|
63
|
+
}
|
64
|
+
|
65
|
+
bool getDwordFromRegistry(HKEY rootKey, const char *keyName, const char *valueName, DWORD &value) {
|
66
|
+
logMsg("getDwordFromRegistry()\n\tkeyName: %s\n\tvalueName: %s", keyName, valueName);
|
67
|
+
HKEY hKey = 0;
|
68
|
+
if (RegOpenKeyEx(rootKey, keyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
|
69
|
+
DWORD valSize = sizeof(DWORD);
|
70
|
+
DWORD type = 0;
|
71
|
+
if (RegQueryValueEx(hKey, valueName, 0, &type, (BYTE *) &value, &valSize) == ERROR_SUCCESS
|
72
|
+
&& type == REG_DWORD) {
|
73
|
+
logMsg("%s: %u", valueName, value);
|
74
|
+
RegCloseKey(hKey);
|
75
|
+
return true;
|
76
|
+
} else {
|
77
|
+
logErr(true, false, "RegQueryValueEx() failed.");
|
78
|
+
}
|
79
|
+
RegCloseKey(hKey);
|
80
|
+
} else {
|
81
|
+
logErr(true, false, "RegOpenKeyEx() failed.");
|
82
|
+
}
|
83
|
+
return false;
|
84
|
+
}
|
85
|
+
|
86
|
+
char * getCurrentModulePath(char *path, int pathLen) {
|
87
|
+
MEMORY_BASIC_INFORMATION mbi;
|
88
|
+
static int dummy;
|
89
|
+
VirtualQuery(&dummy, &mbi, sizeof (mbi));
|
90
|
+
HMODULE hModule = (HMODULE) mbi.AllocationBase;
|
91
|
+
GetModuleFileName(hModule, path, pathLen);
|
92
|
+
return path;
|
93
|
+
}
|
94
|
+
|
95
|
+
#ifdef JRUBYW
|
96
|
+
bool setupProcess(int &argc, char *argv[], DWORD &parentProcID, const char *attachMsg) {
|
97
|
+
#define CHECK_ARG \
|
98
|
+
if (i+1 == argc) {\
|
99
|
+
logErr(false, true, "Argument is missing for \"%s\" option.", argv[i]);\
|
100
|
+
return false;\
|
101
|
+
}
|
102
|
+
|
103
|
+
parentProcID = 0;
|
104
|
+
DWORD cmdLineArgPPID = 0;
|
105
|
+
for (int i = 0; i < argc; i++) {
|
106
|
+
// break arg parsing, once "--" is found
|
107
|
+
if (strcmp("--", argv[i]) == 0) {
|
108
|
+
break;
|
109
|
+
}
|
110
|
+
if (strcmp(ARG_NAME_CONSOLE, argv[i]) == 0) {
|
111
|
+
CHECK_ARG;
|
112
|
+
if (strcmp("new", argv[i + 1]) == 0){
|
113
|
+
logMsg("Allocating new console...");
|
114
|
+
AllocConsole();
|
115
|
+
} else if (strcmp("suppress", argv[i + 1]) == 0) {
|
116
|
+
logMsg("Suppressing the attachment to console...");
|
117
|
+
// nothing, no console should be attached
|
118
|
+
} else if (strcmp("attach", argv[i + 1]) == 0) {
|
119
|
+
logMsg("Trying to attach to the existing console...");
|
120
|
+
// attach to parent process console if exists
|
121
|
+
// AttachConsole exists since WinXP, so be nice and do it dynamically
|
122
|
+
typedef BOOL(WINAPI * LPFAC)(DWORD dwProcessId);
|
123
|
+
HINSTANCE hKernel32 = GetModuleHandle("kernel32");
|
124
|
+
if (hKernel32) {
|
125
|
+
LPFAC attachConsole = (LPFAC) GetProcAddress(hKernel32, "AttachConsole");
|
126
|
+
if (attachConsole) {
|
127
|
+
if (cmdLineArgPPID) {
|
128
|
+
if (!attachConsole(cmdLineArgPPID)) {
|
129
|
+
logErr(true, false, "AttachConsole of PPID: %u failed.", cmdLineArgPPID);
|
130
|
+
}
|
131
|
+
} else {
|
132
|
+
if (!attachConsole((DWORD) - 1)) {
|
133
|
+
logErr(true, true, "AttachConsole of PP failed.");
|
134
|
+
} else {
|
135
|
+
getParentProcessID(parentProcID);
|
136
|
+
if (attachMsg) {
|
137
|
+
printToConsole(attachMsg);
|
138
|
+
}
|
139
|
+
}
|
140
|
+
}
|
141
|
+
} else {
|
142
|
+
logErr(true, false, "GetProcAddress() for AttachConsole failed.");
|
143
|
+
}
|
144
|
+
}
|
145
|
+
} else {
|
146
|
+
logErr(false, true, "Invalid argument for \"%s\" option.", argv[i]);
|
147
|
+
return false;
|
148
|
+
}
|
149
|
+
// remove options
|
150
|
+
for (int k = i + 2; k < argc; k++) {
|
151
|
+
argv[k-2] = argv[k];
|
152
|
+
}
|
153
|
+
argc -= 2;
|
154
|
+
return true;
|
155
|
+
}
|
156
|
+
}
|
157
|
+
#undef CHECK_ARG
|
158
|
+
|
159
|
+
return true;
|
160
|
+
}
|
161
|
+
#endif /* JRUBYW */
|
162
|
+
|
163
|
+
bool isConsoleAttached() {
|
164
|
+
typedef HWND (WINAPI *GetConsoleWindowT)();
|
165
|
+
HINSTANCE hKernel32 = GetModuleHandle("kernel32");
|
166
|
+
if (hKernel32) {
|
167
|
+
GetConsoleWindowT getConsoleWindow = (GetConsoleWindowT) GetProcAddress(hKernel32, "GetConsoleWindow");
|
168
|
+
if (getConsoleWindow) {
|
169
|
+
if (getConsoleWindow() != NULL) {
|
170
|
+
logMsg("Console is attached.");
|
171
|
+
return true;
|
172
|
+
}
|
173
|
+
} else {
|
174
|
+
logErr(true, false, "GetProcAddress() for GetConsoleWindow failed.");
|
175
|
+
}
|
176
|
+
}
|
177
|
+
return false;
|
178
|
+
}
|
179
|
+
|
180
|
+
#ifdef JRUBYW
|
181
|
+
bool getParentProcessID(DWORD &id) {
|
182
|
+
typedef HANDLE (WINAPI * CreateToolhelp32SnapshotT)(DWORD, DWORD);
|
183
|
+
typedef BOOL (WINAPI * Process32FirstT)(HANDLE, LPPROCESSENTRY32);
|
184
|
+
typedef BOOL (WINAPI * Process32NextT)(HANDLE, LPPROCESSENTRY32);
|
185
|
+
|
186
|
+
HINSTANCE hKernel32 = GetModuleHandle("kernel32");
|
187
|
+
if (!hKernel32) {
|
188
|
+
return false;
|
189
|
+
}
|
190
|
+
|
191
|
+
CreateToolhelp32SnapshotT createToolhelp32Snapshot = (CreateToolhelp32SnapshotT) GetProcAddress(hKernel32, "CreateToolhelp32Snapshot");
|
192
|
+
Process32FirstT process32First = (Process32FirstT) GetProcAddress(hKernel32, "Process32First");
|
193
|
+
Process32NextT process32Next = (Process32NextT) GetProcAddress(hKernel32, "Process32Next");
|
194
|
+
|
195
|
+
if (createToolhelp32Snapshot == NULL || process32First == NULL || process32Next == NULL) {
|
196
|
+
logErr(true, false, "Failed to obtain Toolhelp32 functions.");
|
197
|
+
return false;
|
198
|
+
}
|
199
|
+
|
200
|
+
HANDLE hSnapshot = createToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
201
|
+
if (hSnapshot == INVALID_HANDLE_VALUE) {
|
202
|
+
logErr(true, false, "Failed to obtain process snapshot.");
|
203
|
+
return false;
|
204
|
+
}
|
205
|
+
|
206
|
+
PROCESSENTRY32 entry = {0};
|
207
|
+
entry.dwSize = sizeof (PROCESSENTRY32);
|
208
|
+
if (!process32First(hSnapshot, &entry)) {
|
209
|
+
CloseHandle(hSnapshot);
|
210
|
+
return false;
|
211
|
+
}
|
212
|
+
|
213
|
+
DWORD curID = GetCurrentProcessId();
|
214
|
+
logMsg("Current process ID: %u", curID);
|
215
|
+
|
216
|
+
do {
|
217
|
+
if (entry.th32ProcessID == curID) {
|
218
|
+
id = entry.th32ParentProcessID;
|
219
|
+
logMsg("Parent process ID: %u", id);
|
220
|
+
CloseHandle(hSnapshot);
|
221
|
+
return true;
|
222
|
+
}
|
223
|
+
} while (process32Next(hSnapshot, &entry));
|
224
|
+
|
225
|
+
CloseHandle(hSnapshot);
|
226
|
+
return false;
|
227
|
+
}
|
228
|
+
#endif /* JRUBYW */
|
229
|
+
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jruby-launcher
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 9
|
8
|
+
- 9
|
9
|
+
version: 0.9.9
|
10
|
+
platform: java
|
11
|
+
authors:
|
12
|
+
- Nick Sieger
|
13
|
+
- Vladimir Sizikov
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-03-01 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Builds and installs a native launcher for JRuby on your system
|
23
|
+
email:
|
24
|
+
- nick@nicksieger.com
|
25
|
+
- vsizikov@gmail.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions:
|
29
|
+
- extconf.rb
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- COPYING
|
34
|
+
- README.txt
|
35
|
+
- Makefile
|
36
|
+
- Rakefile
|
37
|
+
- ng.c
|
38
|
+
- strlcpy.c
|
39
|
+
- argparser.cpp
|
40
|
+
- jruby.cpp
|
41
|
+
- jrubyexe.cpp
|
42
|
+
- jvmlauncher.cpp
|
43
|
+
- platformlauncher.cpp
|
44
|
+
- unixlauncher.cpp
|
45
|
+
- utilsfuncs.cpp
|
46
|
+
- utilsfuncswin.cpp
|
47
|
+
- argnames.h
|
48
|
+
- argparser.h
|
49
|
+
- jvmlauncher.h
|
50
|
+
- nbexecloader.h
|
51
|
+
- platformlauncher.h
|
52
|
+
- rb_w32_cmdvector.h
|
53
|
+
- unixlauncher.h
|
54
|
+
- utilsfuncs.h
|
55
|
+
- inc/Makefile-conf.mk
|
56
|
+
- inc/Makefile-impl.mk
|
57
|
+
- inc/Makefile-rules.mk
|
58
|
+
- extconf.rb
|
59
|
+
- lib/jruby-launcher.rb
|
60
|
+
- lib/rubygems/defaults/jruby_native.rb
|
61
|
+
- spec/launcher_spec.rb
|
62
|
+
- spec/spec_helper.rb
|
63
|
+
- resources/jruby.ico
|
64
|
+
- resources/jruby.rc
|
65
|
+
has_rdoc: true
|
66
|
+
homepage: http://jruby.org
|
67
|
+
licenses: []
|
68
|
+
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
requirements: []
|
89
|
+
|
90
|
+
rubyforge_project: jruby-extras
|
91
|
+
rubygems_version: 1.3.6
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
summary: Native launcher for JRuby
|
95
|
+
test_files: []
|
96
|
+
|