1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
// License: see LICENSE file at root directory of `master` branch //! # R50 //! //! ## Project //! //! - Repository: <https://bitbucket.org/haibison/r50> //! - License: Nice License 1.0.0 _(see LICENSE file at root directory of `master` branch)_ //! - _This project follows [Semantic Versioning 2.0.0]_ //! //! ## Features //! //! This project helps with resource management of process(es) running on personal Linux machines. //! //! It provides 2 programs: a server, and a client. //! //! - The server program binds to an abstract Linux socket, then listens for clients. //! - Each client is expected to send: //! //! + One single command (with optional arguments). //! + Its credentials: process ID, user ID, group ID. //! + Its standard streams: input, output, error. //! + Its current working directory and environment variables. //! //! The command will be run by server under client's credentials, with standard streams routed to client's. The new process ID will be sent //! back to client. So when the user uses Ctrl-C, client can *forward* it to that process ID. //! //! The idea is to group client processes under one single process: the server. This helps with resource management. //! //! ## Notes //! //! Due to technical requirements, currently only Linux is supported. Because: //! //! - Linux supports abstract sockets. //! - Linux supports sending credentials between processes, via Unix domain socket. Some BSD systems also support this feature, but //! implementation details differ -- and currently this project only supports Linux's implementation. //! //! For details, see `unix(7)`. //! //! [Semantic Versioning 2.0.0]: https://semver.org/spec/v2.0.0.html #![warn(missing_docs)] #![cfg(any(target_os = "linux", target_os = "l4re"))] // ╔═════════════════╗ // ║ IDENTIFIERS ║ // ╚═════════════════╝ macro_rules! code_name { () => { "r50" }} macro_rules! version { () => { "0.14.1" }} /// # Crate name pub const NAME: &str = "R50"; /// # Crate code name pub const CODE_NAME: &str = code_name!(); /// # ID of this crate pub const ID: &str = concat!( "98178d52-766c26f2-76cdae3f-95c0bc79-6baef9dc-7e754cb8-bd3e8a6f-fa4f119d-", "7e6a00f1-e4f881d0-260a988d-5bf8eb58-b4e49fc0-74cfb1fc-4f4b2671-12d89845", ); /// # Crate version pub const VERSION: &str = version!(); /// # Crate release date (year/month/day) pub const RELEASE_DATE: (u16, u8, u8) = (2021, 3, 21); /// # Tag, which can be used for logging... pub const TAG: &str = concat!(code_name!(), "::98178d52::", version!()); // ╔════════════════════╗ // ║ IMPLEMENTATION ║ // ╚════════════════════╝ pub mod version_info; use std::borrow::Cow; use dia_args::docs::Project; #[test] fn test_crate_version() { assert_eq!(VERSION, env!("CARGO_PKG_VERSION")); } /// # Result type used in this crate pub type Result<T> = std::io::Result<T>; /// # Server address pub const SERVER_ADDRESS: &[u8] = &[ 0x00, 0xdf, 0xb5, 0x42, 0x8e, 0x3f, 0x9e, 0x22, 0x27, 0xd0, 0xf2, 0x7a, 0x18, 0x89, 0xaa, 0xa8, 0x12, 0xf7, 0x94, 0x21, 0xc0, 0xe8, 0xd1, 0x75, 0x90, 0x64, 0xaf, 0x2e, 0xa9, 0x28, 0xa5, 0xcf, 0x2c, 0x40, 0x5b, 0x65, 0x60, 0x94, 0x4e, 0x17, 0xdb, 0xa6, 0x3a, 0x16, 0x48, 0x17, 0xdd, 0xdd, 0xf5, 0x77, 0x86, 0x7c, 0xa4, 0xc9, 0x55, 0xd9, 0xb0, 0xa6, 0x39, 0x01, 0xf8, 0xc3, 0xd9, 0x6a, 0xa4, ]; /// # Debug server address pub const DEBUG_SERVER_ADDRESS: &[u8] = &[ 0x00, 0x69, 0xc1, 0x12, 0x1d, 0x40, 0x7a, 0x24, 0x80, 0xa5, 0xec, 0xd9, 0x29, 0x30, 0x36, 0x0d, 0x2c, 0xee, 0xae, 0xac, 0x7f, 0xa6, 0x74, 0x42, 0xc3, 0x5d, 0xaf, 0xa9, 0xe5, 0x2e, 0xed, 0x24, 0x46, 0x94, 0x1c, 0xc8, 0x3c, 0xb4, 0x36, 0xc6, 0x2d, 0xd2, 0xd4, 0xc4, 0xc6, 0x6a, 0x2e, 0x54, 0xa1, 0x68, 0x32, 0x7f, 0xe6, 0x1a, 0x09, 0xac, 0x69, 0xbf, 0x34, 0x4f, 0x1f, 0xf5, 0xe9, 0xfe, 0x98, ]; /// # Makes new project pub fn project<'a>() -> Option<Project<'a>> { let license = include_str!("../LICENSE"); Some(Project::new("https://bitbucket.org/haibison/r50", license.lines().next().unwrap(), Some(Cow::Borrowed(license)))) } #[test] fn tests() { assert_ne!(SERVER_ADDRESS, DEBUG_SERVER_ADDRESS); for addr in &[SERVER_ADDRESS, DEBUG_SERVER_ADDRESS] { assert!(addr.is_empty() == false && addr[0] == 0 && addr.len() <= udsx::als::MAX_ADDR_LEN); } assert!(project().is_some()); }