1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright (c) 2001 by Sun Microsystems, Inc.
23 * All rights reserved.
24 *
25 */
26
27//  StreamListener.java: Listen to stream socket, spawn request to
28//			  handle incoming request.
29//  Author:           James Kempf
30//  Created On:       Mon May 18 13:31:40 1998
31//  Last Modified By: James Kempf
32//  Last Modified On: Tue Jan 12 11:03:30 1999
33//  Update Count:     24
34//
35
36package com.sun.slp;
37
38import java.util.*;
39import java.net.*;
40import java.io.*;
41
42/**
43 * Listen on the SLP port for clients requesting a stream connection. Spawn
44 * a request handler to handle the connection.
45 *
46 * @author James Kempf, Erik Guttman
47 */
48
49class StreamListener extends Thread {
50
51    private ServerSocket serverSocket = null;		// The listening socket
52    private InetAddress interfac = null;		// The interface.
53
54    static private SLPConfig config   = null;		// Config object
55    static private Hashtable listeners = new Hashtable(); // Stream listeners
56
57    // Initialize a stream (TCP) listener on an interface.
58
59    static void initializeStreamListenerOnInterface(InetAddress interfac)
60	throws ServiceLocationException {
61
62	// If we've got it, return.
63
64	if (listeners.get(interfac) != null) {
65	    return;
66
67	}
68
69	// Get config object.
70
71	if (config == null) {
72	    config = SLPConfig.getSLPConfig();
73
74	}
75
76	// Create the new stream listener.
77
78	StreamListener listener = new StreamListener(interfac);
79
80	// Start it running.
81
82	listener.start();
83
84    }
85
86    private StreamListener(InetAddress interfac)
87	throws ServiceLocationException {
88
89	int qn = config.getServerSocketQueueLength();
90
91	// Create a server socket for incoming Stream connections.
92
93	try {
94	    serverSocket = new ServerSocket(Defaults.iSLPPort,
95					    qn,
96					    interfac);
97
98	} catch (IOException ex) {
99	    throw new ServiceLocationException(
100				ServiceLocationException.NETWORK_INIT_FAILED,
101				"socket_creation_failure",
102				new Object[] {interfac, ex.getMessage()});
103	}
104
105	// Record.
106
107	listeners.put(interfac, this);
108
109	this.interfac = interfac;
110
111    }
112
113    // Listen to port 427, accept incoming connections, pass the socket
114    //  off to a new RequestHandler to process.
115
116    public void run() {
117
118	setName("SLP Stream Listener");
119
120	long lLastIOE = 0;
121
122	// Loop, blocking on acceptence of connections.
123
124	while (true) {
125
126	    Socket s = null;
127
128	    try {
129		s = serverSocket.accept(); // will block here
130
131		if (config.traceMsg() && s != null) {
132		    config.writeLog("sl_incoming",
133				    new Object[] {
134			s.getInetAddress().toString(),
135			    interfac});
136		}
137
138		// Set socket timeout in case something goes wrong.
139
140		if (s != null) {
141		    s.setSoTimeout(config.getTCPTimeout());
142
143		}
144
145	    } catch (SocketException ex) {
146		if (config.traceMsg()) {
147		    config.writeLog("sl_sock_timeout",
148				    new Object[] {
149			s.getInetAddress().toString(),
150			    interfac,
151			    ex.getMessage()});
152
153		}
154
155		continue;
156
157	    } catch (IOException ex) {
158		long lThisIOE = System.currentTimeMillis();
159
160		Assert.slpassert((lThisIOE - lLastIOE >= 250),
161			      "sls_repeat_failure",
162			      new Object[0]);
163
164		lLastIOE = lThisIOE;
165		continue;
166	    }
167
168	    RequestHandler rh = new RequestHandler(s, interfac, config);
169	    rh.start();
170
171	}
172    }
173}
174