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); }
static bool field_jtoc_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; int mode; 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_jtoc_long(env, clsperm, "uid", objperm, &perm->uid)) return false; if (!field_jtoc_long(env, clsperm, "gid", objperm, &perm->gid)) return false; if (!field_jtoc_long(env, clsperm, "cuid", objperm, &perm->cuid)) return false; if (!field_jtoc_long(env, clsperm, "cgid", objperm, &perm->cgid)) return false; if (!field_jtoc_int(env, clsperm, "mode", objperm, &mode)) return false; perm->mode = mode; return true; }