1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-31 21:17:46 +00:00

Merge pull request #495 from ebfe/fix-build-alpha

id, nice, nohup: fix build
This commit is contained in:
Heather 2015-01-10 19:23:35 +03:00
commit ec44be6034
3 changed files with 45 additions and 46 deletions

View file

@ -17,6 +17,7 @@
extern crate getopts;
extern crate libc;
use std::ffi::c_str_to_bytes;
use std::ptr::read;
use libc::{
uid_t,
@ -136,8 +137,8 @@ pub fn uumain(args: Vec<String>) -> isize {
};
let gr = unsafe { getgrgid(id) };
if nflag && gr.is_not_null() {
let gr_name = unsafe { String::from_raw_buf(read(gr).gr_name as *const u8) };
if nflag && !gr.is_null() {
let gr_name = unsafe { String::from_utf8_lossy(c_str_to_bytes(&read(gr).gr_name)).to_string() };
println!("{}", gr_name);
} else {
println!("{}", id);
@ -155,9 +156,9 @@ pub fn uumain(args: Vec<String>) -> isize {
};
let pw = unsafe { getpwuid(id) };
if nflag && pw.is_not_null() {
if nflag && !pw.is_null() {
let pw_name = unsafe {
String::from_raw_buf(read(pw).pw_name as *const u8)
String::from_utf8_lossy(c_str_to_bytes(&read(pw).pw_name)).to_string()
};
println!("{}", pw_name);
} else {
@ -195,26 +196,26 @@ fn pretty(possible_pw: Option<c_passwd>) {
if possible_pw.is_some() {
let pw = possible_pw.unwrap();
let pw_name = unsafe { String::from_raw_buf(pw.pw_name as *const u8) };
let pw_name = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_name)).to_string() };
print!("uid\t{}\ngroups\t", pw_name);
group(possible_pw, true);
} else {
let login = unsafe { String::from_raw_buf(getlogin() as *const u8) };
let login = unsafe { String::from_utf8_lossy(c_str_to_bytes(&(getlogin() as *const i8))).to_string() };
let rid = unsafe { getuid() };
let pw = unsafe { getpwuid(rid) };
let is_same_user = unsafe {
String::from_raw_buf(read(pw).pw_name as *const u8) == login
String::from_utf8_lossy(c_str_to_bytes(&read(pw).pw_name)).to_string() == login
};
if pw.is_null() || is_same_user {
println!("login\t{}", login);
}
if pw.is_not_null() {
if !pw.is_null() {
println!(
"uid\t{}",
unsafe { String::from_raw_buf(read(pw).pw_name as *const u8) })
unsafe { String::from_utf8_lossy(c_str_to_bytes(&read(pw).pw_name)).to_string() })
} else {
println!("uid\t{}\n", rid);
}
@ -222,10 +223,10 @@ fn pretty(possible_pw: Option<c_passwd>) {
let eid = unsafe { getegid() };
if eid == rid {
let pw = unsafe { getpwuid(eid) };
if pw.is_not_null() {
if !pw.is_null() {
println!(
"euid\t{}",
unsafe { String::from_raw_buf(read(pw).pw_name as *const u8) });
unsafe { String::from_utf8_lossy(c_str_to_bytes(&read(pw).pw_name)).to_string() });
} else {
println!("euid\t{}", eid);
}
@ -235,10 +236,10 @@ fn pretty(possible_pw: Option<c_passwd>) {
if rid != eid {
let gr = unsafe { getgrgid(rid) };
if gr.is_not_null() {
if !gr.is_null() {
println!(
"rgid\t{}",
unsafe { String::from_raw_buf(read(gr).gr_name as *const u8) });
unsafe { String::from_utf8_lossy(c_str_to_bytes(&read(gr).gr_name)).to_string() });
} else {
println!("rgid\t{}", rid);
}
@ -257,12 +258,12 @@ fn pline(possible_pw: Option<c_passwd>) {
possible_pw.unwrap()
};
let pw_name = unsafe { String::from_raw_buf(pw.pw_name as *const u8) };
let pw_passwd = unsafe { String::from_raw_buf(pw.pw_passwd as *const u8) };
let pw_class = unsafe { String::from_raw_buf(pw.pw_class as *const u8) };
let pw_gecos = unsafe { String::from_raw_buf(pw.pw_gecos as *const u8) };
let pw_dir = unsafe { String::from_raw_buf(pw.pw_dir as *const u8) };
let pw_shell = unsafe { String::from_raw_buf(pw.pw_shell as *const u8) };
let pw_name = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_name )).to_string()};
let pw_passwd = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_passwd)).to_string()};
let pw_class = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_class )).to_string()};
let pw_gecos = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_gecos )).to_string()};
let pw_dir = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_dir )).to_string()};
let pw_shell = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_shell )).to_string()};
println!(
"{}:{}:{}:{}:{}:{}:{}:{}:{}:{}",
@ -286,11 +287,11 @@ fn pline(possible_pw: Option<c_passwd>) {
possible_pw.unwrap()
};
let pw_name = unsafe { String::from_raw_buf(pw.pw_name as *const u8)};
let pw_passwd = unsafe { String::from_raw_buf(pw.pw_passwd as *const u8)};
let pw_gecos = unsafe { String::from_raw_buf(pw.pw_gecos as *const u8)};
let pw_dir = unsafe { String::from_raw_buf(pw.pw_dir as *const u8)};
let pw_shell = unsafe { String::from_raw_buf(pw.pw_shell as *const u8)};
let pw_name = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_name )).to_string()};
let pw_passwd = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_passwd)).to_string()};
let pw_gecos = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_gecos )).to_string()};
let pw_dir = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_dir )).to_string()};
let pw_shell = unsafe { String::from_utf8_lossy(c_str_to_bytes(&pw.pw_shell )).to_string()};
println!(
"{}:{}:{}:{}:{}:{}:{}",
@ -350,27 +351,27 @@ fn id_print(possible_pw: Option<c_passwd>,
print!(
"uid={}({})",
uid,
unsafe { String::from_raw_buf(possible_pw.unwrap().pw_name as *const u8) });
unsafe { String::from_utf8_lossy(c_str_to_bytes(&possible_pw.unwrap().pw_name)).to_string() });
} else {
print!("uid={}", unsafe { getuid() });
}
print!(" gid={}", gid);
let gr = unsafe { getgrgid(gid) };
if gr.is_not_null() {
if !gr.is_null() {
print!(
"({})",
unsafe { String::from_raw_buf(read(gr).gr_name as *const u8) });
unsafe { String::from_utf8_lossy(c_str_to_bytes(&read(gr).gr_name)).to_string() });
}
let euid = unsafe { geteuid() };
if p_euid && (euid != uid) {
print!(" euid={}", euid);
let pw = unsafe { getpwuid(euid) };
if pw.is_not_null() {
if !pw.is_null() {
print!(
"({})",
unsafe { String::from_raw_buf(read(pw).pw_name as *const u8) });
unsafe { String::from_utf8_lossy(c_str_to_bytes(&read(pw).pw_name)).to_string() });
}
}
@ -379,8 +380,8 @@ fn id_print(possible_pw: Option<c_passwd>,
print!(" egid={}", egid);
unsafe {
let grp = getgrgid(egid);
if grp.is_not_null() {
print!("({})", String::from_raw_buf(read(grp).gr_name as *const u8));
if !grp.is_null() {
print!("({})", String::from_utf8_lossy(c_str_to_bytes(&read(grp).gr_name)).to_string());
}
}
}
@ -393,9 +394,9 @@ fn id_print(possible_pw: Option<c_passwd>,
if !first { print!(",") }
print!("{}", gr);
let group = unsafe { getgrgid(gr) };
if group.is_not_null() {
if !group.is_null() {
let name = unsafe {
String::from_raw_buf(read(group).gr_name as *const u8)
String::from_utf8_lossy(c_str_to_bytes(&read(group).gr_name)).to_string()
};
print!("({})", name);
}

View file

@ -12,6 +12,7 @@
extern crate getopts;
extern crate libc;
use std::ffi::CString;
use std::io::IoError;
use std::os;
use std::ptr;
@ -101,12 +102,10 @@ pub fn uumain(args: Vec<String>) -> isize {
show_warning!("{}", IoError::last_error());
}
unsafe {
let executable = matches.free[0].to_c_str().into_inner();
let mut args: Vec<*const i8> = matches.free.iter().map(|x| x.to_c_str().into_inner()).collect();
args.push(ptr::null());
execvp(executable as *const c_char, args.as_ptr() as *mut *const c_char);
}
let cstrs : Vec<CString> = matches.free.iter().map(|x| CString::from_slice(x.as_bytes())).collect();
let mut args : Vec<*const c_char> = cstrs.iter().map(|s| s.as_ptr()).collect();
args.push(0 as *const c_char);
unsafe { execvp(args[0], args.as_mut_ptr()); }
show_error!("{}", IoError::last_error());
if os::errno() as c_int == libc::ENOENT { 127 } else { 126 }

View file

@ -13,9 +13,11 @@ extern crate getopts;
extern crate libc;
use getopts::{optflag, getopts, usage};
use std::ffi::CString;
use std::io::stdio::{stdin_raw, stdout_raw, stderr_raw};
use std::io::{File, Open, Read, Append, Write};
use std::os::unix::prelude::*;
use libc::c_char;
use libc::funcs::posix88::unistd::{dup2, execvp};
use libc::consts::os::posix88::SIGHUP;
use libc::funcs::posix01::signal::signal;
@ -66,13 +68,10 @@ pub fn uumain(args: Vec<String>) -> isize {
if unsafe { _vprocmgr_detach_from_console(0) } != std::ptr::null() { crash!(2, "Cannot detach from console")};
unsafe {
// we ignore the memory leak here because it doesn't matter anymore
let executable = opts.free[0].as_slice().to_c_str().into_inner();
let mut args: Vec<*const i8> = opts.free.iter().map(|x| x.to_c_str().into_inner()).collect();
args.push(std::ptr::null());
execvp(executable as *const libc::c_char, args.as_ptr() as *mut *const libc::c_char) as int
}
let cstrs : Vec<CString> = opts.free.iter().map(|x| CString::from_slice(x.as_bytes())).collect();
let mut args : Vec<*const c_char> = cstrs.iter().map(|s| s.as_ptr()).collect();
args.push(std::ptr::null());
unsafe { execvp(args[0], args.as_mut_ptr()) as isize }
}
fn replace_fds() {