1 /* LocalSocket.java -- a unix domain client socket.
2    Copyright (C) 2006  Free Software Foundation, Inc.
3 
4 This file is a part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at
9 your option) any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
19 USA
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version.  */
37 
38 
39 package gnu.java.net.local;
40 
41 import java.io.IOException;
42 import java.io.InputStream;
43 import java.io.OutputStream;
44 
45 import java.net.InetAddress;
46 import java.net.Socket;
47 import java.net.SocketAddress;
48 import java.net.SocketException;
49 
50 import java.nio.channels.IllegalBlockingModeException;
51 import java.nio.channels.SocketChannel;
52 
53 /**
54  * A local, or unix-domain socket. Unix domain sockets are connected on the
55  * local filesystem itself, rather than a remote address.
56  */
57 public final class LocalSocket extends Socket
58 {
59 
60   // Fields.
61   // -------------------------------------------------------------------------
62 
63   private final LocalSocketImpl localimpl;
64   boolean localClosed;
65   boolean localConnected;
66 
67   // Constructors.
68   // -------------------------------------------------------------------------
69 
LocalSocket()70   public LocalSocket () throws SocketException
71   {
72     super ();
73     localimpl = new LocalSocketImpl ();
74   }
75 
LocalSocket(LocalSocketAddress addr)76   public LocalSocket (LocalSocketAddress addr) throws SocketException
77   {
78     this ();
79     try
80       {
81         connect (addr);
82       }
83     catch (IOException ioe)
84       {
85         SocketException se = new SocketException ();
86         se.initCause (ioe);
87         throw se;
88       }
89   }
90 
LocalSocket(boolean nocreate)91   LocalSocket (boolean nocreate) throws IOException
92   {
93     super ();
94     localimpl = new LocalSocketImpl (nocreate);
95   }
96 
97   // Instance methods.
98   // -------------------------------------------------------------------------
99 
bind(SocketAddress bindpoint)100   public void bind (SocketAddress bindpoint) throws IOException
101   {
102     throw new SocketException ("binding local client sockets is nonsensical");
103   }
104 
connect(SocketAddress endpoint, int timeout)105   public void connect (SocketAddress endpoint, int timeout) throws IOException
106   {
107     if (isClosed ())
108       {
109         throw new SocketException ("socket is closed");
110       }
111     if (! (endpoint instanceof LocalSocketAddress))
112       {
113         throw new IllegalArgumentException ("socket address is not a local address");
114       }
115     if (getChannel() != null && !getChannel().isBlocking())
116       {
117         throw new IllegalBlockingModeException ();
118       }
119 
120     try
121       {
122         localimpl.doCreate ();
123         localimpl.localConnect ((LocalSocketAddress) endpoint);
124       }
125     catch (IOException ioe)
126       {
127         close ();
128         throw ioe;
129       }
130     localConnected = true;
131   }
132 
getInetAddress()133   public InetAddress getInetAddress ()
134   {
135     return null;
136   }
137 
getLocalAddress()138   public InetAddress getLocalAddress ()
139   {
140     return null;
141   }
142 
getPort()143   public int getPort ()
144   {
145     return -1;
146   }
147 
getLocalPort()148   public int getLocalPort ()
149   {
150     return -1;
151   }
152 
getChannel()153   public SocketChannel getChannel ()
154   {
155     return null;
156   }
157 
getLocalSocketAddress()158   public SocketAddress getLocalSocketAddress ()
159   {
160     return localimpl.getLocalAddress ();
161   }
162 
getRemoteSocketAddress()163   public SocketAddress getRemoteSocketAddress ()
164   {
165     return localimpl.getRemoteAddress ();
166   }
167 
getInputStream()168   public InputStream getInputStream () throws IOException
169   {
170     return localimpl.getInputStream ();
171   }
172 
getOutputStream()173   public OutputStream getOutputStream () throws IOException
174   {
175     return localimpl.getOutputStream ();
176   }
177 
sendUrgentData(int b)178   public void sendUrgentData (int b) throws IOException
179   {
180     localimpl.sendUrgentData (b);
181   }
182 
close()183   public synchronized void close () throws IOException
184   {
185     localimpl.close ();
186     localClosed = true;
187   }
188 
shutdownInput()189   public void shutdownInput () throws IOException
190   {
191     localimpl.shutdownInput ();
192   }
193 
shutdownOutput()194   public void shutdownOutput () throws IOException
195   {
196     localimpl.shutdownOutput ();
197   }
198 
isClosed()199   public boolean isClosed ()
200   {
201     return localClosed;
202   }
203 
isBound()204   public boolean isBound ()
205   {
206     return false;
207   }
208 
isConnected()209   public boolean isConnected ()
210   {
211     return localConnected;
212   }
213 
214   // Unsupported methods.
215   // -------------------------------------------------------------------------
216 
setTcpNoDelay(boolean b)217   public void setTcpNoDelay (boolean b) throws SocketException
218   {
219     throw new SocketException ("local sockets do not support this option");
220   }
221 
getTcpNoDelay()222   public boolean getTcpNoDelay() throws SocketException
223   {
224     throw new SocketException ("local sockets do not support this option");
225   }
226 
setSoLinger(boolean b, int i)227   public void setSoLinger (boolean b, int i) throws SocketException
228   {
229     throw new SocketException ("local sockets do not support this option");
230   }
231 
getSoLinger()232   public int getSoLinger () throws SocketException
233   {
234     throw new SocketException ("local sockets do not support this option");
235   }
236 
setOOBInline(boolean b)237   public void setOOBInline (boolean b) throws SocketException
238   {
239     throw new SocketException ("local sockets do not support this option");
240   }
241 
getOOBInline()242   public boolean getOOBInline () throws SocketException
243   {
244     throw new SocketException ("local sockets do not support this option");
245   }
246 
setSoTimeout(int i)247   public void setSoTimeout (int i) throws SocketException
248   {
249     // Ignore.
250   }
251 
getSoTimeout()252   public int getSoTimeout () throws SocketException
253   {
254     // We don't support timeout, so we return 0.
255     return 0;
256   }
257 
setSendBufferSize(int i)258   public void setSendBufferSize (int i) throws SocketException
259   {
260     throw new SocketException ("local sockets do not support this option");
261   }
262 
getSendBufferSize()263   public int getSendBufferSize() throws SocketException
264   {
265     throw new SocketException ("local sockets do not support this option");
266   }
267 
setReceiveBufferSize(int i)268   public void setReceiveBufferSize (int i) throws SocketException
269   {
270     throw new SocketException ("local sockets do not support this option");
271   }
272 
getReceiveBufferSize()273   public int getReceiveBufferSize () throws SocketException
274   {
275     throw new SocketException ("local sockets do not support this option");
276   }
277 
setKeepAlive(boolean b)278   public void setKeepAlive (boolean b) throws SocketException
279   {
280     throw new SocketException ("local sockets do not support this option");
281   }
282 
getKeepAlive()283   public boolean getKeepAlive () throws SocketException
284   {
285     throw new SocketException ("local sockets do not support this option");
286   }
287 
setTrafficClass(int i)288   public void setTrafficClass (int i) throws SocketException
289   {
290     throw new SocketException ("local sockets do not support this option");
291   }
292 
getTrafficClass()293   public int getTrafficClass () throws SocketException
294   {
295     throw new SocketException ("local sockets do not support this option");
296   }
297 
setReuseAddress(boolean b)298   public void setReuseAddress (boolean b) throws SocketException
299   {
300     throw new SocketException ("local sockets do not support this option");
301   }
302 
getReuseAddress()303   public boolean getReuseAddress () throws SocketException
304   {
305     throw new SocketException ("local sockets do not support this option");
306   }
307 
getLocalImpl()308   LocalSocketImpl getLocalImpl ()
309   {
310     return localimpl;
311   }
312 }
313