Add TTL setting
This commit is contained in:
		
							parent
							
								
									3813999a6b
								
							
						
					
					
						commit
						d1ecf9122d
					
				
					 1 changed files with 54 additions and 25 deletions
				
			
		| 
						 | 
				
			
			@ -42,8 +42,9 @@ struct UdpHandle {
 | 
			
		|||
 | 
			
		||||
#[derive(Copy, Clone)]
 | 
			
		||||
enum SettingKind {
 | 
			
		||||
    Read,
 | 
			
		||||
    Write
 | 
			
		||||
    Ttl,
 | 
			
		||||
    ReadTimeout,
 | 
			
		||||
    WriteTimeout
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum Handle {
 | 
			
		||||
| 
						 | 
				
			
			@ -215,10 +216,12 @@ impl SchemeMut for Udpd {
 | 
			
		|||
 | 
			
		||||
                let path = str::from_utf8(buf).or(Err(Error::new(EINVAL)))?;
 | 
			
		||||
 | 
			
		||||
                if path == "read_timeout" {
 | 
			
		||||
                    Handle::Setting(file, SettingKind::Read)
 | 
			
		||||
                if path == "ttl" {
 | 
			
		||||
                    Handle::Setting(file, SettingKind::Ttl)
 | 
			
		||||
                } else if path == "read_timeout" {
 | 
			
		||||
                    Handle::Setting(file, SettingKind::ReadTimeout)
 | 
			
		||||
                } else if path == "write_timeout" {
 | 
			
		||||
                    Handle::Setting(file, SettingKind::Write)
 | 
			
		||||
                    Handle::Setting(file, SettingKind::WriteTimeout)
 | 
			
		||||
                } else {
 | 
			
		||||
                    if handle.remote.0 == Ipv4Addr::NULL || handle.remote.1 == 0 {
 | 
			
		||||
                        handle.remote = parse_socket(path);
 | 
			
		||||
| 
						 | 
				
			
			@ -269,18 +272,30 @@ impl SchemeMut for Udpd {
 | 
			
		|||
        };
 | 
			
		||||
 | 
			
		||||
        if let Handle::Udp(ref mut handle) = *self.handles.get_mut(&file).ok_or(Error::new(EBADF))? {
 | 
			
		||||
            let timeout = match kind {
 | 
			
		||||
                SettingKind::Read => handle.read_timeout,
 | 
			
		||||
                SettingKind::Write => handle.write_timeout
 | 
			
		||||
            let read_timeout = |timeout: &Option<TimeSpec>, buf: &mut [u8]| -> Result<usize> {
 | 
			
		||||
                if let Some(ref timespec) = *timeout {
 | 
			
		||||
                    timespec.deref().read(buf).map_err(|err| Error::new(err.raw_os_error().unwrap_or(EIO)))
 | 
			
		||||
                } else {
 | 
			
		||||
                    Ok(0)
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            let count = if let Some(timespec) = timeout {
 | 
			
		||||
                timespec.deref().read(buf).map_err(|err| Error::new(err.raw_os_error().unwrap_or(EIO)))?
 | 
			
		||||
            } else {
 | 
			
		||||
                0
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            Ok(count)
 | 
			
		||||
            match kind {
 | 
			
		||||
                SettingKind::Ttl => {
 | 
			
		||||
                    if let Some(mut ttl) = buf.get_mut(0) {
 | 
			
		||||
                        *ttl = handle.ttl;
 | 
			
		||||
                        Ok(1)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        Ok(0)
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                SettingKind::ReadTimeout => {
 | 
			
		||||
                    read_timeout(&handle.read_timeout, buf)
 | 
			
		||||
                },
 | 
			
		||||
                SettingKind::WriteTimeout => {
 | 
			
		||||
                    read_timeout(&handle.write_timeout, buf)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            Err(Error::new(EBADF))
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -334,20 +349,34 @@ impl SchemeMut for Udpd {
 | 
			
		|||
        };
 | 
			
		||||
 | 
			
		||||
        if let Handle::Udp(ref mut handle) = *self.handles.get_mut(&file).ok_or(Error::new(EBADF))? {
 | 
			
		||||
            let (count, timeout) = if buf.len() >= mem::size_of::<TimeSpec>() {
 | 
			
		||||
                let mut timespec = TimeSpec::default();
 | 
			
		||||
                let count = timespec.deref_mut().write(buf).map_err(|err| Error::new(err.raw_os_error().unwrap_or(EIO)))?;
 | 
			
		||||
                (count, Some(timespec))
 | 
			
		||||
            } else {
 | 
			
		||||
                (0, None)
 | 
			
		||||
            let write_timeout = |timeout: &mut Option<TimeSpec>, buf: &[u8]| -> Result<usize> {
 | 
			
		||||
                if buf.len() >= mem::size_of::<TimeSpec>() {
 | 
			
		||||
                    let mut timespec = TimeSpec::default();
 | 
			
		||||
                    let count = timespec.deref_mut().write(buf).map_err(|err| Error::new(err.raw_os_error().unwrap_or(EIO)))?;
 | 
			
		||||
                    *timeout = Some(timespec);
 | 
			
		||||
                    Ok(count)
 | 
			
		||||
                } else {
 | 
			
		||||
                    *timeout = None;
 | 
			
		||||
                    Ok(0)
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            match kind {
 | 
			
		||||
                SettingKind::Read => handle.read_timeout = timeout,
 | 
			
		||||
                SettingKind::Write => handle.write_timeout = timeout
 | 
			
		||||
                SettingKind::Ttl => {
 | 
			
		||||
                    if let Some(ttl) = buf.get(0) {
 | 
			
		||||
                        handle.ttl = *ttl;
 | 
			
		||||
                        Ok(1)
 | 
			
		||||
                    } else {
 | 
			
		||||
                        Ok(0)
 | 
			
		||||
                    }
 | 
			
		||||
                },
 | 
			
		||||
                SettingKind::ReadTimeout => {
 | 
			
		||||
                    write_timeout(&mut handle.read_timeout, buf)
 | 
			
		||||
                },
 | 
			
		||||
                SettingKind::WriteTimeout => {
 | 
			
		||||
                    write_timeout(&mut handle.write_timeout, buf)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Ok(count)
 | 
			
		||||
        } else {
 | 
			
		||||
            Err(Error::new(EBADF))
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue