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)
This commit is contained in:
Warren
2026-06-16 09:49:12 +08:00
parent cfec85ddfc
commit 1d9d144335
173 changed files with 2925 additions and 23 deletions
+1
View File
@@ -0,0 +1 @@
File 1 content
+1
View File
@@ -0,0 +1 @@
File 10 content
+1
View File
@@ -0,0 +1 @@
File 100 content
+1
View File
@@ -0,0 +1 @@
File 11 content
+1
View File
@@ -0,0 +1 @@
File 12 content
+1
View File
@@ -0,0 +1 @@
File 13 content
+1
View File
@@ -0,0 +1 @@
File 14 content
+1
View File
@@ -0,0 +1 @@
File 15 content
+1
View File
@@ -0,0 +1 @@
File 16 content
+1
View File
@@ -0,0 +1 @@
File 17 content
+1
View File
@@ -0,0 +1 @@
File 18 content
+1
View File
@@ -0,0 +1 @@
File 19 content
+1
View File
@@ -0,0 +1 @@
File 2 content
+1
View File
@@ -0,0 +1 @@
File 20 content
+1
View File
@@ -0,0 +1 @@
File 21 content
+1
View File
@@ -0,0 +1 @@
File 22 content
+1
View File
@@ -0,0 +1 @@
File 23 content
+1
View File
@@ -0,0 +1 @@
File 24 content
+1
View File
@@ -0,0 +1 @@
File 25 content
+1
View File
@@ -0,0 +1 @@
File 26 content
+1
View File
@@ -0,0 +1 @@
File 27 content
+1
View File
@@ -0,0 +1 @@
File 28 content
+1
View File
@@ -0,0 +1 @@
File 29 content
+1
View File
@@ -0,0 +1 @@
File 3 content
+1
View File
@@ -0,0 +1 @@
File 30 content
+1
View File
@@ -0,0 +1 @@
File 31 content
+1
View File
@@ -0,0 +1 @@
File 32 content
+1
View File
@@ -0,0 +1 @@
File 33 content
+1
View File
@@ -0,0 +1 @@
File 34 content
+1
View File
@@ -0,0 +1 @@
File 35 content
+1
View File
@@ -0,0 +1 @@
File 36 content
+1
View File
@@ -0,0 +1 @@
File 37 content
+1
View File
@@ -0,0 +1 @@
File 38 content
+1
View File
@@ -0,0 +1 @@
File 39 content
+1
View File
@@ -0,0 +1 @@
File 4 content
+1
View File
@@ -0,0 +1 @@
File 40 content
+1
View File
@@ -0,0 +1 @@
File 41 content
+1
View File
@@ -0,0 +1 @@
File 42 content
+1
View File
@@ -0,0 +1 @@
File 43 content
+1
View File
@@ -0,0 +1 @@
File 44 content
+1
View File
@@ -0,0 +1 @@
File 45 content
+1
View File
@@ -0,0 +1 @@
File 46 content
+1
View File
@@ -0,0 +1 @@
File 47 content
+1
View File
@@ -0,0 +1 @@
File 48 content
+1
View File
@@ -0,0 +1 @@
File 49 content
+1
View File
@@ -0,0 +1 @@
File 5 content
+1
View File
@@ -0,0 +1 @@
File 50 content
+1
View File
@@ -0,0 +1 @@
File 51 content
+1
View File
@@ -0,0 +1 @@
File 52 content
+1
View File
@@ -0,0 +1 @@
File 53 content
+1
View File
@@ -0,0 +1 @@
File 54 content
+1
View File
@@ -0,0 +1 @@
File 55 content
+1
View File
@@ -0,0 +1 @@
File 56 content
+1
View File
@@ -0,0 +1 @@
File 57 content
+1
View File
@@ -0,0 +1 @@
File 58 content
+1
View File
@@ -0,0 +1 @@
File 59 content
+1
View File
@@ -0,0 +1 @@
File 6 content
+1
View File
@@ -0,0 +1 @@
File 60 content
+1
View File
@@ -0,0 +1 @@
File 61 content
+1
View File
@@ -0,0 +1 @@
File 62 content
+1
View File
@@ -0,0 +1 @@
File 63 content
+1
View File
@@ -0,0 +1 @@
File 64 content
+1
View File
@@ -0,0 +1 @@
File 65 content
+1
View File
@@ -0,0 +1 @@
File 66 content
+1
View File
@@ -0,0 +1 @@
File 67 content
+1
View File
@@ -0,0 +1 @@
File 68 content
+1
View File
@@ -0,0 +1 @@
File 69 content
+1
View File
@@ -0,0 +1 @@
File 7 content
+1
View File
@@ -0,0 +1 @@
File 70 content
+1
View File
@@ -0,0 +1 @@
File 71 content
+1
View File
@@ -0,0 +1 @@
File 72 content
+1
View File
@@ -0,0 +1 @@
File 73 content
+1
View File
@@ -0,0 +1 @@
File 74 content
+1
View File
@@ -0,0 +1 @@
File 75 content
+1
View File
@@ -0,0 +1 @@
File 76 content
+1
View File
@@ -0,0 +1 @@
File 77 content
+1
View File
@@ -0,0 +1 @@
File 78 content
+1
View File
@@ -0,0 +1 @@
File 79 content
+1
View File
@@ -0,0 +1 @@
File 8 content
+1
View File
@@ -0,0 +1 @@
File 80 content
+1
View File
@@ -0,0 +1 @@
File 81 content
+1
View File
@@ -0,0 +1 @@
File 82 content
+1
View File
@@ -0,0 +1 @@
File 83 content
+1
View File
@@ -0,0 +1 @@
File 84 content
+1
View File
@@ -0,0 +1 @@
File 85 content
+1
View File
@@ -0,0 +1 @@
File 86 content
+1
View File
@@ -0,0 +1 @@
File 87 content
+1
View File
@@ -0,0 +1 @@
File 88 content
+1
View File
@@ -0,0 +1 @@
File 89 content
+1
View File
@@ -0,0 +1 @@
File 9 content
+1
View File
@@ -0,0 +1 @@
File 90 content
+1
View File
@@ -0,0 +1 @@
File 91 content
+1
View File
@@ -0,0 +1 @@
File 92 content
+1
View File
@@ -0,0 +1 @@
File 93 content
+1
View File
@@ -0,0 +1 @@
File 94 content
+1
View File
@@ -0,0 +1 @@
File 95 content
+1
View File
@@ -0,0 +1 @@
File 96 content
+1
View File
@@ -0,0 +1 @@
File 97 content
+1
View File
@@ -0,0 +1 @@
File 98 content
+1
View File
@@ -0,0 +1 @@
File 99 content