1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.newsclub.net.unix.demo.client;
19
20 import java.io.FileDescriptor;
21 import java.io.FileInputStream;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.net.Socket;
25
26 import org.newsclub.net.unix.AFUNIXSocket;
27
28 import com.kohlschutter.annotations.compiletime.SuppressFBWarnings;
29
30
31
32
33
34
35 public class ReadFileHandleClient extends DemoClientBase {
36 @Override
37 protected void handleSocket(Socket socket) throws IOException {
38 if (!(socket instanceof AFUNIXSocket)) {
39 throw new UnsupportedOperationException("File handles can only be sent via UNIX sockets");
40 }
41 handleSocket((AFUNIXSocket) socket);
42 }
43
44 @SuppressFBWarnings("NCR_NOT_PROPERLY_CHECKED_READ")
45 protected void handleSocket(AFUNIXSocket socket) throws IOException {
46
47 socket.setAncillaryReceiveBufferSize(1024);
48
49 try (InputStream in = socket.getInputStream()) {
50 byte[] buf = new byte[socket.getReceiveBufferSize()];
51
52 while (in.read(buf) != -1) {
53 FileDescriptor[] descriptors = socket.getReceivedFileDescriptors();
54 if (descriptors != null) {
55 for (FileDescriptor fd : descriptors) {
56 handleFileDescriptor(fd);
57 }
58 }
59 }
60 }
61 }
62
63 private void handleFileDescriptor(FileDescriptor fd) throws IOException {
64 try (FileInputStream fin = new FileInputStream(fd)) {
65 byte[] buf = new byte[4096];
66 int read;
67 while ((read = fin.read(buf)) != -1) {
68 System.out.write(buf, 0, read);
69 }
70 System.out.flush();
71 }
72 }
73 }