jcifs-1.1.10 from tgz
authorFelix Schumacher <p0354740@isib001.(none)>
Wed, 6 Aug 2008 14:30:36 +0000 (16:30 +0200)
committerFelix Schumacher <p0354740@isib001.(none)>
Wed, 6 Aug 2008 14:30:36 +0000 (16:30 +0200)
Sun Apr 17 22:37:04 EDT 2005
jcifs-1.1.10 released

The getChallengeForDomain code has been rewritten. It has been considerably
simplified.     It     will     now     rotate     through     the    first
jcifs.netbios.lookupRespLimit  domain  controllers  rather than try to grow
and shrink the list depending on load. The lookupRespLimit property default
has  been  reduced  to  3. The timeout value for rebuilting the DC list has
been  increased  from  20  minutes  to  10  hours.  This  is  calculated by
multiplying   jcifs.netvios.cachePolicy  by  60  but  the  default  in  the
SmbSession  class  is  60  *  10 meaning 10 minutes so 10 * 60 is 10 hours.
Finally  the  NtlmChallenge class is now Serializeable for servers that are
pedantic about what can be stored in a session.

75 files changed:
README.txt
build.xml
examples/AllocInfo.class [deleted file]
examples/Append.class [deleted file]
examples/AuthListFiles.class [deleted file]
examples/CallNamedPipe.class [deleted file]
examples/CopyTo.class [deleted file]
examples/CreateFile.class [deleted file]
examples/Delete.class [deleted file]
examples/Equals.class [deleted file]
examples/Exists.class [deleted file]
examples/FileInfo.class [deleted file]
examples/FileOps.class [deleted file]
examples/FilterFiles$BigFileFilter.class [deleted file]
examples/FilterFiles$ShortFilenameFilter.class [deleted file]
examples/FilterFiles.class [deleted file]
examples/Format.class [deleted file]
examples/Get.class [deleted file]
examples/GetDate.class [deleted file]
examples/GetDfsPath.class [deleted file]
examples/GetType.class [deleted file]
examples/GetURL.class [deleted file]
examples/GrowWrite.class [deleted file]
examples/HttpURL.class [deleted file]
examples/Interleave$IThread.class [deleted file]
examples/Interleave.class [deleted file]
examples/IsDir.class [deleted file]
examples/Length.class [deleted file]
examples/List.class [deleted file]
examples/ListFiles.class [deleted file]
examples/ListTypes.class [deleted file]
examples/Mkdir.class [deleted file]
examples/NodeStatus.class [deleted file]
examples/OpenExclusive.class [deleted file]
examples/PeekNamedPipe$ReceiverThread.class [deleted file]
examples/PeekNamedPipe.class [deleted file]
examples/PipeTalk$ReceiverThread.class [deleted file]
examples/PipeTalk.class [deleted file]
examples/Put.class [deleted file]
examples/Query.class [deleted file]
examples/RenameTo.class [deleted file]
examples/SetAttrs.class [deleted file]
examples/SetTime.class [deleted file]
examples/SlowRead.class [deleted file]
examples/SlowWrite.class [deleted file]
examples/SmbCrawler.class [deleted file]
examples/SmbShell.class [deleted file]
examples/SmbTableFile.class [deleted file]
examples/SmbTableFileRecord.class [deleted file]
examples/T2Crawler$CrawlerThread.class [deleted file]
examples/T2Crawler$Semaphore.class [deleted file]
examples/T2Crawler.class [deleted file]
examples/TestRandomAccess$TestRecord.class [deleted file]
examples/TestRandomAccess.class [deleted file]
examples/TestSmbURL.class [deleted file]
examples/TestUnicode.class [deleted file]
examples/ThreadedNbtQuery$QThread.class [deleted file]
examples/ThreadedNbtQuery.class [deleted file]
examples/ThreadedSmbCrawler$DirEntry.class [deleted file]
examples/ThreadedSmbCrawler$SmbCrawlerThread.class [deleted file]
examples/ThreadedSmbCrawler.class [deleted file]
examples/ThreadedUniQuery$QThread.class [deleted file]
examples/ThreadedUniQuery.class [deleted file]
examples/Torture1.class [deleted file]
examples/Torture2.class [deleted file]
examples/TortureTest5.class [deleted file]
examples/TransactNamedPipe.class [deleted file]
examples/URLTest.class [deleted file]
examples/VerifyGuest.class [deleted file]
examples/VerifyIO.class [deleted file]
examples/VerifyReads.class [deleted file]
examples/Worker.class [deleted file]
examples/m31_gendler_big.jpg [deleted file]
src/jcifs/smb/NtlmChallenge.java
src/jcifs/smb/SmbSession.java

index 5feae4a..dc3683f 100644 (file)
@@ -1,3 +1,17 @@
+Sun Apr 17 22:37:04 EDT 2005
+jcifs-1.1.10 released
+
+The getChallengeForDomain code has been rewritten. It has been considerably
+simplified.     It     will     now     rotate     through     the    first
+jcifs.netbios.lookupRespLimit  domain  controllers  rather than try to grow
+and shrink the list depending on load. The lookupRespLimit property default
+has  been  reduced  to  3. The timeout value for rebuilting the DC list has
+been  increased  from  20  minutes  to  10  hours.  This  is  calculated by
+multiplying   jcifs.netvios.cachePolicy  by  60  but  the  default  in  the
+SmbSession  class  is  60  *  10 meaning 10 minutes so 10 * 60 is 10 hours.
+Finally  the  NtlmChallenge class is now Serializeable for servers that are
+pedantic about what can be stored in a session. 
+
 Thu Feb 10 22:29:12 EST 2005
 jcifs-1.1.8 released
 
index e86087c..1d956ca 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -1,7 +1,7 @@
 <project name="jcifs" default="usage" basedir=".">
 
-    <property name="version" value="1.1.9"/>
-    <property name="reldate" value="Feb 27, 2005"/>
+    <property name="version" value="1.1.10"/>
+    <property name="reldate" value="Apr 17, 2005"/>
 
     <target name="usage">
         <echo>
diff --git a/examples/AllocInfo.class b/examples/AllocInfo.class
deleted file mode 100644 (file)
index d052675..0000000
Binary files a/examples/AllocInfo.class and /dev/null differ
diff --git a/examples/Append.class b/examples/Append.class
deleted file mode 100644 (file)
index d21f774..0000000
Binary files a/examples/Append.class and /dev/null differ
diff --git a/examples/AuthListFiles.class b/examples/AuthListFiles.class
deleted file mode 100644 (file)
index 851ae58..0000000
Binary files a/examples/AuthListFiles.class and /dev/null differ
diff --git a/examples/CallNamedPipe.class b/examples/CallNamedPipe.class
deleted file mode 100644 (file)
index 56a01f5..0000000
Binary files a/examples/CallNamedPipe.class and /dev/null differ
diff --git a/examples/CopyTo.class b/examples/CopyTo.class
deleted file mode 100644 (file)
index 1eec536..0000000
Binary files a/examples/CopyTo.class and /dev/null differ
diff --git a/examples/CreateFile.class b/examples/CreateFile.class
deleted file mode 100644 (file)
index 9ae7ab1..0000000
Binary files a/examples/CreateFile.class and /dev/null differ
diff --git a/examples/Delete.class b/examples/Delete.class
deleted file mode 100644 (file)
index b52be49..0000000
Binary files a/examples/Delete.class and /dev/null differ
diff --git a/examples/Equals.class b/examples/Equals.class
deleted file mode 100644 (file)
index c80c85f..0000000
Binary files a/examples/Equals.class and /dev/null differ
diff --git a/examples/Exists.class b/examples/Exists.class
deleted file mode 100644 (file)
index 9f03ca4..0000000
Binary files a/examples/Exists.class and /dev/null differ
diff --git a/examples/FileInfo.class b/examples/FileInfo.class
deleted file mode 100644 (file)
index d877f51..0000000
Binary files a/examples/FileInfo.class and /dev/null differ
diff --git a/examples/FileOps.class b/examples/FileOps.class
deleted file mode 100644 (file)
index 9a0e176..0000000
Binary files a/examples/FileOps.class and /dev/null differ
diff --git a/examples/FilterFiles$BigFileFilter.class b/examples/FilterFiles$BigFileFilter.class
deleted file mode 100644 (file)
index 1cd1710..0000000
Binary files a/examples/FilterFiles$BigFileFilter.class and /dev/null differ
diff --git a/examples/FilterFiles$ShortFilenameFilter.class b/examples/FilterFiles$ShortFilenameFilter.class
deleted file mode 100644 (file)
index 9260f70..0000000
Binary files a/examples/FilterFiles$ShortFilenameFilter.class and /dev/null differ
diff --git a/examples/FilterFiles.class b/examples/FilterFiles.class
deleted file mode 100644 (file)
index 12a853d..0000000
Binary files a/examples/FilterFiles.class and /dev/null differ
diff --git a/examples/Format.class b/examples/Format.class
deleted file mode 100644 (file)
index 998801f..0000000
Binary files a/examples/Format.class and /dev/null differ
diff --git a/examples/Get.class b/examples/Get.class
deleted file mode 100644 (file)
index 8192c4a..0000000
Binary files a/examples/Get.class and /dev/null differ
diff --git a/examples/GetDate.class b/examples/GetDate.class
deleted file mode 100644 (file)
index 8a82eaa..0000000
Binary files a/examples/GetDate.class and /dev/null differ
diff --git a/examples/GetDfsPath.class b/examples/GetDfsPath.class
deleted file mode 100644 (file)
index 751b59a..0000000
Binary files a/examples/GetDfsPath.class and /dev/null differ
diff --git a/examples/GetType.class b/examples/GetType.class
deleted file mode 100644 (file)
index 1028177..0000000
Binary files a/examples/GetType.class and /dev/null differ
diff --git a/examples/GetURL.class b/examples/GetURL.class
deleted file mode 100644 (file)
index e473c42..0000000
Binary files a/examples/GetURL.class and /dev/null differ
diff --git a/examples/GrowWrite.class b/examples/GrowWrite.class
deleted file mode 100644 (file)
index bb1d8f6..0000000
Binary files a/examples/GrowWrite.class and /dev/null differ
diff --git a/examples/HttpURL.class b/examples/HttpURL.class
deleted file mode 100644 (file)
index 55faf3c..0000000
Binary files a/examples/HttpURL.class and /dev/null differ
diff --git a/examples/Interleave$IThread.class b/examples/Interleave$IThread.class
deleted file mode 100644 (file)
index 12d7d51..0000000
Binary files a/examples/Interleave$IThread.class and /dev/null differ
diff --git a/examples/Interleave.class b/examples/Interleave.class
deleted file mode 100644 (file)
index 4ea28d5..0000000
Binary files a/examples/Interleave.class and /dev/null differ
diff --git a/examples/IsDir.class b/examples/IsDir.class
deleted file mode 100644 (file)
index 712a60e..0000000
Binary files a/examples/IsDir.class and /dev/null differ
diff --git a/examples/Length.class b/examples/Length.class
deleted file mode 100644 (file)
index b096ceb..0000000
Binary files a/examples/Length.class and /dev/null differ
diff --git a/examples/List.class b/examples/List.class
deleted file mode 100644 (file)
index 2d2e7b0..0000000
Binary files a/examples/List.class and /dev/null differ
diff --git a/examples/ListFiles.class b/examples/ListFiles.class
deleted file mode 100644 (file)
index 190cd04..0000000
Binary files a/examples/ListFiles.class and /dev/null differ
diff --git a/examples/ListTypes.class b/examples/ListTypes.class
deleted file mode 100644 (file)
index 6da499c..0000000
Binary files a/examples/ListTypes.class and /dev/null differ
diff --git a/examples/Mkdir.class b/examples/Mkdir.class
deleted file mode 100644 (file)
index 4c96536..0000000
Binary files a/examples/Mkdir.class and /dev/null differ
diff --git a/examples/NodeStatus.class b/examples/NodeStatus.class
deleted file mode 100644 (file)
index 12e8052..0000000
Binary files a/examples/NodeStatus.class and /dev/null differ
diff --git a/examples/OpenExclusive.class b/examples/OpenExclusive.class
deleted file mode 100644 (file)
index 1802220..0000000
Binary files a/examples/OpenExclusive.class and /dev/null differ
diff --git a/examples/PeekNamedPipe$ReceiverThread.class b/examples/PeekNamedPipe$ReceiverThread.class
deleted file mode 100644 (file)
index 642652c..0000000
Binary files a/examples/PeekNamedPipe$ReceiverThread.class and /dev/null differ
diff --git a/examples/PeekNamedPipe.class b/examples/PeekNamedPipe.class
deleted file mode 100644 (file)
index 3cebbd0..0000000
Binary files a/examples/PeekNamedPipe.class and /dev/null differ
diff --git a/examples/PipeTalk$ReceiverThread.class b/examples/PipeTalk$ReceiverThread.class
deleted file mode 100644 (file)
index d05ca7a..0000000
Binary files a/examples/PipeTalk$ReceiverThread.class and /dev/null differ
diff --git a/examples/PipeTalk.class b/examples/PipeTalk.class
deleted file mode 100644 (file)
index ccad890..0000000
Binary files a/examples/PipeTalk.class and /dev/null differ
diff --git a/examples/Put.class b/examples/Put.class
deleted file mode 100644 (file)
index 43b1e70..0000000
Binary files a/examples/Put.class and /dev/null differ
diff --git a/examples/Query.class b/examples/Query.class
deleted file mode 100644 (file)
index 0112790..0000000
Binary files a/examples/Query.class and /dev/null differ
diff --git a/examples/RenameTo.class b/examples/RenameTo.class
deleted file mode 100644 (file)
index c169e35..0000000
Binary files a/examples/RenameTo.class and /dev/null differ
diff --git a/examples/SetAttrs.class b/examples/SetAttrs.class
deleted file mode 100644 (file)
index d36bada..0000000
Binary files a/examples/SetAttrs.class and /dev/null differ
diff --git a/examples/SetTime.class b/examples/SetTime.class
deleted file mode 100644 (file)
index 79b5e36..0000000
Binary files a/examples/SetTime.class and /dev/null differ
diff --git a/examples/SlowRead.class b/examples/SlowRead.class
deleted file mode 100644 (file)
index de72174..0000000
Binary files a/examples/SlowRead.class and /dev/null differ
diff --git a/examples/SlowWrite.class b/examples/SlowWrite.class
deleted file mode 100644 (file)
index 84a1cff..0000000
Binary files a/examples/SlowWrite.class and /dev/null differ
diff --git a/examples/SmbCrawler.class b/examples/SmbCrawler.class
deleted file mode 100644 (file)
index 7b303b6..0000000
Binary files a/examples/SmbCrawler.class and /dev/null differ
diff --git a/examples/SmbShell.class b/examples/SmbShell.class
deleted file mode 100644 (file)
index b9096fa..0000000
Binary files a/examples/SmbShell.class and /dev/null differ
diff --git a/examples/SmbTableFile.class b/examples/SmbTableFile.class
deleted file mode 100644 (file)
index c1bfe46..0000000
Binary files a/examples/SmbTableFile.class and /dev/null differ
diff --git a/examples/SmbTableFileRecord.class b/examples/SmbTableFileRecord.class
deleted file mode 100644 (file)
index b5d68ff..0000000
Binary files a/examples/SmbTableFileRecord.class and /dev/null differ
diff --git a/examples/T2Crawler$CrawlerThread.class b/examples/T2Crawler$CrawlerThread.class
deleted file mode 100644 (file)
index 0b40e5c..0000000
Binary files a/examples/T2Crawler$CrawlerThread.class and /dev/null differ
diff --git a/examples/T2Crawler$Semaphore.class b/examples/T2Crawler$Semaphore.class
deleted file mode 100644 (file)
index af3b771..0000000
Binary files a/examples/T2Crawler$Semaphore.class and /dev/null differ
diff --git a/examples/T2Crawler.class b/examples/T2Crawler.class
deleted file mode 100644 (file)
index ffb3192..0000000
Binary files a/examples/T2Crawler.class and /dev/null differ
diff --git a/examples/TestRandomAccess$TestRecord.class b/examples/TestRandomAccess$TestRecord.class
deleted file mode 100644 (file)
index 872eb31..0000000
Binary files a/examples/TestRandomAccess$TestRecord.class and /dev/null differ
diff --git a/examples/TestRandomAccess.class b/examples/TestRandomAccess.class
deleted file mode 100644 (file)
index 5fdf0df..0000000
Binary files a/examples/TestRandomAccess.class and /dev/null differ
diff --git a/examples/TestSmbURL.class b/examples/TestSmbURL.class
deleted file mode 100644 (file)
index d73dd32..0000000
Binary files a/examples/TestSmbURL.class and /dev/null differ
diff --git a/examples/TestUnicode.class b/examples/TestUnicode.class
deleted file mode 100644 (file)
index 92304e8..0000000
Binary files a/examples/TestUnicode.class and /dev/null differ
diff --git a/examples/ThreadedNbtQuery$QThread.class b/examples/ThreadedNbtQuery$QThread.class
deleted file mode 100644 (file)
index 1259b6d..0000000
Binary files a/examples/ThreadedNbtQuery$QThread.class and /dev/null differ
diff --git a/examples/ThreadedNbtQuery.class b/examples/ThreadedNbtQuery.class
deleted file mode 100644 (file)
index 0d21e06..0000000
Binary files a/examples/ThreadedNbtQuery.class and /dev/null differ
diff --git a/examples/ThreadedSmbCrawler$DirEntry.class b/examples/ThreadedSmbCrawler$DirEntry.class
deleted file mode 100644 (file)
index f849d93..0000000
Binary files a/examples/ThreadedSmbCrawler$DirEntry.class and /dev/null differ
diff --git a/examples/ThreadedSmbCrawler$SmbCrawlerThread.class b/examples/ThreadedSmbCrawler$SmbCrawlerThread.class
deleted file mode 100644 (file)
index a95e988..0000000
Binary files a/examples/ThreadedSmbCrawler$SmbCrawlerThread.class and /dev/null differ
diff --git a/examples/ThreadedSmbCrawler.class b/examples/ThreadedSmbCrawler.class
deleted file mode 100644 (file)
index e0747bf..0000000
Binary files a/examples/ThreadedSmbCrawler.class and /dev/null differ
diff --git a/examples/ThreadedUniQuery$QThread.class b/examples/ThreadedUniQuery$QThread.class
deleted file mode 100644 (file)
index 02d02e0..0000000
Binary files a/examples/ThreadedUniQuery$QThread.class and /dev/null differ
diff --git a/examples/ThreadedUniQuery.class b/examples/ThreadedUniQuery.class
deleted file mode 100644 (file)
index 08632f7..0000000
Binary files a/examples/ThreadedUniQuery.class and /dev/null differ
diff --git a/examples/Torture1.class b/examples/Torture1.class
deleted file mode 100644 (file)
index 72d5f77..0000000
Binary files a/examples/Torture1.class and /dev/null differ
diff --git a/examples/Torture2.class b/examples/Torture2.class
deleted file mode 100644 (file)
index e688b4f..0000000
Binary files a/examples/Torture2.class and /dev/null differ
diff --git a/examples/TortureTest5.class b/examples/TortureTest5.class
deleted file mode 100644 (file)
index cadf7c2..0000000
Binary files a/examples/TortureTest5.class and /dev/null differ
diff --git a/examples/TransactNamedPipe.class b/examples/TransactNamedPipe.class
deleted file mode 100644 (file)
index 76f861c..0000000
Binary files a/examples/TransactNamedPipe.class and /dev/null differ
diff --git a/examples/URLTest.class b/examples/URLTest.class
deleted file mode 100644 (file)
index 5263435..0000000
Binary files a/examples/URLTest.class and /dev/null differ
diff --git a/examples/VerifyGuest.class b/examples/VerifyGuest.class
deleted file mode 100644 (file)
index 6a8ce08..0000000
Binary files a/examples/VerifyGuest.class and /dev/null differ
diff --git a/examples/VerifyIO.class b/examples/VerifyIO.class
deleted file mode 100644 (file)
index 1168477..0000000
Binary files a/examples/VerifyIO.class and /dev/null differ
diff --git a/examples/VerifyReads.class b/examples/VerifyReads.class
deleted file mode 100644 (file)
index ff0d0a1..0000000
Binary files a/examples/VerifyReads.class and /dev/null differ
diff --git a/examples/Worker.class b/examples/Worker.class
deleted file mode 100644 (file)
index 25fa3b2..0000000
Binary files a/examples/Worker.class and /dev/null differ
diff --git a/examples/m31_gendler_big.jpg b/examples/m31_gendler_big.jpg
deleted file mode 100644 (file)
index bcbb749..0000000
Binary files a/examples/m31_gendler_big.jpg and /dev/null differ
index c5c0874..0d9ce62 100644 (file)
 
 package jcifs.smb;
 
-import jcifs.UniAddress;
+import java.io.Serializable;
 import jcifs.util.Hexdump;
+import jcifs.UniAddress;
 
-public final class NtlmChallenge {
+public final class NtlmChallenge implements Serializable {
 
     public byte[] challenge;
     public UniAddress dc;
index 5ef8431..dc5dd15 100644 (file)
@@ -52,104 +52,79 @@ changed without changing init parameters or reinitializing the webapp.
 
 public final class SmbSession {
 
-    private static final String LOGON_SHARE = Config.getProperty( "jcifs.smb.client.logonShare", null );
-    private static final int LOOKUP_RESP_LIMIT = jcifs.Config.getInt( "jcifs.netbios.lookupRespLimit", 5 );
-    private static final String DOMAIN = Config.getProperty("jcifs.smb.client.domain", null);
-    private static final String USERNAME = Config.getProperty("jcifs.smb.client.username", null);
-    private static final int CACHE_POLICY = Config.getInt( "jcifs.netbios.cachePolicy", 1200 );
+    private static final String LOGON_SHARE =
+                Config.getProperty( "jcifs.smb.client.logonShare", null );
+    private static final int LOOKUP_RESP_LIMIT =
+                Config.getInt( "jcifs.netbios.lookupRespLimit", 3 );
+    private static final String DOMAIN =
+                Config.getProperty("jcifs.smb.client.domain", null);
+    private static final String USERNAME =
+                Config.getProperty("jcifs.smb.client.username", null);
+    private static final int CACHE_POLICY =
+                Config.getInt( "jcifs.netbios.cachePolicy", 60 * 10 ) * 60; /* 10 hours */
 
-    static long dc_list_expiration;
     static NbtAddress[] dc_list = null;
-    static int dc_list_index;         /* always less than dc_list_range */
-    static int dc_list_range = 1; /* always less than LOOKUP_RESP_LIMIT */
-
-    static void incr_dc_list_range() {
-        if( dc_list_range < LOOKUP_RESP_LIMIT &&
-                dc_list_range < dc_list.length ) {
-            dc_list_range++;
+    static long dc_list_expiration;
+    static int dc_list_counter;
+
+    private static NtlmChallenge interrogate( NbtAddress addr ) throws SmbException {
+        UniAddress dc = new UniAddress( addr );
+        SmbTransport trans = SmbTransport.getSmbTransport( dc, 0 );
+        if (USERNAME == null) {
+            trans.negotiate();
+            if (SmbTransport.log.level > 2)
+                SmbTransport.log.println(
+                    "Default credentials (jcifs.smb.client.username/password)" +
+                    " not specified. SMB signing may not work propertly." +
+                    "  Skipping DC interrogation." );
+        } else {
+            SmbSession ssn = trans.getSmbSession( NtlmPasswordAuthentication.DEFAULT );
+            ssn.getSmbTree( LOGON_SHARE, null ).treeConnect( null, null );
         }
+        return new NtlmChallenge( trans.server.encryptionKey, dc );
     }
     public static NtlmChallenge getChallengeForDomain()
                 throws SmbException, UnknownHostException {
-        int starting_index;
-
         if( DOMAIN == null ) {
             throw new SmbException( "A domain was not specified" );
         }
-synchronized( DOMAIN ) {
-        if( dc_list_expiration < System.currentTimeMillis() ) {
-            dc_list_expiration = System.currentTimeMillis() + CACHE_POLICY * 1000L;
-
-            if( SmbTransport.log.level > 2 ) {
-                SmbTransport.log.println( (new java.util.Date()) +
-                        ": LOGON_SHARE=" + LOGON_SHARE +
-                        ",LOOKUP_RESP_LIMIT=" + LOOKUP_RESP_LIMIT +
-                        ",DOMAIN=" + DOMAIN +
-                        ",USERNAME=" + USERNAME +
-                        ",CACHE_POLICY=" + CACHE_POLICY +
-                        ",dc_list.length=" + (dc_list == null ? 0 : dc_list.length) +
-                        ",dc_list_range=" + dc_list_range +
-                        ",dc_list_index=" + dc_list_index );
-            }
-
-            NbtAddress[] new_dc_list = NbtAddress.getAllByName( DOMAIN, 0x1C, null, null );
-            if( new_dc_list == null) {
-                dc_list_expiration = System.currentTimeMillis() + 10000; /* 10sec */
-                throw new UnknownHostException( DOMAIN );
-            } else if( new_dc_list.length >= dc_list_range ) {
-                dc_list = new_dc_list;
-            }
-            if( dc_list_range > 1 ) {
-                dc_list_range /= 2; /* shrink dc_list_range */
+        synchronized (DOMAIN) {
+            long now = System.currentTimeMillis();
+            if (dc_list_expiration < now) {
+                dc_list_expiration = now + CACHE_POLICY * 1000L;
+                NbtAddress[] list = NbtAddress.getAllByName( DOMAIN, 0x1C, null, null );
+                if (list != null && list.length > 0) {
+                    dc_list = list;
+                } else { /* keep using the old list */
+                    dc_list_expiration = now + 1000 * 60 * 15; /* 15 min */
+                    if (SmbTransport.log.level > 1) {
+                        SmbTransport.log.println( "Failed to retrieve DC list from WINS" );
+                    }
+                }
             }
-        }
 
-        starting_index = dc_list_index;
-        do {
-            if( dc_list_index == dc_list_range ) {
-                dc_list_index = 0;
-            }
-            NbtAddress addr = dc_list[dc_list_index];
-            if( addr != null ) {
-                try {
-                    UniAddress dc = new UniAddress( addr );
-                    SmbTransport trans = SmbTransport.getSmbTransport( dc, 0 );
-                    if( USERNAME == null ) {
-                        if( SmbTransport.log.level > 2 )
-                            SmbTransport.log.println(
-                                "Default credentials (jcifs.smb.client.username/password)" +
-                                " not specified. SMB signing may not work propertly." +
-                                "  Skipping DC interrogation." );
-                        trans.negotiate();
-                    } else {
-                        trans.getSmbSession( NtlmPasswordAuthentication.DEFAULT ).getSmbTree(
-                                LOGON_SHARE, null ).treeConnect( null, null );
+            int max = Math.min( dc_list.length, LOOKUP_RESP_LIMIT );
+            for (int j = 0; j < max; j++) {
+                int i = dc_list_counter++ % max;
+                if (dc_list[i] != null) {
+                    try {
+                        return interrogate( dc_list[i] );
+                    } catch (SmbException se) {
+                        if (SmbTransport.log.level > 1)
+                            SmbTransport.log.println( "Failed validate DC: " + dc_list[i] +
+                                    ": " + se.getMessage() );
                     }
-synchronized( trans ) {
-                    if( trans.sessions.size() > (trans.SSN_LIMIT / 10)) {
-                        incr_dc_list_range();
-                    }
-}
-                    dc_list_index++;
-                    return new NtlmChallenge( trans.server.encryptionKey, dc );
-                } catch( SmbException se ) {
-                    if( SmbTransport.log.level > 1 )
-                        SmbTransport.log.println( "Failed validate DC: " + addr +
-                                ": " + se.getMessage() );
+                    dc_list[i] = null;
                 }
-                dc_list[dc_list_index] = null; /* dc no good */
-                incr_dc_list_range();
             }
-            dc_list_index++;
-        } while( dc_list_index != starting_index );
-}
 
-        dc_list_expiration = System.currentTimeMillis() + 10000; /* 10sec */
+            dc_list_expiration = now + 1000 * 60 * 15; /* 15 min */
+        }
+
         throw new UnknownHostException(
                 "Failed to negotiate with a suitable domain controller for " + DOMAIN );
     }
 
-
     public static byte[] getChallenge( UniAddress dc )
                 throws SmbException, UnknownHostException {
         return getChallenge(dc, 0);