usleep tests: Avoid failure due to known Cygwin 3.5.3 bug.
[gnulib.git] / tests / test-execute-script.c
blobdfb9d8c259656a74493edec51ca4f820128ec26f
1 /* Test of execute.
2 Copyright (C) 2020-2024 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3, or (at your option)
7 any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, see <https://www.gnu.org/licenses/>. */
17 #include <config.h>
19 #include "execute.h"
21 #include <stdio.h>
22 #include <string.h>
23 #include <unistd.h>
25 #include "read-file.h"
26 #include "macros.h"
28 #define DATA_FILENAME "test-execute-script.tmp"
30 int
31 main ()
33 unlink (DATA_FILENAME);
35 /* Check an invocation of an executable script.
36 This should only be supported if the script has a '#!' marker; otherwise
37 it is unsecure: <https://sourceware.org/bugzilla/show_bug.cgi?id=13134>.
38 POSIX says that the execlp() and execvp() functions support executing
39 shell scripts
40 <https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html>,
41 but this is considered an antiquated feature. */
43 /* This test is an extension of
44 "Check stdout is inherited, part 1 (regular file)"
45 in test-execute-main.c. */
46 FILE *fp = freopen (DATA_FILENAME, "w", stdout);
47 ASSERT (fp != NULL);
50 size_t i;
52 for (i = 0; i < 2; i++)
54 const char *progname =
55 (i == 0 ? "executable-script" : "executable-script.sh");
56 const char *prog_path =
57 (i == 0 ? SRCDIR "executable-script" : SRCDIR "executable-script.sh");
58 const char *prog_argv[2] = { prog_path, NULL };
60 int ret = execute (progname, prog_argv[0], prog_argv, NULL,
61 false, false, false, false, true, false, NULL);
62 ASSERT (ret == 127);
66 #if defined _WIN32 && !defined __CYGWIN__
67 /* On native Windows, scripts - even with '#!' marker - are not executable.
68 Only .bat and .cmd files are. */
69 ASSERT (fclose (fp) == 0);
70 ASSERT (unlink (DATA_FILENAME) == 0);
71 if (test_exit_status)
72 return test_exit_status;
73 fprintf (stderr, "Skipping test: scripts are not executable on this platform.\n");
74 return 77;
75 #else
77 const char *progname = "executable-shell-script";
78 const char *prog_path = SRCDIR "executable-shell-script";
79 const char *prog_argv[2] = { prog_path, NULL };
81 int ret = execute (progname, prog_argv[0], prog_argv, NULL,
82 false, false, false, false, true, false, NULL);
83 ASSERT (ret == 0);
85 ASSERT (fclose (fp) == 0);
87 size_t length;
88 char *contents = read_file (DATA_FILENAME, 0, &length);
89 ASSERT (length == 11 && memcmp (contents, "Halle Potta", 11) == 0);
92 ASSERT (unlink (DATA_FILENAME) == 0);
94 return test_exit_status;
95 #endif