diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lfs.c | 65 |
1 files changed, 40 insertions, 25 deletions
@@ -16,9 +16,11 @@ | |||
16 | ** lfs.touch (filepath [, atime [, mtime]]) | 16 | ** lfs.touch (filepath [, atime [, mtime]]) |
17 | ** lfs.unlock (fh) | 17 | ** lfs.unlock (fh) |
18 | ** | 18 | ** |
19 | ** $Id: lfs.c,v 1.49 2008/02/19 20:08:23 mascarenhas Exp $ | 19 | ** $Id: lfs.c,v 1.50 2008/03/25 16:58:29 mascarenhas Exp $ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #define _LARGEFILE64_SOURCE | ||
23 | |||
22 | #include <errno.h> | 24 | #include <errno.h> |
23 | #include <stdio.h> | 25 | #include <stdio.h> |
24 | #include <string.h> | 26 | #include <string.h> |
@@ -73,11 +75,15 @@ typedef struct dir_data { | |||
73 | 75 | ||
74 | #ifdef _WIN32 | 76 | #ifdef _WIN32 |
75 | #define lfs_setmode(L,file,m) ((void)L, _setmode(_fileno(file), m)) | 77 | #define lfs_setmode(L,file,m) ((void)L, _setmode(_fileno(file), m)) |
78 | #define STAT_STRUCT struct _stat64 | ||
79 | #define STAT_FUNC _stat64 | ||
76 | #else | 80 | #else |
77 | #define _O_TEXT 0 | 81 | #define _O_TEXT 0 |
78 | #define _O_BINARY 0 | 82 | #define _O_BINARY 0 |
79 | #define lfs_setmode(L,file,m) ((void)((void)file,m), \ | 83 | #define lfs_setmode(L,file,m) ((void)((void)file,m), \ |
80 | luaL_error(L, LUA_QL("setmode") " not supported on non Windows platforms"), -1) | 84 | luaL_error(L, LUA_QL("setmode") " not supported on this platform"), -1) |
85 | #define STAT_STRUCT struct stat64 | ||
86 | #define STAT_FUNC stat64 | ||
81 | #endif | 87 | #endif |
82 | 88 | ||
83 | /* | 89 | /* |
@@ -203,11 +209,17 @@ static int lfs_g_setmode (lua_State *L, FILE *f, int arg) { | |||
203 | return 3; | 209 | return 3; |
204 | } | 210 | } |
205 | } | 211 | } |
212 | #else | ||
213 | static int lfs_g_setmode (lua_State *L, FILE *f, int arg) { | ||
214 | lua_pushboolean(L, 0); | ||
215 | lua_pushliteral(L, "setmode not supported on this platform"); | ||
216 | return 2; | ||
217 | } | ||
218 | #endif | ||
206 | 219 | ||
207 | static int lfs_f_setmode(lua_State *L) { | 220 | static int lfs_f_setmode(lua_State *L) { |
208 | return lfs_g_setmode(L, check_file(L, 1, "setmode"), 2); | 221 | return lfs_g_setmode(L, check_file(L, 1, "setmode"), 2); |
209 | } | 222 | } |
210 | #endif | ||
211 | 223 | ||
212 | /* | 224 | /* |
213 | ** Locks a file. | 225 | ** Locks a file. |
@@ -475,67 +487,67 @@ static int file_utime (lua_State *L) { | |||
475 | 487 | ||
476 | 488 | ||
477 | /* inode protection mode */ | 489 | /* inode protection mode */ |
478 | static void push_st_mode (lua_State *L, struct stat *info) { | 490 | static void push_st_mode (lua_State *L, STAT_STRUCT *info) { |
479 | lua_pushstring (L, mode2string (info->st_mode)); | 491 | lua_pushstring (L, mode2string (info->st_mode)); |
480 | } | 492 | } |
481 | /* device inode resides on */ | 493 | /* device inode resides on */ |
482 | static void push_st_dev (lua_State *L, struct stat *info) { | 494 | static void push_st_dev (lua_State *L, STAT_STRUCT *info) { |
483 | lua_pushnumber (L, (lua_Number)info->st_dev); | 495 | lua_pushnumber (L, (lua_Number)info->st_dev); |
484 | } | 496 | } |
485 | /* inode's number */ | 497 | /* inode's number */ |
486 | static void push_st_ino (lua_State *L, struct stat *info) { | 498 | static void push_st_ino (lua_State *L, STAT_STRUCT *info) { |
487 | lua_pushnumber (L, (lua_Number)info->st_ino); | 499 | lua_pushnumber (L, (lua_Number)info->st_ino); |
488 | } | 500 | } |
489 | /* number of hard links to the file */ | 501 | /* number of hard links to the file */ |
490 | static void push_st_nlink (lua_State *L, struct stat *info) { | 502 | static void push_st_nlink (lua_State *L, STAT_STRUCT *info) { |
491 | lua_pushnumber (L, (lua_Number)info->st_nlink); | 503 | lua_pushnumber (L, (lua_Number)info->st_nlink); |
492 | } | 504 | } |
493 | /* user-id of owner */ | 505 | /* user-id of owner */ |
494 | static void push_st_uid (lua_State *L, struct stat *info) { | 506 | static void push_st_uid (lua_State *L, STAT_STRUCT *info) { |
495 | lua_pushnumber (L, (lua_Number)info->st_uid); | 507 | lua_pushnumber (L, (lua_Number)info->st_uid); |
496 | } | 508 | } |
497 | /* group-id of owner */ | 509 | /* group-id of owner */ |
498 | static void push_st_gid (lua_State *L, struct stat *info) { | 510 | static void push_st_gid (lua_State *L, STAT_STRUCT *info) { |
499 | lua_pushnumber (L, (lua_Number)info->st_gid); | 511 | lua_pushnumber (L, (lua_Number)info->st_gid); |
500 | } | 512 | } |
501 | /* device type, for special file inode */ | 513 | /* device type, for special file inode */ |
502 | static void push_st_rdev (lua_State *L, struct stat *info) { | 514 | static void push_st_rdev (lua_State *L, STAT_STRUCT *info) { |
503 | lua_pushnumber (L, (lua_Number)info->st_rdev); | 515 | lua_pushnumber (L, (lua_Number)info->st_rdev); |
504 | } | 516 | } |
505 | /* time of last access */ | 517 | /* time of last access */ |
506 | static void push_st_atime (lua_State *L, struct stat *info) { | 518 | static void push_st_atime (lua_State *L, STAT_STRUCT *info) { |
507 | lua_pushnumber (L, info->st_atime); | 519 | lua_pushnumber (L, info->st_atime); |
508 | } | 520 | } |
509 | /* time of last data modification */ | 521 | /* time of last data modification */ |
510 | static void push_st_mtime (lua_State *L, struct stat *info) { | 522 | static void push_st_mtime (lua_State *L, STAT_STRUCT *info) { |
511 | lua_pushnumber (L, info->st_mtime); | 523 | lua_pushnumber (L, info->st_mtime); |
512 | } | 524 | } |
513 | /* time of last file status change */ | 525 | /* time of last file status change */ |
514 | static void push_st_ctime (lua_State *L, struct stat *info) { | 526 | static void push_st_ctime (lua_State *L, STAT_STRUCT *info) { |
515 | lua_pushnumber (L, info->st_ctime); | 527 | lua_pushnumber (L, info->st_ctime); |
516 | } | 528 | } |
517 | /* file size, in bytes */ | 529 | /* file size, in bytes */ |
518 | static void push_st_size (lua_State *L, struct stat *info) { | 530 | static void push_st_size (lua_State *L, STAT_STRUCT *info) { |
519 | lua_pushnumber (L, (lua_Number)info->st_size); | 531 | lua_pushnumber (L, (lua_Number)info->st_size); |
520 | } | 532 | } |
521 | #ifndef _WIN32 | 533 | #ifndef _WIN32 |
522 | /* blocks allocated for file */ | 534 | /* blocks allocated for file */ |
523 | static void push_st_blocks (lua_State *L, struct stat *info) { | 535 | static void push_st_blocks (lua_State *L, STAT_STRUCT *info) { |
524 | lua_pushnumber (L, (lua_Number)info->st_blocks); | 536 | lua_pushnumber (L, (lua_Number)info->st_blocks); |
525 | } | 537 | } |
526 | /* optimal file system I/O blocksize */ | 538 | /* optimal file system I/O blocksize */ |
527 | static void push_st_blksize (lua_State *L, struct stat *info) { | 539 | static void push_st_blksize (lua_State *L, STAT_STRUCT *info) { |
528 | lua_pushnumber (L, (lua_Number)info->st_blksize); | 540 | lua_pushnumber (L, (lua_Number)info->st_blksize); |
529 | } | 541 | } |
530 | #endif | 542 | #endif |
531 | static void push_invalid (lua_State *L, struct stat *info) { | 543 | static void push_invalid (lua_State *L, STAT_STRUCT *info) { |
532 | luaL_error(L, "invalid attribute name"); | 544 | luaL_error(L, "invalid attribute name"); |
533 | #ifndef _WIN32 | 545 | #ifndef _WIN32 |
534 | info->st_blksize = 0; /* never reached */ | 546 | info->st_blksize = 0; /* never reached */ |
535 | #endif | 547 | #endif |
536 | } | 548 | } |
537 | 549 | ||
538 | typedef void (*_push_function) (lua_State *L, struct stat *info); | 550 | typedef void (*_push_function) (lua_State *L, STAT_STRUCT *info); |
539 | 551 | ||
540 | struct _stat_members { | 552 | struct _stat_members { |
541 | const char *name; | 553 | const char *name; |
@@ -564,9 +576,9 @@ struct _stat_members members[] = { | |||
564 | /* | 576 | /* |
565 | ** Get file or symbolic link information | 577 | ** Get file or symbolic link information |
566 | */ | 578 | */ |
567 | static int _file_info_ (lua_State *L, int (*st)(const char*, struct stat*)) { | 579 | static int _file_info_ (lua_State *L, int (*st)(const char*, STAT_STRUCT*)) { |
568 | int i; | 580 | int i; |
569 | struct stat info; | 581 | STAT_STRUCT info; |
570 | const char *file = luaL_checkstring (L, 1); | 582 | const char *file = luaL_checkstring (L, 1); |
571 | 583 | ||
572 | if (st(file, &info)) { | 584 | if (st(file, &info)) { |
@@ -606,7 +618,7 @@ static int _file_info_ (lua_State *L, int (*st)(const char*, struct stat*)) { | |||
606 | ** Get file information using stat. | 618 | ** Get file information using stat. |
607 | */ | 619 | */ |
608 | static int file_info (lua_State *L) { | 620 | static int file_info (lua_State *L) { |
609 | return _file_info_ (L, stat); | 621 | return _file_info_ (L, STAT_FUNC); |
610 | } | 622 | } |
611 | 623 | ||
612 | 624 | ||
@@ -615,7 +627,13 @@ static int file_info (lua_State *L) { | |||
615 | */ | 627 | */ |
616 | #ifndef _WIN32 | 628 | #ifndef _WIN32 |
617 | static int link_info (lua_State *L) { | 629 | static int link_info (lua_State *L) { |
618 | return _file_info_ (L, lstat); | 630 | return _file_info_ (L, lstat64); |
631 | } | ||
632 | #else | ||
633 | static int link_info (lua_State *L) { | ||
634 | lua_pushboolean(L, 0); | ||
635 | lua_pushliteral(L, "symlinkattributes not supported on this platform"); | ||
636 | return 2; | ||
619 | } | 637 | } |
620 | #endif | 638 | #endif |
621 | 639 | ||
@@ -644,11 +662,8 @@ static const struct luaL_reg fslib[] = { | |||
644 | {"lock", file_lock}, | 662 | {"lock", file_lock}, |
645 | {"mkdir", make_dir}, | 663 | {"mkdir", make_dir}, |
646 | {"rmdir", remove_dir}, | 664 | {"rmdir", remove_dir}, |
647 | #ifndef _WIN32 | ||
648 | {"symlinkattributes", link_info}, | 665 | {"symlinkattributes", link_info}, |
649 | #else | ||
650 | {"setmode", lfs_f_setmode}, | 666 | {"setmode", lfs_f_setmode}, |
651 | #endif | ||
652 | {"touch", file_utime}, | 667 | {"touch", file_utime}, |
653 | {"unlock", file_unlock}, | 668 | {"unlock", file_unlock}, |
654 | {NULL, NULL}, | 669 | {NULL, NULL}, |