Initial commit pushing project source

This commit is contained in:
eneller
2020-07-18 20:10:15 +02:00
parent 9b60b8ec0f
commit 1fb60aaa0d
14 changed files with 1206 additions and 0 deletions

138
cTools/KernelWrapper.c Normal file
View File

@@ -0,0 +1,138 @@
#include <jni.h>
#include "KernelWrapper.h"
#include <stdio.h>
#include <stdlib.h> // calloc
#include <unistd.h> // _exit, fork, lseek, read, write, close, dup2
#include <fcntl.h> // open
#include <sys/types.h> // waitpid, opendir, closedir, open, lseek
#include <sys/wait.h> // waitpid
#include <sys/stat.h> // open
#include <dirent.h> // opendir, readdir, closedir
#include <errno.h>
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_exit(JNIEnv *env, jclass clazz, jint rc) {
_exit(rc);
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_fork(JNIEnv *env, jclass clazz) {
pid_t pid;
if ( (pid = fork()) == -1) { perror("KernelWrapper fork"); }
return pid;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_waitpid(JNIEnv *env, jclass clazz, jint pid, jintArray status, jint options) {
int *stat = (*env)->GetIntArrayElements(env, status, 0);
pid_t p = waitpid(pid, stat, options);
if (p==-1) perror("KernelWrapper waitpid");
(*env)->ReleaseIntArrayElements(env, status, stat, 0);
return p;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_execv( JNIEnv *env, jclass clazz, jstring path, jobjectArray argv ) {
const char *c_path = (*env)->GetStringUTFChars(env, path, 0);
char **c_argv = calloc(sizeof(char*), (*env)->GetArrayLength(env, argv)+2);
for (int i = 0; i < (*env)->GetArrayLength(env, argv); i++)
c_argv[i] = (char*)(*env)->GetStringUTFChars(env, (*env)->GetObjectArrayElement(env, argv, i), 0);
if (execv(c_path, (char *const*)c_argv) == -1) { perror("KernelWrapper execv"); return -1; }
fprintf(stderr, "\nHow did you get here?!?\n"); exit(1);
}
JNIEXPORT jobjectArray JNICALL Java_cTools_KernelWrapper_readdir(JNIEnv *env, jclass clazz, jstring path) {
DIR *dp;
struct dirent *ep;
const char *c_path = (*env)->GetStringUTFChars(env, path, 0);
if ( ! (dp = opendir(c_path)) ) { perror("KernelWrapper opendir"); return 0; }
int size = -1;
do {
size++;
errno = 0;
ep = readdir(dp);
if (errno) { perror("KernelWrapper readdir"); return 0; }
} while (ep);
rewinddir(dp);
jobjectArray array = (*env)->NewObjectArray(env, size, (*env)->FindClass(env, "java/lang/String"), 0);
for (int i = 0; ep = readdir(dp); i++)
(*env)->SetObjectArrayElement(env, array, i, (*env)->NewStringUTF(env, ep->d_name));
closedir(dp);
(*env)->ReleaseStringUTFChars(env, path, c_path);
return array;
}
JNIEXPORT jstring JNICALL Java_cTools_KernelWrapper_get_1current_1dir_1name(JNIEnv *env, jclass clazz) {
char *xxx=get_current_dir_name();
return (*env)->NewStringUTF(env, xxx);
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_open( JNIEnv *env, jclass clazz, jstring path, jint flags ) {
const char *c_path = (*env)->GetStringUTFChars(env, path, 0);
int file;
if ( (file = open(c_path, flags, 0666)) == -1) { perror("KernelWrapper open"); }
(*env)->ReleaseStringUTFChars(env, path, c_path);
return file;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_close( JNIEnv *env, jclass clazz, jint fd ) {
int err;
if ( (err = close(fd)) == -1) { perror("KernelWrapper close"); }
return err;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_lseek( JNIEnv *env, jclass clazz, jint fd, jint offset, jint whence ) {
int bytes;
if ( (bytes = lseek(fd, offset, whence)) == -1) { perror("KernelWrapper lseek"); exit(1); }
return bytes;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_read( JNIEnv *env, jclass clazz, jint fd, jbyteArray buf, jint count ) {
unsigned char *c_buf = (*env)->GetByteArrayElements(env, buf, 0);
int bytes;
if ( (bytes = read(fd, c_buf, count)) == -1) { perror("KernelWrapper read"); exit(1); }
(*env)->ReleaseByteArrayElements(env, buf, c_buf, 0);
return bytes;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_readOffset( JNIEnv *env, jclass clazz, jint fd, jbyteArray buf, jint offset, jint count ) {
unsigned char *c_buf = (*env)->GetByteArrayElements(env, buf, 0);
int bytes;
if ( (bytes = read(fd, c_buf+offset, count)) == -1) { perror("KernelWrapper read"); }
(*env)->ReleaseByteArrayElements(env, buf, c_buf, 0);
return bytes;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_write( JNIEnv *env, jclass clazz, jint fd, jbyteArray buf, jint count ) {
unsigned char *c_buf = (*env)->GetByteArrayElements(env, buf, 0);
int bytes;
if ( (bytes = write(fd, c_buf, count)) == -1) { perror("KernelWrapper write"); }
if (bytes != count) { fprintf(stderr, "Could not write everything!\nThis should not happen!\n"); }
(*env)->ReleaseByteArrayElements(env, buf, c_buf, 0);
return bytes;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_writeOffset( JNIEnv *env, jclass clazz, jint fd, jbyteArray buf, jint offset, jint count ) {
unsigned char *c_buf = (*env)->GetByteArrayElements(env, buf, 0);
int bytes;
if ( (bytes = write(fd, c_buf+offset, count)) == -1) { perror("KernelWrapper write"); }
if (bytes != count) { fprintf(stderr, "Could not write everything!\nThis should not happen!\n"); }
(*env)->ReleaseByteArrayElements(env, buf, c_buf, 0);
return bytes;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_dup2( JNIEnv *env, jclass clazz, jint oldfd, jint newfd ) {
int fd;
if ( (fd = dup2(oldfd, newfd)) == -1) perror("KernelWrapper dup2");
return fd;
}
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_pipe( JNIEnv *env, jclass clazz, jintArray pipefd ) {
int *ary = (*env)->GetIntArrayElements(env, pipefd, 0);
int rc = pipe(ary);
if (rc==-1) { perror("KernelWrapper pipe"); }
(*env)->ReleaseIntArrayElements(env, pipefd, ary, 0);
return rc;
}

BIN
cTools/KernelWrapper.class Normal file

Binary file not shown.

133
cTools/KernelWrapper.h Normal file
View File

@@ -0,0 +1,133 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cTools_KernelWrapper */
#ifndef _Included_cTools_KernelWrapper
#define _Included_cTools_KernelWrapper
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: cTools_KernelWrapper
* Method: exit
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_exit
(JNIEnv *, jclass, jint);
/*
* Class: cTools_KernelWrapper
* Method: fork
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_fork
(JNIEnv *, jclass);
/*
* Class: cTools_KernelWrapper
* Method: waitpid
* Signature: (I[II)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_waitpid
(JNIEnv *, jclass, jint, jintArray, jint);
/*
* Class: cTools_KernelWrapper
* Method: execv
* Signature: (Ljava/lang/String;[Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_execv
(JNIEnv *, jclass, jstring, jobjectArray);
/*
* Class: cTools_KernelWrapper
* Method: get_current_dir_name
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_cTools_KernelWrapper_get_1current_1dir_1name
(JNIEnv *, jclass);
/*
* Class: cTools_KernelWrapper
* Method: open
* Signature: (Ljava/lang/String;I)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_open
(JNIEnv *, jclass, jstring, jint);
/*
* Class: cTools_KernelWrapper
* Method: close
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_close
(JNIEnv *, jclass, jint);
/*
* Class: cTools_KernelWrapper
* Method: lseek
* Signature: (III)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_lseek
(JNIEnv *, jclass, jint, jint, jint);
/*
* Class: cTools_KernelWrapper
* Method: read
* Signature: (I[BI)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_read
(JNIEnv *, jclass, jint, jbyteArray, jint);
/*
* Class: cTools_KernelWrapper
* Method: readOffset
* Signature: (I[BII)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_readOffset
(JNIEnv *, jclass, jint, jbyteArray, jint, jint);
/*
* Class: cTools_KernelWrapper
* Method: write
* Signature: (I[BI)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_write
(JNIEnv *, jclass, jint, jbyteArray, jint);
/*
* Class: cTools_KernelWrapper
* Method: writeOffset
* Signature: (I[BII)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_writeOffset
(JNIEnv *, jclass, jint, jbyteArray, jint, jint);
/*
* Class: cTools_KernelWrapper
* Method: pipe
* Signature: ([I)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_pipe
(JNIEnv *, jclass, jintArray);
/*
* Class: cTools_KernelWrapper
* Method: readdir
* Signature: (Ljava/lang/String;)[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL Java_cTools_KernelWrapper_readdir
(JNIEnv *, jclass, jstring);
/*
* Class: cTools_KernelWrapper
* Method: dup2
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_cTools_KernelWrapper_dup2
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif

38
cTools/KernelWrapper.java Normal file
View File

@@ -0,0 +1,38 @@
package cTools;
public class KernelWrapper {
static {
//System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("KernelWrapper"); // actually: libKernelWrapper.so
}
public static int O_RDONLY = 0;
public static int O_WRONLY = 1;
public static int O_RDWR = 2;
public static int O_CREAT = 64;
public static int O_TRUNC = 512;
public static int SEEK_SET = 0;
public static int SEEK_CUR = 1;
public static int SEEK_END = 2;
public static int STDIN_FILENO = 0;
public static int STDOUT_FILENO = 1;
public static int STDERR_FILENO = 2;
public static native int exit(int rc);
public static native int fork();
public static native int waitpid(int pid, int[] status, int options);
public static native int execv(String path, String[] argv);
//public static native String get_current_dir_name();
public static native int open(String path, int flags);
public static native int close(int fd);
public static native int lseek(int fd, int offset, int whence);
public static native int read(int fd, byte[] buf, int count);
public static native int readOffset(int fd, byte[] buf, int offset, int count);
public static native int write(int fd, byte[] buf, int count);
public static native int writeOffset(int fd, byte[] buf, int offset, int count);
public static native int pipe(int[] pipefd);
public static native String[] readdir(String path);
public static native int dup2(int oldfd, int newfd);
}

8
cTools/Makefile Normal file
View File

@@ -0,0 +1,8 @@
KernelWrapper:
javac KernelWrapper.java
(cd ..; javah -o cTools/KernelWrapper.h cTools.KernelWrapper)
gcc -std=c99 -shared -fpic -I /opt/jdk/include -I /opt/jdk/include/linux -o libKernelWrapper.so KernelWrapper.c
#gcc -std=c99 -shared -fpic -I /usr/lib/jvm/java-7-openjdk-amd64/include -I /usr/lib/jvm/java-7-openjdk-amd64/include/linux -o libKernelWrapper.so KernelWrapper.c
clean:
/bin/rm -f *.class KernelWrapper.h libKernelWrapper.so

BIN
cTools/libKernelWrapper.so Normal file

Binary file not shown.