| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -15,16 +15,16 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 * 02110-1301, USA.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				 */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use crate::common::nom7::take_until_and_consume;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom7::combinator::peek;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom7::bytes::complete::take;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom7::{IResult};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom7::number::streaming::le_u8;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom7::bytes::streaming::tag;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom7::bytes::streaming::{take_until};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use crate::common::nom8::take_until_and_consume;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom8::combinator::peek;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom8::bytes::complete::take;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom8::{IResult, Parser};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom8::number::streaming::le_u8;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom8::bytes::streaming::tag;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				use nom8::bytes::streaming::{take_until};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				pub fn peek_message_is_ctl(i: &[u8]) -> IResult<&[u8], bool> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, v) = peek(le_u8)(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, v) = peek(le_u8).parse(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    Ok((i, v == b'\xff'))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -36,13 +36,13 @@ pub enum TelnetMessageType<'a> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				pub fn parse_ctl_suboption<'a>(i: &'a[u8], full: &'a[u8]) -> IResult<&'a[u8], &'a[u8]> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, _sc) = le_u8(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let tag: &[u8] = b"\xff\xf0";
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, x) = take_until(tag)(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, x) = take_until(tag).parse(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let o = &full[..(x.len()+3)];
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    Ok((i, o))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				pub fn parse_ctl_message(oi: &[u8]) -> IResult<&[u8], &[u8]> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, _) = tag(b"\xff")(oi)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, _) = tag(&b"\xff"[..])(oi)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, cmd) = le_u8(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, d) = match cmd {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        251..=254 => take(3_usize)(oi)?,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -54,7 +54,7 @@ pub fn parse_ctl_message(oi: &[u8]) -> IResult<&[u8], &[u8]> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				pub fn parse_message(i: &[u8]) -> IResult<&[u8], TelnetMessageType<'_>> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, v) = peek(le_u8)(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, v) = peek(le_u8).parse(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if v == b'\xff' {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let (i, c) = parse_ctl_message(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        Ok((i, TelnetMessageType::Control(c)))
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -66,7 +66,7 @@ pub fn parse_message(i: &[u8]) -> IResult<&[u8], TelnetMessageType<'_>> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// 'login: ', 'Password: ', possibly with leading ctls
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				pub fn parse_welcome_message(i: &[u8]) -> IResult<&[u8], TelnetMessageType<'_>> {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, v) = peek(le_u8)(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    let (i, v) = peek(le_u8).parse(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    if v == b'\xff' {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let (i, c) = parse_ctl_message(i)?;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        Ok((i, TelnetMessageType::Control(c)))
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |