1 Commits

Author SHA1 Message Date
DTB
b5cd33bfe6 simexec(1): import from trinity/src 2024-07-23 18:14:24 -06:00
3 changed files with 63 additions and 23 deletions

View File

@@ -32,7 +32,7 @@ RUSTLIBS = --extern getopt=build/o/libgetopt.rlib \
CFLAGS += -I$(SYSEXITS)
.PHONY: all
all: dj false fop hru intcmp mm npc retval rpn scrut str strcmp swab true
all: dj false fop hru intcmp mm npc rpn scrut str strcmp swab true
# keep build/include until bindgen(1) has stdin support
# https://github.com/rust-lang/rust-bindgen/issues/2703
@@ -122,11 +122,6 @@ npc: build/bin/npc
build/bin/npc: src/npc.c build
$(CC) $(CFLAGAS) -o $@ src/npc.c
.PHONY: retval
retval: build/bin/retval
build/bin/retval: src/retval.rs build rustlibs
$(RUSTC) $(RUSTFLAGS) $(RUSTLIBS) -o $@ src/retval.rs
.PHONY: rpn
rpn: build/bin/rpn
build/bin/rpn: src/rpn.rs build rustlibs

49
docs/simexec.1 Normal file
View File

@@ -0,0 +1,49 @@
.TH SIMEXEC 1
.SH NAME
simexec \(en execute a program with the given argv
.SH SYNOPSIS
simexec
.RB [ pathname ]
.RB [ argv... ]
.SH DESCRIPTION
Simexec executes a given program with the given argv.
.SH PITFALLS
Non-binary programs cannot be executed. The PATH environment variable is not used and a valid pathname (relative or absolute) must be specified.
.PP
Simexec relies on the user to take proper precautions.
argv is not just the operands for the program but in fact directly the argv it will receive in runtime;
the first argv entry is the program's name, and forgoing this, though acceptable by simexec, can break customary assumptions.
for example, the true(1) implementation in the GNU coreutils suffers a segmentation fault if there is no argv[0].
.PP
While POSIX.1-2017 doesn't mandate there being an argv[0] per se a Strictly Conforming POSIX Application must pass an argv[0].
It has also been said that those who do not pass an argv[0] are mean and nasty and smell of elderberries.
.PP
Simexec directly uses the execv library function. It cannot execute shell scripts intelligently (via shebang).
It is inadviseable to use simexec as an alternative to simply calling a program, and in fact probably inadviseable to use simexec at all.
.SH DIAGNOSTICS
Simexec returns the value of execv(3), which will be -1 (or 0xFF; 255) if an error occurs.
This is not distinguishable from the executed program returning the same exit status.
.PP
Simexec will print a error message and return the proper sysexits(3) value if used in an invalid manner.
.SH COPYRIGHT
Public domain.
.SH SEE ALSO
exec(3)
.PP
The C89 standard's draft, section 2.1.2.2: "Hosted environment".
.PP
POSIX.1-2017 System Interfaces: execv. Particularly under the RATIONALE section header.

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2024 DTB <trinity@trinity.moe>
* Copyright (c) 2023 DTB <trinity@trinity.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify it under
@@ -16,24 +16,20 @@
* along with this program. If not, see https://www.gnu.org/licenses/.
*/
use std::{ env::args, process::ExitCode };
#include <stdio.h> /* fprintf(3), NULL */
#include <unistd.h> /* execv(3), */
#include <sysexits.h> /* EX_USAGE */
extern crate sysexits;
use sysexits::EX_USAGE;
char *program_name = "simexec";
fn usage(s: &str) -> ExitCode {
eprintln!("Usage: {} status", s);
ExitCode::from(EX_USAGE)
}
int main(int argc, char *argv[]){
fn main() -> ExitCode {
let argv = args().collect::<Vec<String>>();
match argv.len() {
2 => match argv[1].parse::<u8>() {
Ok(e) => ExitCode::from(e),
_ => usage(&argv[0])
},
_ => usage(&argv[0])
if(argc < 2){
fprintf(stderr, "Usage: %s binary argv...\n",
argv[0] == NULL ? program_name : argv[0]
);
return EX_USAGE;
}
execv(argv[1], &argv[2]);
}