Acrescimo da funcao lfs.touch (lfs.c e test.lua).

Pequenas correcoes para evitar warnings de redefinicao de macros.
This commit is contained in:
tomas
2005-01-18 10:48:02 +00:00
parent 7a93f7ee03
commit 86e97088a0
3 changed files with 77 additions and 14 deletions

View File

@@ -1,10 +1,10 @@
# $Id: Makefile,v 1.10 2005/01/18 09:36:11 tomas Exp $ # $Id: Makefile,v 1.11 2005/01/18 10:48:02 tomas Exp $
T= lfs T= lfs
include ./config include ./config
V= 1.0b V= 1.1b
DIST_DIR= luafilesystem-$V DIST_DIR= luafilesystem-$V
TAR_FILE= $(DIST_DIR).tar.gz TAR_FILE= $(DIST_DIR).tar.gz
ZIP_FILE= $(DIST_DIR).zip ZIP_FILE= $(DIST_DIR).zip

View File

@@ -7,9 +7,10 @@
** lfs.dir (path) ** lfs.dir (path)
** lfs.mkdir (path) ** lfs.mkdir (path)
** lfs.lock (fh, mode) ** lfs.lock (fh, mode)
** lfs.touch (filepath [, atime [, mtime]])
** lfs.unlock (fh) ** lfs.unlock (fh)
** **
** $Id: lfs.c,v 1.14 2004/11/17 14:08:04 tomas Exp $ ** $Id: lfs.c,v 1.15 2005/01/18 10:48:02 tomas Exp $
*/ */
#include <errno.h> #include <errno.h>
@@ -17,6 +18,7 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <utime.h>
#ifdef WIN32 #ifdef WIN32
#include <direct.h> #include <direct.h>
@@ -131,7 +133,7 @@ static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long star
case 'r': lkmode = _LK_NBLCK; break; case 'r': lkmode = _LK_NBLCK; break;
case 'w': lkmode = _LK_NBLCK; break; case 'w': lkmode = _LK_NBLCK; break;
case 'u': lkmode = _LK_UNLCK; break; case 'u': lkmode = _LK_UNLCK; break;
default : luaL_error (L, "%s: invalid mode", funcname); default : return luaL_error (L, "%s: invalid mode", funcname);
} }
if (!len) { if (!len) {
fseek (fh, 0L, SEEK_END); fseek (fh, 0L, SEEK_END);
@@ -345,13 +347,27 @@ static int dir_create_meta (lua_State *L) {
#ifdef _WIN32 #ifdef _WIN32
#define S_ISDIR(mode) (mode&_S_IFDIR) #ifndef S_ISDIR
#define S_ISREG(mode) (mode&_S_IFREG) #define S_ISDIR(mode) (mode&_S_IFDIR)
#define S_ISLNK(mode) (0) #endif
#define S_ISSOCK(mode) (0) #ifndef S_ISREG
#define S_ISFIFO(mode) (0) #define S_ISREG(mode) (mode&_S_IFREG)
#define S_ISCHR(mode) (mode&_S_IFCHR) #endif
#define S_ISBLK(mode) (0) #ifndef S_ISLNK
#define S_ISLNK(mode) (0)
#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
#endif #endif
/* /*
** Convert the inode protection mode to a string. ** Convert the inode protection mode to a string.
@@ -380,6 +396,30 @@ static const char *mode2string (mode_t mode) {
} }
/*
** Set access time and modification values for file
*/
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_optnumber (L, 3, utb.actime);
buf = &utb;
}
if (utime (file, buf)) {
lua_pushnil (L);
lua_pushfstring (L, "%s", strerror (errno));
return 2;
}
lua_pushboolean (L, 1);
return 1;
}
/* /*
** Get file information ** Get file information
*/ */
@@ -478,6 +518,7 @@ static const struct luaL_reg fslib[] = {
{"dir", dir_iter_factory}, {"dir", dir_iter_factory},
{"lock", file_lock}, {"lock", file_lock},
{"mkdir", make_dir}, {"mkdir", make_dir},
{"touch", file_utime},
{"unlock", file_unlock}, {"unlock", file_unlock},
{NULL, NULL}, {NULL, NULL},
}; };

View File

@@ -32,9 +32,31 @@ 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")
-- Changing creating and removing directories -- Changing creating and removing directories
assert (lfs.mkdir (tmp.."/lfs_tmp_dir"), "could not make a new directory") local tmpdir = tmp.."/lfs_tmp_dir"
assert (os.remove (tmp.."/lfs_tmp_dir"), "could not remove new directory") assert (lfs.mkdir (tmpdir), "could not make a new directory")
assert (lfs.mkdir (tmp.."/lfs_tmp_dir/lfs_tmp_dir") == false, "could create a directory inside a non-existent one") local attrib, errmsg = lfs.attributes (tmpdir)
if not attrib then
error ("could not get attributes of file `"..tmpdir.."':\n"..errmsg)
else
-- Change access time
assert (lfs.touch (tmpdir, 11))
local new_att = assert (lfs.attributes (tmpdir))
assert (new_att.access == 11, "could not set access time")
assert (new_att.modification == 11, "could not set modification time")
-- Change access and modification time
assert (lfs.touch (tmpdir, 33, 22))
local new_att = assert (lfs.attributes (tmpdir))
assert (new_att.access == 33, "could not set access time")
assert (new_att.modification == 22, "could not set modification time")
-- Restore access time to current value
assert (lfs.touch (tmpdir))
new_att = assert (lfs.attributes (tmpdir))
assert (new_att.access == attrib.access)
assert (new_att.modification == attrib.modification)
end
assert (os.remove (tmpdir), "could not remove new directory")
assert (lfs.mkdir (tmpdir.."/lfs_tmp_dir") == false, "could create a directory inside a non-existent one")
-- --
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")
print"Ok!"