void multiboot_main(oskit_addr_t boot_info_pa) { int rc; multiboot_main_wrapped(boot_info_pa); if ((rc=knit_init())) _exit(rc); invoke_main(); /* call me paranoid... */ _exit(1); }
int main(int argc, char **argv) { int i = 0; int jvm_argc = 0; int main_argc = 0; int jvm_argv_index = 0; int main_argv_index = 0; char ** jvm_argv = (char**)malloc(argc*sizeof(char*)+1); /* plus one for classpath */ char ** main_argv = (char**)malloc(argc*sizeof(char*)); char *main_class_name = NULL; jobject main_class = NULL; char *p = NULL; int doexit = 1; int result = 0; JNIEnv* env = NULL; int classpath_index = -1; const char* classpath_from_env = getenv("CLASSPATH"); if(classpath_from_env != NULL) { int len = strlen("-Djava.class.path=") + strlen(classpath_from_env) + 1; jvm_argv[jvm_argv_index] = (char*)malloc(len); sprintf(jvm_argv[jvm_argv_index],"-Djava.class.path=%s", classpath_from_env); classpath_index = jvm_argv_index; jvm_argv_index++; jvm_argc++; } for(i=1; i < argc; i++) { if ( strcmp(argv[i], "-noexit") == 0 ) { doexit=0; } else if ( strncmp(argv[i], "-X", 2) == 0 ) { jvm_argc++; jvm_argv[jvm_argv_index++] = argv[i]+2; } else if (strcmp(argv[i],"-cp") == 0 ) { i++; if(i >= argc) { fprintf(stderr, "Missing classpath for -cp options\n"); exit(1); } if (classpath_index < 0) { int len = strlen("-Djava.class.path=") + strlen(argv[i]) + 1; jvm_argv[jvm_argv_index] = (char*)malloc(len); sprintf(jvm_argv[jvm_argv_index],"-Djava.class.path=%s", argv[i]); classpath_index = jvm_argv_index; jvm_argc++; jvm_argv_index++; } else { char *tmp = jvm_argv[classpath_index]; int len = strlen(tmp) + strlen(argv[i]) + 2; jvm_argv[classpath_index] = (char*)malloc(len); sprintf(jvm_argv[classpath_index],"%s:%s", tmp, argv[i]); free(tmp); } } else { if(main_class_name == NULL) { main_class_name = argv[i]; } else { main_argc++; main_argv[main_argv_index++] = argv[i]; } } } if(main_class_name == NULL) { fprintf(stderr,"no main class defined\n"); exit(1); } env = create_vm(jvm_argc, jvm_argv); if(env == NULL) { exit(1); } for(p= main_class_name; *p != '\0'; p++) { if(*p == '.') { *p = '/'; } } main_class = (*env)->FindClass(env, main_class_name); if (main_class == NULL) { fprintf(stderr,"class %s not found\n", main_class_name); exit(1); } main_class = (jclass)(*env)->NewGlobalRef(env, main_class); if (main_class == NULL) { fprintf(stderr,"Did not get a global ref on main class\n"); exit(1); } if(load_libs(env, main_class)) { exit(1); } result = invoke_main( env, main_class, main_argc, main_argv ); if(doexit) { exit(result); } return 0; }