4 Commits

Author SHA1 Message Date
DTB
fb65d1f950 Makefile: add simexec(1) 2024-07-23 18:53:27 -06:00
DTB
fc33683382 simexec.1: Fix man page 2024-07-23 18:51:14 -06:00
DTB
6bba80e3f9 simexec(1): fix copyright 2024-07-23 18:35:28 -06:00
DTB
b5cd33bfe6 simexec(1): import from trinity/src 2024-07-23 18:14:24 -06:00
4 changed files with 100 additions and 43 deletions

View File

@@ -32,7 +32,7 @@ RUSTLIBS = --extern getopt=build/o/libgetopt.rlib \
CFLAGS += -I$(SYSEXITS) CFLAGS += -I$(SYSEXITS)
.PHONY: all .PHONY: all
all: argued dj false fop hru intcmp mm npc rpn scrut str strcmp swab true all: dj false fop hru intcmp mm npc rpn simexec scrut str strcmp swab true
# keep build/include until bindgen(1) has stdin support # keep build/include until bindgen(1) has stdin support
# https://github.com/rust-lang/rust-bindgen/issues/2703 # https://github.com/rust-lang/rust-bindgen/issues/2703
@@ -87,11 +87,6 @@ build/o/libsysexits.rlib: build/include/sysexits.h
build/include/sysexits.h: build $(SYSEXITS)sysexits.h build/include/sysexits.h: build $(SYSEXITS)sysexits.h
printf '\043define EXIT_FAILURE 1\n' | cat - $(SYSEXITS)sysexits.h > $@ printf '\043define EXIT_FAILURE 1\n' | cat - $(SYSEXITS)sysexits.h > $@
.PHONY: argued
argued: build/bin/argued
build/bin/argued: src/argued.rs build
$(RUSTC) $(RUSTFLAGS) -o $@ src/argued.rs
.PHONY: dj .PHONY: dj
dj: build/bin/dj dj: build/bin/dj
build/bin/dj: src/dj.c build build/bin/dj: src/dj.c build
@@ -137,6 +132,11 @@ scrut: build/bin/scrut
build/bin/scrut: src/scrut.c build build/bin/scrut: src/scrut.c build
$(CC) $(CFLAGS) -o $@ src/scrut.c $(CC) $(CFLAGS) -o $@ src/scrut.c
.PHONY: simexec
simexec: build/bin/simexec
build/bin/simexec: src/simexec.c build
$(CC) $(CFLAGS) -o $@ src/simexec.c
.PHONY: str .PHONY: str
str: build/bin/str str: build/bin/str
build/bin/str: src/str.c build build/bin/str: src/str.c build

View File

@@ -1,28 +0,0 @@
.\" Copyright (c) 20222024 DTB <trinity@trinity.moe>
.\"
.\" This work is licensed under CC BY-SA 4.0. To see a copy of this license,
.\" visit <http://creativecommons.org/licenses/by-sa/4.0/>.
.\"
.TH ARGUED 1 2024-07-23 "Harakit-overgrown X.X.X"
.SH NAME
argued \(en check for arguments
.\"
.SH DESCRIPTION
.BR argued (1)
exits successfully if any arguments are provided, and unsuccessfully
otherwise.
.\"
.SH AUTHOR
Written by DTB
.MT trinity@trinity.moe
.ME .
.\"
.SH COPYRIGHT
This work is marked with CC0 1.0. To see a copy of this license, visit
<http://creativecommons.org/publicdomain/zero/1.0>.
.\"
.SH SEE ALSO
.BR test (1)

79
docs/simexec.1 Normal file
View File

@@ -0,0 +1,79 @@
.\" Copyright (c) 20222024 DTB <trinity@trinity.moe>
.\"
.\" This work is licensed under CC BY-SA 4.0. To see a copy of this license,
.\" visit <http://creativecommons.org/licenses/by-sa/4.0/>.
.\"
.TH SIMEXEC 1 2024-07-23 "Harakit-overgrown X.X.X"
.SH NAME
simexec \(en execute a program with argv
.\"
.SH SYNOPSIS
simexec
.B binary argv...
.SH DESCRIPTION
Execute a binary with a certain argv.
.SH CAVEATS
Non-binary programs cannot be executed on their own. The PATH environment
variable is not used and a valid pathname (relative or absolute) must be
specified.
.BR simexec (1)
requires caution.
.B argv
are not just the operands for the binary but in fact the direct
.B argv
it will receive in runtime;
the first argv entry is the program\(cqs name, and omitting this, though valid
use of
.BR simexec (1),
can break false assumptions made by programmers.
for example, the
.BR true (1)
implementation in the GNU coreutils project suffers a segmentation fault it is
given no argv[0].
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.
.BR simexec (1)
directly uses the
.BR execv (3p)
library function. It cannot execute shell scripts intelligently (via shebang).
It is inadviseable to use
.BR simexec (1)
to simply execute a program when other methods would suffice.
.\"
.SH DIAGNOSTICS
.BR simexec (1)
exits with the returned value of
.BR execv (3p),
which will be 255 if an error occurs in execution, such as the binary not being
found.
This is indistinguishable from the executed binary exiting with the same
status.
Simexec will print a error message and return the proper
.BR sysexits.h (3)
value if invoked in an invalid manner.
.\"
.SH AUTHOR
Written by DTB
.MT trinity@trinity.moe
.ME .
.\"
.SH COPYRIGHT
.\"
Copyright \(co 20222024 DTB. License AGPLv3+: GNU AGPL version 3 or later
<https://gnu.org/licenses/gpl.html>.
.\"
.SH SEE ALSO
.BR execv (3p)
The C89 standard's draft, section 2.1.2.2: "Hosted environment".
POSIX.1-2017 System Interfaces: execv. Particularly under the RATIONALE section header.

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2022_2024 DTB <trinity@trinity.moe> * Copyright (c) 20222024 DTB <trinity@trinity.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
* *
* This program is free software: you can redistribute it and/or modify it under * This program is free software: you can redistribute it and/or modify it under
@@ -16,13 +16,19 @@
* along with this program. If not, see https://www.gnu.org/licenses/. * 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 */
fn main() -> ExitCode { char *program_name = "simexec";
let argv = args().collect::<Vec<String>>();
match argv.len() { int main(int argc, char *argv[]){
0 | 1 => ExitCode::FAILURE, if (argc < 2) {
_ => ExitCode::SUCCESS fprintf(stderr, "Usage: %s binary argv...\n",
} argv[0] == NULL ? program_name : argv[0]
} );
return EX_USAGE;
}
execv(argv[1], &argv[2]);
}