diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafilesystem')
7 files changed, 285 insertions, 181 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafilesystem/Makefile b/Build/source/texk/web2c/luatexdir/luafilesystem/Makefile index 10d9ca44c2c..6b54f2c779d 100644 --- a/Build/source/texk/web2c/luatexdir/luafilesystem/Makefile +++ b/Build/source/texk/web2c/luatexdir/luafilesystem/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.34 2008/05/07 19:06:37 carregal Exp $ +# $Id: Makefile,v 1.36 2009/09/21 17:02:44 mascarenhas Exp $ T= lfs @@ -12,7 +12,7 @@ OBJS= src/$T.o lib: src/lfs.so src/lfs.so: $(OBJS) - export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/lfs.so $(OBJS) + MACOSX_DEPLOYMENT_TARGET="10.3"; export MACOSX_DEPLOYMENT_TARGET; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/lfs.so $(OBJS) install: mkdir -p $(LUA_LIBDIR) diff --git a/Build/source/texk/web2c/luatexdir/luafilesystem/README b/Build/source/texk/web2c/luatexdir/luafilesystem/README index 858ecb67bb0..0103efa6421 100644 --- a/Build/source/texk/web2c/luatexdir/luafilesystem/README +++ b/Build/source/texk/web2c/luatexdir/luafilesystem/README @@ -10,29 +10,57 @@ related to file systems offered by the standard Lua distribution. LuaFileSystem offers a portable way to access the underlying directory structure and file attributes. LuaFileSystem is free software and uses the same license as Lua 5.1 -Version 1.4.1 [07/May/2008] changes: +LuaRocks Installation +--------------------- +luarocks install luafilesystem + + +Documentation +------------- +Please check the documentation at doc/us/ for more information. + +History +------- + +Version 1.5.0 [20/Oct/2009] + * added explicit next and close methods to second return value of lfs.dir (the directory object), for explicit iteration or explicit closing. + * added directory locking via lfs.lock_dir function (see the manual). + +Version 1.4.2 [03/Feb/2009] + + * fixed bug [#13198] lfs.attributes(filename, 'size') overflow on files > 2 Gb again (bug report and patch by KUBO Takehiro). + * fixed bug [#39794] Compile error on Solaris 10 (bug report and patch by Aaron B). + * fixed compilation problems with Borland C. + +Version 1.4.1 [07/May/2008] + * documentation review * fixed Windows compilation issues * fixed bug in the Windows tests (patch by Shmuel Zeigerman) * fixed bug [#2185] lfs.attributes(filename, 'size') overflow on files > 2 Gb -LuaRocks Installation ---------------------- -luarocks install luafilesystem +Version 1.4.0 [13/Feb/2008] -Unix Installation ------------------ -To install on Linux/OSX/BSD, please edit the config file and then call + * added function lfs.setmode (works only in Windows systems). + * lfs.attributes raises an error if attribute does not exist -make -make install +Version 1.3.0 [26/Oct/2007] -The last step may require root privileges. + * added function lfs.symlinkattributes (works only in non Windows systems). -Windows Installation --------------------- -To install on Windows, please copy lfs.dll to your package.cpath directory +Version 1.2.1 [08/May/2007] -Documentation -------------- -Please check the documentation at /doc/us/ for more information. + * compatible only with Lua 5.1 (Lua 5.0 support was dropped) + +Version 1.2 [15/Mar/2006] + + * added optional argument to lfs.attributes + * added function lfs.rmdir + * bug correction on lfs.dir + +Version 1.1 [30/May/2005] + + * added function lfs.touch. + +Version 1.0 [21/Jan/2005] +Version 1.0 Beta [10/Nov/2004] diff --git a/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/index.html b/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/index.html index 63b57915e9d..43edefc5a1b 100644 --- a/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/index.html +++ b/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/index.html @@ -71,19 +71,32 @@ the underlying directory structure and file attributes.</p> <h2><a name="status"></a>Status</h2> -<p>Current version is 1.4.1. It was developed for Lua 5.1.</p> +<p>Current version is 1.5.0. It was developed for Lua 5.1.</p> <h2><a name="download"></a>Download</h2> <p>LuaFileSystem source can be downloaded from its -<a href="http://luaforge.net/projects/luafilesystem/files">Lua Forge</a> -page. If you are using -<a href="http://luabinaries.luaforge.net">LuaBinaries</a> 5.1.3 a Windows binary -version of LuaFileSystem (compiled with Visual Studio 2005 Express) can be found at the same LuaForge page.</p> +<a href="http://github.com/keplerproject/luafilesystem">Github</a> +page.</p> <h2><a name="history"></a>History</h2> <dl class="history"> + <dt><strong>Version 1.5.0</strong> [20/Oct/2009]</dt> + <li>Added explicit next and close methods to second return value of lfs.dir +(the directory object), for explicit iteration or explicit closing.</li> + <li>Added directory locking via lfs.lock_dir function (see the <a href="manual.html">manual</a>).</li> + <dt><strong>Version 1.4.2</strong> [03/Feb/2009]</dt> + <dd> + <ul> + <li>fixed bug [<a href="http://luaforge.net/tracker/?func=detail&group_id=66&aid=13198&atid=356">#13198</a>] + lfs.attributes(filename, 'size') overflow on files > 2 Gb again (bug report and patch by KUBO Takehiro).</li> + <li>fixed bug [<a href="http://luaforge.net/tracker/?group_id=66&atid=356&func=detail&aid=39794">#39794</a>] + Compile error on Solaris 10 (bug report and patch by Aaron B).</li> + <li>fixed compilation problems with Borland C.</li> + </ul> + </dd> + <dt><strong>Version 1.4.1</strong> [07/May/2008]</dt> <dd> <ul> @@ -153,7 +166,7 @@ version of LuaFileSystem (compiled with Visual Studio 2005 Express) can be found <p>LuaFileSystem was designed by Roberto Ierusalimschy, André Carregal and Tomás Guisasola as part of the <a href="http://www.keplerproject.org">Kepler Project</a>, -which holds its copyright.</p> +which holds its copyright. LuaFileSystem is currently maintained by Fábio Mascarenhas.</p> <h2><a name="contact"></a>Contact us</h2> @@ -170,7 +183,7 @@ Comments are welcome!</p> <div id="about"> <p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p> - <p><small>$Id: index.html,v 1.42 2008/05/07 19:06:37 carregal Exp $</small></p> + <p><small>$Id: index.html,v 1.44 2009/02/04 21:21:33 carregal Exp $</small></p> </div> <!-- id="about" --> </div> <!-- id="container" --> diff --git a/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/manual.html b/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/manual.html index efae2363359..1409c404b1a 100644 --- a/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/manual.html +++ b/Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/manual.html @@ -80,6 +80,9 @@ The file has some definitions like paths to the external libraries, compiler options and the like. </p> +<p>On Windows, the C runtime used to compile LuaFileSystem must be the same +runtime that Lua uses, or some LuaFileSystem functions will not work.</p> + <h2><a name="installation"></a>Installation</h2> <p>The easiest way to install LuaFileSystem is to use LuaRocks:</p> @@ -168,16 +171,27 @@ LuaFileSystem offers the following functions: <code>path</code>.<br /> Returns <code>true</code> in case of success or <code>nil</code> plus an error string.</dd> + + <dt><a name="chdir"></a><strong><code>lfs.lock_dir(path, [seconds_stale])</code></strong></dt> + <dd>Creates a lockfile (called lockfile.lfs) in <code>path</code> if it does not + exist and returns the lock. If the lock already exists checks it + it's stale, using the second parameter (default for the second + parameter is <code>INT_MAX</code>, which in practice means the lock will never + be stale. To free the the lock call <code>lock:free()</code>. <br/> + In case of any errors it returns nil and the error message. In + particular, if the lock exists and is not stale it returns the + "File exists" message.</dd> <dt><a name="getcwd"></a><strong><code>lfs.currentdir ()</code></strong></dt> <dd>Returns a string with the current working directory or <code>nil</code> plus an error string.</dd> - <dt><a name="dir"></a><strong><code>lfs.dir (path)</code></strong></dt> + <dt><a name="dir"></a><strong><code>iter, dir_obj = lfs.dir (path)</code></strong></dt> <dd> Lua iterator over the entries of a given directory. - Each time the iterator is called it returns a directory entry's name as a string, or - <code>nil</code> if there are no more entries. + Each time the iterator is called with <code>dir_obj</code> it returns a directory entry's name as a string, or + <code>nil</code> if there are no more entries. You can also iterate by calling <code>dir_obj:next()</code>, and + explicitly close the directory before the iteration finished with <code>dir_obj:close()</code>. Raises an error if <code>path</code> is not a directory. </dd> @@ -248,7 +262,7 @@ LuaFileSystem offers the following functions: <div id="about"> <p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p> - <p><small>$Id: manual.html,v 1.42 2008/03/24 18:17:59 carregal Exp $</small></p> + <p><small>$Id: manual.html,v 1.45 2009/06/03 20:53:55 mascarenhas Exp $</small></p> </div> <!-- id="about" --> </div> <!-- id="container" --> diff --git a/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.c b/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.c index eed623dfad8..6e968b6d2e8 100644 --- a/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.c +++ b/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.c @@ -9,6 +9,7 @@ ** lfs.currentdir () ** lfs.dir (path) ** lfs.lock (fh, mode) +** lfs.lock_dir (path) ** lfs.mkdir (path) ** lfs.rmdir (path) ** lfs.setmode (filepath, mode) @@ -16,9 +17,17 @@ ** lfs.touch (filepath [, atime [, mtime]]) ** lfs.unlock (fh) ** -** $Id: lfs.c,v 1.53 2008/05/07 19:06:37 carregal Exp $ +** $Id: lfs.c,v 1.61 2009/07/04 02:10:16 mascarenhas Exp $ */ +#ifndef _WIN32 +#ifndef _AIX +#define _FILE_OFFSET_BITS 64 /* Linux, Solaris and HP-UX */ +#else +#define _LARGE_FILES 1 /* AIX */ +#endif +#endif + #define _LARGEFILE64_SOURCE #include <errno.h> @@ -30,11 +39,15 @@ #ifdef _WIN32 #include <direct.h> +#include <windows.h> #include <io.h> #include <sys/locking.h> -#include <sys/utime.h> +#ifdef __BORLANDC__ + #include <utime.h> +#else + #include <sys/utime.h> +#endif #include <fcntl.h> -#include <windows.h> #else #include <unistd.h> #include <dirent.h> @@ -73,24 +86,26 @@ typedef struct dir_data { #endif } dir_data; +#define LOCK_METATABLE "lock metatable" #ifdef _WIN32 -#define lfs_setmode(L,file,m) ((void)L, _setmode(_fileno(file), m)) -#define STAT_STRUCT struct _stati64 + #ifdef __BORLANDC__ + #define lfs_setmode(L,file,m) ((void)L, setmode(_fileno(file), m)) + #define STAT_STRUCT struct stati64 + #else + #define lfs_setmode(L,file,m) ((void)L, _setmode(_fileno(file), m)) + #define STAT_STRUCT struct _stati64 + #endif #define STAT_FUNC _stati64 #else +#define _O_TEXT 0 +#define _O_BINARY 0 #define lfs_setmode(L,file,m) ((void)((void)file,m), \ luaL_error(L, LUA_QL("setmode") " not supported on this platform"), -1) -#ifdef HAVE_STAT64 -#define STAT_STRUCT struct stat64 -#define STAT_FUNC stat64 -#define LSTAT_FUNC lstat64 -#else #define STAT_STRUCT struct stat #define STAT_FUNC stat #define LSTAT_FUNC lstat #endif -#endif /* ** This function changes the working (current) directory @@ -113,9 +128,13 @@ static int change_dir (lua_State *L) { ** If unable to get the current directory, it returns nil ** and a string describing the error */ +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + static int get_dir (lua_State *L) { - char path[500]; - if (getcwd((char *)path, 500) == NULL) { + char path[PATH_MAX]; + if (getcwd((char *)path, PATH_MAX) == NULL) { lua_pushnil(L); lua_pushstring(L, getcwd_error); return 2; @@ -171,7 +190,11 @@ static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long star len = ftell (fh); } fseek (fh, start, SEEK_SET); +#ifdef __BORLANDC__ + code = locking (fileno(fh), lkmode, len); +#else code = _locking (fileno(fh), lkmode, len); +#endif #else struct flock f; switch (*mode) { @@ -189,6 +212,79 @@ static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long star } #ifdef _WIN32 +typedef struct lfs_Lock { + HANDLE fd; +} lfs_Lock; +static int lfs_lock_dir(lua_State *L) { + size_t pathl; HANDLE fd; + lfs_Lock *lock; + char *ln; + const char *lockfile = "/lockfile.lfs"; + const char *path = luaL_checklstring(L, 1, &pathl); + ln = (char*)malloc(pathl + strlen(lockfile) + 1); + if(!ln) { + lua_pushnil(L); lua_pushstring(L, strerror(errno)); return 2; + } + strcpy(ln, path); strcat(ln, lockfile); + if((fd = CreateFile(ln, GENERIC_WRITE, 0, NULL, CREATE_NEW, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL)) == INVALID_HANDLE_VALUE) { + int en = GetLastError(); + free(ln); lua_pushnil(L); + if(en == ERROR_FILE_EXISTS || en == ERROR_SHARING_VIOLATION) + lua_pushstring(L, "File exists"); + else + lua_pushstring(L, strerror(en)); + return 2; + } + free(ln); + lock = (lfs_Lock*)lua_newuserdata(L, sizeof(lfs_Lock)); + lock->fd = fd; + luaL_getmetatable (L, LOCK_METATABLE); + lua_setmetatable (L, -2); + return 1; +} +static int lfs_unlock_dir(lua_State *L) { + lfs_Lock *lock = luaL_checkudata(L, 1, LOCK_METATABLE); + CloseHandle(lock->fd); + return 0; +} +#else +typedef struct lfs_Lock { + char *ln; +} lfs_Lock; +static int lfs_lock_dir(lua_State *L) { + lfs_Lock *lock; + size_t pathl; + char *ln; + const char *lockfile = "/lockfile.lfs"; + const char *path = luaL_checklstring(L, 1, &pathl); + lock = (lfs_Lock*)lua_newuserdata(L, sizeof(lfs_Lock)); + ln = (char*)malloc(pathl + strlen(lockfile) + 1); + if(!ln) { + lua_pushnil(L); lua_pushstring(L, strerror(errno)); return 2; + } + strcpy(ln, path); strcat(ln, lockfile); + if(symlink("lock", ln) == -1) { + free(ln); lua_pushnil(L); + lua_pushstring(L, strerror(errno)); return 2; + } + lock->ln = ln; + luaL_getmetatable (L, LOCK_METATABLE); + lua_setmetatable (L, -2); + return 1; +} +static int lfs_unlock_dir(lua_State *L) { + lfs_Lock *lock = luaL_checkudata(L, 1, LOCK_METATABLE); + if(lock->ln) { + unlink(lock->ln); + free(lock->ln); + lock->ln = NULL; + } + return 0; +} +#endif + +#ifdef _WIN32 static int lfs_g_setmode (lua_State *L, FILE *f, int arg) { static const int mode[] = {_O_TEXT, _O_BINARY}; static const char *const modenames[] = {"text", "binary", NULL}; @@ -319,7 +415,7 @@ static int dir_iter (lua_State *L) { #else struct dirent *entry; #endif - dir_data *d = (dir_data *)lua_touserdata (L, lua_upvalueindex (1)); + dir_data *d = (dir_data *)luaL_checkudata (L, 1, DIR_METATABLE); luaL_argcheck (L, !d->closed, 1, "closed directory"); #ifdef _WIN32 if (d->hFile == 0L) { /* first entry */ @@ -381,7 +477,9 @@ static int dir_close (lua_State *L) { */ static int dir_iter_factory (lua_State *L) { const char *path = luaL_checkstring (L, 1); - dir_data *d = (dir_data *) lua_newuserdata (L, sizeof(dir_data)); + dir_data *d; + lua_pushcfunction (L, dir_iter); + d = (dir_data *) lua_newuserdata (L, sizeof(dir_data)); d->closed = 0; #ifdef _WIN32 d->hFile = 0L; @@ -398,8 +496,7 @@ static int dir_iter_factory (lua_State *L) { if (d->dir == NULL) luaL_error (L, "cannot open %s: %s", path, strerror (errno)); #endif - lua_pushcclosure (L, dir_iter, 1); - return 1; + return 2; } @@ -409,10 +506,33 @@ static int dir_iter_factory (lua_State *L) { static int dir_create_meta (lua_State *L) { luaL_newmetatable (L, DIR_METATABLE); /* set its __gc field */ + lua_pushstring (L, "__index"); + lua_newtable(L); + lua_pushstring (L, "next"); + lua_pushcfunction (L, dir_iter); + lua_settable(L, -3); + lua_pushstring (L, "close"); + lua_pushcfunction (L, dir_close); + lua_settable(L, -3); + lua_settable (L, -3); lua_pushstring (L, "__gc"); lua_pushcfunction (L, dir_close); lua_settable (L, -3); + return 1; +} +/* +** Creates lock metatable. +*/ +static int lock_create_meta (lua_State *L) { + luaL_newmetatable (L, LOCK_METATABLE); + /* set its __gc field */ + lua_newtable(L); + lua_pushcfunction(L, lfs_unlock_dir); + lua_setfield(L, -2, "free"); + lua_setfield(L, -2, "__index"); + lua_pushcfunction(L, lfs_unlock_dir); + lua_setfield(L, -2, "__gc"); return 1; } @@ -466,36 +586,6 @@ static const char *mode2string (mode_t mode) { return "other"; } - /* -** Convert the inode protection mode to a permission list. -*/ - -#ifdef _WIN32 -static const char *perm2string (unsigned short mode) { - static char perms[10] = "---------\0"; - if (mode & _S_IREAD) - { perms[0] = 'r'; perms[3] = 'r'; perms[6] = 'r'; } - if (mode & _S_IWRITE) - { perms[1] = 'w'; perms[4] = 'w'; perms[7] = 'w'; } - if (mode & _S_IEXEC) - { perms[2] = 'x'; perms[5] = 'x'; perms[8] = 'x'; } - return perms; -} -#else -static const char *perm2string (mode_t mode) { - static char perms[10] = "---------\0"; - if (mode & S_IRUSR) perms[0] = 'r'; - if (mode & S_IWUSR) perms[1] = 'w'; - if (mode & S_IXUSR) perms[2] = 'x'; - if (mode & S_IRGRP) perms[3] = 'r'; - if (mode & S_IWGRP) perms[4] = 'w'; - if (mode & S_IXGRP) perms[5] = 'x'; - if (mode & S_IROTH) perms[6] = 'r'; - if (mode & S_IWOTH) perms[7] = 'w'; - if (mode & S_IXOTH) perms[8] = 'x'; - return perms; -} -#endif /* ** Set access time and modification values for file @@ -565,10 +655,6 @@ static void push_st_ctime (lua_State *L, STAT_STRUCT *info) { static void push_st_size (lua_State *L, STAT_STRUCT *info) { lua_pushnumber (L, (lua_Number)info->st_size); } -/* permssions string */ -static void push_st_perm (lua_State *L, STAT_STRUCT *info) { - lua_pushstring (L, perm2string (info->st_mode)); -} #ifndef _WIN32 /* blocks allocated for file */ static void push_st_blocks (lua_State *L, STAT_STRUCT *info) { @@ -586,6 +672,46 @@ static void push_invalid (lua_State *L, STAT_STRUCT *info) { #endif } + /* +** Convert the inode protection mode to a permission list. +*/ + +#ifdef _WIN32 +static const char *perm2string (unsigned short mode) { + static char perms[10] = "---------\0"; + int i; + for (i=0;i<9;i++) perms[i]='-'; + if (mode & _S_IREAD) + { perms[0] = 'r'; perms[3] = 'r'; perms[6] = 'r'; } + if (mode & _S_IWRITE) + { perms[1] = 'w'; perms[4] = 'w'; perms[7] = 'w'; } + if (mode & _S_IEXEC) + { perms[2] = 'x'; perms[5] = 'x'; perms[8] = 'x'; } + return perms; +} +#else +static const char *perm2string (mode_t mode) { + static char perms[10] = "---------\0"; + int i; + for (i=0;i<9;i++) perms[i]='-'; + if (mode & S_IRUSR) perms[0] = 'r'; + if (mode & S_IWUSR) perms[1] = 'w'; + if (mode & S_IXUSR) perms[2] = 'x'; + if (mode & S_IRGRP) perms[3] = 'r'; + if (mode & S_IWGRP) perms[4] = 'w'; + if (mode & S_IXGRP) perms[5] = 'x'; + if (mode & S_IROTH) perms[6] = 'r'; + if (mode & S_IWOTH) perms[7] = 'w'; + if (mode & S_IXOTH) perms[8] = 'x'; + return perms; +} +#endif + +/* permssions string */ +static void push_st_perm (lua_State *L, STAT_STRUCT *info) { + lua_pushstring (L, perm2string (info->st_mode)); +} + typedef void (*_push_function) (lua_State *L, STAT_STRUCT *info); struct _stat_members { @@ -595,7 +721,6 @@ struct _stat_members { struct _stat_members members[] = { { "mode", push_st_mode }, - { "permissions", push_st_perm }, { "dev", push_st_dev }, { "ino", push_st_ino }, { "nlink", push_st_nlink }, @@ -606,6 +731,7 @@ struct _stat_members members[] = { { "modification", push_st_mtime }, { "change", push_st_ctime }, { "size", push_st_size }, + { "permissions", push_st_perm }, #ifndef _WIN32 { "blocks", push_st_blocks }, { "blksize", push_st_blksize }, @@ -653,28 +779,6 @@ static int _file_info_ (lua_State *L, int (*st)(const char*, STAT_STRUCT*)) { return 1; } -#ifndef WIN32 -static int pusherror(lua_State *L, const char *info) -{ - lua_pushnil(L); - if (info==NULL) - lua_pushstring(L, strerror(errno)); - else - lua_pushfstring(L, "%s: %s", info, strerror(errno)); - lua_pushinteger(L, errno); - return 3; -} - -static int Preadlink(lua_State *L) /** readlink(path) */ -{ - char b[PATH_MAX]; - const char *path = luaL_checkstring(L, 1); - int n = readlink(path, b, sizeof(b)); - if (n==-1) return pusherror(L, path); - lua_pushlstring(L, b, n); - return 1; -} -#endif /* ** Get file information using stat. @@ -683,6 +787,7 @@ static int file_info (lua_State *L) { return _file_info_ (L, STAT_FUNC); } + /* ** Get symbolic link information using lstat. */ @@ -690,106 +795,33 @@ static int file_info (lua_State *L) { static int link_info (lua_State *L) { return _file_info_ (L, LSTAT_FUNC); } -static int read_link (lua_State *L) { - return Preadlink (L); -} -static int get_short_name (lua_State *L) { - /* simply do nothing */ - return 1; -} #else static int link_info (lua_State *L) { lua_pushboolean(L, 0); lua_pushliteral(L, "symlinkattributes not supported on this platform"); return 2; } -static int read_link (lua_State *L) { - lua_pushboolean(L, 0); - lua_pushliteral(L, "readlink not supported on this platform"); - return 2; -} -static int get_short_name (lua_State *L) { - long length = 0; - TCHAR* buffer = NULL; - const char *lpszPath = luaL_checkstring (L, 1); - length = GetShortPathName(lpszPath, NULL, 0); - if (length == 0) { - lua_pushnil(L); - lua_pushfstring(L, "operating system error: %d", (int)GetLastError()); - return 2; - } - buffer = (TCHAR *)xmalloc(length * sizeof(TCHAR)); - length = GetShortPathName(lpszPath, buffer, length); - if (length == 0) { - lua_pushnil(L); - lua_pushfstring(L, "operating system error: %d", (int)GetLastError()); - return 2; - } - lua_pushlstring(L, (const char *)buffer, (size_t)length); - return 1; -} #endif - -/* -** Get file information -*/ -static int file_is_directory (lua_State *L) { - struct stat info; - const char *file = luaL_checkstring (L, 1); - - if (stat(file, &info)) { - lua_pushnil (L); - lua_pushfstring (L, "cannot obtain information from file `%s'", file); - return 2; - } - if ( S_ISDIR(info.st_mode) ) - lua_pushboolean (L, 1); - else - lua_pushboolean (L, 0); - - return 1; -} - -static int file_is_file (lua_State *L) { - struct stat info; - const char *file = luaL_checkstring (L, 1); - - if (stat(file, &info)) { - lua_pushnil (L); - lua_pushfstring (L, "cannot obtain information from file `%s'", file); - return 2; - } - if ( S_ISREG(info.st_mode) ) - lua_pushboolean (L, 1); - else - lua_pushboolean (L, 0); - - return 1; -} - - /* ** Assumes the table is on top of the stack. */ static void set_info (lua_State *L) { lua_pushliteral (L, "_COPYRIGHT"); - lua_pushliteral (L, "Copyright (C) 2003 Kepler Project"); + lua_pushliteral (L, "Copyright (C) 2003-2009 Kepler Project"); lua_settable (L, -3); lua_pushliteral (L, "_DESCRIPTION"); lua_pushliteral (L, "LuaFileSystem is a Lua library developed to complement the set of functions related to file systems offered by the standard Lua distribution"); lua_settable (L, -3); lua_pushliteral (L, "_VERSION"); - lua_pushliteral (L, "LuaFileSystem 1.4.1"); + lua_pushliteral (L, "LuaFileSystem 1.5.0"); lua_settable (L, -3); } static const struct luaL_reg fslib[] = { {"attributes", file_info}, - {"isdir", file_is_directory }, - {"isfile", file_is_file }, {"chdir", change_dir}, {"currentdir", get_dir}, {"dir", dir_iter_factory}, @@ -797,16 +829,16 @@ static const struct luaL_reg fslib[] = { {"mkdir", make_dir}, {"rmdir", remove_dir}, {"symlinkattributes", link_info}, - {"readlink", read_link}, - {"shortname", get_short_name}, {"setmode", lfs_f_setmode}, {"touch", file_utime}, {"unlock", file_unlock}, + {"lock_dir", lfs_lock_dir}, {NULL, NULL}, }; int luaopen_lfs (lua_State *L) { dir_create_meta (L); + lock_create_meta (L); luaL_register (L, "lfs", fslib); set_info (L); return 1; diff --git a/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.def b/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.def index 978ee6e60f9..f79cd298b31 100644 --- a/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.def +++ b/Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.def @@ -1,5 +1,5 @@ LIBRARY lfs.dll
DESCRIPTION "LuaFileSystem"
-VERSION 1.4.1
+VERSION 1.4.2
EXPORTS
luaopen_lfs
diff --git a/Build/source/texk/web2c/luatexdir/luafilesystem/tests/test.lua b/Build/source/texk/web2c/luatexdir/luafilesystem/tests/test.lua index 1fd6157a7b9..71110749c06 100644 --- a/Build/source/texk/web2c/luatexdir/luafilesystem/tests/test.lua +++ b/Build/source/texk/web2c/luatexdir/luafilesystem/tests/test.lua @@ -110,4 +110,21 @@ for i = 1, 4000 do count = count + 1 end end + +-- Stressing directory iterator, explicit version +count = 0 +for i = 1, 4000 do + local iter, dir = lfs.dir(tmp) + local file = dir:next() + while file do + count = count + 1 + file = dir:next() + end + assert(not pcall(dir.next, dir)) +end + +-- directory explicit close +local iter, dir = lfs.dir(tmp) +dir:close() +assert(not pcall(dir.next, dir)) print"Ok!" |