source: installer/c/i2pExe/i2p.c @ 5b40914

Last change on this file since 5b40914 was 5b40914, checked in by str4d <str4d@…>, 8 years ago

Removed some unnecessary code from i2pExe

  • Property mode set to 100644
File size: 6.2 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#include <windows.h>
11#include <stdio.h>   
12#include <malloc.h>
13#include <sys/stat.h>
14
15//BOOL MoveFontPropertiesFile(const char *path);
16void SetWorkingDirectory(char *path);
17void readOptions(char***, int*);
18//BOOL localJREExists(const char*);
19BOOL exist(const char*);
20
21// defined in java.c
22extern void* MemAlloc(size_t);
23// defined in java.c
24extern int launchJVM(int, char**);
25
26
27int
28main(int argc, char** argv) {
29
30        int read_options_size;
31        char** read_options;
32        int ret = 0;
33        int new_argc;
34        char** new_argv;
35        int i;
36        char currentDirectory[MAX_PATH+1];
37
38        // Set/get the correct working directory.
39        SetWorkingDirectory(currentDirectory);
40
41        // If there are command-line arguments, just use them
42        if(argc > 1) {
43                ret = launchJVM(argc, argv);
44        } else {
45                // Read in options from disk (launch.properties)
46                // or the default ones (if no launch.properties existed)
47                readOptions(&read_options, &read_options_size);
48
49                // Construct a new argc & argv to pass to launchJVM
50                new_argc = read_options_size;
51                new_argv = (char**)MemAlloc(sizeof(char*) * (new_argc+1));
52
53                // copy process name
54                new_argv[0] = argv[0];
55                // copy arguments from properties file
56                for(i = 1; i <= read_options_size; i++)
57                        new_argv[i] = read_options[i-1];
58
59                new_argv[i] = NULL;
60
61                // options are no longer necessary -- free them up.
62                if(read_options != 0)
63                        free(read_options);
64
65                ret = launchJVM(new_argc, new_argv);
66                free(new_argv);
67        }
68        switch(ret) {
69        case ERROR_COULDNT_FIND_JVM:
70        case ERROR_COULDNT_INITIALIZE_JVM:
71        case ERROR_COULDNT_LOAD_JVM:
72                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.", 
73                       "I2P Launcher Error",
74                       MB_ICONWARNING | MB_OKCANCEL) == IDOK)
75                        ShellExecute(NULL, NULL, "http://www.java.com/", "", "", SW_SHOWNORMAL);
76                break;
77        case ERROR_COULDNT_PARSE_ARGUMENTS:
78                MessageBox(NULL, "I2P failed to parse the commandline arguments to Java.\n"
79                        "Please download and install I2P again.",
80                        "I2P Launcher Error", MB_OK);
81                break;
82        case ERROR_STARTING_PROGRAM:
83                MessageBox(NULL, "I2P was unable to load.\n"
84                                "Please download and install I2P again.",
85                                "I2P Launcher Error", MB_OK);
86                break;
87        }
88        return ret;
89}
90
91
92
93#define MAX_OPTION_SIZE 100
94#define MAX_OPTIONS 100
95
96/**
97 * Read in the launch.properties file and generate psuedo-commandline arguments.
98 */
99void readOptions(char*** options, int* size) {
100        FILE* file;
101        char* buffer;
102        int i;
103        size_t currentlen;
104        char* command; 
105
106        file = fopen("launch.properties", "r");
107        if(file == NULL) {
108                // default to certain values.
109                *size = 9;
110               
111                *options = (char**)MemAlloc(sizeof(char*) * (*size));
112                i = 0;
113                (*options)[i++] = "-Xms64m";
114                (*options)[i++] = "-Xmx128m";
115                //(*options)[i++] = "-Djava.net.preferIPv6Addresses=false";
116                //(*options)[i++] = "-Djava.net.preferIPv4Stack=true";
117                (*options)[i++] = "-Djava.library.path=.;lib";
118                (*options)[i++] = "-DloggerFilenameOverride=logs/log-router-@.txt";
119                (*options)[i++] = "-Dorg.mortbay.http.Version.paranoid=true";
120                (*options)[i++] = "-Dorg.mortbay.util.FileResource.checkAliases=false";
121                (*options)[i++] = "-cp";
122                (*options)[i++] = "lib/i2p.jar:lib/router.jar:lib/jbigi.jar:lib/BOB.jar:lib/sam.jar:lib/mstreaming.jar:lib/streaming.jar:lib/routerconsole.jar:lib/i2ptunnel.jar:lib/org.mortbay.jetty.jar:lib/javax.servlet.jar:lib/jasper-compiler.jar:lib/jasper-runtime.jar:lib/commons-logging.jar:lib/commons-el.jar:lib/wrapper.jar:lib/systray.jar:lib/systray4j.jar:lib/desktopgui.jar:lib/i2psnark.jar:lib/jrobin.jar:lib/jstl.jar:lib/standard.jar:lib/jetty-i2p.jar:lib/jetty-java5-threadpool.jar:lib/jetty-rewrite-handler.jar:lib/jetty-sslengine.jar:lib/jetty-start.jar:lib/jetty-util.jar";
123                (*options)[i++] = "net.i2p.router.RouterLaunch";
124                return;
125        }
126
127        *options = (char**)MemAlloc(sizeof(char*) * MAX_OPTIONS);
128        *size = 0;
129
130        for(i = 0; i < MAX_OPTIONS && !feof(file); i++) {
131                buffer = (char*)MemAlloc(sizeof(char) * MAX_OPTION_SIZE);
132                // get the next option.
133                if(fgets(buffer, MAX_OPTION_SIZE - 1, file) == NULL)
134                        break;
135                // strip off the \n if it exists.
136                currentlen = strlen(buffer);
137                if(currentlen > 0 && buffer[currentlen-1] == '\n') {
138                        buffer[currentlen-1] = 0;
139                        currentlen--;
140                }
141                // downsize the storage for the command.
142                currentlen++; // (include \0)
143                command = (char*)MemAlloc(sizeof(char) * currentlen);
144                strcpy(command, buffer);
145                free(buffer);
146
147                // set the option & increase the size
148                if(currentlen > 0) {
149                        (*options)[i] = command;
150                        (*size)++;
151                }
152        }
153
154        if(file != NULL)
155                fclose(file);
156}
157
158/*
159 * Sets the current working directory to wherever I2P.exe is located
160 */
161static void
162SetWorkingDirectory(char *path) {
163        GetModuleFileName(NULL, path, MAX_PATH + 1);
164        *strrchr(path, '\\') = '\0'; // remove the .exe
165        SetCurrentDirectory(path);
166        GetCurrentDirectory(MAX_PATH + 1, path);
167}
168
169/**
170 * Checks to see if an app-installed JRE exists.
171 */
172/*
173BOOL localJREExists(const char* path) {
174        char localBuf[MAX_PATH + 1];
175        sprintf(localBuf, "%s\\jre\\bin\\hotspot\\jvm.dll\0", path);
176        return exist(localBuf);
177}
178*/
179
180/**
181 * Copies the windows.font.properties file to the jre so that
182 * we use the proper fonts for international installs.
183 */
184/*
185BOOL
186MoveFontPropertiesFile(const char *path) {
187        char curFontFile[MAX_PATH + 1];
188        char newFontFile[MAX_PATH + 1];
189        BOOL copySucceeded;
190        sprintf(curFontFile, "%s\\windows.font.properties\0", path);
191        sprintf(newFontFile, "%s\\jre\\lib\\font.properties\0", path);
192        if(!exist(curFontFile))
193                return TRUE;
194
195        copySucceeded = CopyFile(curFontFile, newFontFile, FALSE);
196        if(copySucceeded)
197                DeleteFile(curFontFile);
198        return copySucceeded;
199}
200*/
201
202BOOL exist(const char *filename) {
203        struct stat s;
204        return stat(filename, &s) == 0 ? TRUE : FALSE;
205}
206
207
208__declspec(dllimport) char **__initenv;
209
210int WINAPI
211WinMain(HINSTANCE inst, HINSTANCE previnst, LPSTR cmdline, int cmdshow)
212{
213    int   ret;
214
215    /* It turns out, that Windows can set thread locale to default user locale
216     * instead of default system locale. We correct this by explicitely setting
217     * thread locale to system default.
218     */
219    SetThreadLocale(GetSystemDefaultLCID());
220
221    __initenv = _environ;
222    ret = main(__argc, __argv);
223
224    return ret; 
225}
Note: See TracBrowser for help on using the repository browser.