source: installer/c/i2pExe/i2p.c @ 7f471910

Last change on this file since 7f471910 was 7f471910, checked in by str4d <str4d@…>, 9 years ago

Marked Windows-specific code in preparation for a cross-platform binary

  • Property mode set to 100644
File size: 6.3 KB
Line 
1/**
2 * Customized I2P launcher.
3 * Launches the JRE within the process, to allow Task Manager to show
4 * "I2P.exe" as the process, and firewalls to control access of
5 * "I2P.exe".
6 */
7
8#include "errors.h"
9
10#ifdef _WIN32
11#include <windows.h>
12#endif
13
14#include <stdio.h>
15#include <malloc.h>
16#include <sys/stat.h>
17
18//BOOL MoveFontPropertiesFile(const char *path);
19#ifdef _WIN32
20void SetWorkingDirectory(char *path);
21#endif
22void readOptions(char***, int*);
23//BOOL localJREExists(const char*);
24//BOOL exist(const char*);
25
26// defined in java.c
27extern void* MemAlloc(size_t);
28// defined in java.c
29extern int launchJVM(int, char**);
30
31
32int
33main(int argc, char** argv) {
34
35        //int read_options_size;
36        //char** read_options;
37        int ret = 0;
38        //int current_argc = 0;
39        //int new_argc;
40        //char** new_argv;
41        //int i;
42#ifdef _WIN32
43        char currentDirectory[MAX_PATH+1];
44#endif
45
46        // Set/get the correct working directory.
47#ifdef _WIN32
48        SetWorkingDirectory(currentDirectory);
49#endif
50
51        // Read in options from disk (launch.properties)
52        // or the default ones (if no launch.properties existed)
53        //readOptions(&read_options, &read_options_size);
54
55        // Construct a new argc & argv to pass to launchJVM
56        //new_argc = read_options_size + argc;
57        //new_argv = (char**)MemAlloc(sizeof(char*) * (new_argc+1));
58
59        // copy process name
60        //new_argv[0] = argv[0];
61        // copy arguments from properties file
62        //for(i = 1; i <= read_options_size; i++)
63        //      new_argv[i] = read_options[i-1];
64        // copy argv arguments as arguments after the properties file
65        // (generally used as arguments for I2P)
66        //for(current_argc = 1; current_argc < argc; current_argc++)
67        //      new_argv[i++] = argv[current_argc];
68
69        //new_argv[i] = NULL;
70
71        // options are no longer necessary -- free them up.
72        //if(read_options != 0)
73        //      free(read_options);
74
75    //ret = launchJVM(new_argc, new_argv);
76        //free(new_argv);
77        ret = launchJVM(argc, argv);
78        switch(ret) {
79        case ERROR_COULDNT_FIND_JVM:
80        case ERROR_COULDNT_INITIALIZE_JVM:
81        case ERROR_COULDNT_LOAD_JVM:
82#ifdef _WIN32
83                if (MessageBox(NULL, "I2P needs the Java Runtime Environment 5.0 or above. Click OK to go to www.java.com, where you can install Java.", 
84                       "I2P Launcher Error",
85                       MB_ICONWARNING | MB_OKCANCEL) == IDOK)
86                        ShellExecute(NULL, NULL, "http://www.java.com/", "", "", SW_SHOWNORMAL);
87#endif
88                break;
89        case ERROR_COULDNT_PARSE_ARGUMENTS:
90#ifdef _WIN32
91                MessageBox(NULL, "I2P failed to parse the commandline arguments to Java.\n"
92                        "Please download and install I2P again.",
93                        "I2P Launcher Error", MB_OK);
94#endif
95                break;
96        case ERROR_STARTING_PROGRAM:
97#ifdef _WIN32
98                MessageBox(NULL, "I2P was unable to load.\n"
99                                "Please download and install I2P again.",
100                                "I2P Launcher Error", MB_OK);
101#endif
102                break;
103        }
104        return ret;
105}
106
107
108
109#define MAX_OPTION_SIZE 100
110#define MAX_OPTIONS 100
111
112/**
113 * Read in the launch.properties file and generate psuedo-commandline arguments.
114 */
115void readOptions(char*** options, int* size) {
116        FILE* file;
117        char* buffer;
118        int i;
119        size_t currentlen;
120        char* command; 
121
122        file = fopen("launch.properties", "r");
123        if(file == NULL) {
124                // default to certain values.
125                *size = 10;
126#ifdef ALPHA
127                *size = (*size) + 1;
128#endif
129               
130                *options = (char**)MemAlloc(sizeof(char*) * (*size));
131                i = 0;
132                (*options)[i++] = "-Xms64m";
133                (*options)[i++] = "-Xmx256m";
134                (*options)[i++] = "-Dasdf=fdsa";
135                (*options)[i++] = "-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog";
136                //(*options)[i++] = "-Djava.net.preferIPv6Addresses=false";
137                (*options)[i++] = "-Djava.net.preferIPv4Stack=true";
138                (*options)[i++] = "-ea:com.limegroup...";
139                (*options)[i++] = "-ea:org.limewire...";
140                (*options)[i++] = "-Djava.library.path=lib";
141                (*options)[i++] = "-jar";
142                (*options)[i++] = "lib\\MuWire.jar";
143#ifdef ALPHA
144#pragma message ("\n\n!!!!!!!!!!!!!! building ALPHA !!!!!!!!!!!!!!\n\n")
145                (*options)[(*size) - 3] = "-agentlib:yjpagent=port=11111";
146                (*options)[(*size) - 2] = "-jar";
147                (*options)[(*size) - 1] = "I2P.jar";
148#endif
149                return;
150        }
151
152        *options = (char**)MemAlloc(sizeof(char*) * MAX_OPTIONS);
153        *size = 0;
154
155        for(i = 0; i < MAX_OPTIONS && !feof(file); i++) {
156                buffer = (char*)MemAlloc(sizeof(char) * MAX_OPTION_SIZE);
157                // get the next option.
158                if(fgets(buffer, MAX_OPTION_SIZE - 1, file) == NULL)
159                        break;
160                // strip off the \n if it exists.
161                currentlen = strlen(buffer);
162                if(currentlen > 0 && buffer[currentlen-1] == '\n') {
163                        buffer[currentlen-1] = 0;
164                        currentlen--;
165                }
166                // downsize the storage for the command.
167                currentlen++; // (include \0)
168                command = (char*)MemAlloc(sizeof(char) * currentlen);
169                strcpy(command, buffer);
170                free(buffer);
171
172                // set the option & increase the size
173                if(currentlen > 0) {
174                        (*options)[i] = command;
175                        (*size)++;
176                }
177        }
178
179        if(file != NULL)
180                fclose(file);
181}
182
183/*
184 * Sets the current working directory to wherever I2P.exe is located
185 */
186#ifdef _WIN32
187static void
188SetWorkingDirectory(char *path) {
189        GetModuleFileName(NULL, path, MAX_PATH + 1);
190        *strrchr(path, '\\') = '\0'; // remove the .exe
191        SetCurrentDirectory(path);
192        GetCurrentDirectory(MAX_PATH + 1, path);
193}
194#endif
195
196/**
197 * Checks to see if an app-installed JRE exists.
198 */
199/*
200BOOL localJREExists(const char* path) {
201        char localBuf[MAX_PATH + 1];
202        sprintf(localBuf, "%s\\jre\\bin\\hotspot\\jvm.dll\0", path);
203        return exist(localBuf);
204}
205*/
206
207/**
208 * Copies the windows.font.properties file to the jre so that
209 * we use the proper fonts for international installs.
210 */
211/*
212BOOL
213MoveFontPropertiesFile(const char *path) {
214        char curFontFile[MAX_PATH + 1];
215        char newFontFile[MAX_PATH + 1];
216        BOOL copySucceeded;
217        sprintf(curFontFile, "%s\\windows.font.properties\0", path);
218        sprintf(newFontFile, "%s\\jre\\lib\\font.properties\0", path);
219        if(!exist(curFontFile))
220                return TRUE;
221
222        copySucceeded = CopyFile(curFontFile, newFontFile, FALSE);
223        if(copySucceeded)
224                DeleteFile(curFontFile);
225        return copySucceeded;
226}
227*/
228/*
229BOOL exist(const char *filename) {
230        struct stat s;
231        return stat(filename, &s) == 0 ? TRUE : FALSE;
232}
233*/
234
235#ifdef _WIN32
236__declspec(dllimport) char **__initenv;
237
238int WINAPI
239WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow)
240{
241    int   ret;
242
243    /* It turns out, that Windows can set thread locale to default user locale
244     * instead of default system locale. We correct this by explicitely setting
245     * thread locale to system default.
246     */
247    SetThreadLocale(GetSystemDefaultLCID());
248
249    __initenv = _environ;
250    ret = main(__argc, __argv);
251
252    return ret; 
253}
254#endif
Note: See TracBrowser for help on using the repository browser.