vlib: add inode/mode information functionality (#4242)
* vlib: add inode/mode information functionality * vlib: add docs to inodepull/4243/head
parent
ef59bac511
commit
e077cce103
|
@ -0,0 +1,92 @@
|
||||||
|
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
||||||
|
// Use of this source code is governed by an MIT license
|
||||||
|
// that can be found in the LICENSE file.
|
||||||
|
module os
|
||||||
|
|
||||||
|
enum FileType {
|
||||||
|
regular
|
||||||
|
directory
|
||||||
|
character_device
|
||||||
|
block_device
|
||||||
|
fifo
|
||||||
|
symbolic_link
|
||||||
|
socket
|
||||||
|
}
|
||||||
|
|
||||||
|
struct FilePermission {
|
||||||
|
read bool
|
||||||
|
write bool
|
||||||
|
execute bool
|
||||||
|
}
|
||||||
|
|
||||||
|
struct FileMode {
|
||||||
|
typ FileType
|
||||||
|
owner FilePermission
|
||||||
|
group FilePermission
|
||||||
|
others FilePermission
|
||||||
|
}
|
||||||
|
|
||||||
|
// inode returns the mode of the file/inode containing inode type and permission information
|
||||||
|
// it supports windows for regular files but it doesn't matter if you use owner, group or others when checking permissions on windows
|
||||||
|
pub fn inode(path string) FileMode {
|
||||||
|
mut attr := C.stat{}
|
||||||
|
C.stat(path.str, &attr)
|
||||||
|
|
||||||
|
mut typ := FileType.regular
|
||||||
|
if attr.st_mode & C.S_IFMT == C.S_IFDIR {
|
||||||
|
typ = .directory
|
||||||
|
}
|
||||||
|
$if !windows {
|
||||||
|
if attr.st_mode & C.S_IFMT == C.S_IFCHR {
|
||||||
|
typ = .character_device
|
||||||
|
} else if attr.st_mode & C.S_IFMT == C.S_IFBLK {
|
||||||
|
typ = .block_device
|
||||||
|
} else if attr.st_mode & C.S_IFMT == C.S_IFIFO {
|
||||||
|
typ = .fifo
|
||||||
|
} else if attr.st_mode & C.S_IFMT == C.S_IFLNK {
|
||||||
|
typ = .symbolic_link
|
||||||
|
} else if attr.st_mode & C.S_IFMT == C.S_IFSOCK {
|
||||||
|
typ = .socket
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$if windows {
|
||||||
|
return FileMode{
|
||||||
|
typ: typ
|
||||||
|
owner: FilePermission{
|
||||||
|
read: bool(attr.st_mode & C.S_IREAD)
|
||||||
|
write: bool(attr.st_mode & C.S_IWRITE)
|
||||||
|
execute: bool(attr.st_mode & C.S_IEXEC)
|
||||||
|
}
|
||||||
|
group: FilePermission{
|
||||||
|
read: bool(attr.st_mode & C.S_IREAD)
|
||||||
|
write: bool(attr.st_mode & C.S_IWRITE)
|
||||||
|
execute: bool(attr.st_mode & C.S_IEXEC)
|
||||||
|
}
|
||||||
|
others: FilePermission{
|
||||||
|
read: bool(attr.st_mode & C.S_IREAD)
|
||||||
|
write: bool(attr.st_mode & C.S_IWRITE)
|
||||||
|
execute: bool(attr.st_mode & C.S_IEXEC)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} $else {
|
||||||
|
return FileMode{
|
||||||
|
typ: typ
|
||||||
|
owner: FilePermission{
|
||||||
|
read: bool(attr.st_mode & C.S_IRUSR)
|
||||||
|
write: bool(attr.st_mode & C.S_IWUSR)
|
||||||
|
execute: bool(attr.st_mode & C.S_IXUSR)
|
||||||
|
}
|
||||||
|
group: FilePermission{
|
||||||
|
read: bool(attr.st_mode & C.S_IRGRP)
|
||||||
|
write: bool(attr.st_mode & C.S_IWGRP)
|
||||||
|
execute: bool(attr.st_mode & C.S_IXGRP)
|
||||||
|
}
|
||||||
|
others: FilePermission{
|
||||||
|
read: bool(attr.st_mode & C.S_IROTH)
|
||||||
|
write: bool(attr.st_mode & C.S_IWOTH)
|
||||||
|
execute: bool(attr.st_mode & C.S_IXOTH)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
const (
|
||||||
|
// tfolder will contain all the temporary files/subfolders made by
|
||||||
|
// the different tests. It would be removed in testsuite_end(), so
|
||||||
|
// individual os tests do not need to clean up after themselves.
|
||||||
|
tfolder = os.join_path(os.temp_dir(), 'v', 'tests', 'inode_test')
|
||||||
|
)
|
||||||
|
|
||||||
|
fn testsuite_begin() {
|
||||||
|
eprintln('testsuite_begin, tfolder = $tfolder')
|
||||||
|
os.rmdir_all(tfolder)
|
||||||
|
assert !os.is_dir(tfolder)
|
||||||
|
os.mkdir_all(tfolder)
|
||||||
|
os.chdir(tfolder)
|
||||||
|
assert os.is_dir(tfolder)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn testsuite_end() {
|
||||||
|
os.chdir(os.wd_at_startup)
|
||||||
|
os.rmdir_all(tfolder)
|
||||||
|
assert !os.is_dir(tfolder)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_inode_file_type() {
|
||||||
|
filename := './test1.txt'
|
||||||
|
mut file := os.open_file(filename, 'w', 0o600)
|
||||||
|
file.close()
|
||||||
|
mode := os.inode(filename)
|
||||||
|
os.rm(filename)
|
||||||
|
assert mode.typ == .regular
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_inode_file_owner_permission() {
|
||||||
|
filename := './test2.txt'
|
||||||
|
mut file := os.open_file(filename, 'w', 0o600)
|
||||||
|
file.close()
|
||||||
|
mode := os.inode(filename)
|
||||||
|
os.rm(filename)
|
||||||
|
assert mode.owner.read
|
||||||
|
assert mode.owner.write
|
||||||
|
assert !mode.owner.execute
|
||||||
|
}
|
Loading…
Reference in New Issue