| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -147,42 +147,6 @@ impl<U: AsRef<str>> CommandRunner for SetuidCommandRunner<U> { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[derive(Debug)]
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					pub struct SuCommandRunner<'a, C>
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					where
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  C: CommandRunner,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  command_runner: &'a C,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  user_name: &'a str,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					impl<'a, C> SuCommandRunner<'a, C>
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					where
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  C: 'a + CommandRunner,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  pub fn new(user_name: &'a str, command_runner: &'a C) -> SuCommandRunner<'a, C> {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    SuCommandRunner {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      command_runner,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      user_name,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// Su doesn't set XDG_RUNTIME_DIR
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// https://github.com/systemd/systemd/blob/master/src/login/pam_systemd.c#L439
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[async_trait(?Send)]
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					impl<'a, C> CommandRunner for SuCommandRunner<'a, C>
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					where
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  C: 'a + CommandRunner,
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  async fn run(&self, program: &str, args: &[&OsStr], input: &[u8]) -> IoResult<Output> {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let raw_new_args = [self.user_name, "-s", "/usr/bin/env", "--", program];
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let mut new_args: Vec<&OsStr> = raw_new_args.iter().map(AsRef::as_ref).collect();
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    new_args.extend_from_slice(args);
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    self.command_runner.run("su", &new_args, input).await
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[cfg(test)]
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					mod test {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  use crate::args;
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |