001: /* jcifs smb client library in Java
002: * Copyright (C) 2000 "Michael B. Allen" <jcifs at samba dot org>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package jcifs.netbios;
020:
021: import java.io.File;
022: import java.io.FileNotFoundException;
023: import java.io.FileReader;
024: import java.io.InputStreamReader;
025: import java.io.Reader;
026: import java.io.BufferedReader;
027: import java.io.IOException;
028: import java.util.Hashtable;
029: import java.net.UnknownHostException;
030: import jcifs.Config;
031: import jcifs.smb.SmbFileInputStream;
032: import jcifs.util.LogStream;
033:
034: public class Lmhosts {
035:
036: private static final String FILENAME = Config
037: .getProperty("jcifs.netbios.lmhosts");
038: private static final Hashtable TAB = new Hashtable();
039: private static long lastModified = 1L;
040: private static int alt;
041: private static LogStream log = LogStream.getInstance();
042:
043: /**
044: * This is really just for {@link jcifs.UniAddress}. It does
045: * not throw an {@link java.net.UnknownHostException} because this
046: * is queried frequently and exceptions would be rather costly to
047: * throw on a regular basis here.
048: */
049:
050: public synchronized static NbtAddress getByName(String host) {
051: return getByName(new Name(host, 0x20, null));
052: }
053:
054: synchronized static NbtAddress getByName(Name name) {
055: NbtAddress result = null;
056:
057: try {
058: if (FILENAME != null) {
059: File f = new File(FILENAME);
060: long lm;
061:
062: if ((lm = f.lastModified()) > lastModified) {
063: lastModified = lm;
064: TAB.clear();
065: alt = 0;
066: populate(new FileReader(f));
067: }
068: result = (NbtAddress) TAB.get(name);
069: }
070: } catch (FileNotFoundException fnfe) {
071: if (log.level > 1) {
072: log.println("lmhosts file: " + FILENAME);
073: fnfe.printStackTrace(log);
074: }
075: } catch (IOException ioe) {
076: if (log.level > 0)
077: ioe.printStackTrace(log);
078: }
079: return result;
080: }
081:
082: static void populate(Reader r) throws IOException {
083: String line;
084: BufferedReader br = new BufferedReader(r);
085:
086: while ((line = br.readLine()) != null) {
087: line = line.toUpperCase().trim();
088: if (line.length() == 0) {
089: continue;
090: } else if (line.charAt(0) == '#') {
091: if (line.startsWith("#INCLUDE ")) {
092: line = line.substring(line.indexOf('\\'));
093: String url = "smb:" + line.replace('\\', '/');
094:
095: if (alt > 0) {
096: try {
097: populate(new InputStreamReader(
098: new SmbFileInputStream(url)));
099: } catch (IOException ioe) {
100: log.println("lmhosts URL: " + url);
101: ioe.printStackTrace(log);
102: continue;
103: }
104:
105: /* An include was loaded successfully. We can skip
106: * all other includes up to the #END_ALTERNATE tag.
107: */
108:
109: alt--;
110: while ((line = br.readLine()) != null) {
111: line = line.toUpperCase().trim();
112: if (line.startsWith("#END_ALTERNATE")) {
113: break;
114: }
115: }
116: } else {
117: populate(new InputStreamReader(
118: new SmbFileInputStream(url)));
119: }
120: } else if (line.startsWith("#BEGIN_ALTERNATE")) {
121: alt++;
122: } else if (line.startsWith("#END_ALTERNATE") && alt > 0) {
123: alt--;
124: throw new IOException(
125: "no lmhosts alternate includes loaded");
126: }
127: } else if (Character.isDigit(line.charAt(0))) {
128: char[] data = line.toCharArray();
129: int ip, i, j;
130: Name name;
131: NbtAddress addr;
132: char c;
133:
134: c = '.';
135: ip = i = 0;
136: for (; i < data.length && c == '.'; i++) {
137: int b = 0x00;
138:
139: for (; i < data.length && (c = data[i]) >= 48
140: && c <= 57; i++) {
141: b = b * 10 + c - '0';
142: }
143: ip = (ip << 8) + b;
144: }
145: while (i < data.length
146: && Character.isWhitespace(data[i])) {
147: i++;
148: }
149: j = i;
150: while (j < data.length
151: && Character.isWhitespace(data[j]) == false) {
152: j++;
153: }
154:
155: name = new Name(line.substring(i, j), 0x20, null);
156: addr = new NbtAddress(name, ip, false,
157: NbtAddress.B_NODE, false, false, true, true,
158: NbtAddress.UNKNOWN_MAC_ADDRESS);
159: TAB.put(name, addr);
160: }
161: }
162: }
163: }
|