JNIEXPORT void JNICALL Java_jtux_UProcess_execvp(JNIEnv *env, jclass obj, jstring s, jobjectArray a) { JSTR_GET_DECL(s_c, s) const char **argv = NULL; int i, argc; jsize array_size = (*env)->GetArrayLength(env, a); jobject arg; JSTR_NULLTEST(s_c) for (argc = 0; argc < array_size && (*env)->GetObjectArrayElement(env, a, argc) != NULL; argc++) ; argv = malloc((argc + 1) * sizeof(char *)); if (argv == NULL) { (void)setup_throw_errno(env, errno); return; } for (i = 0; i < argc; i++) { arg = (*env)->GetObjectArrayElement(env, a, i); if ((*env)->ExceptionCheck(env)) { // why isn't this a check on arg == NULL? free(argv); JSTR_REL(s_c, s) return; } argv[i] = (*env)->GetStringUTFChars(env, arg, NULL); }
JNIEXPORT void JNICALL Java_jtux_UUtil_check_1type_1sizes(JNIEnv *env, jclass obj) { bool ok = true; /* All assumptions about suitability of Java primitive types for POSIX/SUS types must be tested here. */ if (sizeof(jlong) < sizeof(long)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(long)\n"); } if (sizeof(jlong) < sizeof(void *)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(void *)\n"); } if (sizeof(jint) < sizeof(int)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(int)\n"); } if (sizeof(jshort) < sizeof(short)) { ok = false; fprintf(stderr, "Type size error: sizeof(jshort) < sizeof(short)\n"); } if (sizeof(jlong) < sizeof(clock_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(clock_t)\n"); } if (sizeof(jlong) < sizeof(gid_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(gid_t)\n"); } if (sizeof(jlong) < sizeof(pid_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(pid_t)\n"); } if (sizeof(jlong) < sizeof(uid_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(uid_t)\n"); } if (sizeof(jlong) < sizeof(rlim_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(rlim_t)\n"); } if (sizeof(jlong) < sizeof(time_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(time_t)\n"); } if (sizeof(jlong) < sizeof(suseconds_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(suseconds_t)\n"); } if (sizeof(jlong) < sizeof(useconds_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(useconds_t)\n"); } if (sizeof(jlong) < sizeof(off_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(off_t)\n"); } if (sizeof(jlong) < sizeof(fsfilcnt_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(fsfilcnt_t)\n"); } if (sizeof(jlong) < sizeof(fsblkcnt_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(fsblkcnt_t)\n"); } //if (sizeof(jint) < sizeof(size_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(size_t)\n"); //} //if (sizeof(jint) < sizeof(ssize_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(ssize_t)\n"); //} if (sizeof(jint) < sizeof(mode_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jint) < sizeof(mode_t)\n"); } if (sizeof(jint) < sizeof(int)) { ok = false; fprintf(stderr, "Type size error: sizeof(jint) < sizeof(int)\n"); } //if (sizeof(jint) < sizeof(ino_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(ino_t)\n"); //} //if (sizeof(jint) < sizeof(nlink_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(nlink_t)\n"); //} //if (sizeof(jint) < sizeof(blksize_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(blksize_t)\n"); //} if (sizeof(jlong) < sizeof(blkcnt_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(blkcnt_t)\n"); } //if (sizeof(jint) < sizeof(nfds_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(nfds_t)\n"); //} if (sizeof(jlong) < sizeof(key_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(key_t)\n"); } //if (sizeof(jint) < sizeof(msgqnum_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(msgqnum_t)\n"); //} //if (sizeof(jint) < sizeof(msglen_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(jint) < sizeof(msglen_t)\n"); //} if (sizeof(jlong) < sizeof(mqd_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jlong) < sizeof(mqd_t)\n"); } if (sizeof(jint) < sizeof(socklen_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jint) < sizeof(socklen_t)\n"); } if (sizeof(jint) < sizeof(sa_family_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jint) < sizeof(sa_family_t)\n"); } if (sizeof(jshort) < sizeof(in_port_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jshort) < sizeof(in_port_t)\n"); } if (sizeof(jint) < sizeof(in_addr_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(jint) < sizeof(in_addr_t)\n"); } /* Assuming C ints (not only jints) are at least 32-bits, because of the int argument to field_ctoj_int. */ if (sizeof(int) < sizeof(in_addr_t)) { ok = false; fprintf(stderr, "Type size error: sizeof(int) < sizeof(in_addr_t)\n"); } //if (sizeof(int) < sizeof(ino_t)) { // ok = false; // fprintf(stderr, "Type size error: sizeof(int) < sizeof(ino_t)\n"); //} if (!ok) setup_throw_errno(env, ENOSYS); }