diff --git a/jni/interface.c b/jni/interface.c index 853e649..e29f81f 100644 --- a/jni/interface.c +++ b/jni/interface.c @@ -1,4 +1,65 @@ +#include +#include +#include +#include -/* XXX - java-invocable function that starts listener */ /* XXX - do i need a function to generate host keys? DROPBEAR_DELAY_HOSTKEY */ /* XXX - a C-callable interface to get property strings from the java side (paths, etc) */ + +static JNIEnv *env; +static jclass cl_string; +static jclass cl_simplesshdservice; +static jfieldID fid_sss_sshd_pid; + +static int +jni_init(JNIEnv *env_) +{ + env = env_; +#define CLASS(var, id) \ + cl_##var = (*env)->FindClass(env, id); \ + if (!cl_##var) return 0; +#define METHOD(var, mycl, id, sig) \ + mid_##var = (*env)->GetMethodID(env, cl_##mycl, id, sig); \ + if (!mid_##var) return 0; +#define FIELD(var, mycl, id, sig) \ + fid_##var = (*env)->GetFieldID(env, cl_##mycl, id, sig); \ + if (!fid_##var) return 0; +#define STFIELD(var, mycl, id, sig) \ + fid_##var = (*env)->GetStaticFieldID(env, cl_##mycl, id, sig); \ + if (!fid_##var) return 0; + + CLASS(string, "java/lang/String") + CLASS(simplesshdservice, "org/galexander/sshd/SimpleSSHDService") + + FIELD(sss_sshd_pid, simplesshdservice, "sshd_pid", "I") + + return 1; +} + +JNIEXPORT void JNICALL +Java_org_galexander_sshd_SimpleSSHDService_start_1sshd(JNIEnv *env_, + jobject this) +{ + pid_t pid; + if (!jni_init(env_)) { + return; + } + pid = fork(); + if (pid == 0) { + /* XXX - call dropbear main() */ + } else { + (*env)->SetIntField(env, this, fid_sss_sshd_pid, pid); + } +} + +JNIEXPORT void JNICALL +Java_org_galexander_sshd_SimpleSSHDService_stop_1sshd(JNIEnv *env_, jobject this) +{ + pid_t pid; + if (!jni_init(env_)) { + return; + } + pid = (*env)->GetIntField(env, this, fid_sss_sshd_pid); + kill(pid, SIGKILL); + (*env)->SetIntField(env, this, fid_sss_sshd_pid, 0); +}