diff --git a/apps/sam/java/src/net/i2p/sam/MasterSession.java b/apps/sam/java/src/net/i2p/sam/MasterSession.java index 76ba6ab3a..9c301ae56 100644 --- a/apps/sam/java/src/net/i2p/sam/MasterSession.java +++ b/apps/sam/java/src/net/i2p/sam/MasterSession.java @@ -186,11 +186,14 @@ class MasterSession extends SAMv3StreamSession implements SAMDatagramReceiver, S * @return null for success, or error message */ public synchronized String remove(String nick, Properties props) { - boolean ok = SAMv3Handler.sSessionsHash.del(nick); + boolean ok; SAMMessageSess sess = sessions.remove(nick); if (sess != null) { + ok = SAMv3Handler.sSessionsHash.del(nick); sess.close(); // TODO if 0/0, add back this as listener? + if (_log.shouldWarn()) + _log.warn("removed " + sess + " proto " + sess.getListenProtocol() + " port " + sess.getListenPort()); } else { ok = false; } diff --git a/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java b/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java index 328749afb..cabed8059 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMMessageSession.java @@ -234,6 +234,7 @@ abstract class SAMMessageSession implements SAMMessageSess { private class SAMMessageSessionHandler implements Runnable, I2PSessionMuxedListener { private final I2PSession _session; + private final boolean _isOwnSession; private final Object runningLock = new Object(); private volatile boolean stillRunning = true; @@ -253,6 +254,7 @@ abstract class SAMMessageSession implements SAMMessageSess { props.setProperty("inbound.nickname", "SAM UDP Client"); props.setProperty("outbound.nickname", "SAM UDP Client"); } + _isOwnSession = true; _session = client.createSession(destStream, props); if (_log.shouldLog(Log.DEBUG)) @@ -270,6 +272,7 @@ abstract class SAMMessageSession implements SAMMessageSess { * @since 0.9.25 */ public SAMMessageSessionHandler(I2PSession sess) throws I2PSessionException { + _isOwnSession = false; _session = sess; _session.addMuxedSessionListener(this, listenProtocol, listenPort); } @@ -312,14 +315,16 @@ abstract class SAMMessageSession implements SAMMessageSess { shutDown(); session.removeListener(listenProtocol, listenPort); - try { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Destroying I2P session..."); - session.destroySession(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("I2P session destroyed"); - } catch (I2PSessionException e) { - _log.error("Error destroying I2P session", e); + if (_isOwnSession) { + try { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Destroying I2P session..."); + session.destroySession(); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("I2P session destroyed"); + } catch (I2PSessionException e) { + _log.error("Error destroying I2P session", e); + } } } diff --git a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java index 6cebed71d..969dc5a31 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMStreamSession.java @@ -68,6 +68,7 @@ class SAMStreamSession implements SAMMessageSess { protected final boolean canCreate; private final int listenProtocol; private final int listenPort; + protected final boolean _isOwnSession; /** * should we flush every time we get a STREAM SEND, or leave that up to @@ -158,6 +159,7 @@ class SAMStreamSession implements SAMMessageSess { allprops.setProperty("outbound.nickname", "SAM TCP Client"); } + _isOwnSession = true; if (_log.shouldLog(Log.DEBUG)) _log.debug("Creating I2PSocketManager..."); try { @@ -207,6 +209,7 @@ class SAMStreamSession implements SAMMessageSess { canCreate = true; Properties allprops = (Properties) System.getProperties().clone(); allprops.putAll(props); + _isOwnSession = false; socketMgr = mgr; socketMgr.addDisconnectListener(new DisconnectListener()); forceFlush = Boolean.parseBoolean(allprops.getProperty(PROP_FORCE_FLUSH, DEFAULT_FORCE_FLUSH)); @@ -342,7 +345,8 @@ class SAMStreamSession implements SAMMessageSess { } removeAllSocketHandlers(); recv.stopStreamReceiving(); - socketMgr.destroySocketManager(); + if (_isOwnSession) + socketMgr.destroySocketManager(); } /** diff --git a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java index 2adec4123..becd68f38 100644 --- a/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java +++ b/apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java @@ -536,9 +536,11 @@ class SAMv3StreamSession extends SAMStreamSession implements Session /** * Close the stream session + * TODO Why do we override? */ @Override public void close() { - socketMgr.destroySocketManager(); + if (_isOwnSession) + socketMgr.destroySocketManager(); } } diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java index e1a475a93..21494c108 100644 --- a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java +++ b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java @@ -329,6 +329,16 @@ public class SAMStreamSend { if (_log.shouldLog(Log.DEBUG)) _log.debug("SESSION " + command + " reply found: " + ok); + if (masterMode) { + // do a bunch more + req = "SESSION ADD STYLE=STREAM FROM_PORT=99 ID=stream99\n"; + samOut.write(req.getBytes("UTF-8")); + req = "SESSION ADD STYLE=STREAM FROM_PORT=98 ID=stream98\n"; + samOut.write(req.getBytes("UTF-8")); + req = "SESSION REMOVE ID=stream99\n"; + samOut.write(req.getBytes("UTF-8")); + samOut.flush(); + } req = "NAMING LOOKUP NAME=ME\n"; samOut.write(req.getBytes("UTF-8")); samOut.flush(); diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java index 431496541..0b67b7abd 100644 --- a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java +++ b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSink.java @@ -727,6 +727,14 @@ public class SAMStreamSink { samOut.write(req.getBytes("UTF-8")); req = "SESSION ADD STYLE=RAW PORT=9994 FROM_PORT=94 LISTEN_PROTOCOL=222 ID=raw94\n"; samOut.write(req.getBytes("UTF-8")); + req = "SESSION REMOVE ID=stream99\n"; + samOut.write(req.getBytes("UTF-8")); + req = "SESSION REMOVE ID=raw95\n"; + samOut.write(req.getBytes("UTF-8")); + req = "SESSION REMOVE ID=notfound\n"; + samOut.write(req.getBytes("UTF-8")); + req = "SESSION REMOVE ID=masterSink\n"; // shouldn't remove ourselves + samOut.write(req.getBytes("UTF-8")); samOut.flush(); } req = "NAMING LOOKUP NAME=ME\n";