summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/jscanner/PortRange.java
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-04-13 17:31:55 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-09 09:59:28 +0200
commit8b881560dd8884e8e54e1e64654f79749d9ff456 (patch)
treefaffd2348b9430bcda9591120a0aa392923e422c /src/main/java/com/it_jaros/jscanner/PortRange.java
parentb1bdcf02479f67a65f6176ed8a87b47925903e81 (diff)
Renamed package from network_scanner to jscanner
Diffstat (limited to 'src/main/java/com/it_jaros/jscanner/PortRange.java')
-rw-r--r--src/main/java/com/it_jaros/jscanner/PortRange.java91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/PortRange.java b/src/main/java/com/it_jaros/jscanner/PortRange.java
new file mode 100644
index 0000000..dd67176
--- /dev/null
+++ b/src/main/java/com/it_jaros/jscanner/PortRange.java
@@ -0,0 +1,91 @@
+package com.it_jaros.jscanner;
+
+import java.util.BitSet;
+import java.util.NoSuchElementException;
+
+public class PortRange {
+
+ public static final int MIN_PORT = 1;
+ public static final int MAX_PORT = 65535;
+ private final BitSet specifiedPorts = new BitSet(MAX_PORT);
+ private final BitSet availablePorts = new BitSet(MAX_PORT);
+
+ private int cursor;
+ private int done = 0;
+
+ public PortRange(String ports) {
+ if (ports == null || "".equals(ports)) {
+ // keep defaults
+ specifiedPorts.set(1, 1024 + 1);
+ return;
+ }
+
+ 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));
+ }
+
+ 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);
+ checkValue(port);
+ specifiedPorts.set(Integer.parseInt(commaValue));
+ }
+ }
+
+ availablePorts.or(specifiedPorts);
+ cursor = availablePorts.nextSetBit(MIN_PORT);
+ }
+
+ private void checkValues(int start, int end) {
+ checkValue(start);
+ checkValue(end);
+
+ if (start >= end) {
+ throw new IllegalArgumentException(
+ String.format("Start value cannot be equal or bigger than end value '%s >= %s'", start, end));
+ }
+ }
+
+ private void checkValue(int port) {
+ if (port < MIN_PORT) {
+ throw new IllegalArgumentException(
+ String.format("Start value smaller than allowed range %s < %s", port, MIN_PORT));
+ }
+
+ if (port > MAX_PORT) {
+ throw new IllegalArgumentException(
+ String.format("End value bigger than allowed range %s > %s", port, MAX_PORT));
+ }
+ }
+
+ public int next() {
+ int p = availablePorts.nextSetBit(cursor);
+ if (p > 0) {
+ availablePorts.clear(p);
+ cursor = p + 1;
+ done++;
+ return p;
+ }
+
+ throw new NoSuchElementException("Reached end of port range");
+ }
+
+ public boolean hasNext() {
+ return availablePorts.nextSetBit(cursor) > 0;
+ }
+
+ public int getTotal() {
+ return specifiedPorts.cardinality();
+ }
+
+ public int getDone() {
+ return done;
+ }
+}