summaryrefslogtreecommitdiffstats
path: root/vm/Init.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm/Init.c')
-rw-r--r--vm/Init.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/vm/Init.c b/vm/Init.c
index 4a2cbed0f..b82dd39eb 100644
--- a/vm/Init.c
+++ b/vm/Init.c
@@ -723,11 +723,39 @@ static int dvmProcessOptions(int argc, const char* const argv[],
free(gDvm.bootClassPathStr);
gDvm.bootClassPathStr = strdup(path);
- /*
- * TODO: support -Xbootclasspath/a and /p, which append or
- * prepend to the default bootclasspath. We set the default
- * path earlier.
- */
+ } else if (strncmp(argv[i], "-Xbootclasspath/a:",
+ sizeof("-Xbootclasspath/a:")-1) == 0) {
+ const char* appPath = argv[i] + sizeof("-Xbootclasspath/a:")-1;
+
+ if (*(appPath) == '\0') {
+ dvmFprintf(stderr, "Missing appending bootclasspath path list\n");
+ return -1;
+ }
+ char* allPath;
+
+ if (asprintf(&allPath, "%s:%s", gDvm.bootClassPathStr, appPath) < 0) {
+ dvmFprintf(stderr, "Can't append to bootclasspath path list\n");
+ return -1;
+ }
+ free(gDvm.bootClassPathStr);
+ gDvm.bootClassPathStr = allPath;
+
+ } else if (strncmp(argv[i], "-Xbootclasspath/p:",
+ sizeof("-Xbootclasspath/p:")-1) == 0) {
+ const char* prePath = argv[i] + sizeof("-Xbootclasspath/p:")-1;
+
+ if (*(prePath) == '\0') {
+ dvmFprintf(stderr, "Missing prepending bootclasspath path list\n");
+ return -1;
+ }
+ char* allPath;
+
+ if (asprintf(&allPath, "%s:%s", prePath, gDvm.bootClassPathStr) < 0) {
+ dvmFprintf(stderr, "Can't prepend to bootclasspath path list\n");
+ return -1;
+ }
+ free(gDvm.bootClassPathStr);
+ gDvm.bootClassPathStr = allPath;
} else if (strncmp(argv[i], "-D", 2) == 0) {
/* set property */