diff --git a/Makefile b/Makefile
index eaf93d0..b4dc5a0 100755
--- a/Makefile
+++ b/Makefile
@@ -2,10 +2,10 @@
 CFLAGS = -c -DLINUX -fPIC -I/usr/local/j2sdk/include/ -I/usr/local/j2sdk/include/linux -Wimplicit -Wstrict-prototypes -Wall -Wno-unknown-pragmas -Iinclude
 BINDIR=/usr/local/bin
 
-OBJFILES=jtux_clock.o jtux_file.o jtux_posixipc.o jtux_sysvipc.o jtux_dir.o jtux_network.o jtux_process.o jtux_util.o
+OBJFILES=jtux_clock.o jtux_file.o jtux_sysvipc.o jtux_dir.o jtux_network.o jtux_process.o jtux_util.o
 
 libjtux.so: $(OBJFILES)
-	$(CC) -shared -W1 -lrt -lnsl -o libjtux.so $(OBJFILES)
+	$(CC) -shared -W1 -lnsl -o libjtux.so $(OBJFILES)
 
 clean:
 	rm -f *.o libjtux.so *.c~ *.h~ *.class
diff --git a/jtux_mq.c b/jtux_mq.c
new file mode 100755
index 0000000..3163bc9
--- /dev/null
+++ b/jtux_mq.c
@@ -0,0 +1,256 @@
+/*
+	Copyright 2003 by Marc J. Rochkind. All rights reserved.
+	May be copied only for purposes and under conditions described
+	on the Web page www.basepath.com/aup/copyright.htm.
+
+	The Example Files are provided "as is," without any warranty;
+	without even the implied warranty of merchantability or fitness
+	for a particular purpose. The author and his publisher are not
+	responsible for any damages, direct or incidental, resulting
+	from the use or non-use of these Example Files.
+
+	The Example Files may contain defects, and some contain deliberate
+	coding mistakes that were included for educational reasons.
+	You are responsible for determining if and how the Example Files
+	are to be used.
+
+*/
+
+#include "defs.h"
+#include <mqueue.h>
+
+JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1close(JNIEnv *env, jclass obj,
+  jlong mqd)
+{
+	JTHROW_neg1(mq_close((mqd_t)(intptr_t)mqd))
+}
+
+JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1getattr(JNIEnv *env, jclass obj,
+  jlong mqd, jobject attr)
+{
+	jclass cls = (*env)->FindClass(env, "jtux/UPosixIPC$s_mq_attr");
+	struct mq_attr attr_c;
+	int r;
+
+	JTHROW_neg1(r = mq_getattr((mqd_t)(intptr_t)mqd, &attr_c))
+	if (r != -1) {
+		if (!field_ctoj_long(env, cls, "mq_flags", attr, attr_c.mq_flags))
+			return;
+		if (!field_ctoj_long(env, cls, "mq_maxmsg", attr, attr_c.mq_maxmsg))
+			return;
+		if (!field_ctoj_long(env, cls, "mq_msgsize", attr, attr_c.mq_msgsize))
+			return;
+		if (!field_ctoj_long(env, cls, "mq_curmsgs", attr, attr_c.mq_curmsgs))
+			return;
+	}
+}
+
+JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1notify(JNIEnv *env, jclass obj,
+  jlong mqd, jobject ep)
+{
+	jclass cls = (*env)->FindClass(env, "jtux/UProcess$s_sigevent");
+	jclass cls_u_sigval_int = (*env)->FindClass(env, "jtux/UProcess$u_sigval_int");
+	jclass cls_u_sigval_ptr = (*env)->FindClass(env, "jtux/UProcess$u_sigval_ptr");
+	jfieldID fid;
+	jobject sigev_value;
+	struct sigevent sigevent_buf, *ep_c = &sigevent_buf;
+	long sival_ptr;
+
+	if (ep == NULL)
+		ep_c = NULL;
+	else {
+		if (!field_jtoc_int(env, cls, "sigev_notify", ep, &ep_c->sigev_notify))
+			return;
+		if (!field_jtoc_int(env, cls, "sigev_signo", ep, &ep_c->sigev_signo))
+			return;
+		if ((fid = (*env)->GetFieldID(env, cls, "sigev_value", "Ljtux/UProcess$u_sigval;")) == NULL)
+			return;
+		if ((sigev_value = (*env)->GetObjectField(env, ep, fid)) == NULL) {
+			JNU_ThrowByName(env, "NullPointerException", "sigev_value field not initialized");
+			return;
+		}
+		if ((*env)->IsInstanceOf(env, sigev_value, cls_u_sigval_int)) {
+			if (!field_jtoc_int(env, cls_u_sigval_int, "sival_int", sigev_value,
+			  &ep_c->sigev_value.sival_int))
+				return;
+		}
+		else if ((*env)->IsInstanceOf(env, sigev_value, cls_u_sigval_ptr)) {
+			if (!field_jtoc_long(env, cls_u_sigval_ptr, "sival_ptr", sigev_value,
+			  &sival_ptr))
+				return;
+			ep_c->sigev_value.sival_ptr = (void *)(intptr_t)sival_ptr;
+		}
+		else {
+			(void)setup_throw_errno(env, EINVAL);
+			return;
+		}
+	}
+	JTHROW_neg1(mq_notify((mqd_t)(intptr_t)mqd, ep_c))
+}
+
+JNIEXPORT jlong JNICALL Java_jtux_UPosixIPC_mq_1open__Ljava_lang_String_2I(JNIEnv *env, jclass obj,
+  jstring name, jint flags)
+{
+	JSTR_GET_DECL(name_c, name)
+	mqd_t mqd;
+
+	JSTR_NULLTEST_V(name_c, -1)
+	JTHROW_neg1(mqd = mq_open(name_c, flags))
+	JSTR_REL(name_c, name)
+	return (intptr_t)mqd;
+}
+
+JNIEXPORT jlong JNICALL Java_jtux_UPosixIPC_mq_1open__Ljava_lang_String_2IILjtux_UPosixIPC_00024s_1mq_1attr_2(JNIEnv *env, jclass obj,
+  jstring name, jint flags, jint perms, jobject attr)
+{
+	JSTR_GET_DECL(name_c, name)
+	mqd_t mqd;
+	struct mq_attr attr_c_buf, *attr_c = &attr_c_buf;
+	jclass cls = (*env)->FindClass(env, "jtux/UPosixIPC$s_mq_attr");
+
+	JSTR_NULLTEST_V(name_c, -1)
+	if (attr == NULL)
+		attr_c = NULL;
+	else {
+		if (!field_jtoc_long(env, cls, "mq_flags", attr, &attr_c->mq_flags))
+			return -1;
+		if (!field_jtoc_long(env, cls, "mq_maxmsg", attr, &attr_c->mq_maxmsg))
+			return -1;
+		if (!field_jtoc_long(env, cls, "mq_msgsize", attr, &attr_c->mq_msgsize))
+			return -1;
+		if (!field_jtoc_long(env, cls, "mq_curmsgs", attr, &attr_c->mq_curmsgs))
+			return -1;
+	}
+	JTHROW_neg1(mqd = mq_open(name_c, flags, perms, attr_c))
+	JSTR_REL(name_c, name)
+	return (intptr_t)mqd;
+}
+
+JNIEXPORT jint JNICALL Java_jtux_UPosixIPC_mq_1receive(JNIEnv *env, jclass obj,
+  jlong mqd, jbyteArray msg, jint msgsize, jobject priority)
+{
+	ssize_t n;
+	void *msgp_c;
+	int priority_c;
+	jclass cls = (*env)->FindClass(env, "jtux/UUtil$IntHolder");
+
+	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
+		return -1;
+	JTHROW_neg1(n = mq_receive((mqd_t)(intptr_t)mqd, msgp_c, msgsize, &priority_c))
+	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, 0);
+	if (priority != NULL && n != -1) {
+		if (!field_ctoj_int(env, cls, "value", priority, priority_c))
+			return -1;
+	}
+	return n;
+}
+
+JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1send(JNIEnv *env, jclass obj,
+  jlong mqd, jbyteArray msg, jint msgsize, jint priority)
+{
+	void *msgp_c;
+
+	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
+		return;
+	JTHROW_neg1(mq_send((mqd_t)(intptr_t)mqd, msgp_c, msgsize, priority))
+	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, JNI_ABORT);
+}
+
+JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1setattr(JNIEnv *env, jclass obj,
+  jlong mqd, jobject attr, jobject oattr)
+{
+	jclass cls = (*env)->FindClass(env, "jtux/UPosixIPC$s_mq_attr");
+	struct mq_attr attr_c, oattr_buf, *oattr_c = &oattr_buf;
+	int r;
+
+	if (oattr == NULL)
+		oattr_c = NULL;
+	if (!field_jtoc_long(env, cls, "mq_flags", attr, &attr_c.mq_flags))
+		return;
+	if (!field_jtoc_long(env, cls, "mq_maxmsg", attr, &attr_c.mq_maxmsg))
+		return;
+	if (!field_jtoc_long(env, cls, "mq_msgsize", attr, &attr_c.mq_msgsize))
+		return;
+	if (!field_jtoc_long(env, cls, "mq_curmsgs", attr, &attr_c.mq_curmsgs))
+		return;
+	JTHROW_neg1(r = mq_setattr((mqd_t)(intptr_t)mqd, &attr_c, oattr_c))
+	if (oattr != NULL && r != -1) {
+		if (!field_ctoj_long(env, cls, "mq_flags", oattr, oattr_c->mq_flags))
+			return;
+		if (!field_ctoj_long(env, cls, "mq_maxmsg", oattr, oattr_c->mq_maxmsg))
+			return;
+		if (!field_ctoj_long(env, cls, "mq_msgsize", oattr, oattr_c->mq_msgsize))
+			return;
+		if (!field_ctoj_long(env, cls, "mq_curmsgs", oattr, oattr_c->mq_curmsgs))
+			return;
+	}
+}
+
+JNIEXPORT jint JNICALL Java_jtux_UPosixIPC_mq_1timedreceive(JNIEnv *env, jclass obj,
+  jlong mqd, jbyteArray msg, jint msgsize, jobject priority, jobject tmout)
+{
+#if _XOPEN_VERSION >= 600
+// Following compiled but not tested
+	ssize_t n;
+	void *msgp_c;
+	int priority_c;
+	jclass cls_IntHolder = (*env)->FindClass(env, "jtux/UUtil$IntHolder");
+	jclass cls_timespec = (*env)->FindClass(env, "jtux/UProcess$s_timespec");
+	struct timespec tmout_c;
+	long sec;
+
+	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
+		return -1;
+	if (!field_jtoc_long(env, cls_timespec, "tv_sec", tmout, &sec))
+		return -1;
+	tmout_c.tv_sec = (time_t)sec;
+	if (!field_jtoc_long(env, cls_timespec, "tv_nsec", tmout, &tmout_c.tv_nsec))
+		return -1;
+	JTHROW_neg1(n = mq_timedreceive((mqd_t)(intptr_t)mqd, msgp_c, msgsize, &priority_c,
+	  &tmout_c))
+	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, 0);
+	if (priority != NULL && n != -1) {
+		if (!field_ctoj_int(env, cls_IntHolder, "value", priority, priority_c))
+			return -1;
+	}
+	return n;
+#else
+	(void)setup_throw_errno(env, ENOSYS);
+	return -1;
+#endif
+}
+
+JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1timedsend(JNIEnv *env, jclass obj,
+  jlong mqd, jbyteArray msg, jint msgsize, jint priority, jobject tmout)
+{
+#if _XOPEN_VERSION >= 600
+// Following compiled but not tested
+	void *msgp_c;
+	jclass cls_timespec = (*env)->FindClass(env, "jtux/UProcess$s_timespec");
+	struct timespec tmout_c;
+	long sec;
+
+	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
+		return;
+	if (!field_jtoc_long(env, cls_timespec, "tv_sec", tmout, &sec))
+		return;
+	tmout_c.tv_sec = (time_t)sec;
+	if (!field_jtoc_long(env, cls_timespec, "tv_nsec", tmout, &tmout_c.tv_nsec))
+		return;
+	JTHROW_neg1(mq_timedsend((mqd_t)(intptr_t)mqd, msgp_c, msgsize, priority,
+	  &tmout_c))
+	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, JNI_ABORT);
+#else
+	(void)setup_throw_errno(env, ENOSYS);
+#endif
+}
+
+JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1unlink(JNIEnv *env, jclass obj,
+  jstring name)
+{
+	JSTR_GET_DECL(name_c, name)
+
+	JSTR_NULLTEST(name_c)
+	JTHROW_neg1(mq_unlink(name_c))
+	JSTR_REL(name_c, name)
+}
diff --git a/jtux_posixipc.c b/jtux_posixipc.c
index 008b570..c027c84 100755
--- a/jtux_posixipc.c
+++ b/jtux_posixipc.c
@@ -17,7 +17,6 @@
 */
 
 #include "defs.h"
-#include <mqueue.h>
 #include <semaphore.h>
 #include <sys/mman.h>
 #include "JtuxPosixIPC.h" // generated by javah
@@ -34,241 +33,6 @@
 	return (intptr_t)p;
 }
 
-JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1close(JNIEnv *env, jclass obj,
-  jlong mqd)
-{
-	JTHROW_neg1(mq_close((mqd_t)(intptr_t)mqd))
-}
-
-JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1getattr(JNIEnv *env, jclass obj,
-  jlong mqd, jobject attr)
-{
-	jclass cls = (*env)->FindClass(env, "jtux/UPosixIPC$s_mq_attr");
-	struct mq_attr attr_c;
-	int r;
-
-	JTHROW_neg1(r = mq_getattr((mqd_t)(intptr_t)mqd, &attr_c))
-	if (r != -1) {
-		if (!field_ctoj_long(env, cls, "mq_flags", attr, attr_c.mq_flags))
-			return;
-		if (!field_ctoj_long(env, cls, "mq_maxmsg", attr, attr_c.mq_maxmsg))
-			return;
-		if (!field_ctoj_long(env, cls, "mq_msgsize", attr, attr_c.mq_msgsize))
-			return;
-		if (!field_ctoj_long(env, cls, "mq_curmsgs", attr, attr_c.mq_curmsgs))
-			return;
-	}
-}
-
-JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1notify(JNIEnv *env, jclass obj,
-  jlong mqd, jobject ep)
-{
-	jclass cls = (*env)->FindClass(env, "jtux/UProcess$s_sigevent");
-	jclass cls_u_sigval_int = (*env)->FindClass(env, "jtux/UProcess$u_sigval_int");
-	jclass cls_u_sigval_ptr = (*env)->FindClass(env, "jtux/UProcess$u_sigval_ptr");
-	jfieldID fid;
-	jobject sigev_value;
-	struct sigevent sigevent_buf, *ep_c = &sigevent_buf;
-	long sival_ptr;
-
-	if (ep == NULL)
-		ep_c = NULL;
-	else {
-		if (!field_jtoc_int(env, cls, "sigev_notify", ep, &ep_c->sigev_notify))
-			return;
-		if (!field_jtoc_int(env, cls, "sigev_signo", ep, &ep_c->sigev_signo))
-			return;
-		if ((fid = (*env)->GetFieldID(env, cls, "sigev_value", "Ljtux/UProcess$u_sigval;")) == NULL)
-			return;
-		if ((sigev_value = (*env)->GetObjectField(env, ep, fid)) == NULL) {
-			JNU_ThrowByName(env, "NullPointerException", "sigev_value field not initialized");
-			return;
-		}
-		if ((*env)->IsInstanceOf(env, sigev_value, cls_u_sigval_int)) {
-			if (!field_jtoc_int(env, cls_u_sigval_int, "sival_int", sigev_value,
-			  &ep_c->sigev_value.sival_int))
-				return;
-		}
-		else if ((*env)->IsInstanceOf(env, sigev_value, cls_u_sigval_ptr)) {
-			if (!field_jtoc_long(env, cls_u_sigval_ptr, "sival_ptr", sigev_value,
-			  &sival_ptr))
-				return;
-			ep_c->sigev_value.sival_ptr = (void *)(intptr_t)sival_ptr;
-		}
-		else {
-			(void)setup_throw_errno(env, EINVAL);
-			return;
-		}
-	}
-	JTHROW_neg1(mq_notify((mqd_t)(intptr_t)mqd, ep_c))
-}
-
-JNIEXPORT jlong JNICALL Java_jtux_UPosixIPC_mq_1open__Ljava_lang_String_2I(JNIEnv *env, jclass obj,
-  jstring name, jint flags)
-{
-	JSTR_GET_DECL(name_c, name)
-	mqd_t mqd;
-
-	JSTR_NULLTEST_V(name_c, -1)
-	JTHROW_neg1(mqd = mq_open(name_c, flags))
-	JSTR_REL(name_c, name)
-	return (intptr_t)mqd;
-}
-
-JNIEXPORT jlong JNICALL Java_jtux_UPosixIPC_mq_1open__Ljava_lang_String_2IILjtux_UPosixIPC_00024s_1mq_1attr_2(JNIEnv *env, jclass obj,
-  jstring name, jint flags, jint perms, jobject attr)
-{
-	JSTR_GET_DECL(name_c, name)
-	mqd_t mqd;
-	struct mq_attr attr_c_buf, *attr_c = &attr_c_buf;
-	jclass cls = (*env)->FindClass(env, "jtux/UPosixIPC$s_mq_attr");
-
-	JSTR_NULLTEST_V(name_c, -1)
-	if (attr == NULL)
-		attr_c = NULL;
-	else {
-		if (!field_jtoc_long(env, cls, "mq_flags", attr, &attr_c->mq_flags))
-			return -1;
-		if (!field_jtoc_long(env, cls, "mq_maxmsg", attr, &attr_c->mq_maxmsg))
-			return -1;
-		if (!field_jtoc_long(env, cls, "mq_msgsize", attr, &attr_c->mq_msgsize))
-			return -1;
-		if (!field_jtoc_long(env, cls, "mq_curmsgs", attr, &attr_c->mq_curmsgs))
-			return -1;
-	}
-	JTHROW_neg1(mqd = mq_open(name_c, flags, perms, attr_c))
-	JSTR_REL(name_c, name)
-	return (intptr_t)mqd;
-}
-
-JNIEXPORT jint JNICALL Java_jtux_UPosixIPC_mq_1receive(JNIEnv *env, jclass obj,
-  jlong mqd, jbyteArray msg, jint msgsize, jobject priority)
-{
-	ssize_t n;
-	void *msgp_c;
-	int priority_c;
-	jclass cls = (*env)->FindClass(env, "jtux/UUtil$IntHolder");
-
-	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
-		return -1;
-	JTHROW_neg1(n = mq_receive((mqd_t)(intptr_t)mqd, msgp_c, msgsize, &priority_c))
-	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, 0);
-	if (priority != NULL && n != -1) {
-		if (!field_ctoj_int(env, cls, "value", priority, priority_c))
-			return -1;
-	}
-	return n;
-}
-
-JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1send(JNIEnv *env, jclass obj,
-  jlong mqd, jbyteArray msg, jint msgsize, jint priority)
-{
-	void *msgp_c;
-
-	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
-		return;
-	JTHROW_neg1(mq_send((mqd_t)(intptr_t)mqd, msgp_c, msgsize, priority))
-	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, JNI_ABORT);
-}
-
-JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1setattr(JNIEnv *env, jclass obj,
-  jlong mqd, jobject attr, jobject oattr)
-{
-	jclass cls = (*env)->FindClass(env, "jtux/UPosixIPC$s_mq_attr");
-	struct mq_attr attr_c, oattr_buf, *oattr_c = &oattr_buf;
-	int r;
-
-	if (oattr == NULL)
-		oattr_c = NULL;
-	if (!field_jtoc_long(env, cls, "mq_flags", attr, &attr_c.mq_flags))
-		return;
-	if (!field_jtoc_long(env, cls, "mq_maxmsg", attr, &attr_c.mq_maxmsg))
-		return;
-	if (!field_jtoc_long(env, cls, "mq_msgsize", attr, &attr_c.mq_msgsize))
-		return;
-	if (!field_jtoc_long(env, cls, "mq_curmsgs", attr, &attr_c.mq_curmsgs))
-		return;
-	JTHROW_neg1(r = mq_setattr((mqd_t)(intptr_t)mqd, &attr_c, oattr_c))
-	if (oattr != NULL && r != -1) {
-		if (!field_ctoj_long(env, cls, "mq_flags", oattr, oattr_c->mq_flags))
-			return;
-		if (!field_ctoj_long(env, cls, "mq_maxmsg", oattr, oattr_c->mq_maxmsg))
-			return;
-		if (!field_ctoj_long(env, cls, "mq_msgsize", oattr, oattr_c->mq_msgsize))
-			return;
-		if (!field_ctoj_long(env, cls, "mq_curmsgs", oattr, oattr_c->mq_curmsgs))
-			return;
-	}
-}
-
-JNIEXPORT jint JNICALL Java_jtux_UPosixIPC_mq_1timedreceive(JNIEnv *env, jclass obj,
-  jlong mqd, jbyteArray msg, jint msgsize, jobject priority, jobject tmout)
-{
-#if _XOPEN_VERSION >= 600
-// Following compiled but not tested
-	ssize_t n;
-	void *msgp_c;
-	int priority_c;
-	jclass cls_IntHolder = (*env)->FindClass(env, "jtux/UUtil$IntHolder");
-	jclass cls_timespec = (*env)->FindClass(env, "jtux/UProcess$s_timespec");
-	struct timespec tmout_c;
-	long sec;
-
-	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
-		return -1;
-	if (!field_jtoc_long(env, cls_timespec, "tv_sec", tmout, &sec))
-		return -1;
-	tmout_c.tv_sec = (time_t)sec;
-	if (!field_jtoc_long(env, cls_timespec, "tv_nsec", tmout, &tmout_c.tv_nsec))
-		return -1;
-	JTHROW_neg1(n = mq_timedreceive((mqd_t)(intptr_t)mqd, msgp_c, msgsize, &priority_c,
-	  &tmout_c))
-	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, 0);
-	if (priority != NULL && n != -1) {
-		if (!field_ctoj_int(env, cls_IntHolder, "value", priority, priority_c))
-			return -1;
-	}
-	return n;
-#else
-	(void)setup_throw_errno(env, ENOSYS);
-	return -1;
-#endif
-}
-
-JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1timedsend(JNIEnv *env, jclass obj,
-  jlong mqd, jbyteArray msg, jint msgsize, jint priority, jobject tmout)
-{
-#if _XOPEN_VERSION >= 600
-// Following compiled but not tested
-	void *msgp_c;
-	jclass cls_timespec = (*env)->FindClass(env, "jtux/UProcess$s_timespec");
-	struct timespec tmout_c;
-	long sec;
-
-	if ((msgp_c = (*env)->GetByteArrayElements(env, msg, NULL)) == NULL)
-		return;
-	if (!field_jtoc_long(env, cls_timespec, "tv_sec", tmout, &sec))
-		return;
-	tmout_c.tv_sec = (time_t)sec;
-	if (!field_jtoc_long(env, cls_timespec, "tv_nsec", tmout, &tmout_c.tv_nsec))
-		return;
-	JTHROW_neg1(mq_timedsend((mqd_t)(intptr_t)mqd, msgp_c, msgsize, priority,
-	  &tmout_c))
-	(*env)->ReleaseByteArrayElements(env, msg, msgp_c, JNI_ABORT);
-#else
-	(void)setup_throw_errno(env, ENOSYS);
-#endif
-}
-
-JNIEXPORT void JNICALL Java_jtux_UPosixIPC_mq_1unlink(JNIEnv *env, jclass obj,
-  jstring name)
-{
-	JSTR_GET_DECL(name_c, name)
-
-	JSTR_NULLTEST(name_c)
-	JTHROW_neg1(mq_unlink(name_c))
-	JSTR_REL(name_c, name)
-}
 
 JNIEXPORT void JNICALL Java_jtux_UPosixIPC_munmap(JNIEnv *env, jclass obj,
    jlong addr, jint len)
