mirror of
https://github.com/uutils/coreutils
synced 2024-07-22 10:24:54 +00:00
implement hostid
This commit is contained in:
parent
5ddb9d0e3c
commit
fda88ec9c6
1
Makefile
1
Makefile
|
@ -30,6 +30,7 @@ PROGS := \
|
|||
head \
|
||||
|
||||
UNIX_PROGS := \
|
||||
hostid \
|
||||
kill \
|
||||
logname \
|
||||
users \
|
||||
|
|
|
@ -94,7 +94,6 @@ To do
|
|||
- fmt
|
||||
- getlimits
|
||||
- group-list
|
||||
- hostid
|
||||
- install
|
||||
- join
|
||||
- lbracket
|
||||
|
|
111
hostid/hostid.rs
Normal file
111
hostid/hostid.rs
Normal file
|
@ -0,0 +1,111 @@
|
|||
#![crate_id(name="hostid", vers="0.0.1", author="Maciej Dziardziel")]
|
||||
#![feature(macro_rules)]
|
||||
#![feature(phase)]
|
||||
|
||||
/*
|
||||
* This file is part of the uutils coreutils package.
|
||||
*
|
||||
* (c) Maciej Dziardziel <fiedzia@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE file
|
||||
* that was distributed with this source code.
|
||||
*/
|
||||
|
||||
|
||||
extern crate getopts;
|
||||
extern crate collections;
|
||||
extern crate serialize;
|
||||
|
||||
|
||||
#[phase(syntax, link)] extern crate log;
|
||||
|
||||
use std::os;
|
||||
|
||||
use getopts::{
|
||||
getopts,
|
||||
optflag,
|
||||
usage,
|
||||
};
|
||||
|
||||
use std::libc::{c_long};
|
||||
|
||||
#[path = "../common/util.rs"]
|
||||
mod util;
|
||||
|
||||
static NAME: &'static str = "hostid";
|
||||
static VERSION: &'static str = "0.0.1";
|
||||
|
||||
static EXIT_ERR: i32 = 1;
|
||||
|
||||
pub enum Mode {
|
||||
HostId,
|
||||
Help,
|
||||
Version,
|
||||
}
|
||||
|
||||
//currently rust libc interface doesn't include gethostid
|
||||
extern {
|
||||
pub fn gethostid() -> c_long;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args = os::args();
|
||||
|
||||
let opts = ~[
|
||||
optflag("", "help", "display this help and exit"),
|
||||
optflag("", "version", "output version information and exit"),
|
||||
];
|
||||
|
||||
let usage = usage("[options]", opts);
|
||||
|
||||
|
||||
let matches = match getopts(args.tail(), opts) {
|
||||
Ok(m) => m,
|
||||
Err(e) => {
|
||||
show_error!(EXIT_ERR, "{}\n{}", e.to_err_msg(), get_help_text(NAME, usage));
|
||||
return
|
||||
},
|
||||
};
|
||||
|
||||
let mode = if matches.opt_present("version") {
|
||||
Version
|
||||
} else if matches.opt_present("help") {
|
||||
Help
|
||||
} else {
|
||||
HostId
|
||||
};
|
||||
|
||||
match mode {
|
||||
HostId => hostid(),
|
||||
Help => help(NAME, usage),
|
||||
Version => version(),
|
||||
}
|
||||
}
|
||||
|
||||
fn version() {
|
||||
println!("{} {}", NAME, VERSION);
|
||||
}
|
||||
|
||||
fn get_help_text(progname: &str, usage: &str) -> ~str {
|
||||
let msg = format!("Usage: \n {0} {1}", progname, usage);
|
||||
msg
|
||||
}
|
||||
|
||||
fn help(progname: &str, usage: &str) {
|
||||
println!("{}", get_help_text(progname, usage));
|
||||
}
|
||||
|
||||
fn hostid() {
|
||||
|
||||
/* POSIX says gethostid returns a "32-bit identifier" but is silent
|
||||
whether it's sign-extended. Turn off any sign-extension. This
|
||||
is a no-op unless unsigned int is wider than 32 bits. */
|
||||
|
||||
let mut result:c_long;
|
||||
unsafe {
|
||||
result = gethostid();
|
||||
}
|
||||
|
||||
result &= 0xffffffff;
|
||||
println!("{:0>8x}", result);
|
||||
}
|
Loading…
Reference in a new issue