| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 | 
							- // This code is derived from jcifs smb client library <jcifs at samba dot org>
 
- // Ported by J. Arturo <webmaster at komodosoft dot net>
 
- //  
 
- // This library is free software; you can redistribute it and/or
 
- // modify it under the terms of the GNU Lesser General Public
 
- // License as published by the Free Software Foundation; either
 
- // version 2.1 of the License, or (at your option) any later version.
 
- // 
 
- // This library is distributed in the hope that it will be useful,
 
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
 
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
- // Lesser General Public License for more details.
 
- // 
 
- // You should have received a copy of the GNU Lesser General Public
 
- // License along with this library; if not, write to the Free Software
 
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
- using System.IO;
 
- using SharpCifs.Smb;
 
- using SharpCifs.Util;
 
- using SharpCifs.Util.Sharpen;
 
- namespace SharpCifs.Netbios
 
- {
 
- 	public class Lmhosts
 
- 	{
 
- 		private static readonly string Filename = Config.GetProperty("jcifs.netbios.lmhosts"
 
- 			);
 
- 		private static readonly Hashtable Tab = new Hashtable();
 
- 		private static long _lastModified = 1L;
 
- 		private static int _alt;
 
- 		private static LogStream _log = LogStream.GetInstance();
 
- 		/// <summary>
 
- 		/// This is really just for
 
- 		/// <see cref="SharpCifs.UniAddress">Jcifs.UniAddress</see>
 
- 		/// . It does
 
- 		/// not throw an
 
- 		/// <see cref="UnknownHostException">Sharpen.UnknownHostException</see>
 
- 		/// because this
 
- 		/// is queried frequently and exceptions would be rather costly to
 
- 		/// throw on a regular basis here.
 
- 		/// </summary>
 
- 		public static NbtAddress GetByName(string host)
 
- 		{
 
- 			lock (typeof(Lmhosts))
 
- 			{
 
- 				return GetByName(new Name(host, 0x20, null));
 
- 			}
 
- 		}
 
- 		internal static NbtAddress GetByName(Name name)
 
- 		{
 
- 			lock (typeof(Lmhosts))
 
- 			{
 
- 				NbtAddress result = null;
 
- 				try
 
- 				{
 
- 					if (Filename != null)
 
- 					{
 
- 						FilePath f = new FilePath(Filename);
 
- 						long lm;
 
- 						if ((lm = f.LastModified()) > _lastModified)
 
- 						{
 
- 							_lastModified = lm;
 
- 							Tab.Clear();
 
- 							_alt = 0;
 
- 							
 
- 							//path -> fileStream
 
- 							//Populate(new FileReader(f));
 
-                             Populate(new FileReader(new FileStream(f, FileMode.Open)));
 
- 						}
 
- 						result = (NbtAddress)Tab[name];
 
- 					}
 
- 				}
 
- 				catch (FileNotFoundException fnfe)
 
- 				{
 
- 					if (_log.Level > 1)
 
- 					{
 
- 						_log.WriteLine("lmhosts file: " + Filename);
 
- 						Runtime.PrintStackTrace(fnfe, _log);
 
- 					}
 
- 				}
 
- 				catch (IOException ioe)
 
- 				{
 
- 					if (_log.Level > 0)
 
- 					{
 
- 						Runtime.PrintStackTrace(ioe, _log);
 
- 					}
 
- 				}
 
- 				return result;
 
- 			}
 
- 		}
 
- 		/// <exception cref="System.IO.IOException"></exception>
 
- 		internal static void Populate(StreamReader r)
 
- 		{
 
- 			string line;
 
-             BufferedReader br = new BufferedReader((InputStreamReader)r);
 
- 			while ((line = br.ReadLine()) != null)
 
- 			{
 
- 				line = line.ToUpper().Trim();
 
- 				if (line.Length == 0)
 
- 				{
 
- 				}
 
- 				else
 
- 				{
 
- 					if (line[0] == '#')
 
- 					{
 
- 						if (line.StartsWith("#INCLUDE "))
 
- 						{
 
- 							line = Runtime.Substring(line, line.IndexOf('\\'));
 
- 							string url = "smb:" + line.Replace('\\', '/');
 
- 							if (_alt > 0)
 
- 							{
 
- 								try
 
- 								{
 
- 									Populate(new InputStreamReader(new SmbFileInputStream(url)));
 
- 								}
 
- 								catch (IOException ioe)
 
- 								{
 
- 									_log.WriteLine("lmhosts URL: " + url);
 
- 									Runtime.PrintStackTrace(ioe, _log);
 
- 									continue;
 
- 								}
 
- 								_alt--;
 
- 								while ((line = br.ReadLine()) != null)
 
- 								{
 
- 									line = line.ToUpper().Trim();
 
- 									if (line.StartsWith("#END_ALTERNATE"))
 
- 									{
 
- 										break;
 
- 									}
 
- 								}
 
- 							}
 
- 							else
 
- 							{
 
- 								Populate(new InputStreamReader(new SmbFileInputStream(url)));
 
- 							}
 
- 						}
 
- 						else
 
- 						{
 
- 							if (line.StartsWith("#BEGIN_ALTERNATE"))
 
- 							{
 
- 								_alt++;
 
- 							}
 
- 							else
 
- 							{
 
- 								if (line.StartsWith("#END_ALTERNATE") && _alt > 0)
 
- 								{
 
- 									_alt--;
 
- 									throw new IOException("no lmhosts alternate includes loaded");
 
- 								}
 
- 							}
 
- 						}
 
- 					}
 
- 					else
 
- 					{
 
- 						if (char.IsDigit(line[0]))
 
- 						{
 
- 							char[] data = line.ToCharArray();
 
- 							int ip;
 
- 							int i;
 
- 							int j;
 
- 							Name name;
 
- 							NbtAddress addr;
 
- 							char c;
 
- 							c = '.';
 
- 							ip = i = 0;
 
- 							for (; i < data.Length && c == '.'; i++)
 
- 							{
 
- 								int b = unchecked(0x00);
 
- 								for (; i < data.Length && (c = data[i]) >= 48 && c <= 57; i++)
 
- 								{
 
- 									b = b * 10 + c - '0';
 
- 								}
 
- 								ip = (ip << 8) + b;
 
- 							}
 
- 							while (i < data.Length && char.IsWhiteSpace(data[i]))
 
- 							{
 
- 								i++;
 
- 							}
 
- 							j = i;
 
- 							while (j < data.Length && char.IsWhiteSpace(data[j]) == false)
 
- 							{
 
- 								j++;
 
- 							}
 
- 							name = new Name(Runtime.Substring(line, i, j), unchecked(0x20), null
 
- 								);
 
- 							addr = new NbtAddress(name, ip, false, NbtAddress.BNode, false, false, true, true
 
- 								, NbtAddress.UnknownMacAddress);
 
- 							Tab.Put(name, addr);
 
- 						}
 
- 					}
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- }
 
 
  |