Exemplo n.º 1
0
JNIEXPORT void JNICALL Java_jtux_UClock_nanosleep(JNIEnv *env, jclass obj,
        jobject nsecs, jobject remain)
{
    jclass cls_timespec = (*env)->FindClass(env, "jtux/UProcess$s_timespec");
    struct timespec nsecs_c, remain_buf, *remain_c = &remain_buf;
    int r;
    long sec;

    if (remain == NULL)
        remain_c = NULL;
    if (!field_jtoc_long(env, cls_timespec, "tv_sec", nsecs, &sec))
        return;
    nsecs_c.tv_sec = (time_t)sec;
    if (!field_jtoc_long(env, cls_timespec, "tv_nsec", nsecs, &nsecs_c.tv_nsec))
        return;
    r = nanosleep(&nsecs_c, remain_c);
    if (r != 0 && remain_c != NULL) {
        if (!field_ctoj_long(env, cls_timespec, "tv_sec", remain, remain_c->tv_sec))
            return;
        if (!field_ctoj_long(env, cls_timespec, "tv_nsec", remain, remain_c->tv_nsec))
            return;
    }
    if (r == -1)
        JTHROW_neg1(-1);
}
Exemplo n.º 2
0
static bool field_ctoj_perm(JNIEnv *env, jclass cls, const char *field, jobject obj,
  struct ipc_perm *perm)
{
	jfieldID fid;
	jclass clsperm = (*env)->FindClass(env, "jtux/USysVIPC$s_ipc_perm");
	jobject objperm;

	if (cls == NULL || clsperm == NULL)
		return false;
	if ((fid = (*env)->GetFieldID(env, cls, field, "Ljtux/USysVIPC$s_ipc_perm;")) == NULL)
		return false;
	if ((objperm = (*env)->GetObjectField(env, obj, fid)) == NULL) {
		JNU_ThrowByName(env, "NullPointerException", "s_ipc_perm field not initialized");
		return false;
	}
	if (!field_ctoj_long(env, clsperm, "uid", objperm, perm->uid))
		return false;
	if (!field_ctoj_long(env, clsperm, "gid", objperm, perm->gid))
		return false;
	if (!field_ctoj_long(env, clsperm, "cuid", objperm, perm->cuid))
		return false;
	if (!field_ctoj_long(env, clsperm, "cgid", objperm, perm->cgid))
		return false;
	if (!field_ctoj_int(env, clsperm, "mode", objperm, perm->mode))
		return false;
	return true;
}
Exemplo n.º 3
0
JNIEXPORT void JNICALL Java_jtux_USysVIPC_shmctl(JNIEnv *env, jclass obj,
  jint shmid, jint cmd, jobject data)
{
	struct shmid_ds data_c;
	jclass cls = (*env)->FindClass(env, "jtux/USysVIPC$s_shmid_ds");
	int r;

	memset(&data_c, 0, sizeof(data_c));
	if (cmd == IPC_SET) {
		if (!field_jtoc_perm(env, cls, "shm_perm", data, &data_c.shm_perm))
			return;
	}
	JTHROW_neg1(r = shmctl(shmid, cmd, &data_c))
	if (r == -1)
		return;
	if (cmd == IPC_STAT) {
		if (!field_ctoj_perm(env, cls, "shm_perm", data, &data_c.shm_perm))
			return;
		if (!field_ctoj_int(env, cls, "shm_segsz", data, data_c.shm_segsz))
			return;
		if (!field_ctoj_long(env, cls, "shm_lpid", data, data_c.shm_lpid))
			return;
		if (!field_ctoj_long(env, cls, "shm_cpid", data, data_c.shm_cpid))
			return;
		if (!field_ctoj_int(env, cls, "shm_nattch", data, data_c.shm_nattch))
			return;
		if (!field_ctoj_long(env, cls, "shm_atime", data, data_c.shm_atime))
			return;
		if (!field_ctoj_long(env, cls, "shm_dtime", data, data_c.shm_dtime))
			return;
		if (!field_ctoj_long(env, cls, "shm_ctime", data, data_c.shm_ctime))
			return;
	}
}
Exemplo n.º 4
0
JNIEXPORT void JNICALL Java_jtux_USysVIPC_msgctl(JNIEnv *env, jclass obj,
  jint msqid, jint cmd, jobject data)
{
	struct msqid_ds data_c;
	jclass cls = (*env)->FindClass(env, "jtux/USysVIPC$s_msqid_ds");
	int n, r;

	memset(&data_c, 0, sizeof(data_c));
	if (cmd == IPC_SET) {
		if (!field_jtoc_perm(env, cls, "msg_perm", data, &data_c.msg_perm))
			return;
		if (!field_jtoc_int(env, cls, "msg_qbytes", data, &n))
			return;
		data_c.msg_qbytes = n;
	}
	JTHROW_neg1(r = msgctl(msqid, cmd, &data_c))
	if (r == -1)
		return;
	if (cmd == IPC_STAT) {
		if (!field_ctoj_perm(env, cls, "msg_perm", data, &data_c.msg_perm))
			return;
		if (!field_ctoj_int(env, cls, "msg_qnum", data, data_c.msg_qnum))
			return;
		if (!field_ctoj_int(env, cls, "msg_qbytes", data, data_c.msg_qbytes))
			return;
		if (!field_ctoj_long(env, cls, "msg_lspid", data, data_c.msg_lspid))
			return;
		if (!field_ctoj_long(env, cls, "msg_lrpid", data, data_c.msg_lrpid))
			return;
		if (!field_ctoj_long(env, cls, "msg_stime", data, data_c.msg_stime))
			return;
		if (!field_ctoj_long(env, cls, "msg_rtime", data, data_c.msg_rtime))
			return;
		if (!field_ctoj_long(env, cls, "msg_ctime", data, data_c.msg_ctime))
			return;
	}
}
Exemplo n.º 5
0
JNIEXPORT jint JNICALL Java_jtux_USysVIPC_semctl(JNIEnv *env, jclass obj,
  jint semid, jint semnum, jint cmd, jobject arg)
{
	struct semid_ds data_c;
	jclass cls_s_semid_ds = (*env)->FindClass(env, "jtux/USysVIPC$s_semid_ds");
	jclass cls_u_semun_int = (*env)->FindClass(env, "jtux/USysVIPC$u_semun_int");
	jclass cls_u_semun_struct = (*env)->FindClass(env, "jtux/USysVIPC$u_semun_struct");
	jclass cls_u_semun_array = (*env)->FindClass(env, "jtux/USysVIPC$u_semun_array");
	jfieldID fid;
	jobject objds;
	jshortArray array;
	int r;
	union semun {
		int val;
		struct semid_ds *buf;
		unsigned short *array;
	} arg_c;

	memset(&data_c, 0, sizeof(data_c));
	switch (cmd) {
	case IPC_SET:
		if (cls_u_semun_struct == NULL)
			return -1;
		if ((fid = (*env)->GetFieldID(env, cls_u_semun_struct, "buf", "Ljtux/USysVIPC$s_semid_ds;")) == NULL)
			return -1;
		if ((objds = (*env)->GetObjectField(env, arg, fid)) == NULL) {
			JNU_ThrowByName(env, "NullPointerException", "buf field not initialized");
			return -1;
		}
		if (!field_jtoc_perm(env, cls_s_semid_ds, "sem_perm", objds, &data_c.sem_perm))
			return -1;
		/* fall through */
	case IPC_STAT:
		arg_c.buf = &data_c;
		break;
	case SETVAL:
		if (!field_jtoc_int(env, cls_u_semun_int, "val", arg, &arg_c.val))
			return -1;
		break;
	case SETALL:
	case GETALL:
		arg_c.buf = &data_c;
		JTHROW_neg1(r = semctl(semid, 0, IPC_STAT, arg_c))
		if (r == -1)
			return -1;
		if (cls_u_semun_array == NULL)
			return -1;
		if ((fid = (*env)->GetFieldID(env, cls_u_semun_array, "array", "[S")) == NULL)
			return -1;
		if ((array = (*env)->GetObjectField(env, arg, fid)) == NULL) {
			JNU_ThrowByName(env, "NullPointerException", "array field not initialized");
			return -1;
		}
		if ((arg_c.array = (*env)->GetShortArrayElements(env, array, NULL)) == NULL)
			return -1;
	}
	JTHROW_neg1(r = semctl(semid, semnum, cmd, arg_c))
	if (r == -1)
		return r;
	switch (cmd) {
	case IPC_STAT:
		if (cls_u_semun_struct == NULL)
			return -1;
		if ((fid = (*env)->GetFieldID(env, cls_u_semun_struct, "buf", "Ljtux/USysVIPC$s_semid_ds;")) == NULL)
			return -1;
		if ((objds = (*env)->GetObjectField(env, arg, fid)) == NULL) {
			JNU_ThrowByName(env, "NullPointerException", "s_semid_ds field not initialized");
			return -1;
		}
		if (!field_ctoj_perm(env, cls_s_semid_ds, "sem_perm", objds, &data_c.sem_perm))
			return -1;
		if (!field_ctoj_short(env, cls_s_semid_ds, "sem_nsems", objds, data_c.sem_nsems))
			return -1;
		if (!field_ctoj_long(env, cls_s_semid_ds, "sem_otime", objds, data_c.sem_otime))
			return -1;
		if (!field_ctoj_long(env, cls_s_semid_ds, "sem_ctime", objds, data_c.sem_ctime))
			return -1;
		break;
	case SETALL:
		(*env)->ReleaseShortArrayElements(env, array, arg_c.array, JNI_ABORT);
		break;
	case GETALL:
		(*env)->ReleaseShortArrayElements(env, array, arg_c.array, 0);
	}
	return r;
}