/* Test of execute. Copyright (C) 2020-2023 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3, 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . */ #include #include "execute.h" #include #include #include #include "read-file.h" #include "macros.h" #define DATA_FILENAME "test-execute-script.tmp" int main () { unlink (DATA_FILENAME); /* Check an invocation of an executable script. This should only be supported if the script has a '#!' marker; otherwise it is unsecure: . POSIX says that the execlp() and execvp() functions support executing shell scripts , but this is considered an antiquated feature. */ /* This test is an extension of "Check stdout is inherited, part 1 (regular file)" in test-execute-main.c. */ FILE *fp = freopen (DATA_FILENAME, "w", stdout); ASSERT (fp != NULL); { size_t i; for (i = 0; i < 2; i++) { const char *progname = (i == 0 ? "executable-script" : "executable-script.sh"); const char *prog_path = (i == 0 ? SRCDIR "executable-script" : SRCDIR "executable-script.sh"); const char *prog_argv[2] = { prog_path, NULL }; int ret = execute (progname, prog_argv[0], prog_argv, NULL, false, false, false, false, true, false, NULL); ASSERT (ret == 127); } } #if defined _WIN32 && !defined __CYGWIN__ /* On native Windows, scripts - even with '#!' marker - are not executable. Only .bat and .cmd files are. */ ASSERT (fclose (fp) == 0); ASSERT (unlink (DATA_FILENAME) == 0); fprintf (stderr, "Skipping test: scripts are not executable on this platform.\n"); return 77; #else { const char *progname = "executable-shell-script"; const char *prog_path = SRCDIR "executable-shell-script"; const char *prog_argv[2] = { prog_path, NULL }; int ret = execute (progname, prog_argv[0], prog_argv, NULL, false, false, false, false, true, false, NULL); ASSERT (ret == 0); ASSERT (fclose (fp) == 0); size_t length; char *contents = read_file (DATA_FILENAME, 0, &length); ASSERT (length == 11 && memcmp (contents, "Halle Potta", 11) == 0); } ASSERT (unlink (DATA_FILENAME) == 0); return 0; #endif }