Fixed clippy lints
This commit is contained in:
parent
5a7c2008b5
commit
102678015b
@ -1,3 +1,5 @@
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_errors_doc)]
|
||||
//! Minimal bitflags type implementation allowing to check if a set of flags
|
||||
//! contains a specific flag. The type must implement Copy and Bitand with u32.
|
||||
use core::ops::BitAnd;
|
||||
|
@ -47,7 +47,7 @@ impl Cmd for Base32 {
|
||||
} else if index > 0 {
|
||||
println!();
|
||||
}
|
||||
let contents = get_contents(&file)?;
|
||||
let contents = get_contents(file)?;
|
||||
if matches.get_flag("DECODE") {
|
||||
decode_base32(contents, matches.get_flag("IGNORE"))?;
|
||||
} else {
|
||||
|
@ -46,7 +46,7 @@ impl Cmd for Base64 {
|
||||
} else if index > 0 {
|
||||
println!();
|
||||
}
|
||||
let contents = get_contents(&file)?;
|
||||
let contents = get_contents(file)?;
|
||||
if matches.get_flag("DECODE") {
|
||||
decode_base64(contents, matches.get_flag("IGNORE"))?;
|
||||
} else {
|
||||
|
@ -348,7 +348,7 @@ fn completions(prefix: &str, matches: &ArgMatches, usr: bool) -> Result<(), io::
|
||||
})?;
|
||||
}
|
||||
if matches.get_flag("zsh") || matches.get_flag("all") {
|
||||
let mut outdir = basedir.clone();
|
||||
let mut outdir = basedir;
|
||||
outdir.push("zsh");
|
||||
outdir.push("site-functions");
|
||||
COMMANDS.iter().try_for_each(|cmd| {
|
||||
|
@ -59,15 +59,13 @@ impl Cmd for Chmod {
|
||||
};
|
||||
if let Err(e) = action.apply() {
|
||||
if !matches.get_flag("quiet") {
|
||||
return Err(e.into());
|
||||
return Err(e);
|
||||
}
|
||||
}
|
||||
if matches.get_flag("recursive") {
|
||||
if action.path.is_dir() {
|
||||
if matches.get_flag("recursive") && action.path.is_dir() {
|
||||
if let Err(e) = action.recurse() {
|
||||
if !matches.get_flag("quiet") {
|
||||
return Err(e.into());
|
||||
}
|
||||
return Err(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -136,7 +134,7 @@ impl Action<'_> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn into_child(&self, entry: DirEntry) -> Self {
|
||||
fn get_child(&self, entry: DirEntry) -> Self {
|
||||
Self {
|
||||
path: entry.path().to_path_buf(),
|
||||
feedback: self.feedback,
|
||||
@ -148,7 +146,7 @@ impl Action<'_> {
|
||||
let walker = WalkDir::new(&self.path).max_open(1);
|
||||
for entry in walker {
|
||||
let entry = entry?;
|
||||
let action = self.into_child(entry);
|
||||
let action = self.get_child(entry);
|
||||
action.apply()?;
|
||||
}
|
||||
Ok(())
|
||||
|
@ -56,12 +56,11 @@ impl Cmd for Chgrp {
|
||||
feedback,
|
||||
};
|
||||
if let Some(r) = recurse {
|
||||
if action.path.is_dir() {
|
||||
if action.path.is_dir()
|
||||
&& action.path.is_symlink()
|
||||
&& r.traversal != Traversal::NoLinks
|
||||
{
|
||||
action.recurse(recurse)?;
|
||||
} else if action.path.is_symlink() {
|
||||
if r.traversal != Traversal::NoLinks {
|
||||
action.recurse(recurse)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
action.apply()?;
|
||||
@ -127,7 +126,7 @@ impl Action<'_> {
|
||||
println!("{} retained as {}", &self.path.display(), &self.group.name);
|
||||
}
|
||||
|
||||
fn into_child(&self, entry: DirEntry) -> Result<Self, Box<dyn Error>> {
|
||||
fn as_child(&self, entry: DirEntry) -> Result<Self, Box<dyn Error>> {
|
||||
let path = entry.path().to_path_buf();
|
||||
Ok(Self {
|
||||
path,
|
||||
@ -140,13 +139,10 @@ impl Action<'_> {
|
||||
let walker = WalkDir::new(&self.path)
|
||||
.max_open(1)
|
||||
.same_file_system(recurse.map_or(false, |x| x.same_filesystem))
|
||||
.follow_links(recurse.map_or(false, |x| match x.traversal {
|
||||
Traversal::FullLinks => true,
|
||||
_ => false,
|
||||
}));
|
||||
.follow_links(recurse.map_or(false, |x| matches!(x.traversal, Traversal::FullLinks)));
|
||||
for entry in walker {
|
||||
let entry = entry?;
|
||||
let action = self.into_child(entry)?;
|
||||
let action = self.as_child(entry)?;
|
||||
action.apply()?;
|
||||
}
|
||||
Ok(())
|
||||
|
@ -68,12 +68,11 @@ impl Cmd for Chown {
|
||||
feedback,
|
||||
};
|
||||
if let Some(r) = recurse {
|
||||
if action.path.is_dir() {
|
||||
if action.path.is_dir()
|
||||
&& action.path.is_symlink()
|
||||
&& r.traversal != Traversal::NoLinks
|
||||
{
|
||||
action.recurse(recurse)?;
|
||||
} else if action.path.is_symlink() {
|
||||
if r.traversal != Traversal::NoLinks {
|
||||
action.recurse(recurse)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
action.apply()?;
|
||||
@ -119,6 +118,7 @@ fn args() -> [Arg; 8] {
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
#[allow(clippy::enum_variant_names)]
|
||||
enum Traversal {
|
||||
CliLinks,
|
||||
FullLinks,
|
||||
@ -245,7 +245,7 @@ impl Action<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn into_child(&self, entry: DirEntry) -> Result<Self, Box<dyn Error>> {
|
||||
fn as_child(&self, entry: DirEntry) -> Result<Self, Box<dyn Error>> {
|
||||
let path = entry.path().to_path_buf();
|
||||
Ok(Self {
|
||||
path,
|
||||
@ -259,13 +259,10 @@ impl Action<'_> {
|
||||
let walker = WalkDir::new(&self.path)
|
||||
.max_open(1)
|
||||
.same_file_system(recurse.map_or(false, |x| x.same_filesystem))
|
||||
.follow_links(recurse.map_or(false, |x| match x.traversal {
|
||||
Traversal::FullLinks => true,
|
||||
_ => false,
|
||||
}));
|
||||
.follow_links(recurse.map_or(false, |x| matches!(x.traversal, Traversal::FullLinks)));
|
||||
for entry in walker {
|
||||
let entry = entry?;
|
||||
let action = self.into_child(entry)?;
|
||||
let action = self.as_child(entry)?;
|
||||
action.apply()?;
|
||||
}
|
||||
Ok(())
|
||||
|
@ -59,7 +59,7 @@ impl Cmd for Chroot {
|
||||
} else {
|
||||
env::set_current_dir("/")?;
|
||||
}
|
||||
return Err(command.exec().into());
|
||||
Err(command.exec().into())
|
||||
}
|
||||
|
||||
fn path(&self) -> Option<shitbox::Path> {
|
||||
|
@ -44,8 +44,7 @@ impl Cmd for Df {
|
||||
if let Some(files) = matches.get_many::<String>("file") {
|
||||
for f in files {
|
||||
let entry = MntEntries::new("/proc/mounts")?
|
||||
.filter(|e| e.dir.as_str() == f)
|
||||
.next()
|
||||
.find(|e| e.dir.as_str() == f)
|
||||
.ok_or(io::Error::new(io::ErrorKind::Other, "no such filesystem"))?;
|
||||
print_stats(&entry.fsname, &entry.dir, units)?;
|
||||
}
|
||||
@ -109,8 +108,8 @@ fn print_stats(fs: &str, mntpt: &str, units: Units) -> Result<(), Box<dyn Error>
|
||||
Units::Kilo => st.f_frsize / 1024,
|
||||
Units::Natural => st.f_frsize,
|
||||
};
|
||||
let total = st.f_blocks * bs as u64;
|
||||
let avail = st.f_bfree * bs as u64;
|
||||
let total = st.f_blocks * bs;
|
||||
let avail = st.f_bfree * bs;
|
||||
let used = total - avail;
|
||||
let mut capacity = if total > 0 { (used * 100) / total } else { 0 };
|
||||
if used * 100 != capacity * (used + avail) {
|
||||
|
@ -38,7 +38,7 @@ impl Cmd for Expand {
|
||||
])
|
||||
}
|
||||
|
||||
fn run(&self, matches: &clap::ArgMatches) -> Result<(), Box<dyn std::error::Error>> {
|
||||
fn run(&self, _matches: &clap::ArgMatches) -> Result<(), Box<dyn std::error::Error>> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -64,14 +64,10 @@ impl Cmd for Ln {
|
||||
} else {
|
||||
SymTarget::ToLink
|
||||
};
|
||||
if files.len() > 1 {
|
||||
if !dest.is_dir() {
|
||||
return Err(io::Error::new(
|
||||
io::ErrorKind::Other,
|
||||
"destination must be a directory",
|
||||
)
|
||||
.into());
|
||||
}
|
||||
if files.len() > 1 && !dest.is_dir() {
|
||||
return Err(
|
||||
io::Error::new(io::ErrorKind::Other, "destination must be a directory").into(),
|
||||
);
|
||||
}
|
||||
for f in files {
|
||||
let source = PathBuf::from(f);
|
||||
@ -115,14 +111,12 @@ fn do_link(
|
||||
let name = source.file_name().unwrap();
|
||||
dest.push(name);
|
||||
}
|
||||
if dest.exists() {
|
||||
if force {
|
||||
if dest.exists() && force {
|
||||
unistd::unlink(
|
||||
dest.to_str()
|
||||
.ok_or(io::Error::new(io::ErrorKind::Other, "invalid utf8"))?,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
if symbolic {
|
||||
os::unix::fs::symlink(&source, &dest)?;
|
||||
} else {
|
||||
|
@ -62,7 +62,7 @@ impl Cmd for MkTemp {
|
||||
let fname = cname.to_str()?;
|
||||
println!("{fname}");
|
||||
if matches.get_flag("dryrun") {
|
||||
fs::remove_dir(&fname)?;
|
||||
fs::remove_dir(fname)?;
|
||||
}
|
||||
} else {
|
||||
let raw_fd = unsafe { libc::mkstemp(ptr) };
|
||||
@ -73,7 +73,7 @@ impl Cmd for MkTemp {
|
||||
let fname = cname.to_str()?;
|
||||
println!("{fname}");
|
||||
if matches.get_flag("dryrun") {
|
||||
fs::remove_file(&fname)?;
|
||||
fs::remove_file(fname)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
@ -43,7 +43,7 @@ impl Cmd for Realpath {
|
||||
process::exit(1);
|
||||
}
|
||||
} else {
|
||||
match env::current_dir().and_then(|d| fs::canonicalize(d)) {
|
||||
match env::current_dir().and_then(fs::canonicalize) {
|
||||
Ok(p) => println!("{}", p.display()),
|
||||
Err(e) => {
|
||||
if matches.get_flag("quiet") {
|
||||
|
@ -42,7 +42,7 @@ impl Cmd for Rev {
|
||||
}?;
|
||||
stdout.reset()?;
|
||||
}
|
||||
rev_file(&file)?;
|
||||
rev_file(file)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
@ -83,7 +83,7 @@ impl Cmd for Rm {
|
||||
for act in actions.items {
|
||||
if let Err(e) = act.apply() {
|
||||
if !act.force {
|
||||
return Err(e.into());
|
||||
return Err(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -147,7 +147,7 @@ impl Action {
|
||||
Ok(None) => return Ok(()),
|
||||
Err(e) => {
|
||||
if !self.force {
|
||||
return Err(e.into());
|
||||
return Err(e);
|
||||
} else {
|
||||
return Ok(());
|
||||
}
|
||||
@ -156,7 +156,7 @@ impl Action {
|
||||
} else {
|
||||
match File::open(&self.path)
|
||||
.and_then(|fd| fd.metadata())
|
||||
.and_then(|meta| Ok(FileType::from(meta)))
|
||||
.map(FileType::from)
|
||||
{
|
||||
Ok(ft) => ft,
|
||||
Err(e) => {
|
||||
@ -220,7 +220,7 @@ impl Action {
|
||||
} else {
|
||||
File::open(path)
|
||||
.and_then(|fd| fd.metadata())
|
||||
.and_then(|meta| Ok(FileType::from(meta)))?
|
||||
.map(FileType::from)?
|
||||
};
|
||||
eprint!("rm: remove {ft} '{}'? ", &self.path);
|
||||
let mut reply = String::new();
|
||||
@ -277,10 +277,7 @@ impl AllActions {
|
||||
let mut reply = String::new();
|
||||
let stdin = io::stdin();
|
||||
let _read = stdin.read_line(&mut reply);
|
||||
match reply.trim_end() {
|
||||
"y" | "Y" | "yes" | "Yes" => true,
|
||||
_ => false,
|
||||
}
|
||||
matches!(reply.trim_end(), "y" | "Y" | "yes" | "Yes")
|
||||
} else {
|
||||
true
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ fn get_values<'a>(
|
||||
}
|
||||
if flags.contains(Flags::Max) {
|
||||
f.max = 0;
|
||||
contents.lines().into_iter().for_each(|line| {
|
||||
contents.lines().for_each(|line| {
|
||||
let max = line.chars().count();
|
||||
f.max = cmp::max(max, f.max);
|
||||
});
|
||||
|
@ -1,3 +1,5 @@
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_errors_doc, clippy::too_many_lines)]
|
||||
use core::fmt;
|
||||
use std::{error, ffi::c_long};
|
||||
|
||||
|
@ -54,10 +54,10 @@ impl Cmd for B2sum {
|
||||
let line = line?;
|
||||
let mut split = line.split_whitespace();
|
||||
let sum = split.next().ok_or::<io::Error>(
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file").into(),
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file"),
|
||||
)?;
|
||||
let file = split.next().ok_or::<io::Error>(
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file").into(),
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file"),
|
||||
)?;
|
||||
let mut buf = vec![];
|
||||
let mut fd = File::open(file)?;
|
||||
|
@ -348,7 +348,7 @@ fn completions(prefix: &str, matches: &ArgMatches, usr: bool) -> Result<(), io::
|
||||
})?;
|
||||
}
|
||||
if matches.get_flag("zsh") || matches.get_flag("all") {
|
||||
let mut outdir = basedir.clone();
|
||||
let mut outdir = basedir;
|
||||
outdir.push("zsh");
|
||||
outdir.push("site-functions");
|
||||
COMMANDS.iter().try_for_each(|cmd| {
|
||||
|
@ -47,10 +47,10 @@ pub fn check_sums(file: &str, hashtype: HashType, erred: &mut usize) -> Result<(
|
||||
let line = line?;
|
||||
let mut split = line.split_whitespace();
|
||||
let sum = split.next().ok_or::<io::Error>(
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file").into(),
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file"),
|
||||
)?;
|
||||
let file = split.next().ok_or::<io::Error>(
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file").into(),
|
||||
io::Error::new(io::ErrorKind::Other, "invalid checksum file"),
|
||||
)?;
|
||||
let s = match hashtype {
|
||||
HashType::Md5 => compute_hash(file, Md5::new())?,
|
||||
|
@ -1,5 +1,7 @@
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_errors_doc)]
|
||||
use errno::Errno;
|
||||
use sc::*;
|
||||
use sc::syscall;
|
||||
use std::{error::Error, ffi::CString};
|
||||
|
||||
mod mntent;
|
||||
@ -12,7 +14,7 @@ pub use self::{
|
||||
mntflags::{Flags as MntFlags, ParseFlagsError},
|
||||
};
|
||||
|
||||
/// Wraps the Linux SYS_mount syscall in a nicer interface
|
||||
/// Wraps the Linux `SYS_mount` syscall in a nicer interface
|
||||
pub fn mount(
|
||||
dev: &str,
|
||||
mountpoint: &str,
|
||||
|
@ -1,3 +1,4 @@
|
||||
#![allow(clippy::must_use_candidate)]
|
||||
//! A Rust reimplementation of libc's mntent, for parsing /etc/fstab or
|
||||
//! /proc/mounts
|
||||
use super::{MntEntries, MntFlags};
|
||||
@ -52,7 +53,7 @@ impl MntEntry {
|
||||
if self.fstype != "swap" {
|
||||
return false;
|
||||
}
|
||||
let dev = self.device().map(|x| x.to_str().map(|x| x.to_string()));
|
||||
let dev = self.device().map(|x| x.to_str().map(ToString::to_string));
|
||||
let Ok(Some(dev)) = dev else { return false };
|
||||
let Ok(fd) = File::open("/proc/swaps") else {
|
||||
return false;
|
||||
@ -64,7 +65,7 @@ impl MntEntry {
|
||||
};
|
||||
let swap = line.split_whitespace().next();
|
||||
if let Some(swap) = swap {
|
||||
if swap == &dev {
|
||||
if swap == dev {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -179,14 +180,11 @@ fn dev_from_uuid(s: &str) -> io::Result<PathBuf> {
|
||||
for dev in devs {
|
||||
let tags = dev.tags();
|
||||
for tag in tags {
|
||||
match tag.typ() {
|
||||
TagType::Superblock(SuperblockTag::Uuid) => {
|
||||
if let TagType::Superblock(SuperblockTag::Uuid) = tag.typ() {
|
||||
if uuid.to_lowercase().as_str().trim() == tag.value().trim() {
|
||||
return dev.name().canonicalize();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(io::Error::new(io::ErrorKind::Other, "device not found"))
|
||||
@ -202,14 +200,11 @@ fn dev_from_label(s: &str) -> io::Result<PathBuf> {
|
||||
for dev in devs {
|
||||
let tags = dev.tags();
|
||||
for tag in tags {
|
||||
match tag.typ() {
|
||||
TagType::Superblock(SuperblockTag::Label) => {
|
||||
if let TagType::Superblock(SuperblockTag::Label) = tag.typ() {
|
||||
if label == tag.value() {
|
||||
return dev.name().canonicalize();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(io::Error::new(io::ErrorKind::Other, "device not found"))
|
||||
@ -225,14 +220,11 @@ fn dev_from_partuuid(s: &str) -> io::Result<PathBuf> {
|
||||
for dev in devs {
|
||||
let tags = dev.tags();
|
||||
for tag in tags {
|
||||
match tag.typ() {
|
||||
TagType::Partition(PartitionTag::PartEntryUuid) => {
|
||||
if let TagType::Partition(PartitionTag::PartEntryUuid) = tag.typ() {
|
||||
if partlabel == tag.value() {
|
||||
return dev.name().canonicalize();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(io::Error::new(io::ErrorKind::Other, "device not found"))
|
||||
@ -248,14 +240,11 @@ fn dev_from_partlabel(s: &str) -> io::Result<PathBuf> {
|
||||
for dev in devs {
|
||||
let tags = dev.tags();
|
||||
for tag in tags {
|
||||
match tag.typ() {
|
||||
TagType::Partition(PartitionTag::PartEntryName) => {
|
||||
if let TagType::Partition(PartitionTag::PartEntryName) = tag.typ() {
|
||||
if partlabel == tag.value() {
|
||||
return dev.name().canonicalize();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(io::Error::new(io::ErrorKind::Other, "device not found"))
|
||||
|
@ -5,6 +5,7 @@ use std::{
|
||||
str::FromStr,
|
||||
};
|
||||
|
||||
#[repr(u32)]
|
||||
pub enum Flags {
|
||||
ReadOnly = 1,
|
||||
NoSuid = 2,
|
||||
|
@ -1,3 +1,5 @@
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_errors_doc, clippy::must_use_candidate)]
|
||||
//! Wraps certain libc functions around groups and users
|
||||
use std::{
|
||||
error::Error,
|
||||
|
@ -1,5 +1,6 @@
|
||||
//! Common arguments to be re-used across multiple commands. Using these args
|
||||
//! instead of implementing from scratch increases consistency across applets
|
||||
#![allow(clippy::must_use_candidate)]
|
||||
use clap::{Arg, ArgAction};
|
||||
|
||||
pub fn verbose() -> Arg {
|
||||
|
@ -1,4 +1,5 @@
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_errors_doc)]
|
||||
use std::{env, path::PathBuf, string::ToString};
|
||||
|
||||
pub mod args;
|
||||
|
@ -1,14 +1,13 @@
|
||||
use errno::Errno;
|
||||
use sc::*;
|
||||
use sc::syscall;
|
||||
use std::{
|
||||
error::Error,
|
||||
ffi::{c_long, CString},
|
||||
ffi::CString,
|
||||
fs::File,
|
||||
mem,
|
||||
os::fd::AsRawFd,
|
||||
};
|
||||
|
||||
#[inline(always)]
|
||||
pub fn mknod(path: &str, mode: u32, dev: u64) -> Result<(), Box<dyn Error>> {
|
||||
let ret = unsafe {
|
||||
syscall!(
|
||||
@ -26,7 +25,6 @@ pub fn mknod(path: &str, mode: u32, dev: u64) -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn mkfifo(path: &str, mode: u32) -> Result<(), Box<dyn Error>> {
|
||||
let ret = unsafe {
|
||||
syscall!(
|
||||
@ -44,7 +42,6 @@ pub fn mkfifo(path: &str, mode: u32) -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn statfs(dir: &str) -> Result<libc::statvfs, Box<dyn Error>> {
|
||||
let mut buf = mem::MaybeUninit::<libc::statvfs>::uninit();
|
||||
let fd = File::open(dir)?;
|
||||
@ -54,6 +51,6 @@ pub fn statfs(dir: &str) -> Result<libc::statvfs, Box<dyn Error>> {
|
||||
Ok(buf)
|
||||
} else {
|
||||
let e = unsafe { *libc::__errno_location() };
|
||||
Err(Errno::from(e as c_long).into())
|
||||
Err(Errno::from(i64::from(e)).into())
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_errors_doc)]
|
||||
use errno::Errno;
|
||||
use libc::utsname;
|
||||
use sc::syscall;
|
||||
use std::{error::Error, ffi::CString, fs::File, os::fd::AsRawFd, u8};
|
||||
use std::{error::Error, ffi::CString, fs::File, os::fd::AsRawFd, ptr, u8};
|
||||
|
||||
#[inline(always)]
|
||||
fn new_utsname() -> utsname {
|
||||
utsname {
|
||||
sysname: [0; 65],
|
||||
@ -15,11 +16,11 @@ fn new_utsname() -> utsname {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
#[allow(clippy::cast_sign_loss)]
|
||||
pub fn gethostname() -> Result<String, Box<dyn Error>> {
|
||||
let mut uts = new_utsname();
|
||||
unsafe {
|
||||
let ret = syscall!(UNAME, &mut uts as *mut utsname);
|
||||
let ret = syscall!(UNAME, ptr::addr_of_mut!(uts));
|
||||
if ret != 0 {
|
||||
return Err(Errno::from(ret).into());
|
||||
}
|
||||
@ -30,10 +31,9 @@ pub fn gethostname() -> Result<String, Box<dyn Error>> {
|
||||
.map(|x| *x as u8)
|
||||
.take_while(|x| *x != 0)
|
||||
.collect();
|
||||
String::from_utf8(name).map_err(|e| e.into())
|
||||
String::from_utf8(name).map_err(Into::into)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn sethostname(name: &str) -> Result<(), Errno> {
|
||||
let ret = unsafe { syscall!(SETHOSTNAME, name.as_ptr(), name.len()) };
|
||||
if ret == 0 {
|
||||
@ -43,7 +43,6 @@ pub fn sethostname(name: &str) -> Result<(), Errno> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn link(source: &str, dest: &str) -> Result<(), Box<dyn Error>> {
|
||||
let ret = unsafe {
|
||||
syscall!(
|
||||
@ -62,7 +61,6 @@ pub fn link(source: &str, dest: &str) -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn unlink(name: &str) -> Result<(), Box<dyn Error>> {
|
||||
let ret = unsafe { syscall!(UNLINKAT, libc::AT_FDCWD, CString::new(name)?.as_ptr(), 0) };
|
||||
if ret == 0 {
|
||||
@ -72,7 +70,7 @@ pub fn unlink(name: &str) -> Result<(), Box<dyn Error>> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
#[allow(clippy::cast_sign_loss)]
|
||||
pub fn readlink(name: &str) -> Result<String, Box<dyn Error>> {
|
||||
let mut buf = Vec::<i8>::with_capacity(1024);
|
||||
let ret = unsafe {
|
||||
@ -90,13 +88,12 @@ pub fn readlink(name: &str) -> Result<String, Box<dyn Error>> {
|
||||
.map(|x| *x as u8)
|
||||
.take_while(|x| *x != 0)
|
||||
.collect();
|
||||
String::from_utf8(path).map_err(|e| e.into())
|
||||
String::from_utf8(path).map_err(Into::into)
|
||||
} else {
|
||||
Err(Errno::from(ret).into())
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn fdatasync(fd: &File) -> Result<(), Errno> {
|
||||
let ret = unsafe { syscall!(FDATASYNC, fd.as_raw_fd()) };
|
||||
if ret == 0 {
|
||||
@ -106,7 +103,6 @@ pub fn fdatasync(fd: &File) -> Result<(), Errno> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn syncfs(fd: &File) -> Result<(), Errno> {
|
||||
let ret = unsafe { syscall!(SYNCFS, fd.as_raw_fd()) };
|
||||
if ret == 0 {
|
||||
@ -116,7 +112,6 @@ pub fn syncfs(fd: &File) -> Result<(), Errno> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn fsync(fd: &File) -> Result<(), Errno> {
|
||||
let ret = unsafe { syscall!(FSYNC, fd.as_raw_fd()) };
|
||||
if ret == 0 {
|
||||
@ -126,12 +121,10 @@ pub fn fsync(fd: &File) -> Result<(), Errno> {
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn sync() {
|
||||
unsafe { syscall!(SYNC) };
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn symlink(source: &str, dest: &str) -> Result<(), Box<dyn Error>> {
|
||||
let ret = unsafe {
|
||||
syscall!(
|
||||
|
@ -1,3 +1,4 @@
|
||||
#![allow(clippy::must_use_candidate)]
|
||||
use bitflags::BitFlags;
|
||||
use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign};
|
||||
|
||||
@ -80,7 +81,9 @@ impl BitOrAssign<Bit> for u32 {
|
||||
|
||||
impl Bit {
|
||||
pub fn as_char(&self, mode: u32) -> char {
|
||||
if mode & *self != 0 {
|
||||
if mode & *self == 0 {
|
||||
'-'
|
||||
} else {
|
||||
match self {
|
||||
Self::Suid | Self::Sgid => 's',
|
||||
Self::Sticky => 't',
|
||||
@ -91,8 +94,6 @@ impl Bit {
|
||||
Self::OExec if mode.contains(Self::Sticky) => 't',
|
||||
Self::UExec | Self::GExec | Self::OExec => 'x',
|
||||
}
|
||||
} else {
|
||||
'-'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
#![warn(clippy::all, clippy::pedantic)]
|
||||
#![allow(clippy::missing_errors_doc)]
|
||||
//! Functions for parsing and managing permissions
|
||||
mod bit;
|
||||
mod parser;
|
||||
|
@ -348,7 +348,7 @@ fn completions(prefix: &str, matches: &ArgMatches, usr: bool) -> Result<(), io::
|
||||
})?;
|
||||
}
|
||||
if matches.get_flag("zsh") || matches.get_flag("all") {
|
||||
let mut outdir = basedir.clone();
|
||||
let mut outdir = basedir;
|
||||
outdir.push("zsh");
|
||||
outdir.push("site-functions");
|
||||
COMMANDS.iter().try_for_each(|cmd| {
|
||||
|
@ -1,4 +1,4 @@
|
||||
use clap::{Arg, ArgAction, ArgMatches, Command};
|
||||
use clap::{ArgMatches, Command};
|
||||
use shitbox::Cmd;
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
@ -9,7 +9,7 @@ impl Cmd for Mount {
|
||||
Command::new("mount")
|
||||
}
|
||||
|
||||
fn run(&self, matches: &ArgMatches) -> Result<(), Box<dyn std::error::Error>> {
|
||||
fn run(&self, _matches: &ArgMatches) -> Result<(), Box<dyn std::error::Error>> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -8,8 +8,8 @@ use std::{
|
||||
io::{self, Read, Seek, SeekFrom, Write},
|
||||
};
|
||||
|
||||
const SWAP_MAGIC1: &'static str = "SWAPSPACE2";
|
||||
const SWAP_MAGIC2: &'static str = "SWAP_SPACE";
|
||||
const SWAP_MAGIC1: &str = "SWAPSPACE2";
|
||||
const SWAP_MAGIC2: &str = "SWAP_SPACE";
|
||||
const SWAP_MAGIC_LENGTH: u64 = 10;
|
||||
const SWAP_LABEL_LENGTH: u64 = 16;
|
||||
const SWAP_LABEL_OFFSET: u64 = 1024 + 4 + 4 + 4 + 16;
|
||||
@ -61,7 +61,7 @@ impl Cmd for Swaplabel {
|
||||
return Err(io::Error::new(io::ErrorKind::Other, "label is too long").into());
|
||||
}
|
||||
let label = CString::new(label.as_str())?;
|
||||
fd.write(label.as_bytes())?;
|
||||
fd.write_all(label.as_bytes())?;
|
||||
} else {
|
||||
let mut label = [0; SWAP_LABEL_LENGTH as usize];
|
||||
fd.read_exact(&mut label)?;
|
||||
|
@ -47,7 +47,7 @@ impl Cmd for Swapoff {
|
||||
}
|
||||
}
|
||||
} else if let Some(devices) = matches.get_many::<String>("device") {
|
||||
for d in devices {
|
||||
'devloop: for d in devices {
|
||||
let fd = File::open("/proc/swaps")?;
|
||||
let reader = BufReader::new(fd);
|
||||
for line in reader.lines() {
|
||||
@ -61,7 +61,7 @@ impl Cmd for Swapoff {
|
||||
if matches.get_flag("verbose") {
|
||||
println!("swapoff {d}");
|
||||
}
|
||||
return Ok(());
|
||||
continue 'devloop;
|
||||
}
|
||||
}
|
||||
let msg = format!("{d} is not swapped");
|
||||
|
@ -100,13 +100,11 @@ impl Cmd for Umount {
|
||||
if x.fstype == t {
|
||||
ret = false;
|
||||
}
|
||||
} else {
|
||||
if &x.fstype != t {
|
||||
} else if &x.fstype != t {
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(spec) = matches.get_many::<String>("spec") {
|
||||
let mut r2 = false;
|
||||
for s in spec {
|
||||
@ -126,8 +124,7 @@ impl Cmd for Umount {
|
||||
println!("umount: {} unmounted", &p.dir);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if let Some(spec) = matches.get_many::<String>("spec") {
|
||||
} else if let Some(spec) = matches.get_many::<String>("spec") {
|
||||
for s in spec {
|
||||
let mntpt = get_mntpt(s)?;
|
||||
mount::umount(&mntpt, flags as u32)?;
|
||||
@ -136,7 +133,6 @@ impl Cmd for Umount {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -149,7 +145,7 @@ fn get_mntpt(spec: &str) -> io::Result<String> {
|
||||
let entries = MntEntries::new("/proc/mounts")?;
|
||||
for e in entries {
|
||||
if e.fsname == spec {
|
||||
return Ok(e.dir.clone());
|
||||
return Ok(e.dir);
|
||||
} else if e.dir == spec {
|
||||
return Ok(spec.to_string());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user