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
29
30
31
32
33 public class ReadFileHandleClient extends DemoClientBase {
34 @Override
35 protected void handleSocket(Socket socket) throws IOException {
36 if (!(socket instanceof AFUNIXSocket)) {
37 throw new UnsupportedOperationException("File handles can only be sent via UNIX sockets");
38 }
39 handleSocket((AFUNIXSocket) socket);
40 }
41
42 protected void handleSocket(AFUNIXSocket socket) throws IOException {
43
44 socket.setAncillaryReceiveBufferSize(1024);
45
46 try (InputStream in = socket.getInputStream()) {
47 byte[] buf = new byte[socket.getReceiveBufferSize()];
48
49 while (in.read(buf) != -1) {
50 FileDescriptor[] descriptors = socket.getReceivedFileDescriptors();
51 if (descriptors != null) {
52 for (FileDescriptor fd : descriptors) {
53 handleFileDescriptor(fd);
54 }
55 }
56 }
57 }
58 }
59
60 private void handleFileDescriptor(FileDescriptor fd) throws IOException {
61 try (FileInputStream fin = new FileInputStream(fd)) {
62 byte[] buf = new byte[4096];
63 int read;
64 while ((read = fin.read(buf)) != -1) {
65 System.out.write(buf, 0, read);
66 }
67 System.out.flush();
68 }
69 }
70 }