aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFabio Mascarenhas <mascarenhas@acm.org>2012-04-08 20:25:40 -0300
committerFabio Mascarenhas <mascarenhas@acm.org>2012-04-08 20:25:40 -0300
commit84f1af5eef6af267109eaa84c18c5a70edaf65ea (patch)
treeadb555999c0713cf1ba0f70e530658eec41e6b66 /src
parent149e0fb8ec6295325e1e448bbe79b7e9bf2285aa (diff)
downloadluafilesystem-84f1af5eef6af267109eaa84c18c5a70edaf65ea.tar.gz
luafilesystem-84f1af5eef6af267109eaa84c18c5a70edaf65ea.tar.bz2
luafilesystem-84f1af5eef6af267109eaa84c18c5a70edaf65ea.zip
applied debian patches from enrico tassi
Diffstat (limited to 'src')
-rw-r--r--src/lfs.c60
1 files changed, 57 insertions, 3 deletions
diff --git a/src/lfs.c b/src/lfs.c
index e95dcab..a784d77 100644
--- a/src/lfs.c
+++ b/src/lfs.c
@@ -61,6 +61,16 @@
61#include "lualib.h" 61#include "lualib.h"
62#include "lfs.h" 62#include "lfs.h"
63 63
64/*
65 * ** compatibility with Lua 5.2
66 * */
67#if (LUA_VERSION_NUM == 502)
68#undef luaL_register
69#define luaL_register(L,n,f) \
70 { if ((n) == NULL) luaL_setfuncs(L,f,0); else luaL_newlib(L,f); }
71
72#endif
73
64/* Define 'strerror' for systems that do not implement it */ 74/* Define 'strerror' for systems that do not implement it */
65#ifdef NO_STRERROR 75#ifdef NO_STRERROR
66#define strerror(_) "System unable to describe the error" 76#define strerror(_) "System unable to describe the error"
@@ -150,16 +160,19 @@ static int change_dir (lua_State *L) {
150** If unable to get the current directory, it returns nil 160** If unable to get the current directory, it returns nil
151** and a string describing the error 161** and a string describing the error
152*/ 162*/
163#ifndef PATH_MAX
164#define PATH_MAX 4096
165#endif
166
153static int get_dir (lua_State *L) { 167static int get_dir (lua_State *L) {
154 char *path; 168 char path[PATH_MAX];
155 if ((path = getcwd(NULL, 0)) == NULL) { 169 if (getcwd((char *)path, PATH_MAX) == NULL) {
156 lua_pushnil(L); 170 lua_pushnil(L);
157 lua_pushstring(L, getcwd_error); 171 lua_pushstring(L, getcwd_error);
158 return 2; 172 return 2;
159 } 173 }
160 else { 174 else {
161 lua_pushstring(L, path); 175 lua_pushstring(L, path);
162 free(path);
163 return 1; 176 return 1;
164 } 177 }
165} 178}
@@ -703,6 +716,46 @@ static void push_invalid (lua_State *L, STAT_STRUCT *info) {
703#endif 716#endif
704} 717}
705 718
719 /*
720** Convert the inode protection mode to a permission list.
721*/
722
723#ifdef _WIN32
724static const char *perm2string (unsigned short mode) {
725 static char perms[10] = "---------\0";
726 int i;
727 for (i=0;i<9;i++) perms[i]='-';
728 if (mode & _S_IREAD)
729 { perms[0] = 'r'; perms[3] = 'r'; perms[6] = 'r'; }
730 if (mode & _S_IWRITE)
731 { perms[1] = 'w'; perms[4] = 'w'; perms[7] = 'w'; }
732 if (mode & _S_IEXEC)
733 { perms[2] = 'x'; perms[5] = 'x'; perms[8] = 'x'; }
734 return perms;
735}
736#else
737static const char *perm2string (mode_t mode) {
738 static char perms[10] = "---------\0";
739 int i;
740 for (i=0;i<9;i++) perms[i]='-';
741 if (mode & S_IRUSR) perms[0] = 'r';
742 if (mode & S_IWUSR) perms[1] = 'w';
743 if (mode & S_IXUSR) perms[2] = 'x';
744 if (mode & S_IRGRP) perms[3] = 'r';
745 if (mode & S_IWGRP) perms[4] = 'w';
746 if (mode & S_IXGRP) perms[5] = 'x';
747 if (mode & S_IROTH) perms[6] = 'r';
748 if (mode & S_IWOTH) perms[7] = 'w';
749 if (mode & S_IXOTH) perms[8] = 'x';
750 return perms;
751}
752#endif
753
754/* permssions string */
755static void push_st_perm (lua_State *L, STAT_STRUCT *info) {
756 lua_pushstring (L, perm2string (info->st_mode));
757}
758
706typedef void (*_push_function) (lua_State *L, STAT_STRUCT *info); 759typedef void (*_push_function) (lua_State *L, STAT_STRUCT *info);
707 760
708struct _stat_members { 761struct _stat_members {
@@ -722,6 +775,7 @@ struct _stat_members members[] = {
722 { "modification", push_st_mtime }, 775 { "modification", push_st_mtime },
723 { "change", push_st_ctime }, 776 { "change", push_st_ctime },
724 { "size", push_st_size }, 777 { "size", push_st_size },
778 { "permissions", push_st_perm },
725#ifndef _WIN32 779#ifndef _WIN32
726 { "blocks", push_st_blocks }, 780 { "blocks", push_st_blocks },
727 { "blksize", push_st_blksize }, 781 { "blksize", push_st_blksize },