Files
markbase/markbase-core/Cargo.toml
Warren 1d9d144335 Implement Phase 14.2: OpenSSH unified poll mechanism with child process management
**Key Achievements**:
-  Unified poll mechanism (client + stdout + stderr monitoring)
-  Child process status detection (try_wait integration)
-  EOF pipe closure to prevent infinite loops
-  stdin force-close timeout (590ms) for rsync EOF signaling
-  child_exited handling with SSH_MSG_CHANNEL_EOF + CLOSE
-  Small file transfer success (<=1MB, MD5 verified)

**Technical Implementation**:
- poll_exec_stdout_and_client(): 100-iteration poll loop with stdin_closed tracking
- Force stdin close after 50 iterations without data (500ms timeout)
- stdout/stderr EOF detection with pipe closure (exec_process.stdout/stderr = None)
- Child exited check after pipes closed (return child_exited flag)
- handle_child_exited(): automatic EOF + CLOSE packet generation

**Testing Results**:
- 100KB: Success (MD5: 67d6566ea4e488c0916f78f6cfdbc727)
- 1MB: Success (MD5: 38fd6536467443dfdc91f89c0fd573d8, 50.18MB/s)
- 5MB+: Partial failure (stdin stops at ~7MB due to rsync protocol handshake)

**Root Cause Analysis**:
- Large file transfer limited by rsync protocol expectations
- Client expects stdout responses during transfer (progress/acknowledgment)
- Current implementation only does stdin/stdout forwarding
- Requires Phase 8 (rsync protocol support) for complete large file handling

**Architecture**:
- OpenSSH-style poll mechanism (session.c: do_exec_no_pty)
- Non-blocking I/O (O_NONBLOCK on stdout/stderr)
- nix::poll with 10ms timeout
- Child process state tracking across poll iterations

**Files Modified**:
- channel.rs: 1300+ lines (poll_exec_stdout_and_client, handle_child_exited)
- server.rs: unified poll integration in handle_ssh_service_loop
- Total: ~400 lines new code, 100+ lines modifications

**Next Steps**:
- Phase 8: rsync protocol implementation (handshake, progress, acknowledgment)
- Expected: 500+ lines code, complete large file support

**Progress**: SSH Phase 14.2 complete (95% total SSH implementation)
2026-06-16 09:49:12 +08:00

72 lines
2.2 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[package]
name = "markbase-core"
version = "0.2.0"
edition = "2021"
[dependencies]
# === 核心压缩库Phase 1-2已完成===
zip = "0.6" # ZIP格式稳定版本
tar = "0.4.46" # TAR格式
flate2 = "1.1" # GZIP格式已有
tempfile = "3.12" # 临时目录(解压时需要)
# === 可选压缩库Phase 3争议格式===
unrar = { version = "0.4.0", optional = true } # RAR解压 ⚠️法律风险
xz2 = { version = "0.1.7", optional = true } # XZ格式 ⚠️外部依赖
sevenz-rust = { version = "0.6.1", optional = true } # 7z格式 ⚠️库不稳定(修正版本号)
anyhow = "1"
axum = { version = "0.7", features = ["macros"] }
bcrypt = "0.16"
chrono = { version = "0.4", features = ["serde"] }
regex = "1"
clap = { version = "4", features = ["derive"] }
dav-server = "0.11"
filetree = { path = "../filetree" }
futures-util = "0.3"
log = "0.4"
env_logger = "0.11"
markbase-webdav = { path = "../markbase-webdav" }
pulldown-cmark = "0.12"
rusqlite = { version = "0.32", features = ["bundled"] }
sled = "1.0.0-alpha.124"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
sha2 = "0.10"
hmac = "0.12"
filetime = "0.2"
base64 = "0.22"
tokio = { version = "1", features = ["full"] }
tokio-postgres = "0.7"
russh = "0.61.2"
russh-keys = "0.50.0-beta.7"
russh-sftp = "2.3.0"
ssh2 = "0.9.4"
ssh-key = "0.7.0-rc.10"
rand = "0.8"
axum-extra = { version = "0.9", features = ["multipart"] }
tokio-util = { version = "0.7", features = ["io"] }
toml = "0.8"
uuid = { version = "1", features = ["v4"] }
dashmap = "6.1"
md5 = "0.8"
adler = "1.0"
byteorder = "1.5"
x25519-dalek = "2.0"
ed25519-dalek = { version = "2.0", features = ["rand_core"] }
aes = "0.8"
ctr = "0.9"
cipher = "0.4"
nix = { version = "0.29", features = ["poll", "fs"] } # Phase 14: OpenSSH风格的poll()和非阻塞I/Ofs feature包含fcntl
[features]
default = [] # 默认不启用可选格式
optional-formats = ["unrar", "xz2", "sevenz-rust"] # 争议格式可选启用
[dev-dependencies]
# tempfile moved to dependencies (needed for archive extraction)
[[bin]]
name = "markbase-core"
path = "src/main.rs"