/* Test of execle(). Copyright (C) 2020-2021 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 . */ /* Written by Bruno Haible , 2020. */ #include /* Specification. */ #include #include "signature.h" SIGNATURE_CHECK (execle, int, (const char *, const char *, ...)); #include #include /* Looks up the NAME=VALUE assignment among the environment variables. Returns it, or NULL if not found. */ static const char * get_environ_assignment (const char *name) { size_t name_len = strlen (name); char **p; for (p = environ; *p != NULL; p++) { const char *assignment = *p; if (strncmp (assignment, name, name_len) == 0 && assignment[name_len] == '=') return assignment; } return NULL; } /* Creates a minimal environment. */ static void create_minimal_env (const char *env[5]) { const char **p = env; *p++ = #ifdef __CYGWIN__ /* The Cygwin DLLs needed by the program are in /bin. */ "PATH=.:/bin"; #else "PATH=."; #endif *p = get_environ_assignment ("QEMU_LD_PREFIX"); if (*p != NULL) p++; *p = get_environ_assignment ("QEMU_CPU"); if (*p != NULL) p++; *p++ = "Hommingberg=Gepardenforelle"; *p = NULL; } int main () { const char *progname = "./test-exec-child"; const char *env[5]; create_minimal_env (env); execle (progname, progname, "abc def", "abc\"def\"ghi", "xyz\"", "abc\\def\\ghi", "xyz\\", "???", "***", "", "foo", "", NULL, env); perror ("execle"); return 1; }