summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/luafilesystem
diff options
context:
space:
mode:
authorTaco Hoekwater <taco@elvenkind.com>2011-04-12 14:17:47 +0000
committerTaco Hoekwater <taco@elvenkind.com>2011-04-12 14:17:47 +0000
commit307453997ef030ec4dfa1e876feaf0b8b8125bab (patch)
treeab2054693ba95e9ac8f6e3478b4d0175d893329f /Build/source/texk/web2c/luatexdir/luafilesystem
parentd95b11a25d3d9e17cc4afb9c8713ef4037567527 (diff)
check in luatex 0.66.0
git-svn-id: svn://tug.org/texlive/trunk@22059 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafilesystem')
-rw-r--r--Build/source/texk/web2c/luatexdir/luafilesystem/Makefile4
-rw-r--r--Build/source/texk/web2c/luatexdir/luafilesystem/README60
-rw-r--r--Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/index.html27
-rw-r--r--Build/source/texk/web2c/luatexdir/luafilesystem/doc/us/manual.html22
-rw-r--r--Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.c334
-rw-r--r--Build/source/texk/web2c/luatexdir/luafilesystem/src/lfs.def2
-rw-r--r--Build/source/texk/web2c/luatexdir/luafilesystem/tests/test.lua17
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&amp;group_id=66&amp;aid=13198&amp;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&amp;atid=356&amp;func=detail&amp;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&eacute; Carregal and Tom&aacute;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&aacute;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!"