view src/main.rs @ 3:5bdb02e05c86

show virsh list --all
author AnaTofuZ <anatofuz@gmail.com>
date Thu, 22 Oct 2020 17:40:16 +0900
parents 1632a34a3f6c
children 668a91cd7be8
line wrap: on
line source

use nix;
use std::process::Command;
//use libc;

fn main() {
    let uid       = getuid();
    let gid       = getgid();
    let user_name = getlogin(uid);
    println!("uid: {} gid: {} name: {}", uid, gid, user_name);
    set_root_id();

    list_command();
}


fn getlogin(uid: u32) -> &'static str {
    use std::ffi::CStr;
    let user_passwd = unsafe { nix::libc::getpwuid(uid)};
    let c_str  = unsafe { CStr::from_ptr((*user_passwd).pw_name)} ;
    return c_str.to_str().unwrap();
}

fn getuid() -> u32 {
    let uid_struct = nix::unistd::getuid();
    return uid_struct.into();
}

fn getgid() -> u32 {
    let gid_struct = nix::unistd::getgid();
    return gid_struct.into();
}

fn list_command() {
    Command::new("virsh").arg("list").arg("--all").status().expect("failed to virsh");
}


fn set_root_id(){
    let id = 0;
    match nix::unistd::seteuid(nix::unistd::Uid::from_raw(id)) {
        Err(err) => panic!("failed seteuid {}", err),
        Ok(_) => {}
    }
    match nix::unistd::setegid(nix::unistd::Gid::from_raw(id)) {
        Err(err) => panic!("failed setedid{}", err),
        Ok(_) => {}
    }

    match nix::unistd::setuid(nix::unistd::Uid::from_raw(id)) {
        Err(err) => panic!("failed setuid {}", err),
        Ok(_) => {}
    }

    match nix::unistd::setgid(nix::unistd::Gid::from_raw(id)) {
        Err(err) => panic!("failed setdid{}", err),
        Ok(_) => {}
    }
}