4 Commits

Author SHA1 Message Date
carregal
2afb826d96 Merging README 2007-05-08 22:11:42 +00:00
carregal
00be93ab51 Merging the trunk changes for the 1.2.1 release 2007-05-08 21:35:10 +00:00
carregal
0147f85957 Merging the documentation from HEAD 2006-03-15 20:30:53 +00:00
carregal
d5c95fbf86 Merging of VC6 files from HEAD 2006-03-15 19:36:19 +00:00
33 changed files with 438 additions and 1868 deletions

View File

@@ -1,33 +0,0 @@
language: c
env:
global:
- LUAROCKS=2.2.0-rc1
matrix:
- LUA=lua5.1
- LUA=lua5.2
- LUA=lua5.3
- LUA=luajit
branches:
only:
- master
before_install:
- bash .travis/setup_lua.sh
- sudo pip install cpp-coveralls
install:
- sudo luarocks make rockspecs/luafilesystem-cvs-3.rockspec CFLAGS="-O2 -fPIC -ftest-coverage -fprofile-arcs" LIBFLAG="-shared --coverage"
script:
- cd tests
- sudo lua test.lua
after_success:
- coveralls -b .. -r .. -E usr
notifications:
email:
on_success: change
on_failure: always

View File

@@ -1,15 +0,0 @@
if [ -z "$PLATFORM" ]; then
PLATFORM=$TRAVIS_OS_NAME;
fi
if [ "$PLATFORM" == "osx" ]; then
PLATFORM="macosx";
fi
if [ -z "$PLATFORM" ]; then
if [ "$(uname)" == "Linux" ]; then
PLATFORM="linux";
else
PLATFORM="macosx";
fi;
fi

View File

@@ -1,101 +0,0 @@
#! /bin/bash
# A script for setting up environment for travis-ci testing.
# Sets up Lua and Luarocks.
# LUA must be "lua5.1", "lua5.2" or "luajit".
# luajit2.0 - master v2.0
# luajit2.1 - master v2.1
LUAJIT_BASE="LuaJIT-2.0.3"
source .travis/platform.sh
LUAJIT="no"
if [ "$PLATFORM" == "macosx" ]; then
if [ "$LUA" == "luajit" ]; then
LUAJIT="yes";
fi
if [ "$LUA" == "luajit2.0" ]; then
LUAJIT="yes";
fi
if [ "$LUA" == "luajit2.1" ]; then
LUAJIT="yes";
fi;
elif [ "$(expr substr $LUA 1 6)" == "luajit" ]; then
LUAJIT="yes";
fi
if [ "$LUAJIT" == "yes" ]; then
if [ "$LUA" == "luajit" ]; then
curl http://luajit.org/download/$LUAJIT_BASE.tar.gz | tar xz;
else
git clone http://luajit.org/git/luajit-2.0.git $LUAJIT_BASE;
fi
cd $LUAJIT_BASE
if [ "$LUA" == "luajit2.1" ]; then
git checkout v2.1;
fi
make && sudo make install
if [ "$LUA" == "luajit2.1" ]; then
sudo ln -s /usr/local/bin/luajit-2.1.0-alpha /usr/local/bin/luajit
sudo ln -s /usr/local/bin/luajit /usr/local/bin/lua;
else
sudo ln -s /usr/local/bin/luajit /usr/local/bin/lua;
fi;
else
if [ "$LUA" == "lua5.1" ]; then
curl http://www.lua.org/ftp/lua-5.1.5.tar.gz | tar xz
cd lua-5.1.5;
elif [ "$LUA" == "lua5.2" ]; then
curl http://www.lua.org/ftp/lua-5.2.3.tar.gz | tar xz
cd lua-5.2.3;
elif [ "$LUA" == "lua5.3" ]; then
curl http://www.lua.org/work/lua-5.3.0-beta.tar.gz | tar xz
cd lua-5.3.0-beta;
fi
sudo make $PLATFORM install;
fi
cd $TRAVIS_BUILD_DIR;
LUAROCKS_BASE=luarocks-$LUAROCKS
# curl http://luarocks.org/releases/$LUAROCKS_BASE.tar.gz | tar xz
git clone https://github.com/keplerproject/luarocks.git $LUAROCKS_BASE
cd $LUAROCKS_BASE
git checkout v$LUAROCKS
if [ "$LUA" == "luajit" ]; then
./configure --lua-suffix=jit --with-lua-include=/usr/local/include/luajit-2.0;
elif [ "$LUA" == "luajit2.0" ]; then
./configure --lua-suffix=jit --with-lua-include=/usr/local/include/luajit-2.0;
elif [ "$LUA" == "luajit2.1" ]; then
./configure --lua-suffix=jit --with-lua-include=/usr/local/include/luajit-2.1;
else
./configure;
fi
make build && sudo make install
cd $TRAVIS_BUILD_DIR
rm -rf $LUAROCKS_BASE
if [ "$LUAJIT" == "yes" ]; then
rm -rf $LUAJIT_BASE;
elif [ "$LUA" == "lua5.1" ]; then
rm -rf lua-5.1.5;
elif [ "$LUA" == "lua5.2" ]; then
rm -rf lua-5.2.3;
elif [ "$LUA" == "lua5.3" ]; then
rm -rf lua-5.3.0-beta;
fi

21
LICENSE
View File

@@ -1,21 +0,0 @@
Copyright © 2003-2014 Kepler Project.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

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

View File

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

82
README
View File

@@ -1,82 +1,14 @@
LuaFileSystem - File System Library for Lua LuaFileSystem - File System Library for Lua
Copyright 2003 Kepler Project Copyright 2003-2007 PUC-Rio
http://www.keplerproject.org/luafilesystem http://www.keplerproject.org/luafilesystem
Description 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.
-----------
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. To install on Linux/OSX/BSD, please edit the config file and then call
LuaFileSystem is free software and uses the same license as Lua 5.1
LuaRocks Installation make
--------------------- make install
luarocks install luafilesystem
The last step may require root privileges.
Documentation Please check the documentation at /doc/us/ for more information.
-------------
Please check the documentation at doc/us/ for more information.
History
-------
Version 1.6.3 [15/Jan/2012]
* Lua 5.3 compatibility
* Assorted bugfixes
Version 1.6.2 [??/Oct/2012]
* Full Lua 5.2 compatibility (with Lua 5.1 fallbacks)
Version 1.6.1 [01/Oct/2012]
* fix build for Lua 5.2
Version 1.6.0 [26/Sep/2012]
* getcwd fix for Android
* support for Lua 5.2
* add lfs.link
* other bug fixes
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,13 +1,8 @@
# Installation directories # Installation directories
# Default installation prefix
PREFIX=/usr/local
# System's libraries directory (where binary libraries are installed) # System's libraries directory (where binary libraries are installed)
LUA_LIBDIR= $(PREFIX)/lib/lua/5.1 LUA_LIBDIR= /usr/local/lib/lua/5.1
# Lua includes directory # Lua includes directory
LUA_INC= $(PREFIX)/include LUA_INC= /usr/local/include/lua51
# OS dependent # OS dependent
LIB_OPTION= -shared #for Linux LIB_OPTION= -shared #for Linux
@@ -16,9 +11,9 @@ LIB_OPTION= -shared #for Linux
LIBNAME= $T.so.$V LIBNAME= $T.so.$V
# Compilation directives # Compilation directives
WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -pedantic WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings
INCS= -I$(LUA_INC) INCS= -I$(LUA_INC)
CFLAGS= $(WARN) $(INCS) CFLAGS= $(WARN) $(INCS)
CC= gcc CC= gcc
# $Id: config,v 1.21 2007/10/27 22:42:32 carregal Exp $ # $Id: config,v 1.14.2.1 2007/05/08 21:35:10 carregal Exp $

View File

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

View File

@@ -1,212 +0,0 @@
body {
margin-left: 1em;
margin-right: 1em;
font-family: arial, helvetica, geneva, sans-serif;
background-color:#ffffff; margin:0px;
}
code {
font-family: "Andale Mono", monospace;
}
tt {
font-family: "Andale Mono", monospace;
}
body, td, th { font-size: 11pt; }
h1, h2, h3, h4 { margin-left: 0em; }
textarea, pre, tt { font-size:10pt; }
body, td, th { color:#000000; }
small { font-size:0.85em; }
h1 { font-size:1.5em; }
h2 { font-size:1.25em; }
h3 { font-size:1.15em; }
h4 { font-size:1.06em; }
a:link { font-weight:bold; color: #004080; text-decoration: none; }
a:visited { font-weight:bold; color: #006699; text-decoration: none; }
a:link:hover { text-decoration:underline; }
hr { color:#cccccc }
img { border-width: 0px; }
h3 { padding-top: 1em; }
p { margin-left: 1em; }
p.name {
font-family: "Andale Mono", monospace;
padding-top: 1em;
margin-left: 0em;
}
blockquote { margin-left: 3em; }
.example {
background-color: rgb(245, 245, 245);
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-style: solid;
border-right-style: solid;
border-bottom-style: solid;
border-left-style: solid;
border-top-color: silver;
border-right-color: silver;
border-bottom-color: silver;
border-left-color: silver;
padding: 1em;
margin-left: 1em;
margin-right: 1em;
font-family: "Andale Mono", monospace;
font-size: smaller;
}
hr {
margin-left: 0em;
background: #00007f;
border: 0px;
height: 1px;
}
ul { list-style-type: disc; }
table.index { border: 1px #00007f; }
table.index td { text-align: left; vertical-align: top; }
table.index ul { padding-top: 0em; margin-top: 0em; }
table {
border: 1px solid black;
border-collapse: collapse;
margin-left: auto;
margin-right: auto;
}
th {
border: 1px solid black;
padding: 0.5em;
}
td {
border: 1px solid black;
padding: 0.5em;
}
div.header, div.footer { margin-left: 0em; }
#container {
margin-left: 1em;
margin-right: 1em;
background-color: #f0f0f0;
}
#product {
text-align: center;
border-bottom: 1px solid #cccccc;
background-color: #ffffff;
}
#product big {
font-size: 2em;
}
#product_logo {
}
#product_name {
}
#product_description {
}
#main {
background-color: #f0f0f0;
border-left: 2px solid #cccccc;
}
#navigation {
float: left;
width: 12em;
margin: 0;
vertical-align: top;
background-color: #f0f0f0;
overflow:visible;
}
#navigation h1 {
background-color:#e7e7e7;
font-size:1.1em;
color:#000000;
text-align:left;
margin:0px;
padding:0.2em;
border-top:1px solid #dddddd;
border-bottom:1px solid #dddddd;
}
#navigation ul {
font-size:1em;
list-style-type: none;
padding: 0;
margin: 1px;
}
#navigation li {
text-indent: -1em;
margin: 0em 0em 0em 0.5em;
display: block;
padding: 3px 0px 0px 12px;
}
#navigation li li a {
padding: 0px 3px 0px -1em;
}
#content {
margin-left: 12em;
padding: 1em;
border-left: 2px solid #cccccc;
border-right: 2px solid #cccccc;
background-color: #ffffff;
}
#about {
clear: both;
margin: 0;
padding: 5px;
border-top: 2px solid #cccccc;
background-color: #ffffff;
}
@media print {
body {
font: 10pt "Times New Roman", "TimeNR", Times, serif;
}
a {
font-weight:bold; color: #004080; text-decoration: underline;
}
#main {
background-color: #ffffff; border-left: 0px;
}
#container {
margin-left: 2%; margin-right: 2%; background-color: #ffffff;
}
#content {
margin-left: 0px; padding: 1em; border-left: 0px; border-right: 0px; background-color: #ffffff;
}
#navigation {
display: none;
}
#product_logo {
display: none;
}
#about img {
display: none;
}
.example {
font-family: "Andale Mono", monospace;
font-size: 8pt;
page-break-inside: avoid;
}
}

View File

@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html>
<head> <head>
<title>LuaFileSystem</title> <title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/> <link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head> </head>
@@ -45,10 +45,10 @@
</ul> </ul>
</li> </li>
<li><strong>Examples</strong></li> <li><strong>Examples</strong></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Project</a> <li><a href="http://luaforge.net/projects/luafilesystem/">Project</a>
<ul> <ul>
<li><a href="https://github.com/keplerproject/luafilesystem/issues">Bug Tracker</a></li> <li><a href="http://luaforge.net/tracker/?group_id=66">Bug Tracker</a></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Git</a></li> <li><a href="http://luaforge.net/scm/?group_id=66">CVS</a></li>
</ul> </ul>
</li> </li>
<li><a href="license.html">License</a></li> <li><a href="license.html">License</a></li>
@@ -65,7 +65,7 @@
attributes for each file inside it.</p> attributes for each file inside it.</p>
<pre class="example"> <pre class="example">
local lfs = require"lfs" require"lfs"
function attrdir (path) function attrdir (path)
for file in lfs.dir(path) do for file in lfs.dir(path) do
@@ -93,8 +93,9 @@ attrdir (".")
</div> <!-- id="main" --> </div> <!-- id="main" -->
<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">
<p><small>$Id: examples.html,v 1.8 2007/12/14 15:28:04 carregal Exp $</small></p> <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>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->

View File

@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html>
<head> <head>
<title>LuaFileSystem</title> <title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/> <link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head> </head>
@@ -45,10 +45,10 @@
</ul> </ul>
</li> </li>
<li><a href="examples.html">Examples</a></li> <li><a href="examples.html">Examples</a></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Project</a> <li><a href="http://luaforge.net/projects/luafilesystem/">Project</a>
<ul> <ul>
<li><a href="https://github.com/keplerproject/luafilesystem/issues">Bug Tracker</a></li> <li><a href="http://luaforge.net/tracker/?group_id=66">Bug Tracker</a></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Git</a></li> <li><a href="http://luaforge.net/scm/?group_id=66">CVS</a></li>
</ul> </ul>
</li> </li>
<li><a href="license.html">License</a></li> <li><a href="license.html">License</a></li>
@@ -71,90 +71,19 @@ 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.6.3. It works with Lua 5.1, 5.2 and 5.3.</p> <p>Current version is 1.2.1. 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://github.com/keplerproject/luafilesystem">Github</a> <a href="http://luaforge.net/projects/luafilesystem/files">Lua Forge</a>
page.</p> 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>
<h2><a name="history"></a>History</h2> <h2><a name="history"></a>History</h2>
<dl class="history"> <dl class="history">
<dt><strong>Version 1.6.3</strong> [15/Jan/2015]</dt>
<dd><ul>
<li>Lua 5.3 support.</li>
<li>Assorted bugfixes.</li>
</ul></dd>
<dt><strong>Version 1.6.2</strong> [??/Oct/2012]</dt>
<dd><ul>
<li>Full Lua 5.2 compatibility (with Lua 5.1 fallbacks)</li>
</ul></dd>
<dt><strong>Version 1.6.1</strong> [01/Oct/2012]</dt>
<dd><ul>
<li>fix build for Lua 5.2</li>
</ul></dd>
<dt><strong>Version 1.6.0</strong> [26/Sep/2012]</dt>
<dd><ul>
<li>getcwd fix for Android</li>
<li>support for Lua 5.2</li>
<li>add lfs.link</li>
<li>other bug fixes</li>
</ul></dd>
<dt><strong>Version 1.5.0</strong> [20/Oct/2009]</dt>
<dd><ul>
<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>
</ul></dd>
<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>Version 1.3.0</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>Version 1.2.1</strong> [08/May/2007]</dt> <dt><strong>Version 1.2.1</strong> [08/May/2007]</dt>
<dd> <dd>
<ul> <ul>
@@ -169,18 +98,18 @@ page.</p>
<a href="manual.html#attributes"><code>lfs.attributes</code></a></li> <a href="manual.html#attributes"><code>lfs.attributes</code></a></li>
<li>added function <li>added function
<a href="manual.html#rmdir"><code>lfs.rmdir</code></a></li> <a href="manual.html#rmdir"><code>lfs.rmdir</code></a></li>
<li>bug correction on <a href="manual.html#dir"><code>lfs.dir</code></a></li> <li>bug correction on <code>lfs.dir</code></li>
</ul> </ul>
</dd> </dd>
<dt><strong>Version 1.1</strong> [30/May/2005]</dt> <dt><strong><a href="http://www.keplerproject.org/luafilesystem/1.1/">Version 1.1</a></strong> [30/May/2005]</dt>
<dd> <dd>
<ul> <ul>
<li>added function <a href="manual.html#touch"><code>lfs.touch</code></a>.</li> <li>added function <code>lfs.touch</code>.</li>
</ul> </ul>
</dd> </dd>
<dt><strong>Version 1.0</strong> [21/Jan/2005]</dt> <dt><strong><a href="http://www.keplerproject.org/luafilesystem/1.0/">Version 1.0</a></strong> [21/Jan/2005]</dt>
<dd /> <dd />
<dt><strong>Version 1.0 Beta</strong> [10/Nov/2004]</dt> <dt><strong>Version 1.0 Beta</strong> [10/Nov/2004]</dt>
@@ -192,7 +121,7 @@ page.</p>
<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. LuaFileSystem is currently maintained by F&aacute;bio Mascarenhas.</p> which holds its copyright.</p>
<h2><a name="contact"></a>Contact us</h2> <h2><a name="contact"></a>Contact us</h2>
@@ -208,8 +137,9 @@ Comments are welcome!</p>
</div> <!-- id="main" --> </div> <!-- id="main" -->
<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">
<p><small>$Id: index.html,v 1.44 2009/02/04 21:21:33 carregal Exp $</small></p> <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>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->

View File

@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html>
<head> <head>
<title>LuaFileSystem</title> <title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/> <link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head> </head>
@@ -45,10 +45,10 @@
</ul> </ul>
</li> </li>
<li><a href="examples.html">Examples</a></li> <li><a href="examples.html">Examples</a></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Project</a> <li><a href="http://luaforge.net/projects/luafilesystem/">Project</a>
<ul> <ul>
<li><a href="https://github.com/keplerproject/luafilesystem/issues/">Bug Tracker</a></li> <li><a href="http://luaforge.net/tracker/?group_id=66">Bug Tracker</a></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Git</a></li> <li><a href="http://luaforge.net/scm/?group_id=66">CVS</a></li>
</ul> </ul>
</li> </li>
<li><strong>License</strong></li> <li><strong>License</strong></li>
@@ -85,7 +85,7 @@ Ierusalimschy, Andr&eacute; Carregal and Tom&aacute;s Guisasola.
The implementation is not derived from licensed software.</p> The implementation is not derived from licensed software.</p>
<hr/> <hr/>
<p>Copyright &copy; 2003 Kepler Project.</p> <p>Copyright &copy; 2004-2007 The Kepler Project.</p>
<p>Permission is hereby granted, free of charge, to any person <p>Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation obtaining a copy of this software and associated documentation
@@ -112,8 +112,9 @@ SOFTWARE.</p>
</div> <!-- id="main" --> </div> <!-- id="main" -->
<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">
<p><small>$Id: license.html,v 1.13 2008/02/11 22:42:21 carregal Exp $</small></p> <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>
</div><!-- id="about" --> </div><!-- id="about" -->
</div><!-- id="container" --> </div><!-- id="container" -->

View File

@@ -1,9 +1,9 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <html>
<head> <head>
<title>LuaFileSystem</title> <title>LuaFileSystem</title>
<link rel="stylesheet" href="doc.css" type="text/css"/> <link rel="stylesheet" href="http://www.keplerproject.org/doc.css" type="text/css"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head> </head>
@@ -43,10 +43,10 @@
</ul> </ul>
</li> </li>
<li><a href="examples.html">Examples</a></li> <li><a href="examples.html">Examples</a></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Project</a> <li><a href="http://luaforge.net/projects/luafilesystem/">Project</a>
<ul> <ul>
<li><a href="https://github.com/keplerproject/luafilesystem/issues">Bug Tracker</a></li> <li><a href="http://luaforge.net/tracker/?group_id=66">Bug Tracker</a></li>
<li><a href="https://github.com/keplerproject/luafilesystem">Git</a></li> <li><a href="http://luaforge.net/scm/?group_id=66">CVS</a></li>
</ul> </ul>
</li> </li>
<li><a href="license.html">License</a></li> <li><a href="license.html">License</a></li>
@@ -74,26 +74,21 @@ and header files for the target version must be installed properly.
<p> <p>
LuaFileSystem offers a Makefile and a separate configuration file, LuaFileSystem offers a Makefile and a separate configuration file,
<code>config</code>, <code>config</code>,
which should be edited to suit your installation before running which should be edited to suit your installation before runnig
<code>make</code>. <code>make</code>.
The file has some definitions like paths to the external libraries, 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 LuaFileSystem compiled binary should be copied to a directory in your
<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> <a href="http://www.lua.org/manual/5.1/manual.html#pdf-package.cpath">C path</a>.</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>
<h2><a name="reference"></a>Reference</h2> <h2><a name="reference"></a>Reference</h2>
<p> <p>
@@ -158,12 +153,6 @@ LuaFileSystem offers the following functions:
<dt><strong><code>blksize</code></strong></dt> <dt><strong><code>blksize</code></strong></dt>
<dd>optimal file system I/O blocksize; (Unix only)</dd> <dd>optimal file system I/O blocksize; (Unix only)</dd>
</dl> </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> </dd>
<dt><a name="chdir"></a><strong><code>lfs.chdir (path)</code></strong></dt> <dt><a name="chdir"></a><strong><code>lfs.chdir (path)</code></strong></dt>
@@ -172,26 +161,15 @@ 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 if
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>iter, dir_obj = lfs.dir (path)</code></strong></dt> <dt><a name="dir"></a><strong><code>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 with <code>dir_obj</code> it returns a directory entry's name as a string, or Each time the iterator is called it returns a string with an entry of the
<code>nil</code> if there are no more entries. You can also iterate by calling <code>dir_obj:next()</code>, and directory; <code>nil</code> is returned when there is no more entries.
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>
@@ -207,13 +185,6 @@ LuaFileSystem offers the following functions:
case of error, it returns <code>nil</code> plus an error string. case of error, it returns <code>nil</code> plus an error string.
</dd> </dd>
<dt><a name="link"></a><strong><code>lfs.link (old, new[, symlink])</code></strong></dt>
<dd>Creates a link. The first argument is the object to link to
and the second is the name of the link. If the optional third
argument is true, the link will by a symbolic link (by default, a
hard link is created).
</dd>
<dt><a name="mkdir"></a><strong><code>lfs.mkdir (dirname)</code></strong></dt> <dt><a name="mkdir"></a><strong><code>lfs.mkdir (dirname)</code></strong></dt>
<dd>Creates a new directory. The argument is the name of the new <dd>Creates a new directory. The argument is the name of the new
directory.<br /> directory.<br />
@@ -226,28 +197,13 @@ LuaFileSystem offers the following functions:
Returns <code>true</code> if the operation was successful; Returns <code>true</code> if the operation was successful;
in case of error, it returns <code>nil</code> plus an error string.</dd> 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 <code>true</code> followed the previous mode string for the file, or
<code>nil</code> followed by an error string in case of errors.
On non-Windows platforms, where the two modes are identical,
setting the mode has no effect, and the mode is always returned as <code>binary</code>.
</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).
On Windows this function does not yet support links, and is identical to
<code>lfs.attributes</code>.
</dd>
<dt><a name="touch"></a><strong><code>lfs.touch (filepath [, atime [, mtime]])</code></strong></dt> <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 <dd>Set access and modification times of a file. This function is
a bind to <code>utime</code> function. The first argument is the a bind to <code>utime</code> function. The first argument is the
filename, the second argument (<code>atime</code>) is the access time, filename, the second argument (<code>atime</code>) is the access time,
and the third argument (<code>mtime</code>) is the modification time. and the third argument (<code>mtime</code>) is the modification time.
Both times are provided in seconds (which should be generated with Both times are provided in seconds (which should be generated with
Lua standard function <code>os.time</code>). Lua standard function <code>os.date</code>).
If the modification time is omitted, the access time provided is used; If the modification time is omitted, the access time provided is used;
if both times are omitted, the current time is used.<br /> if both times are omitted, the current time is used.<br />
Returns <code>true</code> if the operation was successful; Returns <code>true</code> if the operation was successful;
@@ -270,8 +226,9 @@ LuaFileSystem offers the following functions:
</div> <!-- id="main" --> </div> <!-- id="main" -->
<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">
<p><small>$Id: manual.html,v 1.45 2009/06/03 20:53:55 mascarenhas Exp $</small></p> <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>
</div> <!-- id="about" --> </div> <!-- id="about" -->
</div> <!-- id="container" --> </div> <!-- id="container" -->

View File

@@ -1,27 +0,0 @@
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

@@ -1,27 +0,0 @@
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

@@ -1,43 +0,0 @@
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

@@ -1,43 +0,0 @@
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

@@ -1,43 +0,0 @@
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

@@ -1,26 +0,0 @@
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

@@ -1,27 +0,0 @@
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,27 +0,0 @@
package = "LuaFileSystem"
version = "1.6.0-1"
source = {
url = "https://github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.6.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 = "builtin",
modules = { lfs = "src/lfs.c" },
copy_directories = { "doc", "tests" }
}

View File

@@ -1,27 +0,0 @@
package = "LuaFileSystem"
version = "1.6.1-1"
source = {
url = "https://github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.6.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 = {
type = "builtin",
modules = { lfs = "src/lfs.c" },
copy_directories = { "doc", "tests" }
}

View File

@@ -1,27 +0,0 @@
package = "LuaFileSystem"
version = "1.6.2-1"
source = {
url = "https://github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.6.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 = "builtin",
modules = { lfs = "src/lfs.c" },
copy_directories = { "doc", "tests" }
}

View File

@@ -1,28 +0,0 @@
package = "LuaFileSystem"
version = "1.6.3-1"
source = {
url = "git://github.com/keplerproject/luafilesystem",
tag = "v_1_6_3",
}
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.
]],
license = "MIT/X11",
}
dependencies = {
"lua >= 5.1"
}
build = {
type = "builtin",
modules = {
lfs = "src/lfs.c"
},
copy_directories = {
"doc", "tests"
}
}

View File

@@ -1,44 +0,0 @@
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

@@ -1,26 +0,0 @@
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" }
}

View File

@@ -1,27 +0,0 @@
package = "LuaFileSystem"
version = "cvs-3"
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, < 5.4"
}
build = {
type = "builtin",
modules = { lfs = "src/lfs.c" },
copy_directories = { "doc", "tests" }
}

2
src/.gitignore vendored
View File

@@ -1,2 +0,0 @@
*.o
*.so

474
src/lfs.c
View File

@@ -1,6 +1,6 @@
/* /*
** LuaFileSystem ** LuaFileSystem
** Copyright Kepler Project 2003 (http://www.keplerproject.org/luafilesystem) ** Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/luafilesystem)
** **
** File system manipulation library. ** File system manipulation library.
** This library offers these functions: ** This library offers these functions:
@@ -9,49 +9,25 @@
** 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.symlinkattributes (filepath [, attributename]) -- thanks to Sam Roberts
** lfs.touch (filepath [, atime [, mtime]]) ** lfs.touch (filepath [, atime [, mtime]])
** lfs.unlock (fh) ** lfs.unlock (fh)
** **
** $Id: lfs.c,v 1.61 2009/07/04 02:10:16 mascarenhas Exp $ ** $Id: lfs.c,v 1.32.2.1 2007/05/08 21:35:10 carregal Exp $
*/ */
#ifndef LFS_DO_NOT_USE_LARGE_FILE
#ifndef _WIN32
#ifndef _AIX
#define _FILE_OFFSET_BITS 64 /* Linux, Solaris and HP-UX */
#else
#define _LARGE_FILES 1 /* AIX */
#endif
#endif
#endif
#ifndef LFS_DO_NOT_USE_LARGE_FILE
#define _LARGEFILE64_SOURCE
#endif
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h>
#include <time.h> #include <time.h>
#include <sys/stat.h> #include <sys/stat.h>
#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>
#ifdef __BORLANDC__ #include <sys/utime.h>
#include <utime.h>
#else
#include <sys/utime.h>
#endif
#include <fcntl.h>
#else #else
#include <unistd.h> #include <unistd.h>
#include <dirent.h> #include <dirent.h>
@@ -60,27 +36,11 @@
#include <utime.h> #include <utime.h>
#endif #endif
#include <lua.h> #include "lua.h"
#include <lauxlib.h> #include "lauxlib.h"
#include <lualib.h> #include "lualib.h"
#include "lfs.h" #include "lfs.h"
#define LFS_VERSION "1.6.3"
#define LFS_LIBNAME "lfs"
#if LUA_VERSION_NUM >= 503 /* Lua 5.3 */
#ifndef luaL_optlong
#define luaL_optlong luaL_optinteger
#endif
#endif
#if LUA_VERSION_NUM < 502
# define luaL_newlib(L,l) (lua_newtable(L), luaL_register(L,NULL,l))
#endif
/* Define 'strerror' for systems that do not implement it */ /* Define 'strerror' for systems that do not implement it */
#ifdef NO_STRERROR #ifdef NO_STRERROR
#define strerror(_) "System unable to describe the error" #define strerror(_) "System unable to describe the error"
@@ -92,70 +52,20 @@
#define getcwd_error "Function 'getcwd' not provided by system" #define getcwd_error "Function 'getcwd' not provided by system"
#else #else
#define getcwd_error strerror(errno) #define getcwd_error strerror(errno)
#ifdef _WIN32
/* MAX_PATH seems to be 260. Seems kind of small. Is there a better one? */
#define LFS_MAXPATHLEN MAX_PATH
#else
/* For MAXPATHLEN: */
#include <sys/param.h>
#define LFS_MAXPATHLEN MAXPATHLEN
#endif
#endif #endif
#define DIR_METATABLE "directory metatable" #define DIR_METATABLE "directory metatable"
#define MAX_DIR_LENGTH 1023
typedef struct dir_data { typedef struct dir_data {
int closed; int closed;
#ifdef _WIN32 #ifdef _WIN32
intptr_t hFile; long hFile;
char pattern[MAX_PATH+1]; char pattern[MAX_DIR_LENGTH+1];
#else #else
DIR *dir; DIR *dir;
#endif #endif
} dir_data; } 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
#define LSTAT_FUNC STAT_FUNC
#else
#define _O_TEXT 0
#define _O_BINARY 0
#define lfs_setmode(L,file,m) ((void)L, (void)file, (void)m, 0)
#define STAT_STRUCT struct stat
#define STAT_FUNC stat
#define LSTAT_FUNC lstat
#endif
/*
** Utility functions
*/
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 pushresult(lua_State *L, int i, const char *info)
{
if (i==-1)
return pusherror(L, info);
lua_pushinteger(L, i);
return 1;
}
/* /*
** This function changes the working (current) directory ** This function changes the working (current) directory
@@ -179,10 +89,8 @@ static int change_dir (lua_State *L) {
** and a string describing the error ** and a string describing the error
*/ */
static int get_dir (lua_State *L) { static int get_dir (lua_State *L) {
char *path; char path[255+2];
/* Passing (NULL, 0) is not guaranteed to work. Use a temp buffer and size instead. */ if (getcwd(path, 255) == NULL) {
char buf[LFS_MAXPATHLEN];
if ((path = getcwd(buf, LFS_MAXPATHLEN)) == NULL) {
lua_pushnil(L); lua_pushnil(L);
lua_pushstring(L, getcwd_error); lua_pushstring(L, getcwd_error);
return 2; return 2;
@@ -238,11 +146,7 @@ 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) {
@@ -259,111 +163,6 @@ 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);
if(lock->fd != INVALID_HANDLE_VALUE) {
CloseHandle(lock->fd);
lock->fd=INVALID_HANDLE_VALUE;
}
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
static int lfs_g_setmode (lua_State *L, FILE *f, int arg) {
static const int mode[] = {_O_BINARY, _O_TEXT};
static const char *const modenames[] = {"binary", "text", 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;
}
}
static int lfs_f_setmode(lua_State *L) {
return lfs_g_setmode(L, check_file(L, 1, "setmode"), 2);
}
/* /*
** Locks a file. ** Locks a file.
@@ -375,8 +174,8 @@ static int lfs_f_setmode(lua_State *L) {
static int file_lock (lua_State *L) { static int file_lock (lua_State *L) {
FILE *fh = check_file (L, 1, "lock"); FILE *fh = check_file (L, 1, "lock");
const char *mode = luaL_checkstring (L, 2); const char *mode = luaL_checkstring (L, 2);
const long start = (long) luaL_optinteger (L, 3, 0); const long start = luaL_optlong (L, 3, 0);
long len = (long) luaL_optinteger (L, 4, 0); long len = luaL_optlong (L, 4, 0);
if (_file_lock (L, fh, mode, start, len, "lock")) { if (_file_lock (L, fh, mode, start, len, "lock")) {
lua_pushboolean (L, 1); lua_pushboolean (L, 1);
return 1; return 1;
@@ -396,8 +195,8 @@ static int file_lock (lua_State *L) {
*/ */
static int file_unlock (lua_State *L) { static int file_unlock (lua_State *L) {
FILE *fh = check_file (L, 1, "unlock"); FILE *fh = check_file (L, 1, "unlock");
const long start = (long) luaL_optinteger (L, 2, 0); const long start = luaL_optlong (L, 2, 0);
long len = (long) luaL_optinteger (L, 3, 0); long len = luaL_optlong (L, 3, 0);
if (_file_lock (L, fh, "u", start, len, "unlock")) { if (_file_lock (L, fh, "u", start, len, "unlock")) {
lua_pushboolean (L, 1); lua_pushboolean (L, 1);
return 1; return 1;
@@ -409,35 +208,14 @@ static int file_unlock (lua_State *L) {
} }
/*
** Creates a link.
** @param #1 Object to link to.
** @param #2 Name of link.
** @param #3 True if link is symbolic (optional).
*/
static int make_link(lua_State *L)
{
#ifndef _WIN32
const char *oldpath = luaL_checkstring(L, 1);
const char *newpath = luaL_checkstring(L, 2);
return pushresult(L,
(lua_toboolean(L,3) ? symlink : link)(oldpath, newpath), NULL);
#else
return pusherror(L, "make_link is not supported on Windows");
#endif
}
/*
** Creates a directory.
** @param #1 Directory path.
*/
static int make_dir (lua_State *L) { static int make_dir (lua_State *L) {
const char *path = luaL_checkstring (L, 1); const char *path = luaL_checkstring (L, 1);
int fail; int fail;
#ifdef _WIN32 #ifdef _WIN32
int oldmask = umask (0);
fail = _mkdir (path); fail = _mkdir (path);
#else #else
mode_t oldmask = umask( (mode_t)0 );
fail = mkdir (path, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | fail = mkdir (path, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP |
S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH ); S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH );
#endif #endif
@@ -446,11 +224,11 @@ static int make_dir (lua_State *L) {
lua_pushfstring (L, "%s", strerror(errno)); lua_pushfstring (L, "%s", strerror(errno));
return 2; return 2;
} }
umask (oldmask);
lua_pushboolean (L, 1); lua_pushboolean (L, 1);
return 1; return 1;
} }
/* /*
** Removes a directory. ** Removes a directory.
** @param #1 Directory path. ** @param #1 Directory path.
@@ -470,24 +248,20 @@ static int remove_dir (lua_State *L) {
return 1; return 1;
} }
/* /*
** Directory iterator ** Directory iterator
*/ */
static int dir_iter (lua_State *L) { static int dir_iter (lua_State *L) {
#ifdef _WIN32 #ifdef _WIN32
struct _finddata_t c_file; struct _finddata_t c_file;
#else
struct dirent *entry;
#endif #endif
dir_data *d = (dir_data *)luaL_checkudata (L, 1, DIR_METATABLE); dir_data *d = (dir_data *)lua_touserdata (L, lua_upvalueindex (1));
luaL_argcheck (L, d->closed == 0, 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 */
if ((d->hFile = _findfirst (d->pattern, &c_file)) == -1L) { if ((d->hFile = _findfirst (d->pattern, &c_file)) == -1L) {
lua_pushnil (L); lua_pushnil (L);
lua_pushstring (L, strerror (errno)); lua_pushstring (L, strerror (errno));
d->closed = 1;
return 2; return 2;
} else { } else {
lua_pushstring (L, c_file.name); lua_pushstring (L, c_file.name);
@@ -505,6 +279,7 @@ static int dir_iter (lua_State *L) {
} }
} }
#else #else
struct dirent *entry;
if ((entry = readdir (d->dir)) != NULL) { if ((entry = readdir (d->dir)) != NULL) {
lua_pushstring (L, entry->d_name); lua_pushstring (L, entry->d_name);
return 1; return 1;
@@ -526,13 +301,14 @@ static int dir_close (lua_State *L) {
#ifdef _WIN32 #ifdef _WIN32
if (!d->closed && d->hFile) { if (!d->closed && d->hFile) {
_findclose (d->hFile); _findclose (d->hFile);
d->closed = 1;
} }
#else #else
if (!d->closed && d->dir) { if (!d->closed && d->dir) {
closedir (d->dir); closedir (d->dir);
d->closed = 1;
} }
#endif #endif
d->closed = 1;
return 0; return 0;
} }
@@ -542,24 +318,25 @@ 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 *d = (dir_data *) lua_newuserdata (L, sizeof(dir_data));
lua_pushcfunction (L, dir_iter);
d = (dir_data *) lua_newuserdata (L, sizeof(dir_data));
luaL_getmetatable (L, DIR_METATABLE);
lua_setmetatable (L, -2);
d->closed = 0; d->closed = 0;
#ifdef _WIN32 #ifdef _WIN32
d->hFile = 0L; d->hFile = 0L;
if (strlen(path) > MAX_PATH-2) luaL_getmetatable (L, DIR_METATABLE);
lua_setmetatable (L, -2);
if (strlen(path) > MAX_DIR_LENGTH)
luaL_error (L, "path too long: %s", path); luaL_error (L, "path too long: %s", path);
else else
sprintf (d->pattern, "%s/*", path); sprintf (d->pattern, "%s/*", path);
#else #else
luaL_getmetatable (L, DIR_METATABLE);
lua_setmetatable (L, -2);
d->dir = opendir (path); d->dir = opendir (path);
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
return 2; lua_pushcclosure (L, dir_iter, 1);
return 1;
} }
@@ -568,37 +345,11 @@ 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 */
/* Method table */ lua_pushstring (L, "__gc");
lua_newtable(L);
lua_pushcfunction (L, dir_iter);
lua_setfield(L, -2, "next");
lua_pushcfunction (L, dir_close); lua_pushcfunction (L, dir_close);
lua_setfield(L, -2, "close"); lua_settable (L, -3);
/* Metamethods */
lua_setfield(L, -2, "__index");
lua_pushcfunction (L, dir_close);
lua_setfield (L, -2, "__gc");
return 1;
}
/*
** Creates lock metatable.
*/
static int lock_create_meta (lua_State *L) {
luaL_newmetatable (L, LOCK_METATABLE);
/* Method table */
lua_newtable(L);
lua_pushcfunction(L, lfs_unlock_dir);
lua_setfield(L, -2, "free");
/* Metamethods */
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lfs_unlock_dir);
lua_setfield(L, -2, "__gc");
return 1; return 1;
} }
@@ -664,7 +415,7 @@ static int file_utime (lua_State *L) {
buf = NULL; buf = NULL;
else { else {
utb.actime = (time_t)luaL_optnumber (L, 2, 0); utb.actime = (time_t)luaL_optnumber (L, 2, 0);
utb.modtime = (time_t) luaL_optinteger (L, 3, utb.actime); utb.modtime = (time_t)luaL_optnumber (L, 3, utb.actime);
buf = &utb; buf = &utb;
} }
if (utime (file, buf)) { if (utime (file, buf)) {
@@ -678,101 +429,61 @@ static int file_utime (lua_State *L) {
/* inode protection mode */ /* inode protection mode */
static void push_st_mode (lua_State *L, STAT_STRUCT *info) { static void push_st_mode (lua_State *L, struct stat *info) {
lua_pushstring (L, mode2string (info->st_mode)); lua_pushstring (L, mode2string (info->st_mode));
} }
/* device inode resides on */ /* device inode resides on */
static void push_st_dev (lua_State *L, STAT_STRUCT *info) { static void push_st_dev (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer) info->st_dev); lua_pushnumber (L, (lua_Number)info->st_dev);
} }
/* inode's number */ /* inode's number */
static void push_st_ino (lua_State *L, STAT_STRUCT *info) { static void push_st_ino (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer) info->st_ino); lua_pushnumber (L, (lua_Number)info->st_ino);
} }
/* number of hard links to the file */ /* number of hard links to the file */
static void push_st_nlink (lua_State *L, STAT_STRUCT *info) { static void push_st_nlink (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer)info->st_nlink); lua_pushnumber (L, (lua_Number)info->st_nlink);
} }
/* user-id of owner */ /* user-id of owner */
static void push_st_uid (lua_State *L, STAT_STRUCT *info) { static void push_st_uid (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer)info->st_uid); lua_pushnumber (L, (lua_Number)info->st_uid);
} }
/* group-id of owner */ /* group-id of owner */
static void push_st_gid (lua_State *L, STAT_STRUCT *info) { static void push_st_gid (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer)info->st_gid); lua_pushnumber (L, (lua_Number)info->st_gid);
} }
/* device type, for special file inode */ /* device type, for special file inode */
static void push_st_rdev (lua_State *L, STAT_STRUCT *info) { static void push_st_rdev (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer) info->st_rdev); lua_pushnumber (L, (lua_Number)info->st_rdev);
} }
/* time of last access */ /* time of last access */
static void push_st_atime (lua_State *L, STAT_STRUCT *info) { static void push_st_atime (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer) info->st_atime); lua_pushnumber (L, info->st_atime);
} }
/* time of last data modification */ /* time of last data modification */
static void push_st_mtime (lua_State *L, STAT_STRUCT *info) { static void push_st_mtime (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer) info->st_mtime); lua_pushnumber (L, info->st_mtime);
} }
/* time of last file status change */ /* time of last file status change */
static void push_st_ctime (lua_State *L, STAT_STRUCT *info) { static void push_st_ctime (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer) info->st_ctime); lua_pushnumber (L, info->st_ctime);
} }
/* file size, in bytes */ /* file size, in bytes */
static void push_st_size (lua_State *L, STAT_STRUCT *info) { static void push_st_size (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer)info->st_size); lua_pushnumber (L, (lua_Number)info->st_size);
} }
#ifndef _WIN32 #ifndef _WIN32
/* blocks allocated for file */ /* blocks allocated for file */
static void push_st_blocks (lua_State *L, STAT_STRUCT *info) { static void push_st_blocks (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer)info->st_blocks); lua_pushnumber (L, (lua_Number)info->st_blocks);
} }
/* optimal file system I/O blocksize */ /* optimal file system I/O blocksize */
static void push_st_blksize (lua_State *L, STAT_STRUCT *info) { static void push_st_blksize (lua_State *L, struct stat *info) {
lua_pushinteger (L, (lua_Integer)info->st_blksize); lua_pushnumber (L, (lua_Number)info->st_blksize);
} }
#endif #endif
/* typedef void (*_push_function) (lua_State *L, struct stat *info);
** Convert the inode protection mode to a permission list.
*/
#ifdef _WIN32
static const char *perm2string (unsigned short mode) {
static char perms[10] = "---------";
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] = "---------";
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 { struct _stat_members {
const char *name; const char *name;
@@ -791,7 +502,6 @@ struct _stat_members members[] = {
{ "modification", push_st_mtime }, { "modification", push_st_mtime },
{ "change", push_st_ctime }, { "change", push_st_ctime },
{ "size", push_st_size }, { "size", push_st_size },
{ "permissions", push_st_perm },
#ifndef _WIN32 #ifndef _WIN32
{ "blocks", push_st_blocks }, { "blocks", push_st_blocks },
{ "blksize", push_st_blksize }, { "blksize", push_st_blksize },
@@ -800,34 +510,35 @@ struct _stat_members members[] = {
}; };
/* /*
** Get file or symbolic link information ** Get file information
*/ */
static int _file_info_ (lua_State *L, int (*st)(const char*, STAT_STRUCT*)) { static int file_info (lua_State *L) {
STAT_STRUCT info;
const char *file = luaL_checkstring (L, 1);
int i; int i;
struct stat info;
const char *file = luaL_checkstring (L, 1);
if (st(file, &info)) { if (stat(file, &info)) {
lua_pushnil (L); lua_pushnil (L);
lua_pushfstring (L, "cannot obtain information from file `%s'", file); lua_pushfstring (L, "cannot obtain information from file `%s'", file);
return 2; return 2;
} }
if (lua_isstring (L, 2)) { if (lua_isstring (L, 2)) {
int v;
const char *member = lua_tostring (L, 2); const char *member = lua_tostring (L, 2);
for (i = 0; members[i].name; i++) { if (strcmp (member, "mode") == 0) v = 0;
if (strcmp(members[i].name, member) == 0) { #ifndef _WIN32
else if (strcmp (member, "blksize") == 0) v = 12;
#endif
else /* look for member */
for (v = 1; members[v].name; v++)
if (*members[v].name == *member)
break;
/* push member value and return */ /* push member value and return */
members[i].push (L, &info); members[v].push (L, &info);
return 1; return 1;
} } else if (!lua_istable (L, 2))
}
/* member not found */
return luaL_error(L, "invalid attribute name");
}
/* creates a table if none is given */ /* creates a table if none is given */
if (!lua_istable (L, 2)) {
lua_newtable (L); lua_newtable (L);
}
/* stores all members in table on top of the stack */ /* stores all members in table on top of the stack */
for (i = 0; members[i].name; i++) { for (i = 0; members[i].name; i++) {
lua_pushstring (L, members[i].name); lua_pushstring (L, members[i].name);
@@ -838,61 +549,38 @@ static int _file_info_ (lua_State *L, int (*st)(const char*, STAT_STRUCT*)) {
} }
/*
** Get file information using stat.
*/
static int file_info (lua_State *L) {
return _file_info_ (L, STAT_FUNC);
}
/*
** Get symbolic link information using lstat.
*/
static int link_info (lua_State *L) {
return _file_info_ (L, LSTAT_FUNC);
}
/* /*
** Assumes the table is on top of the stack. ** Assumes the table is on top of the stack.
*/ */
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-2012 Kepler Project"); lua_pushliteral (L, "Copyright (C) 2003-2007 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 "LFS_VERSION); lua_pushliteral (L, "LuaFileSystem 1.2.1");
lua_settable (L, -3); lua_settable (L, -3);
} }
static const struct luaL_Reg fslib[] = { static const struct luaL_reg fslib[] = {
{"attributes", file_info}, {"attributes", file_info},
{"chdir", change_dir}, {"chdir", change_dir},
{"currentdir", get_dir}, {"currentdir", get_dir},
{"dir", dir_iter_factory}, {"dir", dir_iter_factory},
{"link", make_link},
{"lock", file_lock}, {"lock", file_lock},
{"mkdir", make_dir}, {"mkdir", make_dir},
{"rmdir", remove_dir}, {"rmdir", remove_dir},
{"symlinkattributes", link_info},
{"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_openlib (L, "lfs", fslib, 0);
luaL_newlib (L, fslib);
lua_pushvalue(L, -1);
lua_setglobal(L, LFS_LIBNAME);
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.5.0 VERSION 1.2.1
EXPORTS EXPORTS
luaopen_lfs luaopen_lfs

View File

@@ -1,8 +1,8 @@
/* /*
** LuaFileSystem ** LuaFileSystem
** Copyright Kepler Project 2003 (http://www.keplerproject.org/luafilesystem) ** Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/luafilesystem)
** **
** $Id: lfs.h,v 1.5 2008/02/19 20:08:23 mascarenhas Exp $ ** $Id: lfs.h,v 1.3 2006/03/10 23:37:32 carregal Exp $
*/ */
/* Define 'chdir' for systems that do not implement it */ /* Define 'chdir' for systems that do not implement it */
@@ -11,15 +11,6 @@
#define chdir_error "Function 'chdir' not provided by system" #define chdir_error "Function 'chdir' not provided by system"
#else #else
#define chdir_error strerror(errno) #define chdir_error strerror(errno)
#endif #endif
#ifdef _WIN32
#define chdir(p) (_chdir(p))
#define getcwd(d, s) (_getcwd(d, s))
#define rmdir(p) (_rmdir(p))
#define fileno(f) (_fileno(f))
#endif
int luaopen_lfs (lua_State *L); int luaopen_lfs (lua_State *L);

View File

@@ -1,15 +1,12 @@
#!/usr/bin/env lua5.1 #!/usr/local/bin/lua5.1
local tmp = "/tmp" local tmp = "/tmp"
local sep = string.match (package.config, "[^\n]+") local sep = "/"
local upper = ".." local upper = ".."
local lfs = require"lfs" require"lfs"
print (lfs._VERSION) print (lfs._VERSION)
io.write(".")
io.flush()
function attrdir (path) function attrdir (path)
for file in lfs.dir(path) do for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then if file ~= "." and file ~= ".." then
@@ -36,24 +33,9 @@ assert (lfs.chdir (reldir), "could not change back to current directory")
assert (lfs.currentdir() == current, "error trying to change directories") 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") assert (lfs.chdir ("this couldn't be an actual directory") == nil, "could change to a non-existent directory")
io.write(".")
io.flush()
-- Changing creating and removing directories -- Changing creating and removing directories
local tmpdir = current..sep.."lfs_tmp_dir" local tmpdir = tmp..sep.."lfs_tmp_dir"
local tmpfile = tmpdir..sep.."tmp_file" 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
io.write(".")
io.flush()
-- tries to create a directory
assert (lfs.mkdir (tmpdir), "could not make a new directory") assert (lfs.mkdir (tmpdir), "could not make a new directory")
local attrib, errmsg = lfs.attributes (tmpdir) local attrib, errmsg = lfs.attributes (tmpdir)
if not attrib then if not attrib then
@@ -62,86 +44,33 @@ end
local f = io.open(tmpfile, "w") local f = io.open(tmpfile, "w")
f:close() f:close()
io.write(".")
io.flush()
-- Change access time -- Change access time
local testdate = os.time({ year = 2007, day = 10, month = 2, hour=0}) assert (lfs.touch (tmpfile, 86401))
assert (lfs.touch (tmpfile, testdate))
local new_att = assert (lfs.attributes (tmpfile)) local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == testdate, "could not set access time") assert (new_att.access == 86401, "could not set access time")
assert (new_att.modification == testdate, "could not set modification time") assert (new_att.modification == 86401, "could not set modification time")
io.write(".")
io.flush()
-- Change access and modification time -- Change access and modification time
local testdate1 = os.time({ year = 2007, day = 10, month = 2, hour=0}) assert (lfs.touch (tmpfile, 86403, 86402))
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)) local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == testdate2, "could not set access time") assert (new_att.access == 86403, "could not set access time")
assert (new_att.modification == testdate1, "could not set modification time") assert (new_att.modification == 86402, "could not set modification time")
io.write(".")
io.flush()
-- Checking link (does not work on Windows)
if lfs.link (tmpfile, "_a_link_for_test_", true) then
assert (lfs.attributes"_a_link_for_test_".mode == "file")
assert (lfs.symlinkattributes"_a_link_for_test_".mode == "link")
assert (lfs.link (tmpfile, "_a_hard_link_for_test_"))
assert (lfs.attributes (tmpfile, "nlink") == 2)
assert (os.remove"_a_link_for_test_")
assert (os.remove"_a_hard_link_for_test_")
end
io.write(".")
io.flush()
-- Checking text/binary modes (only has an effect in Windows)
local f = io.open(tmpfile, "w")
local result, mode = lfs.setmode(f, "binary")
assert(result) -- on non-Windows platforms, mode is always returned as "binary"
result, mode = lfs.setmode(f, "text")
assert(result and mode == "binary")
f:close()
io.write(".")
io.flush()
-- Restore access time to current value -- Restore access time to current value
assert (lfs.touch (tmpfile, attrib.access, attrib.modification)) assert (lfs.touch (tmpfile))
new_att = assert (lfs.attributes (tmpfile)) new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == attrib.access) assert (new_att.access == attrib.access)
assert (new_att.modification == attrib.modification) assert (new_att.modification == attrib.modification)
io.write(".")
io.flush()
-- Check consistency of lfs.attributes values
local attr = lfs.attributes (tmpfile)
for key, value in pairs(attr) do
assert (value == lfs.attributes (tmpfile, key),
"lfs.attributes values not consistent")
end
-- Remove new file and directory -- Remove new file and directory
assert (os.remove (tmpfile), "could not remove new file") assert (os.remove (tmpfile), "could not remove new file")
assert (lfs.rmdir (tmpdir), "could not remove new directory") assert (lfs.rmdir (tmpdir), "could not remove new directory")
assert (lfs.mkdir (tmpdir..sep.."lfs_tmp_dir") == nil, "could create a directory inside a non-existent one") assert (lfs.mkdir (tmpdir..sep.."lfs_tmp_dir") == nil, "could create a directory inside a non-existent one")
io.write(".")
io.flush()
-- Trying to get attributes of a non-existent file -- Trying to get attributes of a non-existent file
assert (lfs.attributes ("this couldn't be an actual file") == nil, "could get attributes of a non-existent file") assert (lfs.attributes ("this couldn't be an actual file") == nil, "could get attributes of a non-existent file")
assert (type(lfs.attributes (upper)) == "table", "couldn't get attributes of upper directory") assert (type(lfs.attributes (upper)) == "table", "couldn't get attributes of upper directory")
io.write(".")
io.flush()
-- Stressing directory iterator -- Stressing directory iterator
count = 0 count = 0
for i = 1, 4000 do for i = 1, 4000 do
@@ -149,27 +78,4 @@ for i = 1, 4000 do
count = count + 1 count = count + 1
end end
end end
io.write(".")
io.flush()
-- 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
io.write(".")
io.flush()
-- directory explicit close
local iter, dir = lfs.dir(tmp)
dir:close()
assert(not pcall(dir.next, dir))
print"Ok!" print"Ok!"