summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2019-08-16 22:38:34 +0800
committerruki <[email protected]>2019-08-16 17:49:18 +0800
commit7bf7eabafb4c7f4bc36bd3964a914358cd7bb46c (patch)
tree95ab3093f5363a3715b6456a48302329ad47f819 /core/src
parent524b4d10954233517fd25374b36c3e4080b29113 (diff)
improve process.openv
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/process/open.c6
-rw-r--r--core/src/xmake/process/openv.c111
2 files changed, 66 insertions, 51 deletions
diff --git a/core/src/xmake/process/open.c b/core/src/xmake/process/open.c
index 7a65c8d31..fad3e8fec 100644
--- a/core/src/xmake/process/open.c
+++ b/core/src/xmake/process/open.c
@@ -109,12 +109,6 @@ tb_int_t xm_process_open(lua_State* lua)
}
lua_pop(lua, 1);
}
- else
- {
- // @deprecated compatible with process.open(cmd, outpath, errpath)
- outpath = lua_tostring(lua, 2);
- errpath = lua_tostring(lua, 3);
- }
// set the new environments
if (envn > 0) attr.envp = envs;
diff --git a/core/src/xmake/process/openv.c b/core/src/xmake/process/openv.c
index bdb3e2ba9..459a56832 100644
--- a/core/src/xmake/process/openv.c
+++ b/core/src/xmake/process/openv.c
@@ -34,7 +34,7 @@
* implementation
*/
-// p = process.openv(shellname, argv, outpath, errpath, envs)
+// p = process.openv(shellname, argv, {outpath = "", errpath = "", envs = {"PATH=xxx", "XXX=yyy"})
tb_int_t xm_process_openv(lua_State* lua)
{
// check
@@ -49,53 +49,10 @@ tb_int_t xm_process_openv(lua_State* lua)
return 0;
}
- // get the output and error file
+ // get shellname
tb_char_t const* shellname = lua_tostring(lua, 1);
- tb_char_t const* outpath = lua_tostring(lua, 3);
- tb_char_t const* errpath = lua_tostring(lua, 4);
tb_check_return_val(shellname, 0);
- // get environments
- tb_char_t const* envs[256] = {0};
- tb_size_t envn = 0;
- if (lua_istable(lua, 5))
- {
- // get environment variables count
- envn = (tb_size_t)lua_objlen(lua, 5);
-
- // get all passed environment variables
- tb_size_t i;
- for (i = 0; i < envn; i++)
- {
- // get envs[i]
- lua_pushinteger(lua, i + 1);
- lua_gettable(lua, 5);
-
- // is string?
- if (lua_isstring(lua, -1))
- {
- // add this environment value
- if (i + 1 < tb_arrayn(envs))
- envs[i] = lua_tostring(lua, -1);
- else
- {
- // error
- lua_pushfstring(lua, "envs is too large(%lu > %d) for process.openv", envn, tb_arrayn(envs) - 1);
- lua_error(lua);
- }
- }
- else
- {
- // error
- lua_pushfstring(lua, "invalid envs[%ld] type(%s) for process.openv", i, luaL_typename(lua, -1));
- lua_error(lua);
- }
-
- // pop it
- lua_pop(lua, 1);
- }
- }
-
// get the arguments count
tb_long_t argn = lua_objlen(lua, 2);
tb_check_return_val(argn >= 0, 0);
@@ -133,6 +90,68 @@ tb_int_t xm_process_openv(lua_State* lua)
// init attributes
tb_process_attr_t attr = {0};
+ // get option arguments
+ tb_size_t envn = 0;
+ tb_char_t const* envs[256] = {0};
+ tb_char_t const* outpath = tb_null;
+ tb_char_t const* errpath = tb_null;
+ if (lua_istable(lua, 3))
+ {
+ // get outpath
+ lua_pushstring(lua, "outpath");
+ lua_gettable(lua, 3);
+ outpath = lua_tostring(lua, -1);
+ lua_pop(lua, 1);
+
+ // get errpath
+ lua_pushstring(lua, "errpath");
+ lua_gettable(lua, 3);
+ errpath = lua_tostring(lua, -1);
+ lua_pop(lua, 1);
+
+ // get environments
+ lua_pushstring(lua, "envs");
+ lua_gettable(lua, 3);
+ if (lua_istable(lua, -1))
+ {
+ // get environment variables count
+ envn = (tb_size_t)lua_objlen(lua, -1);
+
+ // get all passed environment variables
+ tb_size_t i;
+ for (i = 0; i < envn; i++)
+ {
+ // get envs[i]
+ lua_pushinteger(lua, i + 1);
+ lua_gettable(lua, -2);
+
+ // is string?
+ if (lua_isstring(lua, -1))
+ {
+ // add this environment value
+ if (i + 1 < tb_arrayn(envs))
+ envs[i] = lua_tostring(lua, -1);
+ else
+ {
+ // error
+ lua_pushfstring(lua, "envs is too large(%lu > %d) for process.openv", envn, tb_arrayn(envs) - 1);
+ lua_error(lua);
+ }
+ }
+ else
+ {
+ // error
+ lua_pushfstring(lua, "invalid envs[%ld] type(%s) for process.openv", i, luaL_typename(lua, -1));
+ lua_error(lua);
+ }
+
+ // pop it
+ lua_pop(lua, 1);
+ }
+ }
+ lua_pop(lua, 1);
+ }
+
// set the new environments
if (envn > 0) attr.envp = envs;
@@ -142,6 +161,7 @@ tb_int_t xm_process_openv(lua_State* lua)
// redirect stdout to file
attr.outpath = outpath;
attr.outmode = TB_FILE_MODE_RW | TB_FILE_MODE_TRUNC | TB_FILE_MODE_CREAT;
+ attr.outtype = TB_PROCESS_REDIRECT_TYPE_FILEPATH;
}
// redirect stderr?
@@ -150,6 +170,7 @@ tb_int_t xm_process_openv(lua_State* lua)
// redirect stderr to file
attr.errpath = errpath;
attr.errmode = TB_FILE_MODE_RW | TB_FILE_MODE_TRUNC | TB_FILE_MODE_CREAT;
+ attr.errtype = TB_PROCESS_REDIRECT_TYPE_FILEPATH;
}
// init process