static int child( euca_opts *args, java_home_t *data, uid_t uid, gid_t gid ) { int ret = 0; jboolean r=0; __write_pid( GETARG(args,pidfile) ); setpgrp( ); __die(java_init( args, data ) != 1, "Failed to initialize Eucalyptus."); __die((r=(*env)->CallBooleanMethod(env,bootstrap.instance,bootstrap.init))==0,"Failed to init Eucalyptus."); __abort(4, set_keys_ownership( GETARG( args, home ), uid, gid ) != 0,"Setting ownership of keyfile failed." ); __abort(4, linuxset_user_group( GETARG( args, user ), uid, gid ) != 0,"Setting the user failed." ); __abort(4, (set_caps(0)!=0), "set_caps (0) failed"); __die((r=(*env)->CallBooleanMethod(env,bootstrap.instance,bootstrap.load))==0,"Failed to load Eucalyptus."); __die((r=(*env)->CallBooleanMethod(env,bootstrap.instance,bootstrap.start))==0,"Failed to start Eucalyptus."); handle._hup = signal_set( SIGHUP, handler ); handle._term = signal_set( SIGTERM, handler ); handle._int = signal_set( SIGINT, handler ); child_pid = getpid( ); __debug( "Waiting for a signal to be delivered" ); while( !stopping ) sleep( 60 ); __debug( "Shutdown or reload requested: exiting" ); __die((r=(*env)->CallBooleanMethod(env,bootstrap.instance,bootstrap.stop))==0,"Failed to stop Eucalyptus."); if( doreload == 1 ) ret = EUCA_RET_RELOAD; else ret = 0; __die((r=(*env)->CallBooleanMethod(env,bootstrap.instance,bootstrap.destroy))==0,"Failed to destroy Eucalyptus."); __die((JVM_destroy( ret ) != 1), "Failed trying to destroy JVM... bailing out seems like the right thing to do" ); return ret; }
/** * _pyjava.start function: dynamically load a JVM DLL and start it. */ static PyObject *pyjava_start(PyObject *self, PyObject *args) { const char *path; PyObject *options; size_t size; const char **option_array; size_t i; if(!(PyArg_ParseTuple(args, "sO!", &path, &PyList_Type, &options))) return NULL; if(penv != NULL) { PyErr_SetString( Err_Base, "Attempt to start() the JVM a second time."); return NULL; } size = PyList_GET_SIZE(options); option_array = malloc(size * sizeof(char *)); for(i = 0; i < size; ++i) { PyObject *option = PyList_GET_ITEM(options, i); if(!PyString_Check(option)) { PyErr_SetString( PyExc_TypeError, "Options list contained non-string objects."); free(option_array); return NULL; } option_array[i] = PyString_AS_STRING(option); } penv = java_start_vm(path, option_array, size); free(option_array); if(penv != NULL) { /* * Initialize the modules dependent on the JVM (load classes and * methods, ...) */ java_init(); convert_init(); Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } }
EXPORT MODULE *subload(char *modname, MODULE **pMod, CLASS **cptr, int argc, char **argv) { MODULE *mod = (MODULE *)malloc(sizeof(MODULE)); CLASS *c = NULL; memset(mod, 0, sizeof(MODULE)); gl_output("glmjava: trying to subload \"%s\"", modname); java_init(callback, (JAVACALLBACKS *)getvar("jcallback", NULL, NULL), mod, modname, argc, argv); c = *cptr; while(c != NULL) { c->create = (FUNCTIONADDR)create_java; c->init = (FUNCTIONADDR)init_java; c->isa = (FUNCTIONADDR)isa_java; c->notify = (FUNCTIONADDR)notify_java; c->plc = (FUNCTIONADDR)plc_java; c->recalc = (FUNCTIONADDR)recalc_java; c->sync = (FUNCTIONADDR)sync_java; c->commit = (FUNCTIONADDR)commit_java; c = c->next; } return mod; }
static int child(arg_data *args, home_data *data, uid_t uid, gid_t gid) { int ret = 0; /* check the pid file */ ret = check_pid(args); if (args->vers != true && args->chck != true) { if (ret == 122) return ret; if (ret < 0) return ret; } #ifdef OS_LINUX /* setuid()/setgid() only apply the current thread so we must do it now */ if (linuxset_user_group(args->user, uid, gid) != 0) return 4; #endif /* Initialize the Java VM */ if (java_init(args, data) != true) { log_debug("java_init failed"); return 1; } else log_debug("java_init done"); /* Check wether we need to dump the VM version */ if (args->vers == true) { log_error("jsvc (Apache Commons Daemon) " JSVC_VERSION_STRING); log_error("Copyright (c) 1999-2011 Apache Software Foundation."); if (java_version() != true) { return -1; } else return 0; } /* Check wether we need to dump the VM version */ else if (args->vershow == true) { if (java_version() != true) { return 7; } } /* Do we have to do a "check-only" initialization? */ if (args->chck == true) { if (java_check(args) != true) return 2; printf("Service \"%s\" checked successfully\n", args->clas); return 0; } /* Load the service */ if (java_load(args) != true) { log_debug("java_load failed"); return 3; } else log_debug("java_load done"); /* Downgrade user */ #ifdef OS_LINUX if (args->user && set_caps(0) != 0) { log_debug("set_caps (0) failed"); return 4; } #else if (set_user_group(args->user, uid, gid) != 0) return 4; #endif /* Start the service */ umask(envmask); if (java_start() != true) { log_debug("java_start failed"); return 5; } else log_debug("java_start done"); /* Install signal handlers */ handler_hup = signal_set(SIGHUP, handler); handler_usr1 = signal_set(SIGUSR1, handler); handler_usr2 = signal_set(SIGUSR2, handler); handler_trm = signal_set(SIGTERM, handler); handler_int = signal_set(SIGINT, handler); controlled = getpid(); log_debug("Waiting for a signal to be delivered"); create_tmp_file(args); while (!stopping) { #if defined(OSD_POSIX) java_sleep(60); /* pause(); */ #else /* pause() is not threadsafe */ sleep(60); #endif if(doreopen) { doreopen = false; set_output(args->outfile, args->errfile, args->redirectstdin, args->procname); } if(dosignal) { dosignal = false; java_signal(); } } remove_tmp_file(args); log_debug("Shutdown or reload requested: exiting"); /* Stop the service */ if (java_stop() != true) return 6; if (doreload == true) ret = 123; else ret = 0; /* Destroy the service */ java_destroy(); /* Destroy the Java VM */ if (JVM_destroy(ret) != true) return 7; return ret; }