Skip to content

Commit f5269b2

Browse files
authored
Merge pull request #45 from headius/fix_blocking
Fix fcntl binding
2 parents aaa74df + 2bfd9f8 commit f5269b2

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/main/java/jnr/enxio/channels/Native.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
import jnr.ffi.annotations.In;
2828
import jnr.ffi.annotations.Out;
2929
import jnr.ffi.annotations.Transient;
30+
import jnr.ffi.annotations.Variadic;
3031
import jnr.ffi.types.size_t;
3132
import jnr.ffi.types.ssize_t;
3233
import jnr.ffi.Platform;
34+
import jnr.ffi.types.u_int64_t;
3335

3436
import java.io.IOException;
3537
import java.nio.ByteBuffer;
@@ -46,7 +48,8 @@ public static interface LibC {
4648
public @ssize_t int read(int fd, @Out byte[] data, @size_t long size);
4749
public @ssize_t int write(int fd, @In ByteBuffer data, @size_t long size);
4850
public @ssize_t int write(int fd, @In byte[] data, @size_t long size);
49-
public int fcntl(int fd, int cmd, int data);
51+
@Variadic(fixedCount = 2)
52+
public int fcntl(int fd, int cmd, @u_int64_t int data);
5053
public int poll(@In @Out ByteBuffer pfds, int nfds, int timeout);
5154
public int poll(@In @Out Pointer pfds, int nfds, int timeout);
5255
public int kqueue();
@@ -155,6 +158,12 @@ public static void setBlocking(int fd, boolean block) {
155158

156159
libc().fcntl(fd, LibC.F_SETFL, flags);
157160
}
161+
162+
public static boolean getBlocking(int fd) {
163+
int flags = libc().fcntl(fd, LibC.F_GETFL, 0);
164+
165+
return !((flags & LibC.O_NONBLOCK) == LibC.O_NONBLOCK);
166+
}
158167

159168
public static int shutdown(int fd, int how) {
160169
return libc().shutdown(fd, how);

src/test/java/jnr/enxio/channels/NativeTest.java

+18
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package jnr.enxio.channels;
22

3+
import org.junit.Assert;
34
import org.junit.Rule;
45
import org.junit.Test;
56
import org.junit.rules.ExpectedException;
67

78
import java.io.FileDescriptor;
89
import java.io.FileOutputStream;
910
import java.lang.reflect.Field;
11+
import java.nio.channels.Pipe;
1012

1113
public class NativeTest {
1214
@Rule
@@ -23,4 +25,20 @@ public void closeThrowsOnNativeError() throws Exception {
2325
expectedEx.expect(NativeException.class);
2426
Native.close(fd);
2527
}
28+
29+
@Test
30+
public void setBlocking() throws Exception {
31+
Pipe pipe = Pipe.open();
32+
Pipe.SinkChannel sink = pipe.sink();
33+
// sink.getClass().getModule().addOpens("sun.nio.ch", NativeTest.class.getModule());
34+
Field fd1 = sink.getClass().getDeclaredField("fd");
35+
fd1.setAccessible(true);
36+
FileDescriptor descriptor = (FileDescriptor) fd1.get(sink);
37+
Field fdField = descriptor.getClass().getDeclaredField("fd");
38+
fdField.setAccessible(true);
39+
int fd = (int)(Integer)fdField.get(descriptor);
40+
Assert.assertEquals(true, Native.getBlocking(fd));
41+
Native.setBlocking(fd, false);
42+
Assert.assertEquals(false, Native.getBlocking(fd));
43+
}
2644
}

0 commit comments

Comments
 (0)