From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 93FB46C822 for ; Mon, 1 Feb 2021 08:55:51 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 89B9E21DC5 for ; Mon, 1 Feb 2021 08:55:21 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id B1A2521DB9 for ; Mon, 1 Feb 2021 08:55:20 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 75D6A4250E for ; Mon, 1 Feb 2021 08:55:20 +0100 (CET) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Mon, 1 Feb 2021 08:55:17 +0100 Message-Id: <20210201075518.21727-3-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210201075518.21727-1-d.csapak@proxmox.com> References: <20210201075518.21727-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.009 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_NUMSUBJECT 0.5 Subject ends in numbers excluding current years RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pbs-devel] [PATCH xtermjs 2/3] update to mio 0.7 X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 01 Feb 2021 07:55:51 -0000 notable changes: * all polls in mio are now edge triggered, so no need for PollOpt, etc. * functionality of UnixReady is now in the mio::Event directly (UnixReady::is_hup -> event.is_read_closed()) * TcpListener::from_std() is not a result anymore * EventedFd -> SourceFd * mio::net::TcpListener cannot accept_std anymore, so convert everywhere to mio::net::TcpStream, drop set_read_timeout (this warrants another patch) Signed-off-by: Dominik Csapak --- src/main.rs | 48 ++++++++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/main.rs b/src/main.rs index 12e70bc..07fa1a8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ use std::cmp::min; use std::collections::HashMap; use std::ffi::{OsStr, OsString}; use std::io::{ErrorKind, Result, Write}; -use std::net::TcpStream; use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::process::CommandExt; use std::process::Command; @@ -10,9 +9,9 @@ use std::time::{Duration, Instant}; use clap::{App, AppSettings, Arg}; use curl::easy::Easy; -use mio::net::TcpListener; -use mio::unix::{EventedFd, UnixReady}; -use mio::{Events, Poll, PollOpt, Ready, Token}; +use mio::net::{TcpListener, TcpStream}; +use mio::{Events, Poll, Token, Interest}; +use mio::unix::SourceFd; use proxmox::sys::error::io_err_other; use proxmox::sys::linux::pty::{make_controlling_terminal, PTY}; @@ -98,7 +97,6 @@ fn read_ticket_line( if buf.is_full() || now.elapsed() >= timeout { io_bail!("authentication data is incomplete: {:?}", &buf[..]); } - stream.set_read_timeout(Some(Duration::new(1, 0)))?; match buf.read_from(stream) { Ok(n) => { if n == 0 { @@ -110,7 +108,6 @@ fn read_ticket_line( } } - stream.set_read_timeout(None)?; let newline_idx = &buf[..].iter().position(|&x| x == b'\n').unwrap(); let line = buf.remove_data(*newline_idx); @@ -182,10 +179,10 @@ fn listen_and_accept( std::net::TcpListener::bind((hostname, port as u16))? }; let port = listener.local_addr()?.port(); - let listener = TcpListener::from_std(listener)?; - let poll = Poll::new()?; + let mut listener = TcpListener::from_std(listener); + let mut poll = Poll::new()?; - poll.register(&listener, Token(0), Ready::readable(), PollOpt::edge())?; + poll.registry().register(&mut listener, Token(0), Interest::READABLE)?; let mut events = Events::with_capacity(1); @@ -195,7 +192,7 @@ fn listen_and_accept( poll.poll(&mut events, Some(timeout))?; let elapsed = now.elapsed(); if !events.is_empty() { - let (stream, client) = listener.accept_std()?; + let (stream, client) = listener.accept()?; println!("client connection: {:?}", client); return Ok((stream, port)); } @@ -287,34 +284,30 @@ fn do_main() -> Result<()> { return Err(io_format_err!("Invalid FD number")); } - let (mut stream, port) = + let (mut tcp_handle, port) = listen_and_accept("localhost", port, use_port_as_fd, Duration::new(10, 0)) .map_err(|err| io_format_err!("failed waiting for client: {}", err))?; - let (username, ticket) = read_ticket_line(&mut stream, &mut pty_buf, Duration::new(10, 0)) + let (username, ticket) = read_ticket_line(&mut tcp_handle, &mut pty_buf, Duration::new(10, 0)) .map_err(|err| io_format_err!("failed reading ticket: {}", err))?; let port = if use_port_as_fd { Some(port) } else { None }; authenticate(&username, &ticket, path, perm, authport, port)?; - stream.write_all(b"OK").expect("error writing response"); + tcp_handle.write_all(b"OK").expect("error writing response"); - let mut tcp_handle = mio::net::TcpStream::from_stream(stream)?; - - let poll = Poll::new()?; + let mut poll = Poll::new()?; let mut events = Events::with_capacity(128); let mut pty = run_pty(cmd, cmdparams)?; - poll.register( - &tcp_handle, + poll.registry().register( + &mut tcp_handle, TCP, - Ready::readable() | Ready::writable() | UnixReady::hup(), - PollOpt::edge(), + Interest::READABLE.add(Interest::WRITABLE) )?; - poll.register( - &EventedFd(&pty.as_raw_fd()), + poll.registry().register( + &mut SourceFd(&pty.as_raw_fd()), PTY, - Ready::readable() | Ready::writable() | UnixReady::hup(), - PollOpt::edge(), + Interest::READABLE.add(Interest::WRITABLE) )?; let mut tcp_writable = true; @@ -332,10 +325,9 @@ fn do_main() -> Result<()> { } for event in &events { - let readiness = event.readiness(); - let writable = readiness.is_writable(); - let readable = readiness.is_readable(); - if UnixReady::from(readiness).is_hup() { + let writable = event.is_writable(); + let readable = event.is_readable(); + if event.is_read_closed() { finished = true; } match event.token() { -- 2.20.1