22 Commits

Author SHA1 Message Date
Fabio Mascarenhas
8ff20138af packaging for version 1.5.0 - changing _VERSION 2009-10-20 18:54:35 -02:00
Fabio Mascarenhas
5ffde8ae51 packaging for version 1.5.0 2009-10-20 18:54:02 -02:00
Fabio Mascarenhas
2b5f187a40 cvs rockspecs now point to github 2009-09-24 14:29:44 -03:00
mascarenhas
f715ad9998 fixed typo in makefile 2009-09-21 17:02:44 +00:00
mascarenhas
c293392539 overhaul of lock_dir to remove staleness checks (due to race condition) and simplify the function 2009-07-04 02:10:16 +00:00
mascarenhas
327acf788f updated docs for lfs.dir 2009-06-03 20:53:55 +00:00
mascarenhas
375d009d89 added explicit next and close methods to second return value of lfs.dir (the directory object), for explicit iteration or explicit closing 2009-06-03 20:49:18 +00:00
mascarenhas
c1eff3de6b fixing lfs.lock_dir on windows to return "File exists" instead of looping, plus
documenting lfs.lock_dir
2009-04-24 22:24:06 +00:00
mascarenhas
b80d2baacc added lfs.lock_dir (directory locking) for Windows. On Windows the timeout
parameter is ignored, as killing the process removes the lock automatically
2009-04-24 22:11:12 +00:00
mascarenhas
d21c4ae194 locking via lockfiles in posix systems. API:
lock, err = lfs.lock_dir(path, [seconds_stale])
  Creates a lockfile (called lockfile.lfs) in <path> 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 INT_MAX, which in practice means the lock will never
  be stale. To free the the lock call lock:free().
  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.
2009-03-25 19:14:17 +00:00
carregal
342df4a5a3 Credits review 2009-02-04 21:21:33 +00:00
carregal
7961aab687 Updating the rockspec URL 2009-02-03 22:42:16 +00:00
carregal
657faad984 Packaging version 1.4.2 2009-02-03 22:05:48 +00:00
mascarenhas
16961a6c2c compiling with borland c 2008-12-15 16:13:55 +00:00
carregal
57d9592448 Fixed bug [#39794] Compile error on Solaris 10
Bug report and patch by Aaron B.
2008-12-12 13:26:37 +00:00
carregal
b941f90d24 Moving to "modules" builds on the rockspecs 2008-12-09 18:39:20 +00:00
carregal
b8acd4ca54 Fixing bug [#13198] lfs.attributes(filename, 'size') overflow on files > 2 Gb again
(bug report and patch by KUBO Takehiro)
2008-07-31 19:34:22 +00:00
carregal
21412ad14c Mentioning the need of using the same C runtime (Ignacio Burgueño) 2008-05-08 18:45:15 +00:00
carregal
5c7eb0e1ff Updated package URL 2008-05-07 20:01:02 +00:00
carregal
1e40455d39 Packaging version 1.4.1 2008-05-07 19:44:39 +00:00
carregal
d4bfd537a8 Packaging version 1.4.1 2008-05-07 19:06:37 +00:00
mascarenhas
d7a5679fb8 fixed bug 2293 2008-04-24 17:27:18 +00:00
12 changed files with 357 additions and 75 deletions

View File

@@ -1,7 +1,7 @@
# $Id: Makefile,v 1.33 2008/03/25 18:24:17 mascarenhas Exp $ # $Id: Makefile,v 1.36 2009/09/21 17:02:44 mascarenhas Exp $
T= lfs T= lfs
V= 1.4.0
CONFIG= ./config CONFIG= ./config
include $(CONFIG) include $(CONFIG)
@@ -12,7 +12,7 @@ OBJS= src/$T.o
lib: src/lfs.so lib: src/lfs.so
src/lfs.so: $(OBJS) 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: install:
mkdir -p $(LUA_LIBDIR) mkdir -p $(LUA_LIBDIR)

View File

@@ -1,7 +1,6 @@
# $Id: Makefile.win,v 1.10 2008/02/13 22:08:31 carregal Exp $ # $Id: Makefile.win,v 1.11 2008/05/07 19:06:37 carregal Exp $
T= lfs T= lfs
V= 1.4.0
include config.win include config.win

62
README
View File

@@ -10,25 +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 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 LuaFileSystem is free software and uses the same license as Lua 5.1
Current version is 1.4.0
LuaRocks Installation LuaRocks Installation
--------------------- ---------------------
luarocks install luafilesystem luarocks install luafilesystem
Unix Installation
-----------------
To install on Linux/OSX/BSD, please edit the config file and then call
make
make install
The last step may require root privileges.
Windows Installation
--------------------
To install on Windows, please copy lfs.ddl to your package.cpath directory
Documentation Documentation
------------- -------------
Please check the documentation at /doc/us/ for more information. 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
Version 1.4.0 [13/Feb/2008]
* added function lfs.setmode (works only in Windows systems).
* lfs.attributes raises an error if attribute does not exist
Version 1.3.0 [26/Oct/2007]
* added function lfs.symlinkattributes (works only in non Windows systems).
Version 1.2.1 [08/May/2007]
* 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]

View File

@@ -71,19 +71,44 @@ the underlying directory structure and file attributes.</p>
<h2><a name="status"></a>Status</h2> <h2><a name="status"></a>Status</h2>
<p>Current version is 1.4.0. 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> <h2><a name="download"></a>Download</h2>
<p>LuaFileSystem source can be downloaded from its <p>LuaFileSystem source can be downloaded from its
<a href="http://luaforge.net/projects/luafilesystem/files">Lua Forge</a> <a href="http://github.com/keplerproject/luafilesystem">Github</a>
page. If you are using page.</p>
<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>
<h2><a name="history"></a>History</h2> <h2><a name="history"></a>History</h2>
<dl class="history"> <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>
<li>documentation review</li>
<li>fixed Windows compilation issues</li>
<li>fixed bug in the Windows tests (patch by Shmuel Zeigerman)</li>
<li>fixed bug [<a href="http://luaforge.net/tracker/?func=detail&amp;group_id=66&amp;aid=2185&amp;atid=356">#2185</a>]
<code>lfs.attributes(filename, 'size')</code> overflow on files > 2 Gb
</li>
</ul>
</dd>
<dt><strong>Version 1.4.0</strong> [13/Feb/2008]</dt> <dt><strong>Version 1.4.0</strong> [13/Feb/2008]</dt>
<dd> <dd>
<ul> <ul>
@@ -141,7 +166,7 @@ version of LuaFileSystem (compiled with Visual Studio 2005 Express) can be found
<p>LuaFileSystem was designed by Roberto Ierusalimschy, <p>LuaFileSystem was designed by Roberto Ierusalimschy,
Andr&eacute; Carregal and Tom&aacute;s Guisasola as part of the Andr&eacute; Carregal and Tom&aacute;s Guisasola as part of the
<a href="http://www.keplerproject.org">Kepler Project</a>, <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> <h2><a name="contact"></a>Contact us</h2>
@@ -158,7 +183,7 @@ Comments are welcome!</p>
<div id="about"> <div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p> <p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p>
<p><small>$Id: index.html,v 1.41 2008/02/18 17:20:16 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="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->

View File

@@ -80,6 +80,9 @@ The file has some definitions like paths to the external libraries,
compiler options and the like. compiler options and the like.
</p> </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> <h2><a name="installation"></a>Installation</h2>
<p>The easiest way to install LuaFileSystem is to use LuaRocks:</p> <p>The easiest way to install LuaFileSystem is to use LuaRocks:</p>
@@ -169,15 +172,26 @@ LuaFileSystem offers the following functions:
Returns <code>true</code> in case of success or <code>nil</code> plus an Returns <code>true</code> in case of success or <code>nil</code> plus an
error string.</dd> 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> <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> <dd>Returns a string with the current working directory or <code>nil</code>
plus an error string.</dd> 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> <dd>
Lua iterator over the entries of a given directory. 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 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. <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. Raises an error if <code>path</code> is not a directory.
</dd> </dd>
@@ -248,7 +262,7 @@ LuaFileSystem offers the following functions:
<div id="about"> <div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p> <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="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->

View File

@@ -0,0 +1,43 @@
package = "LuaFileSystem"
version = "1.4.1-1"
source = {
url = "http://luaforge.net/frs/download.php/3345/luafilesystem-1.4.1.tar.gz",
}
description = {
summary = "File System Library for the Lua Programming Language",
detailed = [[
LuaFileSystem is a Lua library developed to complement the set of
functions related to file systems offered by the standard Lua
distribution. LuaFileSystem offers a portable way to access the
underlying directory structure and file attributes.
]]
}
dependencies = {
"lua >= 5.1"
}
build = {
platforms = {
unix = {
type = "make",
build_variables = {
LIB_OPTION = "$(LIBFLAG)",
CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR) $(STAT64)",
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)"
}
},
win32 = {
type = "make",
build_variables = {
LUA_LIB = "$(LUA_LIBDIR)\\lua5.1.lib",
CFLAGS = "/MD $(CFLAGS) /I$(LUA_INCDIR)",
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)",
LUA_DIR = "$(LUADIR)",
BIN_DIR = "$(BINDIR)"
}
}
}
}

View File

@@ -0,0 +1,26 @@
package = "LuaFileSystem"
version = "1.4.2-1"
source = {
url = "http://luaforge.net/frs/download.php/3931/luafilesystem-1.4.2.tar.gz",
}
description = {
summary = "File System Library for the Lua Programming Language",
detailed = [[
LuaFileSystem is a Lua library developed to complement the set of
functions related to file systems offered by the standard Lua
distribution. LuaFileSystem offers a portable way to access the
underlying directory structure and file attributes.
]]
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "module",
modules = { lfs = "src/lfs.c" }
}

View File

@@ -0,0 +1,27 @@
package = "LuaFileSystem"
version = "1.5.0-1"
source = {
url = "http://cloud.github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.5.0.tar.gz",
}
description = {
summary = "File System Library for the Lua Programming Language",
detailed = [[
LuaFileSystem is a Lua library developed to complement the set of
functions related to file systems offered by the standard Lua
distribution. LuaFileSystem offers a portable way to access the
underlying directory structure and file attributes.
]]
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "module",
modules = { lfs = "src/lfs.c" },
copy_directories = { "doc", "tests" }
}

View File

@@ -1,9 +1,11 @@
package = "LuaFileSystem" package = "LuaFileSystem"
version = "cvs-2" version = "cvs-2"
source = { source = {
url = "cvs://:pserver:anonymous:@cvs.luaforge.net:/cvsroot/luafilesystem", url = "git://github.com/keplerproject/luafilesystem.git",
cvs_tag = "HEAD"
} }
description = { description = {
summary = "File System Library for the Lua Programming Language", summary = "File System Library for the Lua Programming Language",
detailed = [[ detailed = [[
@@ -13,32 +15,12 @@ description = {
underlying directory structure and file attributes. underlying directory structure and file attributes.
]] ]]
} }
dependencies = { dependencies = {
"lua >= 5.1" "lua >= 5.1"
} }
build = { build = {
platforms = { type = "module",
unix = { modules = { lfs = "src/lfs.c" }
type = "make",
build_variables = {
LIB_OPTION = "$(LIBFLAG)",
CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR) $(STAT64)",
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)"
}
},
win32 = {
type = "make",
build_variables = {
LUA_LIB = "$(LUA_LIBDIR)\\lua5.1.lib",
CFLAGS = "/MD $(CFLAGS) /I$(LUA_INCDIR)",
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)",
LUA_DIR = "$(LUADIR)",
BIN_DIR = "$(BINDIR)"
}
}
}
} }

151
src/lfs.c
View File

@@ -9,6 +9,7 @@
** lfs.currentdir () ** lfs.currentdir ()
** lfs.dir (path) ** lfs.dir (path)
** lfs.lock (fh, mode) ** lfs.lock (fh, mode)
** lfs.lock_dir (path)
** lfs.mkdir (path) ** lfs.mkdir (path)
** lfs.rmdir (path) ** lfs.rmdir (path)
** lfs.setmode (filepath, mode) ** lfs.setmode (filepath, mode)
@@ -16,9 +17,17 @@
** lfs.touch (filepath [, atime [, mtime]]) ** lfs.touch (filepath [, atime [, mtime]])
** lfs.unlock (fh) ** lfs.unlock (fh)
** **
** $Id: lfs.c,v 1.51 2008/03/25 18:20:29 mascarenhas 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 #define _LARGEFILE64_SOURCE
#include <errno.h> #include <errno.h>
@@ -30,9 +39,14 @@
#ifdef _WIN32 #ifdef _WIN32
#include <direct.h> #include <direct.h>
#include <windows.h>
#include <io.h> #include <io.h>
#include <sys/locking.h> #include <sys/locking.h>
#include <sys/utime.h> #ifdef __BORLANDC__
#include <utime.h>
#else
#include <sys/utime.h>
#endif
#include <fcntl.h> #include <fcntl.h>
#else #else
#include <unistd.h> #include <unistd.h>
@@ -72,26 +86,26 @@ typedef struct dir_data {
#endif #endif
} dir_data; } dir_data;
#define LOCK_METATABLE "lock metatable"
#ifdef _WIN32 #ifdef _WIN32
#define lfs_setmode(L,file,m) ((void)L, _setmode(_fileno(file), m)) #ifdef __BORLANDC__
#define STAT_STRUCT struct _stat64 #define lfs_setmode(L,file,m) ((void)L, setmode(_fileno(file), m))
#define STAT_FUNC _stat64 #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 #else
#define _O_TEXT 0 #define _O_TEXT 0
#define _O_BINARY 0 #define _O_BINARY 0
#define lfs_setmode(L,file,m) ((void)((void)file,m), \ #define lfs_setmode(L,file,m) ((void)((void)file,m), \
luaL_error(L, LUA_QL("setmode") " not supported on this platform"), -1) 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_STRUCT struct stat
#define STAT_FUNC stat #define STAT_FUNC stat
#define LSTAT_FUNC lstat #define LSTAT_FUNC lstat
#endif #endif
#endif
/* /*
** This function changes the working (current) directory ** This function changes the working (current) directory
@@ -173,7 +187,11 @@ static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long star
len = ftell (fh); len = ftell (fh);
} }
fseek (fh, start, SEEK_SET); fseek (fh, start, SEEK_SET);
#ifdef __BORLANDC__
code = locking (fileno(fh), lkmode, len);
#else
code = _locking (fileno(fh), lkmode, len); code = _locking (fileno(fh), lkmode, len);
#endif
#else #else
struct flock f; struct flock f;
switch (*mode) { switch (*mode) {
@@ -190,6 +208,79 @@ static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long star
return (code != -1); return (code != -1);
} }
#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 #ifdef _WIN32
static int lfs_g_setmode (lua_State *L, FILE *f, int arg) { static int lfs_g_setmode (lua_State *L, FILE *f, int arg) {
static const int mode[] = {_O_TEXT, _O_BINARY}; static const int mode[] = {_O_TEXT, _O_BINARY};
@@ -321,7 +412,7 @@ static int dir_iter (lua_State *L) {
#else #else
struct dirent *entry; struct dirent *entry;
#endif #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"); luaL_argcheck (L, !d->closed, 1, "closed directory");
#ifdef _WIN32 #ifdef _WIN32
if (d->hFile == 0L) { /* first entry */ if (d->hFile == 0L) { /* first entry */
@@ -383,7 +474,9 @@ static int dir_close (lua_State *L) {
*/ */
static int dir_iter_factory (lua_State *L) { static int dir_iter_factory (lua_State *L) {
const char *path = luaL_checkstring (L, 1); 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; d->closed = 0;
#ifdef _WIN32 #ifdef _WIN32
d->hFile = 0L; d->hFile = 0L;
@@ -400,8 +493,7 @@ static int dir_iter_factory (lua_State *L) {
if (d->dir == NULL) if (d->dir == NULL)
luaL_error (L, "cannot open %s: %s", path, strerror (errno)); luaL_error (L, "cannot open %s: %s", path, strerror (errno));
#endif #endif
lua_pushcclosure (L, dir_iter, 1); return 2;
return 1;
} }
@@ -411,10 +503,33 @@ static int dir_iter_factory (lua_State *L) {
static int dir_create_meta (lua_State *L) { static int dir_create_meta (lua_State *L) {
luaL_newmetatable (L, DIR_METATABLE); luaL_newmetatable (L, DIR_METATABLE);
/* set its __gc field */ /* 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_pushstring (L, "__gc");
lua_pushcfunction (L, dir_close); lua_pushcfunction (L, dir_close);
lua_settable (L, -3); 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; return 1;
} }
@@ -650,13 +765,13 @@ static int link_info (lua_State *L) {
*/ */
static void set_info (lua_State *L) { static void set_info (lua_State *L) {
lua_pushliteral (L, "_COPYRIGHT"); 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_settable (L, -3);
lua_pushliteral (L, "_DESCRIPTION"); 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_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_settable (L, -3);
lua_pushliteral (L, "_VERSION"); lua_pushliteral (L, "_VERSION");
lua_pushliteral (L, "LuaFileSystem 1.4.0"); lua_pushliteral (L, "LuaFileSystem 1.5.0");
lua_settable (L, -3); lua_settable (L, -3);
} }
@@ -673,11 +788,13 @@ static const struct luaL_reg fslib[] = {
{"setmode", lfs_f_setmode}, {"setmode", lfs_f_setmode},
{"touch", file_utime}, {"touch", file_utime},
{"unlock", file_unlock}, {"unlock", file_unlock},
{"lock_dir", lfs_lock_dir},
{NULL, NULL}, {NULL, NULL},
}; };
int luaopen_lfs (lua_State *L) { int luaopen_lfs (lua_State *L) {
dir_create_meta (L); dir_create_meta (L);
lock_create_meta (L);
luaL_register (L, "lfs", fslib); luaL_register (L, "lfs", fslib);
set_info (L); set_info (L);
return 1; return 1;

View File

@@ -1,5 +1,5 @@
LIBRARY lfs.dll LIBRARY lfs.dll
DESCRIPTION "LuaFileSystem" DESCRIPTION "LuaFileSystem"
VERSION 1.4.0 VERSION 1.4.2
EXPORTS EXPORTS
luaopen_lfs luaopen_lfs

View File

@@ -110,4 +110,21 @@ for i = 1, 4000 do
count = count + 1 count = count + 1
end end
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!" print"Ok!"