87 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
mascarenhas
c039fc9798 added 1.4.1rc1 rockspec 2008-04-14 19:55:55 +00:00
mascarenhas
e7a2c5419f *** empty log message *** 2008-03-25 18:24:17 +00:00
mascarenhas
baf658a721 large file support in Linux needs STAT64=-DHAVE_STAT64 in LuaRocks
config
2008-03-25 18:20:29 +00:00
mascarenhas
5c8e92efa3 fixing config.win 2008-03-25 17:39:29 +00:00
mascarenhas
dac6b84eda fixed config.win 2008-03-25 17:38:15 +00:00
mascarenhas
ca8efaa8e7 large file support in lfs.attributes (bug #2185) 2008-03-25 16:58:29 +00:00
carregal
3aba7a98fb Small revision by Reuben Thomas 2008-03-24 18:17:59 +00:00
carregal
0154141e3f Fixed bug in the Windows tests (patch by Shmuel Zeigerman) 2008-03-10 15:28:50 +00:00
carregal
bb9cf83617 Correcting the use of the /MD flag 2008-02-19 22:07:42 +00:00
mascarenhas
c5bfbb1bd2 fixed windows compile problem 2008-02-19 20:08:23 +00:00
carregal
c2e720b5dc Finishing the new rockspecs 2008-02-18 18:55:14 +00:00
carregal
0233beea30 New rockspec for lfs 1.4.0, this time including Windows rules 2008-02-18 18:17:05 +00:00
carregal
f1e4fd1bf4 Fixing wrong decription of lfs.setmode 2008-02-18 17:20:16 +00:00
mascarenhas
640265aee7 removed warnings 2008-02-18 03:13:50 +00:00
carregal
8f943857e8 Corecting the lfs.setmode signature 2008-02-14 18:26:19 +00:00
carregal
80027817c3 Updating rockspec to include the correct package URL 2008-02-13 22:33:47 +00:00
carregal
6c16dc4634 Correcting the detection of the manifest file 2008-02-13 22:08:31 +00:00
carregal
dff01ac3c9 Version 1.4.0 rockspec 2008-02-13 21:40:56 +00:00
carregal
cdfd06b4ea Minor update 2008-02-13 21:00:10 +00:00
carregal
db7e8b9133 Adding tests for lfs.setmode 2008-02-13 20:59:51 +00:00
carregal
d931b9b2bb Small corrections 2008-02-11 22:48:16 +00:00
carregal
b66ab2cae9 Preparing the 1.4.0 release.
Added documentation for lfs.setmode
2008-02-11 22:42:21 +00:00
mascarenhas
78f28b6468 lfs.attributes raises an error if attribute does not exist 2008-01-25 17:09:56 +00:00
mascarenhas
25f8aa1936 makefile.win tweak 2008-01-23 02:50:08 +00:00
mascarenhas
804e976407 updated makefile for vc2008 2008-01-23 02:48:47 +00:00
mascarenhas
d219de7885 added flag to supress manifest creation 2008-01-23 01:58:25 +00:00
mascarenhas
ed97af80fb *** empty log message *** 2008-01-16 22:33:24 +00:00
mascarenhas
895e9daf27 getcwd no longer passes a buffer 2008-01-16 22:29:26 +00:00
mascarenhas
50f17597b3 Added lfs.setmode for changing file's mode (only for Windows) 2007-12-22 17:19:45 +00:00
carregal
24fdbc0a66 Minor HTML revision 2007-12-14 15:28:04 +00:00
carregal
e52a7fef15 Using a default prefix for the Makefile 2007-10-27 22:42:32 +00:00
carregal
6368cd544f Fixing a wrong test (tks to Enrico Tassi) 2007-10-27 14:15:49 +00:00
carregal
9cdf62e1bd Documentation updates for 1.3.0 2007-10-26 21:44:43 +00:00
carregal
4790b562ca Checking for lfs.symlinkattributes so the tests are not applied in Windows 2007-10-26 21:06:14 +00:00
carregal
8432017680 Version 1.3.0 (final) 2007-10-26 21:01:07 +00:00
carregal
d202dad4f1 Removing the symbolic link tests since they don't work in Windows. We have to re-check them later. 2007-10-26 20:13:10 +00:00
carregal
6756befeff Changing version to LuaFileSystem 1.3.0 (work) 2007-10-05 02:06:58 +00:00
tomas
aeca787ff3 Improving conditional compilation for Windows version (thanks to Varol Kaptan) 2007-08-30 14:39:45 +00:00
tomas
1cfd57550e Correcting version 2007-08-30 14:38:07 +00:00
hisham
9f7e1dc153 Make include path comply with vanilla Lua 2007-07-31 03:22:55 +00:00
tomas
97ccdc90ed Avoiding dependency in backwards compatibility to Lua 5.0 2007-06-22 12:44:46 +00:00
tomas
57a64a5cfe Adding function symlinkatributes. Updating version to 1.3.0 2007-06-07 01:28:08 +00:00
carregal
47f40e5705 Changes related to the new build strucutre using Lua 5.1 default paths 2007-05-18 19:52:59 +00:00
carregal
d3e7a0ed12 Corrected the second of 2 bugs on the test script found by Shmuel Zeigerman involving the access and update time on lfs.touch() 2007-05-18 18:04:46 +00:00
carregal
6a22c3e728 Correction on the documentation of lfs.touch() 2007-05-17 23:08:56 +00:00
carregal
4e23cb01d9 Corrected 1 of 2 bugs on the test script found by Shmuel Zeigerman: the use of /tmp as a necessary directory.
Corrected a bug on the test script on slow fliesystems due to the reliance on close times
2007-05-17 23:08:20 +00:00
tomas
7ee2d8e1b2 Compilation bug fix: ISO C90 forbids mixed declarations and code 2007-05-15 12:58:35 +00:00
carregal
8033232c92 Simplified README 2007-05-08 21:39:23 +00:00
carregal
3b35114a16 Details for the 1.2.1 release. Version number, droping Lua 5.0 support 2007-05-08 19:23:12 +00:00
carregal
8161cea877 Changing the default Windows building directory from c:\lua51 to c:\lua5.1 2007-03-15 21:27:52 +00:00
carregal
a11b58023e Add removal rules for nmake clean 2006-12-19 21:41:42 +00:00
mascarenhas
94e104b98a config revert 2006-12-15 18:04:50 +00:00
mascarenhas
e92c9b4d9e Added pseudo-configure script
----------------------------------------------------------------------
2006-12-15 17:14:28 +00:00
mascarenhas
c9fe48709f Windows Makefile take two 2006-12-04 18:25:24 +00:00
mascarenhas
57622411a9 Windows Makefile and config 2006-12-04 18:24:18 +00:00
mascarenhas
67c2187e9a Dropped Lua 5.0 support. 2006-12-04 15:28:53 +00:00
tomas
5100f420b7 Updating to Lua 5.1 2006-07-24 01:19:42 +00:00
carregal
722f6a9869 Reference to LuaBinaries 5.0.2 2006-06-26 18:29:13 +00:00
tomas
e10a4bc816 Correcting version number 2006-06-08 18:06:18 +00:00
tomas
c182bab5f9 Adding version information 2006-06-08 18:04:29 +00:00
tomas
df2efb797c Adding support for compilation on both Lua 5.0 and Lua 5.1 2006-06-08 17:55:33 +00:00
tomas
b6c8c13942 Adding support for compilation on both Lua 5.0 and Lua 5.1 2006-06-08 16:23:25 +00:00
tomas
59ef09d270 Adding support for compilation on both Lua 5.0 and Lua 5.1 2006-06-08 16:16:23 +00:00
carregal
ac0de9a462 Documentation update - minor details 2006-03-23 20:44:00 +00:00
carregal
3a7a15178f Documentation update - minor details 2006-03-15 20:29:15 +00:00
22 changed files with 833 additions and 127 deletions

View File

@@ -1,7 +1,7 @@
# $Id: Makefile,v 1.26.2.1 2007/05/08 21:35:11 carregal Exp $
# $Id: Makefile,v 1.36 2009/09/21 17:02:44 mascarenhas Exp $
T= lfs
V= 1.2.1
CONFIG= ./config
include $(CONFIG)
@@ -9,15 +9,14 @@ include $(CONFIG)
SRCS= src/$T.c
OBJS= src/$T.o
lib: src/$(LIBNAME)
lib: src/lfs.so
src/$(LIBNAME): $(OBJS)
export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/$(LIBNAME) $(OBJS)
src/lfs.so: $(OBJS)
MACOSX_DEPLOYMENT_TARGET="10.3"; export MACOSX_DEPLOYMENT_TARGET; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/lfs.so $(OBJS)
install: src/$(LIBNAME)
install:
mkdir -p $(LUA_LIBDIR)
cp src/$(LIBNAME) $(LUA_LIBDIR)
cd $(LUA_LIBDIR); ln -f -s $(LIBNAME) $T.so
cp src/lfs.so $(LUA_LIBDIR)
clean:
rm -f src/$(LIBNAME) $(OBJS)
rm -f src/lfs.so $(OBJS)

View File

@@ -1,24 +1,25 @@
# $Id: Makefile.win,v 1.4.2.1 2007/05/08 21:35:11 carregal Exp $
# $Id: Makefile.win,v 1.11 2008/05/07 19:06:37 carregal Exp $
T= lfs
V= 1.2.1
include config.win
SRCS= src\$T.c
OBJS= src\$T.obj
lib: src\$(LIBNAME)
lib: src\lfs.dll
.c.obj:
$(CC) /c /Fo$@ $(CFLAGS) $<
src\$(LIBNAME): $(OBJS)
link /dll /def:src\$T.def /out:src\$(LIBNAME) $(OBJS) $(LUA_LIB)
src\lfs.dll: $(OBJS)
link /dll /def:src\$T.def /out:src\lfs.dll $(OBJS) "$(LUA_LIB)"
IF EXIST src\lfs.dll.manifest mt -manifest src\lfs.dll.manifest -outputresource:src\lfs.dll;2
install: src\$(LIBNAME)
IF NOT EXIST $(LUA_LIBDIR) mkdir $(LUA_LIBDIR)
copy src\$(LIBNAME) $(LUA_LIBDIR)
install: src\lfs.dll
IF NOT EXIST "$(LUA_LIBDIR)" mkdir "$(LUA_LIBDIR)"
copy src\lfs.dll "$(LUA_LIBDIR)"
clean:
del src\$(LIBNAME) $(OBJS) src\$T.lib src\$T.exp
del src\lfs.dll $(OBJS) src\$T.lib src\$T.exp
IF EXIST src\lfs.dll.manifest del src\lfs.dll.manifest

66
README
View File

@@ -1,14 +1,66 @@
LuaFileSystem - File System Library for Lua
Copyright 2003-2007 PUC-Rio
Copyright 2003 Kepler Project
http://www.keplerproject.org/luafilesystem
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. LuaFileSystem is free software and uses the same license as Lua 5.1 Current version is 1.2.1.
Description
-----------
LuaFileSystem is a Lua library developed to complement the set of functions
related to file systems offered by the standard Lua distribution.
To install on Linux/OSX/BSD, please edit the config file and then call
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
make
make install
LuaRocks Installation
---------------------
luarocks install luafilesystem
The last step may require root privileges.
Please check the documentation at /doc/us/ for more information.
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
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]

13
config
View File

@@ -1,8 +1,13 @@
# Installation directories
# Default installation prefix
PREFIX=/usr/local
# System's libraries directory (where binary libraries are installed)
LUA_LIBDIR= /usr/local/lib/lua/5.1
LUA_LIBDIR= $(PREFIX)/lib/lua/5.1
# Lua includes directory
LUA_INC= /usr/local/include/lua51
LUA_INC= $(PREFIX)/include
# OS dependent
LIB_OPTION= -shared #for Linux
@@ -11,9 +16,9 @@ LIB_OPTION= -shared #for Linux
LIBNAME= $T.so.$V
# Compilation directives
WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings
WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -pedantic
INCS= -I$(LUA_INC)
CFLAGS= $(WARN) $(INCS)
CC= gcc
# $Id: config,v 1.14.2.1 2007/05/08 21:35:10 carregal Exp $
# $Id: config,v 1.21 2007/10/27 22:42:32 carregal Exp $

View File

@@ -1,17 +1,19 @@
# Installation directories
# System's libraries directory (where binary libraries are installed)
LUA_LIBDIR= c:\lua5.1\lib
LUA_LIBDIR= "c:\lua5.1"
# Lua includes directory
LUA_INC= c:\lua5.1\include
LUA_INC= "c:\lua5.1\include"
# Lua library
LUA_LIB= c:\lua5.1\bin\lua5.1.lib
LUA_LIB= "c:\lua5.1\lua5.1.lib"
LIBNAME= $T.dll
# Compilation directives
WARN= /O2
INCS= /I$(LUA_INC)
CFLAGS= $(WARN) $(INCS)
CFLAGS= /MD $(WARN) $(INCS)
CC= cl
# $Id: config.win,v 1.3.2.1 2007/05/08 21:35:10 carregal Exp $
# $Id: config.win,v 1.7 2008/03/25 17:39:29 mascarenhas Exp $

View File

@@ -1,6 +1,6 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
@@ -93,9 +93,8 @@ attrdir (".")
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">
<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
<p><small>$Id: examples.html,v 1.5.2.1 2007/05/08 21:35:11 carregal Exp $</small></p>
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p>
<p><small>$Id: examples.html,v 1.8 2007/12/14 15:28:04 carregal Exp $</small></p>
</div> <!-- id="about" -->
</div> <!-- id="container" -->

View File

@@ -1,6 +1,6 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
@@ -71,41 +71,86 @@ the underlying directory structure and file attributes.</p>
<h2><a name="status"></a>Status</h2>
<p>Current version is 1.2.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.2 a Windows binary
version of LuaFileSystem 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.2.1</strong> [08/May/2007]</dt>
<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>
<dd>
<ul>
<li>added function
<a href="manual.html#setmode"><code>lfs.setmode</code></a>
(works only in Windows systems).</li>
<li><a href="manual.html#attributes"><code>lfs.attributes</code></a>
raises an error if attribute does not exist</li>
</ul>
</dd>
<dt><strong><a href="http://www.keplerproject.org/luafilesystem/1.3/">Version 1.3.0</a></strong> [26/Oct/2007]</dt>
<dd>
<ul>
<li>added function
<a href="manual.html#symlinkattributes"><code>lfs.symlinkattributes</code></a>
(works only in non Windows systems).</li>
</ul>
</dd>
<dt><strong><a href="http://www.keplerproject.org/luafilesystem/1.2/">Version 1.2.1</a></strong> [08/May/2007]</dt>
<dd>
<ul>
<li>compatible only with Lua 5.1 (Lua 5.0 support was dropped)</li>
</ul>
</dd>
<dt><strong>Version 1.2</strong> [15/Mar/2006]</dt>
<dt><strong><a href="http://www.keplerproject.org/luafilesystem/1.2/">Version 1.2</a></strong> [15/Mar/2006]</dt>
<dd>
<ul>
<li>added optional argument to
<a href="manual.html#attributes"><code>lfs.attributes</code></a></li>
<li>added function
<a href="manual.html#rmdir"><code>lfs.rmdir</code></a></li>
<li>bug correction on <code>lfs.dir</code></li>
<li>bug correction on <a href="manual.html#dir"><code>lfs.dir</code></a></li>
</ul>
</dd>
<dt><strong><a href="http://www.keplerproject.org/luafilesystem/1.1/">Version 1.1</a></strong> [30/May/2005]</dt>
<dd>
<ul>
<li>added function <code>lfs.touch</code>.</li>
<li>added function <a href="manual.html#touch"><code>lfs.touch</code></a>.</li>
</ul>
</dd>
@@ -121,7 +166,7 @@ version of LuaFileSystem can be found at the same LuaForge page.</p>
<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>
@@ -137,9 +182,8 @@ Comments are welcome!</p>
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">
<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
<p><small>$Id: index.html,v 1.30.2.1 2007/05/08 21:35:11 carregal Exp $</small></p>
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></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" -->

View File

@@ -1,6 +1,6 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
@@ -85,7 +85,7 @@ Ierusalimschy, Andr&eacute; Carregal and Tom&aacute;s Guisasola.
The implementation is not derived from licensed software.</p>
<hr/>
<p>Copyright &copy; 2004-2007 The Kepler Project.</p>
<p>Copyright &copy; 2003 Kepler Project.</p>
<p>Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
@@ -112,9 +112,8 @@ SOFTWARE.</p>
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">
<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
<p><small>$Id: license.html,v 1.9.2.1 2007/05/08 21:35:11 carregal Exp $</small></p>
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></p>
<p><small>$Id: license.html,v 1.13 2008/02/11 22:42:21 carregal Exp $</small></p>
</div><!-- id="about" -->
</div><!-- id="container" -->

View File

@@ -1,6 +1,6 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>LuaFileSystem</title>
<link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
@@ -74,20 +74,25 @@ and header files for the target version must be installed properly.
<p>
LuaFileSystem offers a Makefile and a separate configuration file,
<code>config</code>,
which should be edited to suit your installation before runnig
which should be edited to suit your installation before running
<code>make</code>.
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 LuaFileSystem compiled binary should be copied to a directory in your
<a href="http://www.lua.org/manual/5.1/manual.html#pdf-package.cpath">C path</a>.</p>
<p>The easiest way to install LuaFileSystem is to use LuaRocks:</p>
<p>Windows users can use the binary version of LuaFileSystem
(<code>lfs.dll</code>) available at
<a href="http://luaforge.net/projects/luafilesystem/files">LuaForge</a>.</p>
<pre class="example">
luarocks install luafilesystem
</pre>
<p>If you prefer to install LuaFileSystem manually, the compiled binary should be copied to a directory in your
<a href="http://www.lua.org/manual/5.1/manual.html#pdf-package.cpath">C path</a>.</p>
<h2><a name="reference"></a>Reference</h2>
@@ -153,6 +158,12 @@ LuaFileSystem offers the following functions:
<dt><strong><code>blksize</code></strong></dt>
<dd>optimal file system I/O blocksize; (Unix only)</dd>
</dl>
This function uses <code>stat</code> internally thus if the given
<code>filepath</code> is a symbolic link, it is followed (if it points to
another link the chain is followed recursively) and the information
is about the file it refers to.
To obtain information about the link itself, see function
<a href="#symlinkattributes">lfs.symlinkattributes</a>.
</dd>
<dt><a name="chdir"></a><strong><code>lfs.chdir (path)</code></strong></dt>
@@ -160,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 string with an entry of the
directory; <code>nil</code> is returned when there is 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>
@@ -196,14 +218,27 @@ LuaFileSystem offers the following functions:
<dd>Removes an existing directory. The argument is the name of the directory.<br />
Returns <code>true</code> if the operation was successful;
in case of error, it returns <code>nil</code> plus an error string.</dd>
<dt><a name="setmode"></a><strong><code>lfs.setmode (file, mode)</code></strong></dt>
<dd>Sets the writing mode for a file. The mode string can be either <code>binary</code> or <code>text</code>.
Returns the previous mode string for the file. This function is only available in Windows, so you may want to make sure that
<code>lfs.setmode</code> exists before using it.
</dd>
<dt><a name="symlinkattributes"></a><strong><code>lfs.symlinkattributes (filepath [, aname])</code></strong></dt>
<dd>Identical to <a href="#attributes">lfs.attributes</a> except that
it obtains information about the link itself (not the file it refers to).
This function is not available in Windows so you may want to make sure that
<code>lfs.symlinkattributes</code> exists before using it.
</dd>
<dt><a name="touch"></a><strong><code>lfs.touch (filepath [, atime [, mtime]])</code></strong></dt>
<dd>Set access and modification times of a file. This function is
a bind to <code>utime</code> function. The first argument is the
filename, the second argument (<code>atime</code>) is the access time,
and the third argument (<code>mtime</code>) is the modification time.
Both times are provided in seconds (which should be generated with
Lua standard function <code>os.date</code>).
Lua standard function <code>os.time</code>).
If the modification time is omitted, the access time provided is used;
if both times are omitted, the current time is used.<br />
Returns <code>true</code> if the operation was successful;
@@ -226,9 +261,8 @@ LuaFileSystem offers the following functions:
</div> <!-- id="main" -->
<div id="about">
<p><a href="http://validator.w3.org/check?uri=referer">
<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
<p><small>$Id: manual.html,v 1.30.2.2 2007/05/08 21:35:11 carregal Exp $</small></p>
<p><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.0!</a></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" -->

View File

@@ -0,0 +1,27 @@
package = "LuaFileSystem"
version = "1.3.0-1"
source = {
url = "http://luaforge.net/frs/download.php/2679/luafilesystem-1.3.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 = "make",
build_variables = {
LUA_INC = "$(LUA_INCDIR)",
LIB_OPTION = "$(LIBFLAG)"
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)"
}
}

View File

@@ -0,0 +1,27 @@
package = "LuaFileSystem"
version = "1.4.0-1"
source = {
url = "http://luaforge.net/frs/download.php/3158/luafilesystem-1.4.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 = "make",
build_variables = {
LUA_INC = "$(LUA_INCDIR)",
LIB_OPTION = "$(LIBFLAG)"
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)"
}
}

View File

@@ -0,0 +1,43 @@
package = "LuaFileSystem"
version = "1.4.0-2"
source = {
url = "http://luaforge.net/frs/download.php/3158/luafilesystem-1.4.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 = {
platforms = {
unix = {
type = "make",
build_variables = {
LIB_OPTION = "$(LIBFLAG)",
CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR)",
},
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,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,43 @@
package = "LuaFileSystem"
version = "1.4.1rc1-1"
source = {
url = "http://luafilesystem.luaforge.net/luafilesystem-1.4.1rc1.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

@@ -0,0 +1,44 @@
package = "LuaFileSystem"
version = "cvs-1"
source = {
url = "cvs://:pserver:anonymous:@cvs.luaforge.net:/cvsroot/luafilesystem",
cvs_tag = "HEAD"
}
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)",
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)"
}
},
win32 = {
type = "make",
build_variables = {
LUA_LIB = "$(LUA_LIBDIR)\\lua5.1.lib",
CFLAGS = "$(CFLAGS) /I$(LUA_INCDIR)",
},
install_variables = {
LUA_LIBDIR = "$(LIBDIR)",
LUA_DIR = "$(LUADIR)",
BIN_DIR = "$(BINDIR)"
}
}
}
}

View File

@@ -0,0 +1,26 @@
package = "LuaFileSystem"
version = "cvs-2"
source = {
url = "git://github.com/keplerproject/luafilesystem.git",
}
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" }
}

295
src/lfs.c
View File

@@ -1,6 +1,6 @@
/*
** LuaFileSystem
** Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/luafilesystem)
** Copyright Kepler Project 2003 (http://www.keplerproject.org/luafilesystem)
**
** File system manipulation library.
** This library offers these functions:
@@ -9,25 +9,45 @@
** lfs.currentdir ()
** lfs.dir (path)
** lfs.lock (fh, mode)
** lfs.lock_dir (path)
** lfs.mkdir (path)
** lfs.rmdir (path)
** lfs.setmode (filepath, mode)
** lfs.symlinkattributes (filepath [, attributename]) -- thanks to Sam Roberts
** lfs.touch (filepath [, atime [, mtime]])
** lfs.unlock (fh)
**
** $Id: lfs.c,v 1.32.2.1 2007/05/08 21:35:10 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>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#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>
#else
#include <unistd.h>
#include <dirent.h>
@@ -66,6 +86,26 @@ typedef struct dir_data {
#endif
} dir_data;
#define LOCK_METATABLE "lock metatable"
#ifdef _WIN32
#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)
#define STAT_STRUCT struct stat
#define STAT_FUNC stat
#define LSTAT_FUNC lstat
#endif
/*
** This function changes the working (current) directory
@@ -89,16 +129,17 @@ static int change_dir (lua_State *L) {
** and a string describing the error
*/
static int get_dir (lua_State *L) {
char path[255+2];
if (getcwd(path, 255) == NULL) {
lua_pushnil(L);
lua_pushstring(L, getcwd_error);
return 2;
}
else {
lua_pushstring(L, path);
return 1;
}
char *path;
if ((path = getcwd(NULL, 0)) == NULL) {
lua_pushnil(L);
lua_pushstring(L, getcwd_error);
return 2;
}
else {
lua_pushstring(L, path);
free(path);
return 1;
}
}
/*
@@ -146,7 +187,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) {
@@ -163,6 +208,116 @@ static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long star
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
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};
int op = luaL_checkoption(L, arg, NULL, modenames);
int res = lfs_setmode(L, f, mode[op]);
if (res != -1) {
int i;
lua_pushboolean(L, 1);
for (i = 0; modenames[i] != NULL; i++) {
if (mode[i] == res) {
lua_pushstring(L, modenames[i]);
goto exit;
}
}
lua_pushnil(L);
exit:
return 2;
} else {
int en = errno;
lua_pushnil(L);
lua_pushfstring(L, "%s", strerror(en));
lua_pushinteger(L, en);
return 3;
}
}
#else
static int lfs_g_setmode (lua_State *L, FILE *f, int arg) {
lua_pushboolean(L, 0);
lua_pushliteral(L, "setmode not supported on this platform");
return 2;
}
#endif
static int lfs_f_setmode(lua_State *L) {
return lfs_g_setmode(L, check_file(L, 1, "setmode"), 2);
}
/*
** Locks a file.
@@ -254,8 +409,10 @@ static int remove_dir (lua_State *L) {
static int dir_iter (lua_State *L) {
#ifdef _WIN32
struct _finddata_t c_file;
#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 */
@@ -279,7 +436,6 @@ static int dir_iter (lua_State *L) {
}
}
#else
struct dirent *entry;
if ((entry = readdir (d->dir)) != NULL) {
lua_pushstring (L, entry->d_name);
return 1;
@@ -318,7 +474,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;
@@ -335,8 +493,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;
}
@@ -346,10 +503,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;
}
@@ -429,61 +609,67 @@ static int file_utime (lua_State *L) {
/* inode protection mode */
static void push_st_mode (lua_State *L, struct stat *info) {
static void push_st_mode (lua_State *L, STAT_STRUCT *info) {
lua_pushstring (L, mode2string (info->st_mode));
}
/* device inode resides on */
static void push_st_dev (lua_State *L, struct stat *info) {
static void push_st_dev (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_dev);
}
/* inode's number */
static void push_st_ino (lua_State *L, struct stat *info) {
static void push_st_ino (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_ino);
}
/* number of hard links to the file */
static void push_st_nlink (lua_State *L, struct stat *info) {
static void push_st_nlink (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_nlink);
}
/* user-id of owner */
static void push_st_uid (lua_State *L, struct stat *info) {
static void push_st_uid (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_uid);
}
/* group-id of owner */
static void push_st_gid (lua_State *L, struct stat *info) {
static void push_st_gid (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_gid);
}
/* device type, for special file inode */
static void push_st_rdev (lua_State *L, struct stat *info) {
static void push_st_rdev (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_rdev);
}
/* time of last access */
static void push_st_atime (lua_State *L, struct stat *info) {
static void push_st_atime (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, info->st_atime);
}
/* time of last data modification */
static void push_st_mtime (lua_State *L, struct stat *info) {
static void push_st_mtime (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, info->st_mtime);
}
/* time of last file status change */
static void push_st_ctime (lua_State *L, struct stat *info) {
static void push_st_ctime (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, info->st_ctime);
}
/* file size, in bytes */
static void push_st_size (lua_State *L, struct stat *info) {
static void push_st_size (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_size);
}
#ifndef _WIN32
/* blocks allocated for file */
static void push_st_blocks (lua_State *L, struct stat *info) {
static void push_st_blocks (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_blocks);
}
/* optimal file system I/O blocksize */
static void push_st_blksize (lua_State *L, struct stat *info) {
static void push_st_blksize (lua_State *L, STAT_STRUCT *info) {
lua_pushnumber (L, (lua_Number)info->st_blksize);
}
#endif
static void push_invalid (lua_State *L, STAT_STRUCT *info) {
luaL_error(L, "invalid attribute name");
#ifndef _WIN32
info->st_blksize = 0; /* never reached */
#endif
}
typedef void (*_push_function) (lua_State *L, struct stat *info);
typedef void (*_push_function) (lua_State *L, STAT_STRUCT *info);
struct _stat_members {
const char *name;
@@ -506,18 +692,18 @@ struct _stat_members members[] = {
{ "blocks", push_st_blocks },
{ "blksize", push_st_blksize },
#endif
{ NULL, NULL }
{ NULL, push_invalid }
};
/*
** Get file information
** Get file or symbolic link information
*/
static int file_info (lua_State *L) {
static int _file_info_ (lua_State *L, int (*st)(const char*, STAT_STRUCT*)) {
int i;
struct stat info;
STAT_STRUCT info;
const char *file = luaL_checkstring (L, 1);
if (stat(file, &info)) {
if (st(file, &info)) {
lua_pushnil (L);
lua_pushfstring (L, "cannot obtain information from file `%s'", file);
return 2;
@@ -527,6 +713,7 @@ static int file_info (lua_State *L) {
const char *member = lua_tostring (L, 2);
if (strcmp (member, "mode") == 0) v = 0;
#ifndef _WIN32
else if (strcmp (member, "blocks") == 0) v = 11;
else if (strcmp (member, "blksize") == 0) v = 12;
#endif
else /* look for member */
@@ -549,18 +736,42 @@ static int file_info (lua_State *L) {
}
/*
** Get file information using stat.
*/
static int file_info (lua_State *L) {
return _file_info_ (L, STAT_FUNC);
}
/*
** Get symbolic link information using lstat.
*/
#ifndef _WIN32
static int link_info (lua_State *L) {
return _file_info_ (L, LSTAT_FUNC);
}
#else
static int link_info (lua_State *L) {
lua_pushboolean(L, 0);
lua_pushliteral(L, "symlinkattributes not supported on this platform");
return 2;
}
#endif
/*
** 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-2007 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.2.1");
lua_pushliteral (L, "LuaFileSystem 1.5.0");
lua_settable (L, -3);
}
@@ -573,14 +784,18 @@ static const struct luaL_reg fslib[] = {
{"lock", file_lock},
{"mkdir", make_dir},
{"rmdir", remove_dir},
{"symlinkattributes", link_info},
{"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);
luaL_openlib (L, "lfs", fslib, 0);
lock_create_meta (L);
luaL_register (L, "lfs", fslib);
set_info (L);
return 1;
}

View File

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

View File

@@ -1,8 +1,8 @@
/*
** LuaFileSystem
** Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/luafilesystem)
** Copyright Kepler Project 2003 (http://www.keplerproject.org/luafilesystem)
**
** $Id: lfs.h,v 1.3 2006/03/10 23:37:32 carregal Exp $
** $Id: lfs.h,v 1.5 2008/02/19 20:08:23 mascarenhas Exp $
*/
/* Define 'chdir' for systems that do not implement it */
@@ -13,4 +13,5 @@
#define chdir_error strerror(errno)
#endif
int luaopen_lfs (lua_State *L);

View File

@@ -34,8 +34,17 @@ assert (lfs.currentdir() == current, "error trying to change directories")
assert (lfs.chdir ("this couldn't be an actual directory") == nil, "could change to a non-existent directory")
-- Changing creating and removing directories
local tmpdir = tmp..sep.."lfs_tmp_dir"
local tmpdir = current..sep.."lfs_tmp_dir"
local tmpfile = tmpdir..sep.."tmp_file"
-- Test for existence of a previous lfs_tmp_dir
-- that may have resulted from an interrupted test execution and remove it
if lfs.chdir (tmpdir) then
assert (lfs.chdir (upper), "could not change to upper directory")
assert (os.remove (tmpfile), "could not remove file from previous test")
assert (lfs.rmdir (tmpdir), "could not remove directory from previous test")
end
-- tries to create a directory
assert (lfs.mkdir (tmpdir), "could not make a new directory")
local attrib, errmsg = lfs.attributes (tmpdir)
if not attrib then
@@ -45,19 +54,42 @@ local f = io.open(tmpfile, "w")
f:close()
-- Change access time
assert (lfs.touch (tmpfile, 86401))
local testdate = os.time({ year = 2007, day = 10, month = 2, hour=0})
assert (lfs.touch (tmpfile, testdate))
local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == 86401, "could not set access time")
assert (new_att.modification == 86401, "could not set modification time")
assert (new_att.access == testdate, "could not set access time")
assert (new_att.modification == testdate, "could not set modification time")
-- Change access and modification time
assert (lfs.touch (tmpfile, 86403, 86402))
local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == 86403, "could not set access time")
assert (new_att.modification == 86402, "could not set modification time")
local testdate1 = os.time({ year = 2007, day = 10, month = 2, hour=0})
local testdate2 = os.time({ year = 2007, day = 11, month = 2, hour=0})
assert (lfs.touch (tmpfile, testdate2, testdate1))
local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == testdate2, "could not set access time")
assert (new_att.modification == testdate1, "could not set modification time")
local res, err = lfs.symlinkattributes(tmpfile)
if err ~= "symlinkattributes not supported on this platform" then
-- Checking symbolic link information (does not work in Windows)
assert (os.execute ("ln -s "..tmpfile.." _a_link_for_test_"))
assert (lfs.attributes"_a_link_for_test_".mode == "file")
assert (lfs.symlinkattributes"_a_link_for_test_".mode == "link")
assert (os.remove"_a_link_for_test_")
end
if lfs.setmode then
-- Checking text/binary modes (works only in Windows)
local f = io.open(tmpfile, "w")
local result, mode = lfs.setmode(f, "binary")
assert((result and mode == "text") or (not result and mode == "setmode not supported on this platform"))
result, mode = lfs.setmode(f, "text")
assert((result and mode == "binary") or (not result and mode == "setmode not supported on this platform"))
f:close()
end
-- Restore access time to current value
assert (lfs.touch (tmpfile))
assert (lfs.touch (tmpfile, attrib.access, attrib.modification))
new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == attrib.access)
assert (new_att.modification == attrib.modification)
@@ -78,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!"