diff options
Diffstat (limited to 'src/lfs.c')
-rw-r--r-- | src/lfs.c | 41 |
1 files changed, 36 insertions, 5 deletions
@@ -172,6 +172,15 @@ typedef struct dir_data { | |||
172 | 172 | ||
173 | #endif | 173 | #endif |
174 | 174 | ||
175 | #if _POSIX_VERSION >= 200809L | ||
176 | #define UTIME_FUNC(dirp, name, utb) utimensat(dirp ? dirfd(dirp) : 0, name, utb, 0) | ||
177 | #define UTIME_STRUCT struct timespec | ||
178 | #else | ||
179 | #define UTIME_FUNC(dirp, name, utb) utime(name, utb) | ||
180 | #define UTIME_STRUCT struct utimbuf | ||
181 | #endif | ||
182 | |||
183 | |||
175 | #ifdef _WIN32 | 184 | #ifdef _WIN32 |
176 | #define lfs_mkdir _mkdir | 185 | #define lfs_mkdir _mkdir |
177 | #else | 186 | #else |
@@ -820,17 +829,39 @@ static const char *mode2string(mode_t mode) | |||
820 | static int file_utime(lua_State * L) | 829 | static int file_utime(lua_State * L) |
821 | { | 830 | { |
822 | const char *file = luaL_checkstring(L, 1); | 831 | const char *file = luaL_checkstring(L, 1); |
823 | struct utimbuf utb, *buf; | 832 | UTIME_STRUCT utb[2]; |
833 | UTIME_STRUCT *buf; | ||
834 | #ifndef _WIN32 | ||
835 | DIR* dirp = NULL; | ||
836 | #endif | ||
824 | 837 | ||
825 | if (lua_gettop(L) == 1) /* set to current date/time */ | 838 | if (lua_gettop(L) == 1) /* set to current date/time */ |
826 | buf = NULL; | 839 | buf = NULL; |
827 | else { | 840 | else { |
828 | utb.actime = (time_t) luaL_optnumber(L, 2, 0); | 841 | #if _POSIX_VERSION >= 200809L |
829 | utb.modtime = (time_t) luaL_optinteger(L, 3, utb.actime); | 842 | lua_Number acctime = luaL_optnumber(L, 2, 0); |
830 | buf = &utb; | 843 | lua_Number modtime = luaL_optnumber(L, 3, acctime); |
844 | utb[0].tv_sec = acctime; | ||
845 | utb[0].tv_nsec = (acctime - utb[0].tv_sec) * 1000000000; | ||
846 | utb[1].tv_sec = modtime; | ||
847 | utb[1].tv_nsec = (modtime - utb[1].tv_sec) * 1000000000; | ||
848 | if (file[0] != '/') { | ||
849 | dirp = opendir("."); | ||
850 | } | ||
851 | #else | ||
852 | utb[0].actime = (time_t) luaL_optnumber(L, 2, 0); | ||
853 | utb[0].modtime = (time_t) luaL_optnumber(L, 3, utb[0].actime); | ||
854 | #endif | ||
855 | buf = utb; | ||
831 | } | 856 | } |
832 | 857 | ||
833 | return pushresult(L, utime(file, buf), NULL); | 858 | int res = UTIME_FUNC(dirp, file, buf); |
859 | #ifndef _WIN32 | ||
860 | if (dirp) { | ||
861 | closedir(dirp); | ||
862 | } | ||
863 | #endif | ||
864 | return pushresult(L, res, NULL); | ||
834 | } | 865 | } |
835 | 866 | ||
836 | 867 | ||