pax_global_header00006660000000000000000000000064136501661720014521gustar00rootroot0000000000000052 comment=7c6e1b013caec0602ca4796df3b1d7253a2dd258 lua-filesystem-1.8.0/000077500000000000000000000000001365016617200144725ustar00rootroot00000000000000lua-filesystem-1.8.0/.gitignore000066400000000000000000000000061365016617200164560ustar00rootroot00000000000000*.so lua-filesystem-1.8.0/.travis.yml000066400000000000000000000014561365016617200166110ustar00rootroot00000000000000language: c sudo: false env: - LUA="lua 5.1" - LUA="lua 5.2" - LUA="lua 5.3" - LUA="luajit 2.1" before_install: - pip install --user cpp-coveralls hererocks - hererocks env --$LUA --luarocks latest - export PATH="$PWD/env/bin:$PATH" - luarocks install lua-path - luarocks install dkjson - luarocks install luacov # install luacov-coveralls, but avoid installing luafilesystem - luarocks install luacov-coveralls --server=https://luarocks.org/dev --deps-mode=none install: - luarocks make CFLAGS="-O2 -fPIC -ftest-coverage -fprofile-arcs" LIBFLAG="-shared --coverage" script: - lua -lluacov tests/test.lua after_success: - coveralls -b . -i src --dump c.report.json - luacov-coveralls -j c.report.json -v notifications: email: on_success: change on_failure: always lua-filesystem-1.8.0/LICENSE000066400000000000000000000020471365016617200155020ustar00rootroot00000000000000Copyright © 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. lua-filesystem-1.8.0/Makefile000066400000000000000000000007321365016617200161340ustar00rootroot00000000000000# $Id: Makefile,v 1.36 2009/09/21 17:02:44 mascarenhas Exp $ T= lfs CONFIG= ./config include $(CONFIG) SRCS= src/$T.c OBJS= src/$T.o lib: src/lfs.so src/lfs.so: $(OBJS) MACOSX_DEPLOYMENT_TARGET=$(MACOSX_DEPLOYMENT_TARGET); export MACOSX_DEPLOYMENT_TARGET; $(CC) $(LIB_OPTION) -o src/lfs.so $(OBJS) test: lib LUA_CPATH=./src/?.so lua tests/test.lua install: mkdir -p $(DESTDIR)$(LUA_LIBDIR) cp src/lfs.so $(DESTDIR)$(LUA_LIBDIR) clean: rm -f src/lfs.so $(OBJS) lua-filesystem-1.8.0/Makefile.win000066400000000000000000000011031365016617200167210ustar00rootroot00000000000000# $Id: Makefile.win,v 1.11 2008/05/07 19:06:37 carregal Exp $ T= lfs include config.win SRCS= src\$T.c OBJS= src\$T.obj lib: src\lfs.dll .c.obj: $(CC) /c /Fo$@ $(CFLAGS) $< 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\lfs.dll IF NOT EXIST "$(LUA_LIBDIR)" mkdir "$(LUA_LIBDIR)" copy src\lfs.dll "$(LUA_LIBDIR)" clean: del src\lfs.dll $(OBJS) src\$T.lib src\$T.exp IF EXIST src\lfs.dll.manifest del src\lfs.dll.manifestlua-filesystem-1.8.0/README.md000066400000000000000000000021311365016617200157460ustar00rootroot00000000000000[![License](http://img.shields.io/badge/Licence-MIT-brightgreen.svg)](LICENSE) [![Build Status](https://travis-ci.org/keplerproject/luafilesystem.svg?branch=master)](https://travis-ci.org/keplerproject/luafilesystem) [![Build status](https://ci.appveyor.com/api/projects/status/y04s4ms7u16trw8e?svg=true)](https://ci.appveyor.com/project/ignacio/luafilesystem) [![Coverage Status](https://coveralls.io/repos/keplerproject/luafilesystem/badge.png)](https://coveralls.io/r/keplerproject/luafilesystem) # LuaFileSystem - File System Library for Lua Copyright 2003-2020 Kepler Project https://keplerproject.github.io/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.x (MIT). # LuaRocks Installation ``` luarocks install luafilesystem ``` # Documentation Please check the documentation at doc/us/ for more information. lua-filesystem-1.8.0/appveyor.yml000066400000000000000000000013171365016617200170640ustar00rootroot00000000000000version: 0.0.1.{build}-test # Use default image unless needed #os: #- Windows Server 2012 R2 shallow_clone: true environment: matrix: - LUA: "lua 5.1" - LUA: "lua 5.2 --compat none" - LUA: "lua 5.3 --compat none" - LUA: "luajit 2.1" # Abuse this section so we can have a matrix with different Compiler versions configuration: - mingw - vs_32 - vs_64 install: - set PATH=%CD%\env\bin;C:\Python27\Scripts;C:\MinGW\bin;%PATH% - pip install hererocks - hererocks env --%LUA% --target %configuration% --luarocks latest before_build: # @todo - echo "Installing external deps" build_script: - luarocks make before_test: test_script: - echo "Testing..." - lua tests/test.lua after_test: # @todo lua-filesystem-1.8.0/config000066400000000000000000000014211365016617200156600ustar00rootroot00000000000000# Installation directories # Default installation prefix PREFIX=/usr/local LUA_VERSION = 5.1 # System's libraries directory (where binary libraries are installed) LUA_LIBDIR= $(PREFIX)/lib/lua/$(LUA_VERSION) # Lua includes directory LUA_INC += -I$(PREFIX)/include LUA_INC += -I/usr/include/lua$(LUA_VERSION) -I/usr/include/lua/$(LUA_VERSION) # OS dependent LIB_OPTION= -shared #for Linux #LIB_OPTION= -bundle -undefined dynamic_lookup #for MacOS X # Minimum runtime OS version on macOS MACOSX_DEPLOYMENT_TARGET= 10.5 # Compilation directives WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -pedantic INCS= $(LUA_INC) CFLAGS= $(WARN) $(INCS) CC= gcc # $Id: config,v 1.21 2007/10/27 22:42:32 carregal Exp $ lua-filesystem-1.8.0/config.win000066400000000000000000000006661365016617200164660ustar00rootroot00000000000000LUA_VERSION= 5.1 # Installation directories # System's libraries directory (where binary libraries are installed) LUA_LIBDIR= "c:\lua$(LUA_VERSION)" # Lua includes directory LUA_INC= "c:\lua$(LUA_VERSION)\include" # Lua library LUA_LIB= "c:\lua$(LUA_VERSION)\lua$(LUA_VERSION).lib" # Compilation directives WARN= /O2 INCS= /I$(LUA_INC) CFLAGS= /MD $(WARN) $(INCS) CC= cl # $Id: config.win,v 1.7 2008/03/25 17:39:29 mascarenhas Exp $ lua-filesystem-1.8.0/doc/000077500000000000000000000000001365016617200152375ustar00rootroot00000000000000lua-filesystem-1.8.0/doc/us/000077500000000000000000000000001365016617200156665ustar00rootroot00000000000000lua-filesystem-1.8.0/doc/us/doc.css000066400000000000000000000063131365016617200171500ustar00rootroot00000000000000body { color: #47555c; font-size: 16px; font-family: "Open Sans", sans-serif; margin: 0; padding: 0; background: #eff4ff; } a:link { color: #008fee; } a:visited { color: #008fee; } a:hover { color: #22a7ff; } h1 { font-size:26px; } h2 { font-size:24px; } h3 { font-size:18px; } h4 { font-size:16px; } hr { height: 1px; background: #c1cce4; border: 0px; margin: 20px 0; } code { font-family: "Open Sans Mono", "Andale Mono", monospace; } tt { font-family: "Open Sans Mono", "Andale Mono", monospace; } body, td, th { } textarea, pre, tt { font-family: "Open Sans Mono", "Andale Mono", monospace; } img { border-width: 0px; } .example { background-color: #323744; color: white; font-size: 16px; padding: 16px 24px; border-radius: 2px; } div.header, div.footer { } #container { } #product { background-color: white; padding: 10px; height: 130px; border-bottom: solid #d3dbec 1px; } #product big { font-size: 42px; } #product strong { font-weight: normal; } #product_logo { float: right; } #product_name { padding-top: 15px; padding-left: 30px; font-size: 42px; font-weight: normal; } #product_description { padding-left: 30px; color: #757779; } #main { background: #eff4ff; margin: 0; } #navigation { width: 100%; background-color: rgb(44,62,103); padding: 10px; margin: 0; } #navigation h1 { display: none; } #navigation a:hover { text-decoration: underline; } #navigation ul li a { color: rgb(136, 208, 255); font-weight: bold; text-decoration: none; } #navigation ul li li a { color: rgb(136, 208, 255); font-weight: normal; text-decoration: none; } #navigation ul { display: inline; color: white; padding: 0px; padding-top: 10px; padding-bottom: 10px; } #navigation li { display: inline; list-style-type: none; padding-left: 5px; padding-right: 5px; } #navigation li { padding: 10px; padding: 10px; } #navigation li li { } #navigation li:hover a { color: rgb(166, 238, 255); } #content { padding: 20px; width: 800px; margin-left: auto; margin-right: auto; } #about { display: none; } dl.reference { background-color: white; padding: 20px; border: solid #d3dbec 1px; } dl.reference dt { padding: 5px; padding-top: 25px; color: #637bbc; } dl.reference dl dt { padding-top: 5px; color: #637383; } dl.reference dd { } @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; } } lua-filesystem-1.8.0/doc/us/examples.html000066400000000000000000000055571365016617200204060ustar00rootroot00000000000000 LuaFileSystem
LuaFileSystem
File System Library for the Lua Programming Language

Examples

Directory iterator

The following example iterates over a directory and recursively lists the attributes for each file inside it.

local lfs = require"lfs"

function attrdir (path)
    for file in lfs.dir(path) do
        if file ~= "." and file ~= ".." then
            local f = path..'/'..file
            print ("\t "..f)
            local attr = lfs.attributes (f)
            assert (type(attr) == "table")
            if attr.mode == "directory" then
                attrdir (f)
            else
                for name, value in pairs(attr) do
                    print (name, value)
                end
            end
        end
    end
end

attrdir (".")

Valid XHTML 1.0!

lua-filesystem-1.8.0/doc/us/index.html000066400000000000000000000166471365016617200177010ustar00rootroot00000000000000 LuaFileSystem
LuaFileSystem
File System Library for the Lua Programming Language

Overview

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.x (MIT).

Status

Current version is 1.8.0. It works with Lua 5.1, 5.2, 5.3 and 5.4, and it runs on various flavors of Unix (including Linux, BSDs, macOS) and Windows.

Download

LuaFileSystem can be installed using LuaRocks:

$ luarocks install luafilesystem

Its source can be found at its Github page.

History

Version 1.8.0 [22/Apr/2020]
  • Lua 5.4 support
  • lfs.link and lfs.symlinkattributes now work on Windows
  • MACOSX_DEPLOYMENT_TARGET is configurable in the Makefile
  • Fallback to _POSIX_PATH_MAX when MAXPATHLEN is not avaliable
  • Fixed memory leak in case of realloc failure
Version 1.7.0 [15/Sep/2017]
  • symlinkattributes function now provides 'target' field, containing name of the file that the symlink points to.
  • attributes, symlinkattributes, touch, mkdir, and rmdir functions now return system-dependent error code as the third value on error.
  • Fixed detection of closed files for Lua 5.2+ in setmode, lock, and unlock functions.
  • Fixed various compiler warnings.
Version 1.6.3 [15/Jan/2015]
  • Lua 5.3 support.
  • 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 lfs.attributes(filename, 'size') overflow on files > 2 Gb again (bug report and patch by KUBO Takehiro).
  • fixed bug 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 lfs.attributes(filename, 'size') overflow on files > 2 Gb
Version 1.4.0 [13/Feb/2008]
Version 1.3.0 [26/Oct/2007]
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]
Version 1.1 [30/May/2005]
Version 1.0 [21/Jan/2005]
Version 1.0 Beta [10/Nov/2004]

Credits

LuaFileSystem was designed by Roberto Ierusalimschy, André Carregal and Tomás Guisasola as part of the Kepler Project, which holds its copyright. LuaFileSystem is currently maintained by Fábio Mascarenhas.

Valid XHTML 1.0!

lua-filesystem-1.8.0/doc/us/license.html000066400000000000000000000103701365016617200201770ustar00rootroot00000000000000 LuaFileSystem
LuaFileSystem
File System Library for the Lua Programming Language

License

LuaFileSystem is free software: it can be used for both academic and commercial purposes at absolutely no cost. There are no royalties or GNU-like "copyleft" restrictions. LuaFileSystem qualifies as Open Source software. Its licenses are compatible with GPL. LuaFileSystem is not in the public domain and the Kepler Project keep its copyright. The legal details are below.

The spirit of the license is that you are free to use LuaFileSystem for any purpose at no cost without having to ask us. The only requirement is that if you do use LuaFileSystem, then you should give us credit by including the appropriate copyright notice somewhere in your product or its documentation.

The LuaFileSystem library is designed and implemented by Roberto Ierusalimschy, André Carregal and Tomás Guisasola. The implementation is not derived from licensed software.


Copyright © 2003 - 2020 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.

Valid XHTML 1.0!

lua-filesystem-1.8.0/doc/us/luafilesystem.png000066400000000000000000000205271365016617200212700ustar00rootroot00000000000000PNG  IHDRL\ IDATxyXS׺ $a !*F( 8 C uV}sszm{{XmV>>sU(...y`` &&D"A4goo着*L& aaa4m``য়~zT'Өԭ[2ϟs8(,Y`0t:]R w-M Bju``D %11o(&RGB)lm-t gXŚ$ p $ǫ}||,--iQZZZRRB!:VdZFz2www dzBbx[jь(^}qJuAA{_߰溋 -$K2ng$5"5ȑqq=̈́ !!!8PZZ Rӧp8AJ`aai&${{{O>]SSrtˋH$޹s'::Ƿ\reÆ H d~ggg_ðqlzn3jȺ:ڵ|3*8p80o<]{{/:::i¨'O899!+++Ȅ_~ŋ E(.X_. Mwwwq`0b]]aVQf_HS&DY%I{{JYb͛7,@TXXrJeeeݬY˗//**"sVBdgg Hdqoo/@i $a!yllAӺuk6'|"]TTj**R(7x֑xd|244t޽d0,J58}_HHeee666o{b3ĉ}^tuu===9T*zo AB8w\ggM2@ jZڜ>.zjwsߩgN`9ք7AT*uΝ===d2d .w!7o>~DAtVVVj>|Sr ˒?8| 򆆆zLpNNN666cZ^XȿHM!8.00pʕȿ"4#h\kccؘ)뽼 Eqqy* O>TsX,V*HÇ##f(--:ݘf2 wܹtRbb"N///_p!m!P(LNNgٓ)++RR4|oootΝlpvb4Q1-[hӄsEѡ%*ҒbŊ%K WA/_ uZ`mT*2AoaK"jmC}}##JT P Ãf3]\he2IrLÉqR hƌŏ?~att9s H$LjUY^˂'O:**zG0>dRX q sӍ],-IF< -HTWWs8 r BFF\._bڶm'@R|777C_=xZի/ ڍ+B4/e^#G d|p 3i#`Eڢbhd2ݻw֭[ $W^U*QQQ6l8w\nn. !??(۷~ۍJ\TYk.nl…. _4r&,H RTdƌ_~%000&&֭[---GQJϗ;^t8۷կQ8;&.0бl D{"[nK.]!02TVe.\]۷Sud/{.0"˷oߎ-aˋ@/_LKKLHH;+(hۿviنF:~<:,]kYik;<0:~WW}Z;a1gϞmٲEԇmllmlllvaa|D{YsKd3Oϻ$aarCSD{0[XkH$:uTXXfى-{n޼RPΧ>xk ɘ`))KTꄄS /u2ׯ#W Ezz'Ov122rL?aۢ---ˆs_}xLqii Vy?_'&YFbT`mlloF"雹]wK.WMbB~ݬ_  bf_\L&;ԩX<^_& 1RS999ɓX:J;DvL0&RRGG_3$ǎE=z=,]ϳ8_^` >,VZ~z4-BHLLS`Tj=0[,\a՚Gjk,gδظq9 C_AО={F2QV<}9=<Zx+ͤH*7\Ys~Zg!9ݽ`+ 6]]SR2:Bnn 7__;]J+bXmZGc*BS|}}cccG[GxŋX`2)έ[KAϞ-s}zި;  5:2 1 666%%%ףd>tщO'*wpr$c O"׬q99xѧV˖aZ ζpvvkמ>}faad2q89sX,2JvvΝSF#=xk %£G/sӈz/WWWs\J^Z[[6mڔӓL"<{ sJO`Rү&t‰s8 A~acGFɲeQC $00p̙ 222=بK0 sBH[bbя'c̹;3)[[ۀ&Ԑ nD!gϞ-,X멫Wk~ 4F_a.96'3n۷*nxLL }0z `2EEEr omllu;%فw̚X -۷D,%]Wvvv&}}}d2p[[ Ç;;RqȨ+9$^oo>+mll֭[AË/@לI{ ݻlHG_6M&KJJtBe$f^PXbAΝ+>Y'׹lnjjjjjjkkS*AR%%%iO^.]zvbnb6p >5+Ho9 bXŋqh,4۷6>߸jx߾XMND"q8gB<37ve67izt#p'ᆆH4Q Ï=.RwjE `/A9jױ @V#^zޭb:q44/^| cxB߳A\A=% CCC*JXK$t:9))]RUPnPnGG@x^aZ#0Yee݆u9o0 #ƇC<F+O;;˯F~>?9('>]~?b`A0 +ھ*KJ=VVVZP *33B +-t:}_d1YOkNaxXqBŅ kk q8P ጱDMqqqȺX,nmmEkis0k10 +6}M7ڎcaxddD#=+"|}0-DbGĔdo)245LI> N@HL&F#7’|HxYs ¨"'/ܲe`xX嗅|S[$&h42ࠬ͆, hֱ$dd6::zu!&'D!= d!jjZg#GVhRpA u uߗڕy*Vd2zۆV)8(99Fj5, xae2ii-1N,7r9AGYpr:thҮoX_qv>jeY@@ߗ :裥ofdd@ _A@JJʳgnn k!j8>7if00 w8qUْ%n?cI׮]dQ^ нju2 =c`hHI@~XYTL}@ C&EyԺ0m Ӂ_D2@qNͤrxOpAк0CwLW\R? c-ߘ34Avvvj5p k''#id3̙=hcCDia2oٳgϞK ]].炠B \'.ˆfZ[X`âE3PMbzZ5fBVV>X{7W]P8d0Ʋu Ĺ65“du^̙3lhoh诩-*zǼ ooogXZfͬY|ӣ2= #'Nܻ4f5ۀNf8ꪵ}Coa EEE΍g3#Q{2sDīر!!?<7q-oÆYk`FEZIJr˖94pڗBC_tؓA`˖ hd2յaFDx%Cu3t:92R{Yc^٤45 c,^슥A_]]gyg!C|kVV$]? n_1ZW1wpLҺ{9=_sF_G-[v~b=}7X9Gδ]}X%Ω ^^uDN'$3]MuuaΞ-۾=C-Ǧqm[zJswAŋ]oyZT)m \og:LG4*:-b2gf_\t+g_|QpcX: SbYYYYg ; * NK%0]s:>|, 0 Ç`*̿{{_O17>zw pl6ŋwP¤RѣG6R"}>H󻬬{gάU >(',񾯲cbR>_}ȑTW2RO~r,ː!ǟbBa8* lƁAK{xx0H$E"QJJ_W~ [˻qveg˦:Gc}ػw/2][i7}yj7`x0l uvR~玎;vr$ ⋂ziaAܽ{xjku9‚VZZgޡS{{x;vv{NNF r˗ݱϡ3 =55mƍF/)33Ξ-żvRRP|*B]a&㥤ھ7|Fۍ֖2hJ>@ \,*Ǐ;**zzD"Śf̞0gE30nCMWWWW@9"v&&H6B%IGFh2@lm- KOOgXطM2]FAJSPPr[&C Ç{{~e֭x,ALF P(.\ viaxppPF3IMZ.))5k\]]'FðL&þb Tq8… }}}M;O(|>w6cg)OJ1 6qYYYmmmppV?<oÆ 1S\^|boo?w\.5D GdD"qLy@oooiiiMM7܉444TWWwtt)L  T:Ԯ*777WWWuJ,++#>>>f1Nqk.^JE###Gtx<ÍoU*X,"`p\ݖZ>M##-ɺx<;3g"H x}4Y $''T*cfO32}k~%L&S*JrѢET*5B*Täd< `SS LuaFileSystem
LuaFileSystem
File System Library for the Lua Programming Language

Introduction

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.

Building

LuaFileSystem should be built with Lua 5.1 so the language library and header files for the target version must be installed properly.

LuaFileSystem offers a Makefile and a separate configuration file, config, which should be edited to suit your installation before running make. The file has some definitions like paths to the external libraries, compiler options and the like.

On Windows, the C runtime used to compile LuaFileSystem must be the same runtime that Lua uses, or some LuaFileSystem functions will not work.

Installation

The easiest way to install LuaFileSystem is to use LuaRocks:

luarocks install luafilesystem

If you prefer to install LuaFileSystem manually, the compiled binary should be copied to a directory in your C path.

Reference

LuaFileSystem offers the following functions:

lfs.attributes (filepath [, request_name | result_table])
Returns a table with the file attributes corresponding to filepath (or nil followed by an error message and a system-dependent error code in case of error). If the second optional argument is given and is a string, then only the value of the named attribute is returned (this use is equivalent to lfs.attributes(filepath)[request_name], but the table is not created and only one attribute is retrieved from the O.S.). if a table is passed as the second argument, it (result_table) is filled with attributes and returned instead of a new table. The attributes are described as follows; attribute mode is a string, all the others are numbers, and the time related attributes use the same time reference of os.time:
dev
on Unix systems, this represents the device that the inode resides on. On Windows systems, represents the drive number of the disk containing the file
ino
on Unix systems, this represents the inode number. On Windows systems this has no meaning
mode
string representing the associated protection mode (the values could be file, directory, link, socket, named pipe, char device, block device or other)
nlink
number of hard links to the file
uid
user-id of owner (Unix only, always 0 on Windows)
gid
group-id of owner (Unix only, always 0 on Windows)
rdev
on Unix systems, represents the device type, for special file inodes. On Windows systems represents the same as dev
access
time of last access
modification
time of last data modification
change
time of last file status change
size
file size, in bytes
permissions
file permissions string
blocks
block allocated for file; (Unix only)
blksize
optimal file system I/O blocksize; (Unix only)
This function uses stat internally thus if the given filepath 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 lfs.symlinkattributes.
lfs.chdir (path)
Changes the current working directory to the given path.
Returns true in case of success or nil plus an error string.
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 if 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.
lfs.currentdir ()
Returns a string with the current working directory or nil plus an error string.
iter, dir_obj = lfs.dir (path)
Lua iterator over the entries of a given directory. Each time the iterator is called with dir_obj it returns a directory entry's name as a string, or nil if there are no more entries. You can also iterate by calling dir_obj:next(), and explicitly close the directory before the iteration finished with dir_obj:close(). Raises an error if path is not a directory.
lfs.lock (filehandle, mode[, start[, length]])
Locks a file or a part of it. This function works on open files; the file handle should be specified as the first argument. The string mode could be either r (for a read/shared lock) or w (for a write/exclusive lock). The optional arguments start and length can be used to specify a starting point and its length; both should be numbers.
Returns true if the operation was successful; in case of error, it returns nil plus an error string.
lfs.link (old, new[, symlink])
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).
lfs.mkdir (dirname)
Creates a new directory. The argument is the name of the new directory.
Returns true in case of success or nil, an error message and a system-dependent error code in case of error.
lfs.rmdir (dirname)
Removes an existing directory. The argument is the name of the directory.
Returns true in case of success or nil, an error message and a system-dependent error code in case of error.
lfs.setmode (file, mode)
Sets the writing mode for a file. The mode string can be either "binary" or "text". Returns true followed the previous mode string for the file, or nil 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 binary.
lfs.symlinkattributes (filepath [, request_name])
Identical to lfs.attributes except that it obtains information about the link itself (not the file it refers to). It also adds a target field, containing the file name that the symlink points to. On Windows this function does not yet support links, and is identical to lfs.attributes.
lfs.touch (filepath [, atime [, mtime]])
Set access and modification times of a file. This function is a bind to utime function. The first argument is the filename, the second argument (atime) is the access time, and the third argument (mtime) is the modification time. Both times are provided in seconds (which should be generated with Lua standard function os.time). If the modification time is omitted, the access time provided is used; if both times are omitted, the current time is used.
Returns true in case of success or nil, an error message and a system-dependent error code in case of error.
lfs.unlock (filehandle[, start[, length]])
Unlocks a file or a part of it. This function works on open files; the file handle should be specified as the first argument. The optional arguments start and length can be used to specify a starting point and its length; both should be numbers.
Returns true if the operation was successful; in case of error, it returns nil plus an error string.
lua-filesystem-1.8.0/luafilesystem-scm-1.rockspec000066400000000000000000000012541365016617200220330ustar00rootroot00000000000000package = "luafilesystem" version = "scm-1" source = { url = "git://github.com/keplerproject/luafilesystem" } 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" } } lua-filesystem-1.8.0/src/000077500000000000000000000000001365016617200152615ustar00rootroot00000000000000lua-filesystem-1.8.0/src/.gitignore000066400000000000000000000000111365016617200172410ustar00rootroot00000000000000*.o *.so lua-filesystem-1.8.0/src/lfs.c000066400000000000000000000647571365016617200162340ustar00rootroot00000000000000/* ** LuaFileSystem ** Copyright Kepler Project 2003 - 2020 ** (http://keplerproject.github.io/luafilesystem) ** ** File system manipulation library. ** This library offers these functions: ** lfs.attributes (filepath [, attributename | attributetable]) ** lfs.chdir (path) ** lfs.currentdir () ** lfs.dir (path) ** lfs.link (old, new[, symlink]) ** lfs.lock (fh, mode) ** lfs.lock_dir (path) ** lfs.mkdir (path) ** lfs.rmdir (path) ** lfs.setmode (filepath, mode) ** lfs.symlinkattributes (filepath [, attributename]) ** lfs.touch (filepath [, atime [, mtime]]) ** lfs.unlock (fh) */ #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 #ifdef _WIN32 #define _WIN32_WINNT 0x600 #endif #ifndef LFS_DO_NOT_USE_LARGE_FILE #define _LARGEFILE64_SOURCE #endif #include #include #include #include #include #include #ifdef _WIN32 #include #include #include #include #ifdef __BORLANDC__ #include #else #include #endif #include /* MAX_PATH seems to be 260. Seems kind of small. Is there a better one? */ #define LFS_MAXPATHLEN MAX_PATH #else #include #include #include #include #include #include /* for MAXPATHLEN */ #ifdef MAXPATHLEN #define LFS_MAXPATHLEN MAXPATHLEN #else #include /* for _POSIX_PATH_MAX */ #define LFS_MAXPATHLEN _POSIX_PATH_MAX #endif #endif #include #include #include #include "lfs.h" #define LFS_VERSION "1.8.0" #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 new_lib(L, l) (luaL_newlib(L, l)) #else #define new_lib(L, l) (lua_newtable(L), luaL_register(L, NULL, l)) #endif /* Define 'strerror' for systems that do not implement it */ #ifdef NO_STRERROR #define strerror(_) "System unable to describe the error" #endif #define DIR_METATABLE "directory metatable" typedef struct dir_data { int closed; #ifdef _WIN32 intptr_t hFile; char pattern[MAX_PATH + 1]; #else DIR *dir; #endif } dir_data; #define LOCK_METATABLE "lock metatable" #ifdef _WIN32 #ifdef __BORLANDC__ #define lfs_setmode(file, m) (setmode(_fileno(file), m)) #define STAT_STRUCT struct stati64 #else #define lfs_setmode(file, m) (_setmode(_fileno(file), m)) #define STAT_STRUCT struct _stati64 #endif #ifndef _S_IFLNK #define _S_IFLNK 0x400 #endif #ifndef S_ISDIR #define S_ISDIR(mode) (mode&_S_IFDIR) #endif #ifndef S_ISREG #define S_ISREG(mode) (mode&_S_IFREG) #endif #ifndef S_ISLNK #define S_ISLNK(mode) (mode&_S_IFLNK) #endif #ifndef S_ISSOCK #define S_ISSOCK(mode) (0) #endif #ifndef S_ISFIFO #define S_ISFIFO(mode) (0) #endif #ifndef S_ISCHR #define S_ISCHR(mode) (mode&_S_IFCHR) #endif #ifndef S_ISBLK #define S_ISBLK(mode) (0) #endif #define STAT_FUNC _stati64 #define LSTAT_FUNC lfs_win32_lstat #else #define _O_TEXT 0 #define _O_BINARY 0 #define lfs_setmode(file, m) ((void)file, (void)m, 0) #define STAT_STRUCT struct stat #define STAT_FUNC stat #define LSTAT_FUNC lstat #endif #ifdef _WIN32 #define lfs_mkdir _mkdir #else #define lfs_mkdir(path) (mkdir((path), \ S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH)) #endif #ifdef _WIN32 int lfs_win32_pusherror(lua_State * L) { int en = GetLastError(); 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; } #define TICKS_PER_SECOND 10000000 #define EPOCH_DIFFERENCE 11644473600LL time_t windowsToUnixTime(FILETIME ft) { ULARGE_INTEGER uli; uli.LowPart = ft.dwLowDateTime; uli.HighPart = ft.dwHighDateTime; return (time_t) (uli.QuadPart / TICKS_PER_SECOND - EPOCH_DIFFERENCE); } int lfs_win32_lstat(const char *path, STAT_STRUCT * buffer) { WIN32_FILE_ATTRIBUTE_DATA win32buffer; if (GetFileAttributesEx(path, GetFileExInfoStandard, &win32buffer)) { if (!(win32buffer.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) { return STAT_FUNC(path, buffer); } buffer->st_mode = _S_IFLNK; buffer->st_dev = 0; buffer->st_ino = 0; buffer->st_nlink = 0; buffer->st_uid = 0; buffer->st_gid = 0; buffer->st_rdev = 0; buffer->st_atime = windowsToUnixTime(win32buffer.ftLastAccessTime); buffer->st_mtime = windowsToUnixTime(win32buffer.ftLastWriteTime); buffer->st_ctime = windowsToUnixTime(win32buffer.ftCreationTime); buffer->st_size = 0; return 0; } else { return 1; } } #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 res, const char *info) { if (res == -1) { return pusherror(L, info); } else { lua_pushboolean(L, 1); return 1; } } /* ** This function changes the working (current) directory */ static int change_dir(lua_State * L) { const char *path = luaL_checkstring(L, 1); if (chdir(path)) { lua_pushnil(L); lua_pushfstring(L, "Unable to change working directory to '%s'\n%s\n", path, chdir_error); return 2; } else { lua_pushboolean(L, 1); return 1; } } /* ** This function returns the current directory ** If unable to get the current directory, it returns nil ** and a string describing the error */ static int get_dir(lua_State * L) { #ifdef NO_GETCWD lua_pushnil(L); lua_pushstring(L, "Function 'getcwd' not provided by system"); return 2; #else char *path = NULL; /* Passing (NULL, 0) is not guaranteed to work. Use a temp buffer and size instead. */ size_t size = LFS_MAXPATHLEN; /* initial buffer size */ int result; while (1) { char *path2 = realloc(path, size); if (!path2) { /* failed to allocate */ result = pusherror(L, "get_dir realloc() failed"); break; } path = path2; if (getcwd(path, size) != NULL) { /* success, push the path to the Lua stack */ lua_pushstring(L, path); result = 1; break; } if (errno != ERANGE) { /* unexpected error */ result = pusherror(L, "get_dir getcwd() failed"); break; } /* ERANGE = insufficient buffer capacity, double size and retry */ size *= 2; } free(path); return result; #endif } /* ** Check if the given element on the stack is a file and returns it. */ static FILE *check_file(lua_State * L, int idx, const char *funcname) { #if LUA_VERSION_NUM == 501 FILE **fh = (FILE **) luaL_checkudata(L, idx, "FILE*"); if (*fh == NULL) { luaL_error(L, "%s: closed file", funcname); return 0; } else return *fh; #elif LUA_VERSION_NUM >= 502 && LUA_VERSION_NUM <= 504 luaL_Stream *fh = (luaL_Stream *) luaL_checkudata(L, idx, "FILE*"); if (fh->closef == 0 || fh->f == NULL) { luaL_error(L, "%s: closed file", funcname); return 0; } else return fh->f; #else #error unsupported Lua version #endif } /* ** */ static int _file_lock(lua_State * L, FILE * fh, const char *mode, const long start, long len, const char *funcname) { int code; #ifdef _WIN32 /* lkmode valid values are: LK_LOCK Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, the constant returns an error. LK_NBLCK Locks the specified bytes. If the bytes cannot be locked, the constant returns an error. LK_NBRLCK Same as _LK_NBLCK. LK_RLCK Same as _LK_LOCK. LK_UNLCK Unlocks the specified bytes, which must have been previously locked. Regions should be locked only briefly and should be unlocked before closing a file or exiting the program. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__locking.asp */ int lkmode; switch (*mode) { case 'r': lkmode = LK_NBLCK; break; case 'w': lkmode = LK_NBLCK; break; case 'u': lkmode = LK_UNLCK; break; default: return luaL_error(L, "%s: invalid mode", funcname); } if (!len) { fseek(fh, 0L, SEEK_END); 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) { case 'w': f.l_type = F_WRLCK; break; case 'r': f.l_type = F_RDLCK; break; case 'u': f.l_type = F_UNLCK; break; default: return luaL_error(L, "%s: invalid mode", funcname); } f.l_whence = SEEK_SET; f.l_start = (off_t) start; f.l_len = (off_t) len; code = fcntl(fileno(fh), F_SETLK, &f); #endif 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); fd = CreateFile(ln, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL); free(ln); if (fd == INVALID_HANDLE_VALUE) { return lfs_win32_pusherror(L); } 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 = (lfs_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 = (lfs_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(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]); return 2; } } lua_pushnil(L); return 2; } else { return pusherror(L, NULL); } } static int lfs_f_setmode(lua_State * L) { return lfs_g_setmode(L, check_file(L, 1, "setmode"), 2); } /* ** Locks a file. ** @param #1 File handle. ** @param #2 String with lock mode ('w'rite, 'r'ead). ** @param #3 Number with start position (optional). ** @param #4 Number with length (optional). */ static int file_lock(lua_State * L) { FILE *fh = check_file(L, 1, "lock"); const char *mode = luaL_checkstring(L, 2); const long start = (long) luaL_optinteger(L, 3, 0); long len = (long) luaL_optinteger(L, 4, 0); if (_file_lock(L, fh, mode, start, len, "lock")) { lua_pushboolean(L, 1); return 1; } else { lua_pushnil(L); lua_pushfstring(L, "%s", strerror(errno)); return 2; } } /* ** Unlocks a file. ** @param #1 File handle. ** @param #2 Number with start position (optional). ** @param #3 Number with length (optional). */ static int file_unlock(lua_State * L) { FILE *fh = check_file(L, 1, "unlock"); const long start = (long) luaL_optinteger(L, 2, 0); long len = (long) luaL_optinteger(L, 3, 0); if (_file_lock(L, fh, "u", start, len, "unlock")) { lua_pushboolean(L, 1); return 1; } else { lua_pushnil(L); lua_pushfstring(L, "%s", strerror(errno)); return 2; } } /* ** 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) { const char *oldpath = luaL_checkstring(L, 1); const char *newpath = luaL_checkstring(L, 2); #ifndef _WIN32 return pushresult(L, (lua_toboolean(L, 3) ? symlink : link) (oldpath, newpath), NULL); #else int symbolic = lua_toboolean(L, 3); STAT_STRUCT oldpathinfo; int is_dir = 0; if (STAT_FUNC(oldpath, &oldpathinfo) == 0) { is_dir = S_ISDIR(oldpathinfo.st_mode) != 0; } if (!symbolic && is_dir) { lua_pushnil(L); lua_pushstring(L, "hard links to directories are not supported on Windows"); return 2; } int result = symbolic ? CreateSymbolicLink(newpath, oldpath, is_dir) : CreateHardLink(newpath, oldpath, NULL); if (result) { return pushresult(L, result, NULL); } else { lua_pushnil(L); lua_pushstring(L, symbolic ? "make_link CreateSymbolicLink() failed" : "make_link CreateHardLink() failed"); return 2; } #endif } /* ** Creates a directory. ** @param #1 Directory path. */ static int make_dir(lua_State * L) { const char *path = luaL_checkstring(L, 1); return pushresult(L, lfs_mkdir(path), NULL); } /* ** Removes a directory. ** @param #1 Directory path. */ static int remove_dir(lua_State * L) { const char *path = luaL_checkstring(L, 1); return pushresult(L, rmdir(path), NULL); } /* ** Directory iterator */ static int dir_iter(lua_State * L) { #ifdef _WIN32 struct _finddata_t c_file; #else struct dirent *entry; #endif dir_data *d = (dir_data *) luaL_checkudata(L, 1, DIR_METATABLE); luaL_argcheck(L, d->closed == 0, 1, "closed directory"); #ifdef _WIN32 if (d->hFile == 0L) { /* first entry */ if ((d->hFile = _findfirst(d->pattern, &c_file)) == -1L) { lua_pushnil(L); lua_pushstring(L, strerror(errno)); d->closed = 1; return 2; } else { lua_pushstring(L, c_file.name); return 1; } } else { /* next entry */ if (_findnext(d->hFile, &c_file) == -1L) { /* no more entries => close directory */ _findclose(d->hFile); d->closed = 1; return 0; } else { lua_pushstring(L, c_file.name); return 1; } } #else if ((entry = readdir(d->dir)) != NULL) { lua_pushstring(L, entry->d_name); return 1; } else { /* no more entries => close directory */ closedir(d->dir); d->closed = 1; return 0; } #endif } /* ** Closes directory iterators */ static int dir_close(lua_State * L) { dir_data *d = (dir_data *) lua_touserdata(L, 1); #ifdef _WIN32 if (!d->closed && d->hFile) { _findclose(d->hFile); } #else if (!d->closed && d->dir) { closedir(d->dir); } #endif d->closed = 1; return 0; } /* ** Factory of directory iterators */ static int dir_iter_factory(lua_State * L) { const char *path = luaL_checkstring(L, 1); dir_data *d; 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; #ifdef _WIN32 d->hFile = 0L; if (strlen(path) > MAX_PATH - 2) luaL_error(L, "path too long: %s", path); else sprintf(d->pattern, "%s/*", path); #else d->dir = opendir(path); if (d->dir == NULL) luaL_error(L, "cannot open %s: %s", path, strerror(errno)); #endif #if LUA_VERSION_NUM >= 504 lua_pushnil(L); lua_pushvalue(L, -2); return 4; #else return 2; #endif } /* ** Creates directory metatable. */ static int dir_create_meta(lua_State * L) { luaL_newmetatable(L, DIR_METATABLE); /* Method table */ lua_newtable(L); lua_pushcfunction(L, dir_iter); lua_setfield(L, -2, "next"); lua_pushcfunction(L, dir_close); lua_setfield(L, -2, "close"); /* Metamethods */ lua_setfield(L, -2, "__index"); lua_pushcfunction(L, dir_close); lua_setfield(L, -2, "__gc"); #if LUA_VERSION_NUM >= 504 lua_pushcfunction(L, dir_close); lua_setfield(L, -2, "__close"); #endif 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; } /* ** Convert the inode protection mode to a string. */ #ifdef _WIN32 static const char *mode2string(unsigned short mode) { #else static const char *mode2string(mode_t mode) { #endif if (S_ISREG(mode)) return "file"; else if (S_ISDIR(mode)) return "directory"; else if (S_ISLNK(mode)) return "link"; else if (S_ISSOCK(mode)) return "socket"; else if (S_ISFIFO(mode)) return "named pipe"; else if (S_ISCHR(mode)) return "char device"; else if (S_ISBLK(mode)) return "block device"; else return "other"; } /* ** Set access time and modification values for a file. ** @param #1 File path. ** @param #2 Access time in seconds, current time is used if missing. ** @param #3 Modification time in seconds, access time is used if missing. */ static int file_utime(lua_State * L) { const char *file = luaL_checkstring(L, 1); struct utimbuf utb, *buf; if (lua_gettop(L) == 1) /* set to current date/time */ buf = NULL; else { utb.actime = (time_t) luaL_optnumber(L, 2, 0); utb.modtime = (time_t) luaL_optinteger(L, 3, utb.actime); buf = &utb; } return pushresult(L, utime(file, buf), NULL); } /* inode protection mode */ 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, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_dev); } /* inode's number */ static void push_st_ino(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_ino); } /* number of hard links to the file */ static void push_st_nlink(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_nlink); } /* user-id of owner */ static void push_st_uid(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_uid); } /* group-id of owner */ static void push_st_gid(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_gid); } /* device type, for special file inode */ static void push_st_rdev(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_rdev); } /* time of last access */ static void push_st_atime(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_atime); } /* time of last data modification */ static void push_st_mtime(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_mtime); } /* time of last file status change */ static void push_st_ctime(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_ctime); } /* file size, in bytes */ static void push_st_size(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_size); } #ifndef _WIN32 /* blocks allocated for file */ static void push_st_blocks(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_blocks); } /* optimal file system I/O blocksize */ static void push_st_blksize(lua_State * L, STAT_STRUCT * info) { lua_pushinteger(L, (lua_Integer) info->st_blksize); } #endif /* ** 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 { const char *name; _push_function push; }; struct _stat_members members[] = { { "mode", push_st_mode }, { "dev", push_st_dev }, { "ino", push_st_ino }, { "nlink", push_st_nlink }, { "uid", push_st_uid }, { "gid", push_st_gid }, { "rdev", push_st_rdev }, { "access", push_st_atime }, { "modification", push_st_mtime }, { "change", push_st_ctime }, { "size", push_st_size }, { "permissions", push_st_perm }, #ifndef _WIN32 { "blocks", push_st_blocks }, { "blksize", push_st_blksize }, #endif { NULL, NULL } }; /* ** Get file or symbolic link information */ static int _file_info_(lua_State * L, int (*st)(const char *, STAT_STRUCT *)) { STAT_STRUCT info; const char *file = luaL_checkstring(L, 1); int i; if (st(file, &info)) { lua_pushnil(L); lua_pushfstring(L, "cannot obtain information from file '%s': %s", file, strerror(errno)); lua_pushinteger(L, errno); return 3; } if (lua_isstring(L, 2)) { const char *member = lua_tostring(L, 2); for (i = 0; members[i].name; i++) { if (strcmp(members[i].name, member) == 0) { /* push member value and return */ members[i].push(L, &info); return 1; } } /* member not found */ return luaL_error(L, "invalid attribute name '%s'", member); } /* creates a table if none is given, removes extra arguments */ lua_settop(L, 2); if (!lua_istable(L, 2)) { lua_newtable(L); } /* stores all members in table on top of the stack */ for (i = 0; members[i].name; i++) { lua_pushstring(L, members[i].name); members[i].push(L, &info); lua_rawset(L, -3); } return 1; } /* ** Get file information using stat. */ static int file_info(lua_State * L) { return _file_info_(L, STAT_FUNC); } /* ** Push the symlink target to the top of the stack. ** Assumes the file name is at position 1 of the stack. ** Returns 1 if successful (with the target on top of the stack), ** 0 on failure (with stack unchanged, and errno set). */ static int push_link_target(lua_State * L) { const char *file = luaL_checkstring(L, 1); #ifdef _WIN32 HANDLE h = CreateFile(file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h == INVALID_HANDLE_VALUE) { return lfs_win32_pusherror(L); } #endif char *target = NULL; int tsize, size = 256; /* size = initial buffer capacity */ int ok = 0; while (!ok) { char *target2 = realloc(target, size); if (!target2) { /* failed to allocate */ break; } target = target2; #ifdef _WIN32 tsize = GetFinalPathNameByHandle(h, target, size, FILE_NAME_OPENED); #else tsize = readlink(file, target, size); #endif if (tsize < 0) { /* a readlink() error occurred */ break; } if (tsize < size) { #ifdef _WIN32 if (tsize > 4 && strncmp(target, "\\\\?\\", 4) == 0) { memmove_s(target, tsize - 3, target + 4, tsize - 3); tsize -= 4; } #endif ok = 1; break; } /* possibly truncated readlink() result, double size and retry */ size *= 2; } if (ok) { target[tsize] = '\0'; lua_pushlstring(L, target, tsize); } #ifdef _WIN32 CloseHandle(h); #endif free(target); return ok; } /* ** Get symbolic link information using lstat. */ static int link_info(lua_State * L) { int ret; if (lua_isstring(L, 2) && (strcmp(lua_tostring(L, 2), "target") == 0)) { int ok = push_link_target(L); return ok ? 1 : pusherror(L, "could not obtain link target"); } ret = _file_info_(L, LSTAT_FUNC); if (ret == 1 && lua_type(L, -1) == LUA_TTABLE) { int ok = push_link_target(L); if (ok) { lua_setfield(L, -2, "target"); } } return ret; } /* ** Assumes the table is on top of the stack. */ static void set_info(lua_State * L) { lua_pushliteral(L, "Copyright (C) 2003-2017 Kepler Project"); lua_setfield(L, -2, "_COPYRIGHT"); 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_setfield(L, -2, "_DESCRIPTION"); lua_pushliteral(L, "LuaFileSystem " LFS_VERSION); lua_setfield(L, -2, "_VERSION"); } static const struct luaL_Reg fslib[] = { { "attributes", file_info }, { "chdir", change_dir }, { "currentdir", get_dir }, { "dir", dir_iter_factory }, { "link", make_link }, { "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 }, }; LFS_EXPORT int luaopen_lfs(lua_State * L) { dir_create_meta(L); lock_create_meta(L); new_lib(L, fslib); lua_pushvalue(L, -1); lua_setglobal(L, LFS_LIBNAME); set_info(L); return 1; } lua-filesystem-1.8.0/src/lfs.def000066400000000000000000000000641365016617200165250ustar00rootroot00000000000000LIBRARY lfs.dll VERSION 1.8 EXPORTS luaopen_lfs lua-filesystem-1.8.0/src/lfs.h000066400000000000000000000012411365016617200162140ustar00rootroot00000000000000/* ** LuaFileSystem ** Copyright Kepler Project 2003 - 2020 ** (http://keplerproject.github.io/luafilesystem) */ /* Define 'chdir' for systems that do not implement it */ #ifdef NO_CHDIR #define chdir(p) (-1) #define chdir_error "Function 'chdir' not provided by system" #else #define chdir_error strerror(errno) #endif #ifdef _WIN32 #define chdir(p) (_chdir(p)) #define getcwd(d, s) (_getcwd(d, s)) #define rmdir(p) (_rmdir(p)) #define LFS_EXPORT __declspec (dllexport) #ifndef fileno #define fileno(f) (_fileno(f)) #endif #else #define LFS_EXPORT #endif #ifdef __cplusplus extern "C" { #endif LFS_EXPORT int luaopen_lfs(lua_State * L); #ifdef __cplusplus } #endif lua-filesystem-1.8.0/tests/000077500000000000000000000000001365016617200156345ustar00rootroot00000000000000lua-filesystem-1.8.0/tests/test.lua000066400000000000000000000154421365016617200173240ustar00rootroot00000000000000#!/usr/bin/env lua5.1 local tmp = "/tmp" local sep = string.match (package.config, "[^\n]+") local upper = ".." local is_unix = package.config:sub(1,1) == "/" local lfs = require"lfs" print (lfs._VERSION) io.write(".") io.flush() function attrdir (path) for file in lfs.dir(path) do if file ~= "." and file ~= ".." then local f = path..sep..file print ("\t=> "..f.." <=") local attr = lfs.attributes (f) assert (type(attr) == "table") if attr.mode == "directory" then attrdir (f) else for name, value in pairs(attr) do print (name, value) end end end end end -- Checking changing directories local current = assert (lfs.currentdir()) local reldir = string.gsub (current, "^.*%"..sep.."([^"..sep.."])$", "%1") assert (lfs.chdir (upper), "could not change to upper directory") assert (lfs.chdir (reldir), "could not change back to current directory") 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") io.write(".") io.flush() -- Changing creating and removing directories 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 io.write(".") io.flush() -- 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 error ("could not get attributes of file `"..tmpdir.."':\n"..errmsg) end local f = io.open(tmpfile, "w") local data = "hello, file!" f:write(data) f:close() io.write(".") io.flush() -- Change access time 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 == testdate, "could not set access time") assert (new_att.modification == testdate, "could not set modification time") io.write(".") io.flush() -- Change access and 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") io.write(".") io.flush() 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.symlinkattributes"_a_link_for_test_".target == tmpfile) assert (lfs.symlinkattributes("_a_link_for_test_", "target") == tmpfile) assert (lfs.symlinkattributes(tmpfile).mode == "file") assert (lfs.link (tmpfile, "_a_hard_link_for_test_")) assert (lfs.symlinkattributes"_a_hard_link_for_test_".mode == "file") local fd = io.open(tmpfile) assert(fd:read("*a") == data) fd:close() fd = io.open("_a_link_for_test_") assert(fd:read("*a") == data) fd:close() fd = io.open("_a_hard_link_for_test_") assert(fd:read("*a") == data) fd:close() fd = io.open("_a_hard_link_for_test_", "w+") local data2 = "write in hard link" fd:write(data2) fd:close() fd = io.open(tmpfile) assert(fd:read("*a") == data2) fd:close() if is_unix then assert (lfs.attributes (tmpfile, "nlink") == 2) end 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() local ok, err = pcall(lfs.setmode, f, "binary") assert(not ok, "could setmode on closed file") assert(err:find("closed file"), "bad error message for setmode on closed file") io.write(".") io.flush() -- Restore access time to current value 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) 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 -- Check that lfs.attributes accepts a table as second argument local attr2 = {} lfs.attributes(tmpfile, attr2) for key, value in pairs(attr2) do assert (value == lfs.attributes (tmpfile, key), "lfs.attributes values with table argument not consistent") end -- Check that extra arguments are ignored lfs.attributes(tmpfile, attr2, nil) -- Remove new file and directory assert (os.remove (tmpfile), "could not remove new file") 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") io.write(".") io.flush() -- Trying to get attributes of a non-existent file local attr_ok, err, errno = lfs.attributes("this couldn't be an actual file") assert(attr_ok == nil, "could get attributes of a non-existent file") assert(type(err) == "string", "failed lfs.attributes did not return an error message") assert(type(errno) == "number", "failed lfs.attributes did not return error code") assert (type(lfs.attributes (upper)) == "table", "couldn't get attributes of upper directory") io.write(".") io.flush() -- Stressing directory iterator count = 0 for i = 1, 4000 do for file in lfs.dir (tmp) do count = count + 1 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!" lua-filesystem-1.8.0/vc6/000077500000000000000000000000001365016617200151705ustar00rootroot00000000000000lua-filesystem-1.8.0/vc6/lfs.def000066400000000000000000000001141365016617200164300ustar00rootroot00000000000000LIBRARY lfs.dll DESCRIPTION "LuaFileSystem" VERSION 1.2 EXPORTS luaopen_lfs lua-filesystem-1.8.0/vc6/luafilesystem.dsw000066400000000000000000000011431365016617200205740ustar00rootroot00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "luafilesystem_dll"=.\luafilesystem_dll.dsp - Package Owner=<4> Package=<5> {{{ begin source code control luafilesystem .. end source code control }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### lua-filesystem-1.8.0/vc6/luafilesystem_dll.dsp000066400000000000000000000114431365016617200214240ustar00rootroot00000000000000# Microsoft Developer Studio Project File - Name="luafilesystem_dll" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=luafilesystem_dll - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "luafilesystem_dll.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "luafilesystem_dll.mak" CFG="luafilesystem_dll - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "luafilesystem_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "luafilesystem_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "luafilesystem_dll" # PROP Scc_LocalPath ".." CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "luafilesystem_dll - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "../lib/vc6" # PROP Intermediate_Dir "luafilesystem_dll/Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "../../external-src/lua50/include" /I "../../compat/src" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x416 /d "NDEBUG" # ADD RSC /l 0x416 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 lua50.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../bin/vc6/lfs.dll" /libpath:"../../external-src/lua50/lib/dll" # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Cmds=cd ../bin/vc6 zip.exe luafilesystem-1.2-win32.zip lfs.dll # End Special Build Tool !ELSEIF "$(CFG)" == "luafilesystem_dll - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "../lib/vc6" # PROP Intermediate_Dir "luafilesystem_dll/Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../external-src/lua50/include" /I "../../compat/src" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x416 /d "_DEBUG" # ADD RSC /l 0x416 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 lua50.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"../bin/vc6/lfsd.dll" /pdbtype:sept /libpath:"../../external-src/lua50/lib/dll" !ENDIF # Begin Target # Name "luafilesystem_dll - Win32 Release" # Name "luafilesystem_dll - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE="..\..\compat\src\compat-5.1.c" # End Source File # Begin Source File SOURCE=..\src\lfs.c # End Source File # Begin Source File SOURCE=.\lfs.def # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\..\compat\src\compat-5.1.h" # End Source File # Begin Source File SOURCE=..\src\lfs.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project