diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/com/it_jaros/jscanner/PortRange.java | 60 |
1 files changed, 37 insertions, 23 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/PortRange.java b/src/main/java/com/it_jaros/jscanner/PortRange.java index dd67176..8159336 100644 --- a/src/main/java/com/it_jaros/jscanner/PortRange.java +++ b/src/main/java/com/it_jaros/jscanner/PortRange.java @@ -10,37 +10,51 @@ public class PortRange { private final BitSet specifiedPorts = new BitSet(MAX_PORT); private final BitSet availablePorts = new BitSet(MAX_PORT); - private int cursor; + private int currentPortCursor; private int done = 0; public PortRange(String ports) { if (ports == null || "".equals(ports)) { - // keep defaults - specifiedPorts.set(1, 1024 + 1); - return; + specifiedPorts.set(MIN_PORT, 1024); + } else if ("all".equalsIgnoreCase(ports)) { + specifiedPorts.set(MIN_PORT, MAX_PORT); + } else { + parsePortRange(ports); } + availablePorts.or(specifiedPorts); + currentPortCursor = availablePorts.nextSetBit(MIN_PORT); + } + + /** + * Possible values are 1,10 or 1-10 or a mix of 1,5-10 + * So we treat , stronger and handle them first and then check for - + * + * @param ports + */ + private void parsePortRange(String ports) { String[] splitComma = ports.split(","); for (String commaValue : splitComma) { - if (commaValue.contains("-")) { - String[] rangeValue = commaValue.split("-"); - if (rangeValue.length > 2) { - throw new IllegalArgumentException(String.format("Argument contains too many '-'' %s", commaValue)); - } + String[] rangeValue = commaValue.split("-"); + + // more then two values are not possible + if (rangeValue.length > 2) { + throw new IllegalArgumentException(String.format("Argument contains too many '-'' %s", commaValue)); + } - int start = Integer.parseInt(rangeValue[0]); - int end = Integer.parseInt(rangeValue[1]); - checkValues(start, end); - specifiedPorts.set(start, end + 1); - } else { - int port = Integer.parseInt(commaValue); + // no range given, only single port + int port = Integer.parseInt(rangeValue[0]); + if (rangeValue.length == 1) { checkValue(port); - specifiedPorts.set(Integer.parseInt(commaValue)); + specifiedPorts.set(port); + continue; } - } - availablePorts.or(specifiedPorts); - cursor = availablePorts.nextSetBit(MIN_PORT); + // range given + int end = Integer.parseInt(rangeValue[1]); + checkValues(port, end); + specifiedPorts.set(port, end + 1); + } } private void checkValues(int start, int end) { @@ -66,10 +80,10 @@ public class PortRange { } public int next() { - int p = availablePorts.nextSetBit(cursor); + int p = availablePorts.nextSetBit(currentPortCursor); if (p > 0) { availablePorts.clear(p); - cursor = p + 1; + currentPortCursor = p + 1; done++; return p; } @@ -78,7 +92,7 @@ public class PortRange { } public boolean hasNext() { - return availablePorts.nextSetBit(cursor) > 0; + return availablePorts.nextSetBit(currentPortCursor) > 0; } public int getTotal() { @@ -88,4 +102,4 @@ public class PortRange { public int getDone() { return done; } -} +}
\ No newline at end of file |
