diff --git a/transport-native-epoll/pom.xml b/transport-native-epoll/pom.xml index c5b0c84604..20ccbea8ac 100644 --- a/transport-native-epoll/pom.xml +++ b/transport-native-epoll/pom.xml @@ -186,7 +186,7 @@ ${linux.sendmmsg.support}${glibc.sendmmsg.support} .*IO_NETTY_SENDMSSG_NOT_FOUND.* - CFLAGS=-O3 -DIO_NETTY_SENDMMSG_NOT_FOUND + CFLAGS=-O3 -DIO_NETTY_SENDMMSG_NOT_FOUND -Werror false @@ -202,7 +202,7 @@ ${jni.compiler.args} ^((?!CFLAGS=).)*$ - CFLAGS=-O3 + CFLAGS=-O3 -Werror false diff --git a/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c b/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c index 863ce85dc6..59ee8f741a 100644 --- a/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c +++ b/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "io_netty_channel_epoll_Native.h" #include "exception_helper.h" @@ -1057,6 +1058,8 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_shutdown0(JNIEnv* env, mode = SHUT_RD; } else if (write) { mode = SHUT_WR; + } else { + return -EINVAL; } if (shutdown(fd, mode) < 0) { return -errno; @@ -1097,12 +1100,14 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_bind(JNIEnv* env, jcla if (bind(fd, (struct sockaddr*) &addr, sizeof(addr)) == -1) { return -errno; } + return 0; } JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_listen0(JNIEnv* env, jclass clazz, jint fd, jint backlog) { if (listen(fd, backlog) == -1) { return -errno; } + return 0; } JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_connect(JNIEnv* env, jclass clazz, jint fd, jbyteArray address, jint scopeId, jint port) { @@ -1560,7 +1565,7 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_socketDomain(JNIEnv* e // macro to calculate the length of a sockaddr_un struct for a given path length. // see sys/un.h#SUN_LEN, this is modified to allow nul bytes -#define _UNIX_ADDR_LENGTH(path_len) (((struct sockaddr_un *) 0)->sun_path) + path_len +#define _UNIX_ADDR_LENGTH(path_len) (uintptr_t) (((struct sockaddr_un *) 0)->sun_path) + path_len JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_bindDomainSocket(JNIEnv* env, jclass clazz, jint fd, jbyteArray socketPath) { struct sockaddr_un addr; @@ -1568,7 +1573,7 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_bindDomainSocket(JNIEn memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - const jbyte* socket_path = (*env)->GetByteArrayElements(env, socketPath, 0); + jbyte* socket_path = (*env)->GetByteArrayElements(env, socketPath, 0); jint socket_path_len = (*env)->GetArrayLength(env, socketPath); if (socket_path_len > sizeof(addr.sun_path)) { socket_path_len = sizeof(addr.sun_path); @@ -1595,7 +1600,7 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_connectDomainSocket(JN memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; - const jbyte* socket_path = (*env)->GetByteArrayElements(env, socketPath, 0); + jbyte* socket_path = (*env)->GetByteArrayElements(env, socketPath, 0); socket_path_len = (*env)->GetArrayLength(env, socketPath); if (socket_path_len > sizeof(addr.sun_path)) { socket_path_len = sizeof(addr.sun_path); @@ -1685,7 +1690,7 @@ JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_sendFd0(JNIEnv* env, j iov[0].iov_base = iovecData; iov[0].iov_len = sizeof(iovecData); - size_t res; + ssize_t res; int err; do { res = sendmsg(socketFd, &descriptorMessage, 0); @@ -1758,14 +1763,17 @@ JNIEXPORT jlong JNICALL Java_io_netty_channel_epoll_Native_pipe0(JNIEnv* env, jc return (((long) fd[0]) << 32) | (fd[1] & 0xffffffffL); } -JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_splice0(JNIEnv* env, jclass clazz, jint fd, jint offIn, jint fdOut, jint offOut, jint len) { +JNIEXPORT jint JNICALL Java_io_netty_channel_epoll_Native_splice0(JNIEnv* env, jclass clazz, jint fd, jlong offIn, jint fdOut, jlong offOut, jlong len) { ssize_t res; int err; - loff_t off_in = offIn >= 0 ? (loff_t) offIn : NULL; - loff_t off_out = offOut >= 0 ? (loff_t) offOut : NULL; + loff_t off_in = (loff_t) offIn; + loff_t off_out = (loff_t) offOut; + + loff_t* p_off_in = off_in >= 0 ? &off_in : NULL; + loff_t* p_off_out = off_in >= 0 ? &off_out : NULL; do { - res = splice(fd, off_in, fdOut, off_out, (size_t) len, SPLICE_F_NONBLOCK | SPLICE_F_MOVE); + res = splice(fd, p_off_in, fdOut, p_off_out, (size_t) len, SPLICE_F_NONBLOCK | SPLICE_F_MOVE); // keep on splicing if it was interrupted } while (res == -1 && ((err = errno) == EINTR)); diff --git a/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.h b/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.h index 1e0dd968da..16e88cf92f 100644 --- a/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.h +++ b/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.h @@ -130,7 +130,7 @@ jint Java_io_netty_channel_epoll_Native_sizeofEpollEvent(JNIEnv* env, jclass cla jint Java_io_netty_channel_epoll_Native_offsetofEpollData(JNIEnv* env, jclass clazz); jlong Java_io_netty_channel_epoll_Native_pipe0(JNIEnv* env, jclass clazz); -jint Java_io_netty_channel_epoll_Native_splice0(JNIEnv* env, jclass clazz, jint fd, jint offIn, jint fdOut, jint offOut, jint len); +jint Java_io_netty_channel_epoll_Native_splice0(JNIEnv* env, jclass clazz, jint fd, jlong offIn, jint fdOut, jlong offOut, jlong len); jint Java_io_netty_channel_epoll_Native_tcpMd5SigMaxKeyLen(JNIEnv* env, jclass clazz); void Java_io_netty_channel_epoll_Native_setTcpMd5Sig0(JNIEnv* env, jclass clazz, jint fd, jbyteArray address, jint scopeId, jbyteArray key); diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/Native.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/Native.java index 54d6976952..b1a75e154c 100644 --- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/Native.java +++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/Native.java @@ -205,7 +205,7 @@ public final class Native { private static native int close0(int fd); - public static int splice(int fd, int offIn, int fdOut, int offOut, int len) throws IOException { + public static int splice(int fd, long offIn, int fdOut, long offOut, long len) throws IOException { int res = splice0(fd, offIn, fdOut, offOut, len); if (res >= 0) { return res; @@ -213,7 +213,7 @@ public final class Native { return ioResult("splice", res, CONNECTION_RESET_EXCEPTION_SPLICE); } - private static native int splice0(int fd, int offIn, int fdOut, int offOut, int len); + private static native int splice0(int fd, long offIn, int fdOut, long offOut, long len); public static long pipe() throws IOException { long res = pipe0();