diff -ruN lua-5.0.2-old/Makefile lua-5.0.2-new/Makefile --- lua-5.0.2-old/Makefile Fri Mar 12 02:50:55 2004 +++ lua-5.0.2-new/Makefile Sat Jul 10 10:08:02 2004 @@ -1,102 +1,122 @@ -# makefile for Lua hierarchy -# see INSTALL for installation instructions -# see config for customization instructions - -LUA= . - -include $(LUA)/config - -# primary targets ("co" and "klean" are used for making the distribution) -all clean co klean: dirs - cd include; $(MAKE) $@ - cd src; $(MAKE) $@ - cd src/lib; $(MAKE) $@ - cd src/luac; $(MAKE) $@ - cd src/lua; $(MAKE) $@ - -# in case they were not created during unpacking -dirs: bin lib - -bin lib: - mkdir -p $@ - -# simple test to see Lua working -test: all - bin/lua test/hello.lua - -# remove debug information from binaries -strip: - $(STRIP) bin/* - -# official installation -install: all strip - mkdir -p $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) - $(INSTALL_EXEC) bin/* $(INSTALL_BIN) - $(INSTALL_DATA) include/*.h $(INSTALL_INC) - $(INSTALL_DATA) lib/*.a $(INSTALL_LIB) - $(INSTALL_DATA) doc/*.1 $(INSTALL_MAN) - -# shared libraries (for Linux) -so: - ld -o lib/liblua.so.$V -shared src/*.o - ld -o lib/liblualib.so.$V -shared src/lib/*.o - cd lib; ln -fs liblua.so.$V liblua.so; ln -fs liblualib.so.$V liblualib.so - -# binaries using shared libraries -sobin: - rm -f bin/* - cd src/lua; $(MAKE) - cd src/luac; $(MAKE) - -# install shared libraries -soinstall: - $(INSTALL_EXEC) lib/*.so.* $(INSTALL_LIB) - cd $(INSTALL_LIB); ln -fs liblua.so.$V liblua.so; ln -fs liblualib.so.$V liblualib.so - -# clean shared libraries -soclean: - rm -f lib/*.so* bin/* - -# echo config parameters -echo: - @echo "" - @echo "These are the parameters currently set in $(LUA)/config to build Lua $V:" - @echo "" - @echo "LOADLIB = $(LOADLIB)" - @echo "DLLIB = $(DLLIB)" - @echo "NUMBER = $(NUMBER)" - @echo "POPEN = $(POPEN)" - @echo "TMPNAM = $(TMPNAM)" - @echo "DEGREES = $(DEGREES)" - @echo "USERCONF = $(USERCONF)" - @echo "CC = $(CC)" - @echo "WARN = $(WARN)" - @echo "MYCFLAGS = $(MYCFLAGS)" - @echo "MYLDFLAGS = $(MYLDFLAGS)" - @echo "EXTRA_LIBS = $(EXTRA_LIBS)" - @echo "AR = $(AR)" - @echo "RANLIB = $(RANLIB)" - @echo "STRIP = $(STRIP)" - @echo "INSTALL_ROOT = $(INSTALL_ROOT)" - @echo "INSTALL_BIN = $(INSTALL_BIN)" - @echo "INSTALL_INC = $(INSTALL_INC)" - @echo "INSTALL_LIB = $(INSTALL_LIB)" - @echo "INSTALL_MAN = $(INSTALL_MAN)" - @echo "INSTALL_EXEC = $(INSTALL_EXEC)" - @echo "INSTALL_DATA = $(INSTALL_DATA)" - @echo "" - @echo "Edit $(LUA)/config if needed to suit your platform and then run make." - @echo "" - -# turn config into Lua code -# uncomment the last sed expression if you want nil instead of empty strings -lecho: - @echo "-- $(LUA)/config for Lua $V" - @echo "VERSION = '$(V)'" - @make echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/' - @echo "-- EOF" +include $(CONFIG) -newer: - @find . -newer MANIFEST -type f +ifneq "$(OS)" "Windows" + ifneq "$(OS)" "Cygwin" + CFLAGS += -DUSE_DLOPEN=1 + endif +endif +ifneq "$(OS)" "Darwin" + ifneq "$(OS)" "Darwin-static" + ifneq "$(OS)" "OpenBSD" + ifneq "$(OS)" "FreeBSD" + ifneq "$(OS)" "Solaris" + CPFLAGS+= -a + LDFLAGS+= -Wl,-E + HLDFLAGS+= -Wl,-E + endif + endif + endif + endif +endif + +CFLAGS += -I../../include -I../include -I. -I.. -DUSE_POPEN=1 +ifeq "$(OS)" "OpenBSD" + LDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lm +else + ifeq "$(OS)" "Cygwin" + LDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lm + else + ifeq "$(OS)" "BeOS" + LDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -ldl + else + LDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lm -ldl + endif + endif +endif +HCFLAGS += -I../../include -I../include -I. -I.. -DUSE_POPEN=1 +ifeq "$(OS)" "FreeBSD" + HLDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lm +else + ifeq "$(OS)" "OpenBSD" + HLDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lm + else + ifeq "$(OS)" "Cygwin" + HLDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lm + else + ifeq "$(OS)" "BeOS" + HLDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -ldl + else + ifeq "$(OS)" "Solaris" + HLDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lsocket -lnsl -lm + else + HLDFLAGS+= -L../lib/ -L../../lib/ -llua-host -llualib-host -lm -ldl + endif + endif + endif + endif +endif + +H=@ + +all: bin/lua + $(H)echo -n + +bin/lua: + $(H)echo -n ' building core library... ' + $(H)cd src ; \ + $(CC) $(CFLAGS) -c *.c ; \ + $(AR) rc ../lib/liblua.a *.o ; \ + $(RANLIB) ../lib/liblua.a ; \ + rm -f *.o + $(H)echo "done." + + $(H)echo -n ' building standard library... ' + $(H)cd src/lib; \ + $(CC) $(CFLAGS) -c *.c ; \ + $(AR) rc ../../lib/liblualib.a *.o ; \ + $(RANLIB) ../../lib/liblualib.a ; \ + rm -f *.o + $(H)echo "done." + + $(H)if test "$(HCC)" = "$(CC)" ; then \ + cd lib/ ; \ + ln -s liblua.a liblua-host.a ; \ + ln -s liblualib.a liblualib-host.a ; \ + else \ + echo -n ' building core host library... '; \ + cd src ; \ + $(HCC) $(HCFLAGS) -c *.c ; \ + $(HAR) rc ../lib/liblua-host.a *.o ; \ + $(HRANLIB) ../lib/liblua-host.a ; \ + rm -f *.o; \ + echo "done."; \ + echo -n ' building standard host library... '; \ + cd ../src/lib; \ + $(HCC) $(HCFLAGS) -c *.c ; \ + $(HAR) rc ../../lib/liblualib-host.a *.o ; \ + $(HRANLIB) ../../lib/liblualib-host.a ; \ + rm -f *.o ; \ + echo "done."; \ + fi + + $(H)echo -n ' building lua... ' + $(H)cd src/lua; \ + $(HCC) $(HCFLAGS) -o ../../bin/lua *.c $(HLDFLAGS) + $(H)echo "done." + + $(H)echo -n ' building luac... ' + $(H)cd src/luac ; \ + $(HCC) $(HCFLAGS) -o ../../bin/luac *.c \ + -DLUA_OPNAMES ../lopcodes.c $(HLDFLAGS) + $(H)echo "done." + + $(H)echo -n ' building bin2c... ' + $(H)cd etc ; \ + $(HCC) $(HCFLAGS) -o ../bin/bin2c bin2c.c \ + $(HLDFLAGS) + $(H)echo "done." + + $(H)cp include/*.h $(PREFIX)/include + $(H)cp bin/* $(PREFIX)/bin + $(H)cp $(CPFLAGS) lib/*.a $(PREFIX)/lib -# (end of Makefile) +clean: + $(H)rm -f lib/* bin/* diff -ruN lua-5.0.2-old/build lua-5.0.2-new/build --- lua-5.0.2-old/build Fri Mar 28 21:06:41 2003 +++ lua-5.0.2-new/build Thu Jan 1 01:00:00 1970 @@ -1,33 +0,0 @@ -# If you don't want to use make, run this script. -# But make sure you read config to see what can be customized. - - -# Easiest way to build bin/lua: -# cc -O2 -o bin/lua -Iinclude -Isrc src/*.c src/lib/*.c src/lua/*.c -lm -ldl - - -# Easiest way to build Lua libraries and executables: -echo -n 'building core library... ' -cd src -cc -O2 -c -I../include *.c -ar rc ../lib/liblua.a *.o -rm -f *.o - -echo -n 'standard library... ' -cd lib -cc -O2 -c -I../../include *.c -ar rc ../../lib/liblualib.a *.o -rm -f *.o - -echo -n 'lua... ' -cd ../lua -cc -O2 -o ../../bin/lua -I../../include *.c ../../lib/*.a -lm -ldl - -echo -n 'luac... ' -cd ../luac -cc -O2 -o ../../bin/luac -I../../include -I.. *.c -DLUA_OPNAMES ../lopcodes.c ../../lib/*.a - -echo 'done' - -cd ../.. -bin/lua test/hello.lua diff -ruN lua-5.0.2-old/src/lib/lauxlib.c lua-5.0.2-new/src/lib/lauxlib.c --- lua-5.0.2-old/src/lib/lauxlib.c Mon Apr 7 16:35:00 2003 +++ lua-5.0.2-new/src/lib/lauxlib.c Sat Jul 10 09:50:58 2004 @@ -475,9 +475,10 @@ } -static int errfile (lua_State *L, int fnameindex) { +static int errfile (lua_State *L, int id,int fnameindex,int err) { const char *filename = lua_tostring(L, fnameindex) + 1; - lua_pushfstring(L, "cannot read %s: %s", filename, strerror(errno)); + const char *error_string = strerror(err); + lua_pushfstring(L, "[%d]cannot read %s: (%d) %s",id, filename, err,error_string); lua_remove(L, fnameindex); return LUA_ERRFILE; } @@ -496,19 +497,19 @@ lua_pushfstring(L, "@%s", filename); lf.f = fopen(filename, "r"); } - if (lf.f == NULL) return errfile(L, fnameindex); /* unable to open file */ + if (lf.f == NULL) return errfile(L,0, fnameindex,errno); /* unable to open file */ c = ungetc(getc(lf.f), lf.f); if (!(isspace(c) || isprint(c)) && lf.f != stdin) { /* binary file? */ fclose(lf.f); lf.f = fopen(filename, "rb"); /* reopen in binary mode */ - if (lf.f == NULL) return errfile(L, fnameindex); /* unable to reopen file */ + if (lf.f == NULL) return errfile(L,1, fnameindex,errno); /* unable to reopen file */ } status = lua_load(L, getF, &lf, lua_tostring(L, -1)); readstatus = ferror(lf.f); if (lf.f != stdin) fclose(lf.f); /* close file (even in case of errors) */ if (readstatus) { lua_settop(L, fnameindex); /* ignore results from `lua_load' */ - return errfile(L, fnameindex); + return errfile(L,2, fnameindex,errno); } lua_remove(L, fnameindex); return status; diff -ruN lua-5.0.2-old/src/lib/loadlib.c lua-5.0.2-new/src/lib/loadlib.c --- lua-5.0.2-old/src/lib/loadlib.c Mon Apr 7 22:11:53 2003 +++ lua-5.0.2-new/src/lib/loadlib.c Sat Jul 10 10:08:56 2004 @@ -49,7 +49,11 @@ { const char *path=luaL_checkstring(L,1); const char *init=luaL_checkstring(L,2); +#ifndef RTLD_NOW + void *lib=dlopen(path,RTLD_LAZY); +#else void *lib=dlopen(path,RTLD_NOW); +#endif if (lib!=NULL) { lua_CFunction f=(lua_CFunction) dlsym(lib,init); --- lua-5.0.2-old/src/lib/liolib.c 2003-10-01 15:16:49.000000000 +0200 +++ lua-5.0.2-new/src/lib/liolib.c 2004-08-26 11:42:11.000000000 +0200 @@ -46,6 +46,12 @@ #ifndef USE_POPEN #define USE_POPEN 0 +#else + #if !defined(WIN32) + #include + #include + #include + #endif #endif @@ -208,6 +212,104 @@ #endif } +static int io_dpopen(lua_State*l){ +#if !defined(USE_POPEN) || defined(WIN32) + luaL_error(l, "`dpopen' not supported"); + return 0; +#else + #define READ 0 + #define WRITE 1 + int in[2],out[2]; + int narg = lua_gettop(l); + const char ** argv = NULL; + int i,rc; + pid_t pid; + FILE **pf_r,**pf_w; + + + if (narg < 1) { + luaL_error(l,"create wants at least one argument"); + } + + argv = calloc(narg+1,sizeof(char*)); + if (argv == NULL){ + luaL_error(l,"Unable to alloc."); + } + + for (i=0;i < narg;i++) { + argv[i] = luaL_checkstring(l,i+1); + //fprintf(stderr,"getting %s",argv[i]); + } + argv[i] = NULL; + + rc = pipe(out); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + rc = pipe(in); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + + pid = fork(); + if (pid == 0) { + // son + pid = fork(); + if (pid == 0) { + // grandson, inherited by init, no Zombie + rc = dup2(out[READ],STDIN_FILENO); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + rc = dup2(in[WRITE],STDOUT_FILENO); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + rc = close(in[READ]); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + rc = close(out[WRITE]); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + //fprintf(stderr,"starting %s...\n",argv[0]); + rc = execv(argv[0],(char* const*)argv); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + luaL_error(l,"dead code"); + } else { + _exit(0); + } + } else { + if (pid == -1) { + luaL_error(l,strerror(errno)); + } + waitpid(pid,NULL,0); //wait the son + } + pf_r = newfile(l); + pf_w = newfile(l); + + rc = close(out[READ]); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + rc = close(in[WRITE]); + if (rc == -1) { + luaL_error(l,strerror(errno)); + } + + *pf_r = fdopen(in[READ],"r"); + *pf_w = fdopen(out[WRITE],"w"); + + free(argv); + + return 2; +#endif +} + + static int io_tmpfile (lua_State *L) { FILE **pf = newfile(L); @@ -497,6 +599,7 @@ {"flush", io_flush}, {"open", io_open}, {"popen", io_popen}, + {"dpopen", io_dpopen}, {"read", io_read}, {"tmpfile", io_tmpfile}, {"type", io_type},