VirtualBox

source: kBuild/trunk/src/kmk/kmkbuiltin.h@ 3219

Last change on this file since 3219 was 3195, checked in by bird, 6 years ago

kmk/win: Catch output from processes spawned by kmk_redirect. Made imagecase threadsafe and made winchildren use it.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.4 KB
Line 
1/* $Id: kmkbuiltin.h 3195 2018-03-27 18:09:23Z bird $ */
2/** @file
3 * kMk Builtin command handling.
4 */
5
6/*
7 * Copyright (c) 2005-2016 knut st. osmundsen <bird-kBuild-spamx@anduin.net>
8 *
9 * This file is part of kBuild.
10 *
11 * kBuild is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * kBuild is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with kBuild. If not, see <http://www.gnu.org/licenses/>
23 *
24 */
25
26#ifndef ___kmk_kmkbuiltin_h___
27#define ___kmk_kmkbuiltin_h___
28
29#ifdef _MSC_VER
30# ifndef pid_t /* see config.h.win */
31# define pid_t intptr_t /* Note! sub_proc.c needs it to be pointer sized. */
32# endif
33#else
34# include <sys/types.h>
35#endif
36#include <fcntl.h>
37
38/* For the GNU/hurd weirdo. */
39#ifndef PATH_MAX
40# ifdef MAXPATHLEN
41# define PATH_MAX MAXPATHLEN
42# else
43# define PATH_MAX 4096
44# endif
45#endif
46#ifndef MAXPATHLEN
47# define MAXPATHLEN PATH_MAX
48#endif
49
50/** This is for telling fopen() to get a close-on-exec handle.
51 * @todo glibc 2.7+ and recent cygwin supports 'e' for doing this. */
52#ifndef KMK_FOPEN_NO_INHERIT_MODE
53# ifdef _MSC_VER
54# define KMK_FOPEN_NO_INHERIT_MODE "N"
55# else
56# define KMK_FOPEN_NO_INHERIT_MODE ""
57# endif
58#endif
59
60/** This is for telling open() to open to return a close-on-exec descriptor. */
61#ifdef _O_NOINHERIT
62# define KMK_OPEN_NO_INHERIT _O_NOINHERIT
63#elif defined(O_NOINHERIT)
64# define KMK_OPEN_NO_INHERIT O_NOINHERIT
65#elif defined(O_CLOEXEC)
66# define KMK_OPEN_NO_INHERIT O_CLOEXEC
67#else
68# define KMK_OPEN_NO_INHERIT 0
69#endif
70
71
72#include "kbuild_version.h"
73#ifndef KMK_BUILTIN_STANDALONE
74# include "../output.h"
75#endif
76
77struct child;
78int kmk_builtin_command(const char *pszCmd, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned);
79int kmk_builtin_command_parsed(int argc, char **argv, struct child *pChild, char ***ppapszArgvToSpawn, pid_t *pPidSpawned);
80
81
82/**
83 * KMK built-in command execution context.
84 */
85typedef struct KMKBUILTINCTX
86{
87 /** The program name to use in error messages. */
88 const char *pszProgName;
89 /** The KMK output synchronizer. */
90 struct output *pOut;
91#if defined(KBUILD_OS_WINDOWS) && !defined(KMK_BUILTIN_STANDALONE)
92 /** Pointer to the worker thread, if we're on one. */
93 void *pvWorker;
94#endif
95} KMKBUILTINCTX;
96/** Pointer to kmk built-in command execution context. */
97typedef KMKBUILTINCTX *PKMKBUILTINCTX;
98
99/**
100 * kmk built-in command entry.
101 */
102typedef struct KMKBUILTINENTRY
103{
104 union
105 {
106 struct
107 {
108 char cch;
109 char sz[15];
110 } s;
111 size_t cchAndStart;
112 } uName;
113 union
114 {
115 uintptr_t uPfn;
116#define FN_SIG_MAIN 0
117 int (* pfnMain)(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
118#define FN_SIG_MAIN_SPAWNS 1
119 int (* pfnMainSpawns)(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPid);
120#define FN_SIG_MAIN_TO_SPAWN 2
121 int (* pfnMainToSpawn)(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, char ***ppapszArgvToSpawn);
122 } u;
123 size_t uFnSignature : 8;
124 size_t fMtSafe : 1; /**< Safe for multi threaded execution. */
125 size_t fNeedEnv : 1; /**< Needs the (target) enviornment. */
126} KMKBUILTINENTRY;
127/** Pointer to kmk built-in command entry. */
128typedef KMKBUILTINENTRY const *PCKMKBUILTINENTRY;
129
130extern int kmk_builtin_append(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned);
131extern int kmk_builtin_cp(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
132extern int kmk_builtin_cat(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
133extern int kmk_builtin_chmod(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
134extern int kmk_builtin_cmp(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
135extern int kmk_builtin_dircache(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
136extern int kmk_builtin_echo(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
137extern int kmk_builtin_expr(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
138extern int kmk_builtin_install(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
139extern int kmk_builtin_ln(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
140extern int kmk_builtin_md5sum(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
141extern int kmk_builtin_mkdir(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
142extern int kmk_builtin_mv(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
143extern int kmk_builtin_printf(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
144extern int kmk_builtin_redirect(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned);
145extern int kmk_builtin_rm(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
146extern int kmk_builtin_rmdir(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
147extern int kmk_builtin_sleep(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
148extern int kmk_builtin_test(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, char ***ppapszArgvSpawn);
149extern int kmk_builtin_touch(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
150#ifdef KBUILD_OS_WINDOWS
151extern int kmk_builtin_kSubmit(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned);
152extern int kSubmitSubProcGetResult(intptr_t pvUser, int *prcExit, int *piSigNo);
153extern int kSubmitSubProcKill(intptr_t pvUser, int iSignal);
154extern void kSubmitSubProcCleanup(intptr_t pvUser);
155#endif
156extern int kmk_builtin_kDepIDB(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
157extern int kmk_builtin_kDepObj(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx);
158
159extern char *kmk_builtin_func_printf(char *o, char **argv, const char *funcname);
160
161/* common-env-and-cwd-opt.c: */
162extern int kBuiltinOptEnvSet(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars,
163 int cVerbosity, const char *pszValue);
164extern int kBuiltinOptEnvAppend(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars,
165 int cVerbosity, const char *pszValue);
166extern int kBuiltinOptEnvPrepend(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars,
167 int cVerbosity, const char *pszValue);
168extern int kBuiltinOptEnvUnset(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars,
169 int cVerbosity, const char *pszVarToRemove);
170extern int kBuiltinOptEnvZap(PKMKBUILTINCTX pCtx, char ***ppapszEnv, unsigned *pcEnvVars, unsigned *pcAllocatedEnvVars,
171 int cVerbosity);
172extern void kBuiltinOptEnvCleanup(char ***ppapszEnv, unsigned cEnvVars, unsigned *pcAllocatedEnvVars);
173extern int kBuiltinOptChDir(PKMKBUILTINCTX pCtx, char *pszCwd, size_t cbCwdBuf, const char *pszValue);
174
175#ifdef CONFIG_WITH_KMK_BUILTIN_STATS
176extern void kmk_builtin_print_stats(FILE *pOutput, const char *pszPrefix);
177#endif
178
179#endif
180
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use