memoryd: the crate, memoryd.toml, and listening on a socket
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
//! `listen`: the directory at 0700, the socket at 0600, a stale socket replaced, and no mode
|
||||
//! changed through a symbolic link (M5a spec, section 7). Do not edit.
|
||||
|
||||
#[path = "support/tmp.rs"]
|
||||
mod tmp;
|
||||
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
use std::os::unix::net::UnixStream;
|
||||
|
||||
use memoryd::socket::listen;
|
||||
use tmp::TempDir;
|
||||
|
||||
fn mode(path: &std::path::Path) -> u32 {
|
||||
std::fs::metadata(path).unwrap().permissions().mode() & 0o777
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn directory_and_socket_are_private_and_a_stale_socket_is_replaced() {
|
||||
let dir = TempDir::new("socket");
|
||||
let run = dir.path().join("run/loop-memory");
|
||||
std::fs::create_dir_all(&run).unwrap();
|
||||
std::fs::set_permissions(&run, std::fs::Permissions::from_mode(0o755)).unwrap();
|
||||
let socket = run.join("memory.sock");
|
||||
let first = listen(&socket).unwrap();
|
||||
assert_eq!((mode(&run), mode(&socket)), (0o700, 0o600));
|
||||
drop(first);
|
||||
let second = listen(&socket).expect("a stale socket is removed");
|
||||
assert!(UnixStream::connect(&socket).is_ok());
|
||||
drop(second);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn no_directory_and_symbolic_links_are_refused() {
|
||||
let dir = TempDir::new("socket-link");
|
||||
let target = dir.path().join("shared");
|
||||
std::fs::create_dir_all(&target).unwrap();
|
||||
std::fs::set_permissions(&target, std::fs::Permissions::from_mode(0o755)).unwrap();
|
||||
std::os::unix::fs::symlink(&target, dir.path().join("link")).unwrap();
|
||||
let err = listen(&dir.path().join("link/memory.sock")).unwrap_err();
|
||||
assert!(err.contains("symbolic link"), "{err}");
|
||||
assert_eq!(mode(&target), 0o755, "the target's mode is untouched");
|
||||
let err = listen(std::path::Path::new("/memory.sock")).unwrap_err();
|
||||
assert!(err.contains("directory of its own"), "{err}");
|
||||
}
|
||||
Reference in New Issue
Block a user