<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dpibreak.git/src/opt.rs, branch v0.6.0</title>
<subtitle>System-wide DPI circumvention with minimal configuration
</subtitle>
<id>http://git.dilluti0n.com/dpibreak.git/atom?h=v0.6.0</id>
<link rel='self' href='http://git.dilluti0n.com/dpibreak.git/atom?h=v0.6.0'/>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/'/>
<updated>2026-04-05T09:25:04Z</updated>
<entry>
<title>Add shopt -t, -a for --fake-ttl, --fake-autottl, respectively</title>
<updated>2026-04-05T09:25:04Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-04-05T09:23:25Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=88f92e05c89f28553adeba7d4866279b167af2f9'/>
<id>urn:sha1:88f92e05c89f28553adeba7d4866279b167af2f9</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add short option -d for --daemon, deprecating -D.</title>
<updated>2026-04-05T09:19:29Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-04-05T09:19:29Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=bbfafeb0a0f478dedc8574152b67dfc8be2c697a'/>
<id>urn:sha1:bbfafeb0a0f478dedc8574152b67dfc8be2c697a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>opt: add shopt for --segment-order and description</title>
<updated>2026-04-05T09:07:07Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-04-05T08:19:48Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=4205ad38509e1eab9936f2cc862c6f48e4cf10c1'/>
<id>urn:sha1:4205ad38509e1eab9936f2cc862c6f48e4cf10c1</id>
<content type='text'>
</content>
</entry>
<entry>
<title>pkt: implement segment-order aware send_split</title>
<updated>2026-04-05T09:07:01Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-04-05T07:50:42Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=405416f946c9a474d89d7fc989c1e78d63e841e8'/>
<id>urn:sha1:405416f946c9a474d89d7fc989c1e78d63e841e8</id>
<content type='text'>
Replace hardcoded [0,1] split with send_split accepting &amp;[Segment].
Segments exceeding payload length are warned and skipped. Add Segment
type to opt.rs with Display/Debug showing [start,end) notation.
</content>
</entry>
<entry>
<title>opt: implement SegmentOrder::new and Display</title>
<updated>2026-04-05T07:35:27Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-04-05T07:35:27Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=60f0ec214a59f5a3935c9347bc96bdf85f25de74'/>
<id>urn:sha1:60f0ec214a59f5a3935c9347bc96bdf85f25de74</id>
<content type='text'>
Parse comma-separated split points into sorted segment ranges as
(start, end): pairs. Display shows original input with computed
ranges, e.g. "5,1,0,3 ([5,end), [1,3), [0,1), [3,5))".
</content>
</entry>
<entry>
<title>opt: add SegmentOrder type and --segment-order option</title>
<updated>2026-04-05T07:24:42Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-04-05T07:24:42Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=54a9b442d72a4ae2f23e53dfb915c3cdf0eeaa42'/>
<id>urn:sha1:54a9b442d72a4ae2f23e53dfb915c3cdf0eeaa42</id>
<content type='text'>
SegmentOrder parses a comma-separated list of u32 split points, sorts
them, and precomputes segment ranges as (start, end) pairs for use in
send_split. The original input string is retained for Display. Parsing
logic is unimplemented and will follow in the next commit.
</content>
</entry>
<entry>
<title>log: add debug!/info!/warn!/error! macros and refactor to use it</title>
<updated>2026-03-01T15:25:37Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-03-01T15:22:51Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=4699bf9afd69d9f2323b1fc0f6abba7aaac23cc2'/>
<id>urn:sha1:4699bf9afd69d9f2323b1fc0f6abba7aaac23cc2</id>
<content type='text'>
</content>
</entry>
<entry>
<title>opt: decouple set_opt() from logging</title>
<updated>2026-02-15T17:52:03Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-02-15T17:49:49Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=b68753e878c440f1a11aa89f1f359764f1609734'/>
<id>urn:sha1:b68753e878c440f1a11aa89f1f359764f1609734</id>
<content type='text'>
set_opt() was logging each option as it set them, which created a
tight coupling between option initialization and log output timing.
This was particularly problematic for daemon mode: daemonize must
happen after set_opt() (to know whether -D was passed) but before
logging (so output goes to the log file, not stdout).

Split into set_opt() -&gt; InitializedOpts and InitializedOpts::log(),
using a typestate pattern to enforce at compile time that log() cannot
be called before set_opt(). This lets each platform's bootstrap()
handle daemonization between the two steps:

    let initialized = opt.set_opt()?;
    platform::bootstrap()?;   // daemonize here if needed
    initialized.log();        // now safe to log

Also:
- Move daemonize_1() into platform::bootstrap() on both platforms
- Make daemonize_1() / service_main() private to their platform modules
- Fix the long-standing TODO about using log_println in daemonize()
</content>
</entry>
<entry>
<title>Consolidate setup logic into run()</title>
<updated>2026-02-15T13:04:25Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-02-15T13:01:43Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=3cb2c192454964c2ae01e196eaa7fdd6434efeb5'/>
<id>urn:sha1:3cb2c192454964c2ae01e196eaa7fdd6434efeb5</id>
<content type='text'>
The bootstrap/run separation was unnecessary. Move all initialization
(cleanup + nftables setup): into run() and skip bootstrap in daemon
mode. We repurpose the bootstrap() function to only run in non-daemon
mode for future foreground-only initialization.

- Add OPT_DAEMON option to detect daemon mode
- Move cleanup() and install_rules() from bootstrap() to run()
- Make bootstrap() a no-op (only called in non-daemon mode)
</content>
</entry>
<entry>
<title>opt: refactor to detach parse_args and set_opt</title>
<updated>2026-02-15T06:59:26Z</updated>
<author>
<name>dilluti0n</name>
<email>hskimse1@gmail.com</email>
</author>
<published>2026-02-15T02:56:34Z</published>
<link rel='alternate' type='text/html' href='http://git.dilluti0n.com/dpibreak.git/commit/?id=40fc4485e56414ab379b2332a9994a23af16eb3f'/>
<id>urn:sha1:40fc4485e56414ab379b2332a9994a23af16eb3f</id>
<content type='text'>
</content>
</entry>
</feed>
