Compare commits

..

No commits in common. "fb65d1f950ac997340a9527bd67ff4ad9e909d58" and "b5cd33bfe6e88575d0cbac27d737156d3c3fa4cd" have entirely different histories.

3 changed files with 36 additions and 70 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: dj false fop hru intcmp mm npc rpn simexec 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 # 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
@ -132,11 +132,6 @@ 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,79 +1,49 @@
.\" Copyright (c) 20222024 DTB <trinity@trinity.moe> .TH SIMEXEC 1
.\"
.\" 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 .SH NAME
simexec \(en execute a program with argv
.\" simexec \(en execute a program with the given argv
.SH SYNOPSIS .SH SYNOPSIS
simexec simexec
.B binary argv... .RB [ pathname ]
.RB [ argv... ]
.SH DESCRIPTION .SH DESCRIPTION
Execute a binary with a certain argv.
.SH CAVEATS
Non-binary programs cannot be executed on their own. The PATH environment Simexec executes a given program with the given argv.
variable is not used and a valid pathname (relative or absolute) must be
specified.
.BR simexec (1) .SH PITFALLS
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 Non-binary programs cannot be executed. The PATH environment variable is not used and a valid pathname (relative or absolute) must be specified.
Conforming POSIX Application must pass an argv[0]. It has also been said that .PP
those who do not pass an argv[0] are mean and nasty and smell of elderberries. 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.
.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 .SH DIAGNOSTICS
.BR simexec (1) Simexec returns the value of execv(3), which will be -1 (or 0xFF; 255) if an error occurs.
exits with the returned value of This is not distinguishable from the executed program returning the same exit status.
.BR execv (3p), .PP
which will be 255 if an error occurs in execution, such as the binary not being Simexec will print a error message and return the proper sysexits(3) value if used in an invalid manner.
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 .SH COPYRIGHT
.\"
Copyright \(co 20222024 DTB. License AGPLv3+: GNU AGPL version 3 or later Public domain.
<https://gnu.org/licenses/gpl.html>.
.\"
.SH SEE ALSO .SH SEE ALSO
.BR execv (3p)
exec(3)
.PP
The C89 standard's draft, section 2.1.2.2: "Hosted environment". 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. POSIX.1-2017 System Interfaces: execv. Particularly under the RATIONALE section header.

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 20222024 DTB <trinity@trinity.moe> * Copyright (c) 2023 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
@ -23,7 +23,8 @@
char *program_name = "simexec"; char *program_name = "simexec";
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
if (argc < 2) {
if(argc < 2){
fprintf(stderr, "Usage: %s binary argv...\n", fprintf(stderr, "Usage: %s binary argv...\n",
argv[0] == NULL ? program_name : argv[0] argv[0] == NULL ? program_name : argv[0]
); );