aboutsummaryrefslogtreecommitdiff
path: root/lauxlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2011-03-03 13:34:46 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2011-03-03 13:34:46 -0300
commitd806710ab5622487159f2a8aecf72003d831542b (patch)
tree0a2c49e7ee732f17002ed086420f51ca7f42b221 /lauxlib.c
parente049abb69a45e06ca5769a3956a0ba36a959d29e (diff)
downloadlua-d806710ab5622487159f2a8aecf72003d831542b.tar.gz
lua-d806710ab5622487159f2a8aecf72003d831542b.tar.bz2
lua-d806710ab5622487159f2a8aecf72003d831542b.zip
returns for file-related functions and process-related functions
unified in 'auxlib'
Diffstat (limited to 'lauxlib.c')
-rw-r--r--lauxlib.c60
1 files changed, 59 insertions, 1 deletions
diff --git a/lauxlib.c b/lauxlib.c
index 22c9de35..777b1aaf 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lauxlib.c,v 1.227 2010/11/10 18:05:36 roberto Exp roberto $ 2** $Id: lauxlib.c,v 1.228 2011/01/10 15:51:42 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -203,6 +203,64 @@ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
203 return lua_error(L); 203 return lua_error(L);
204} 204}
205 205
206
207LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {
208 int en = errno; /* calls to Lua API may change this value */
209 if (stat) {
210 lua_pushboolean(L, 1);
211 return 1;
212 }
213 else {
214 lua_pushnil(L);
215 if (fname)
216 lua_pushfstring(L, "%s: %s", fname, strerror(en));
217 else
218 lua_pushfstring(L, "%s", strerror(en));
219 lua_pushinteger(L, en);
220 return 3;
221 }
222}
223
224
225#if !defined(inspectstat) /* { */
226
227#if defined(LUA_USE_POSIX)
228
229#include <sys/wait.h>
230
231/*
232** use appropriate macros to interpret 'pclose' return status
233*/
234#define inspectstat(stat,what) \
235 if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \
236 else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; }
237
238#else
239
240#define inspectstat(stat,what) /* no op */
241
242#endif
243
244#endif /* } */
245
246
247LUALIB_API int luaL_execresult (lua_State *L, int stat) {
248 const char *what = "exit"; /* type of termination */
249 if (stat == -1) /* error? */
250 return luaL_fileresult(L, 0, NULL);
251 else {
252 inspectstat(stat, what); /* interpret result */
253 if (*what == 'e' && stat == 0) /* successful termination? */
254 return luaL_fileresult(L, 1, NULL);
255 else { /* return nil,what,code */
256 lua_pushnil(L);
257 lua_pushstring(L, what);
258 lua_pushinteger(L, stat);
259 return 3;
260 }
261 }
262}
263
206/* }====================================================== */ 264/* }====================================================== */
207 265
208 266