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());
}