diff options
Diffstat (limited to '')
-rw-r--r-- | src/kmk/kmkbuiltin.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/src/kmk/kmkbuiltin.h b/src/kmk/kmkbuiltin.h new file mode 100644 index 0000000..955a04d --- /dev/null +++ b/src/kmk/kmkbuiltin.h @@ -0,0 +1,184 @@ +/* $Id: kmkbuiltin.h 3352 2020-06-05 00:31:50Z bird $ */ +/** @file + * kMk Builtin command handling. + */ + +/* + * Copyright (c) 2005-2016 knut st. osmundsen <bird-kBuild-spamx@anduin.net> + * + * This file is part of kBuild. + * + * kBuild 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 of the License, or + * (at your option) any later version. + * + * kBuild 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 kBuild. If not, see <http://www.gnu.org/licenses/> + * + */ + +#ifndef ___kmk_kmkbuiltin_h___ +#define ___kmk_kmkbuiltin_h___ + +#ifdef _MSC_VER +# ifndef pid_t /* see config.h.win */ +# define pid_t intptr_t /* Note! sub_proc.c needs it to be pointer sized. */ +# endif +#else +# include <sys/types.h> +#endif +#include <fcntl.h> +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif + +/* For the GNU/hurd weirdo. */ +#ifndef PATH_MAX +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 4096 +# endif +#endif +#ifndef MAXPATHLEN +# define MAXPATHLEN PATH_MAX +#endif + +/** This is for telling fopen() to get a close-on-exec handle. + * @todo glibc 2.7+ and recent cygwin supports 'e' for doing this. */ +#ifndef KMK_FOPEN_NO_INHERIT_MODE +# ifdef _MSC_VER +# define KMK_FOPEN_NO_INHERIT_MODE "N" +# else +# define KMK_FOPEN_NO_INHERIT_MODE "" +# endif +#endif + +/** This is for telling open() to open to return a close-on-exec descriptor. */ +#ifdef _O_NOINHERIT +# define KMK_OPEN_NO_INHERIT _O_NOINHERIT +#elif defined(O_NOINHERIT) +# define KMK_OPEN_NO_INHERIT O_NOINHERIT +#elif defined(O_CLOEXEC) +# define KMK_OPEN_NO_INHERIT O_CLOEXEC +#else +# define KMK_OPEN_NO_INHERIT 0 +#endif + + +#include "kbuild_version.h" +#if !defined(KMK_BUILTIN_STANDALONE) && !defined(KWORKER) +# include "output.h" +#endif + +struct child; +int kmk_builtin_command(const char *pszCmd, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned); +int kmk_builtin_command_parsed(int argc, char **argv, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned); + + +/** + * KMK built-in command execution context. + */ +typedef struct KMKBUILTINCTX +{ + /** The program name to use in error messages. */ + const char *pszProgName; + /** The KMK output synchronizer. */ + struct output *pOut; +#if defined(KBUILD_OS_WINDOWS) && !defined(KMK_BUILTIN_STANDALONE) + /** Pointer to the worker thread, if we're on one. */ + void *pvWorker; +#endif +} KMKBUILTINCTX; +/** Pointer to kmk built-in command execution context. */ +typedef KMKBUILTINCTX *PKMKBUILTINCTX; + +/** + * kmk built-in command entry. + */ +typedef struct KMKBUILTINENTRY +{ + union + { + struct + { + unsigned char cch; + char sz[15]; + } s; + size_t cchAndStart; + } uName; + union + { + uintptr_t uPfn; +#define FN_SIG_MAIN 0 + int (* pfnMain)(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +#define FN_SIG_MAIN_SPAWNS 1 + int (* pfnMainSpawns)(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPid); +#define FN_SIG_MAIN_TO_SPAWN 2 + int (* pfnMainToSpawn)(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, char ***ppapszArgvToSpawn); + } u; + size_t uFnSignature : 8; + size_t fMtSafe : 1; /**< Safe for multi threaded execution. */ + size_t fNeedEnv : 1; /**< Needs the (target) environment. */ +} KMKBUILTINENTRY; +/** Pointer to kmk built-in command entry. */ +typedef KMKBUILTINENTRY const *PCKMKBUILTINENTRY; + +extern int kmk_builtin_append(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned); +extern int kmk_builtin_cp(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_cat(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_chmod(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_cmp(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_dircache(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_echo(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_expr(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_install(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_ln(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_md5sum(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_mkdir(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_mv(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_printf(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_redirect(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned); +extern int kmk_builtin_rm(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_rmdir(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_sleep(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_test(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, char ***ppapszArgvSpawn); +extern int kmk_builtin_touch(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +#ifdef KBUILD_OS_WINDOWS +extern int kmk_builtin_kSubmit(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned); +extern int kSubmitSubProcGetResult(intptr_t pvUser, int fBlock, int *prcExit, int *piSigNo); +extern int kSubmitSubProcKill(intptr_t pvUser, int iSignal); +extern void kSubmitSubProcCleanup(intptr_t pvUser); +extern int kmk_builtin_kill(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +#endif +extern int kmk_builtin_kDepIDB(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); +extern int kmk_builtin_kDepObj(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx); + +extern char *kmk_builtin_func_printf(char *o, char **argv, const char *funcname); + +/* common-env-and-cwd-opt.c: */ +extern int kBuiltinOptEnvSet(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars, + int cVerbosity, const char *pszValue); +extern int kBuiltinOptEnvAppend(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars, + int cVerbosity, const char *pszValue); +extern int kBuiltinOptEnvPrepend(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars, + int cVerbosity, const char *pszValue); +extern int kBuiltinOptEnvUnset(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars, + int cVerbosity, const char *pszVarToRemove); +extern int kBuiltinOptEnvZap(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars, + int cVerbosity); +extern void kBuiltinOptEnvCleanup(char ***ppapszEnv, unsigned cEnvVars, unsigned *pcAllocatedEnvVars); +extern int kBuiltinOptChDir(PKMKBUILTINCTX pCtx, char *pszCwd, size_t cbCwdBuf, const char *pszValue); + +#ifdef CONFIG_WITH_KMK_BUILTIN_STATS +extern void kmk_builtin_print_stats(FILE *pOutput, const char *pszPrefix); +#endif + +#endif + |