From b5cd33bfe6e88575d0cbac27d737156d3c3fa4cd Mon Sep 17 00:00:00 2001 From: DTB Date: Tue, 23 Jul 2024 18:14:24 -0600 Subject: [PATCH 1/4] simexec(1): import from trinity/src --- docs/simexec.1 | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/simexec.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 docs/simexec.1 create mode 100644 src/simexec.c diff --git a/docs/simexec.1 b/docs/simexec.1 new file mode 100644 index 0000000..5d79338 --- /dev/null +++ b/docs/simexec.1 @@ -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. diff --git a/src/simexec.c b/src/simexec.c new file mode 100644 index 0000000..54f087b --- /dev/null +++ b/src/simexec.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2023 DTB + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU Affero General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see https://www.gnu.org/licenses/. + */ + +#include /* fprintf(3), NULL */ +#include /* execv(3), */ +#include /* EX_USAGE */ + +char *program_name = "simexec"; + +int main(int argc, char *argv[]){ + + 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]); +} From 6bba80e3f96b4be96bb6e32e47dd29f0f67f0afa Mon Sep 17 00:00:00 2001 From: DTB Date: Tue, 23 Jul 2024 18:35:28 -0600 Subject: [PATCH 2/4] simexec(1): fix copyright --- src/simexec.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/simexec.c b/src/simexec.c index 54f087b..6441bdb 100644 --- a/src/simexec.c +++ b/src/simexec.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 DTB + * Copyright (c) 2022–2024 DTB * SPDX-License-Identifier: AGPL-3.0-or-later * * This program is free software: you can redistribute it and/or modify it under @@ -23,8 +23,7 @@ char *program_name = "simexec"; int main(int argc, char *argv[]){ - - if(argc < 2){ + if (argc < 2) { fprintf(stderr, "Usage: %s binary argv...\n", argv[0] == NULL ? program_name : argv[0] ); From fc336833820cf94c7f32f4df924fe13eddc9fc95 Mon Sep 17 00:00:00 2001 From: DTB Date: Tue, 23 Jul 2024 18:51:14 -0600 Subject: [PATCH 3/4] simexec.1: Fix man page --- docs/simexec.1 | 94 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 32 deletions(-) diff --git a/docs/simexec.1 b/docs/simexec.1 index 5d79338..794b972 100644 --- a/docs/simexec.1 +++ b/docs/simexec.1 @@ -1,49 +1,79 @@ -.TH SIMEXEC 1 - +.\" Copyright (c) 2022–2024 DTB +.\" +.\" This work is licensed under CC BY-SA 4.0. To see a copy of this license, +.\" visit . +.\" +.TH SIMEXEC 1 2024-07-23 "Harakit-overgrown X.X.X" .SH NAME - -simexec \(en execute a program with the given argv - +simexec \(en execute a program with argv +.\" .SH SYNOPSIS simexec -.RB [ pathname ] -.RB [ argv... ] - +.B binary argv... .SH DESCRIPTION +Execute a binary with a certain argv. +.SH CAVEATS -Simexec executes a given program with the given argv. +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. -.SH PITFALLS +.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]. -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. +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 -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. +.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 - -Public domain. - +.\" +Copyright \(co 2022–2024 DTB. License AGPLv3+: GNU AGPL version 3 or later +. +.\" .SH SEE ALSO +.BR execv (3p) -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. From fb65d1f950ac997340a9527bd67ff4ad9e909d58 Mon Sep 17 00:00:00 2001 From: DTB Date: Tue, 23 Jul 2024 18:53:27 -0600 Subject: [PATCH 4/4] Makefile: add simexec(1) --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 94d0b78..4fd60c5 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ RUSTLIBS = --extern getopt=build/o/libgetopt.rlib \ CFLAGS += -I$(SYSEXITS) .PHONY: all -all: 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 # https://github.com/rust-lang/rust-bindgen/issues/2703 @@ -132,6 +132,11 @@ scrut: build/bin/scrut build/bin/scrut: src/scrut.c build $(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 str: build/bin/str build/bin/str: src/str.c build