1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-30 06:50:31 +02:00

(scm_stat2scm, scm_stat, scm_lstat): Use stat64.

(scm_readdir): Use readdir64.
(scm_copy_file): Use open64 and fstat64, to cope with >2Gb files.
This commit is contained in:
Kevin Ryde 2006-04-16 01:26:29 +00:00
parent 1c64e87552
commit c506a7fda5

View file

@ -20,6 +20,7 @@
/* See stime.c for comments on why _POSIX_C_SOURCE is not always defined. */ /* See stime.c for comments on why _POSIX_C_SOURCE is not always defined. */
#define _GNU_SOURCE /* ask glibc for everything */ #define _GNU_SOURCE /* ask glibc for everything */
#define _LARGEFILE64_SOURCE /* ask for stat64 etc */
#ifdef __hpux #ifdef __hpux
#define _POSIX_C_SOURCE 199506L /* for readdir_r */ #define _POSIX_C_SOURCE 199506L /* for readdir_r */
#endif #endif
@ -475,12 +476,12 @@ SCM_SYMBOL (scm_sym_sock, "socket");
SCM_SYMBOL (scm_sym_unknown, "unknown"); SCM_SYMBOL (scm_sym_unknown, "unknown");
static SCM static SCM
scm_stat2scm (struct stat *stat_temp) scm_stat2scm (struct stat_or_stat64 *stat_temp)
{ {
SCM ans = scm_c_make_vector (15, SCM_UNSPECIFIED); SCM ans = scm_c_make_vector (15, SCM_UNSPECIFIED);
SCM_SIMPLE_VECTOR_SET(ans, 0, scm_from_ulong (stat_temp->st_dev)); SCM_SIMPLE_VECTOR_SET(ans, 0, scm_from_ulong (stat_temp->st_dev));
SCM_SIMPLE_VECTOR_SET(ans, 1, scm_from_ulong (stat_temp->st_ino)); SCM_SIMPLE_VECTOR_SET(ans, 1, scm_from_ino_t_or_ino64_t (stat_temp->st_ino));
SCM_SIMPLE_VECTOR_SET(ans, 2, scm_from_ulong (stat_temp->st_mode)); SCM_SIMPLE_VECTOR_SET(ans, 2, scm_from_ulong (stat_temp->st_mode));
SCM_SIMPLE_VECTOR_SET(ans, 3, scm_from_ulong (stat_temp->st_nlink)); SCM_SIMPLE_VECTOR_SET(ans, 3, scm_from_ulong (stat_temp->st_nlink));
SCM_SIMPLE_VECTOR_SET(ans, 4, scm_from_ulong (stat_temp->st_uid)); SCM_SIMPLE_VECTOR_SET(ans, 4, scm_from_ulong (stat_temp->st_uid));
@ -490,7 +491,7 @@ scm_stat2scm (struct stat *stat_temp)
#else #else
SCM_SIMPLE_VECTOR_SET(ans, 6, SCM_BOOL_F); SCM_SIMPLE_VECTOR_SET(ans, 6, SCM_BOOL_F);
#endif #endif
SCM_SIMPLE_VECTOR_SET(ans, 7, scm_from_ulong (stat_temp->st_size)); SCM_SIMPLE_VECTOR_SET(ans, 7, scm_from_off_t_or_off64_t (stat_temp->st_size));
SCM_SIMPLE_VECTOR_SET(ans, 8, scm_from_ulong (stat_temp->st_atime)); SCM_SIMPLE_VECTOR_SET(ans, 8, scm_from_ulong (stat_temp->st_atime));
SCM_SIMPLE_VECTOR_SET(ans, 9, scm_from_ulong (stat_temp->st_mtime)); SCM_SIMPLE_VECTOR_SET(ans, 9, scm_from_ulong (stat_temp->st_mtime));
SCM_SIMPLE_VECTOR_SET(ans, 10, scm_from_ulong (stat_temp->st_ctime)); SCM_SIMPLE_VECTOR_SET(ans, 10, scm_from_ulong (stat_temp->st_ctime));
@ -500,7 +501,7 @@ scm_stat2scm (struct stat *stat_temp)
SCM_SIMPLE_VECTOR_SET(ans, 11, scm_from_ulong (4096L)); SCM_SIMPLE_VECTOR_SET(ans, 11, scm_from_ulong (4096L));
#endif #endif
#ifdef HAVE_STRUCT_STAT_ST_BLOCKS #ifdef HAVE_STRUCT_STAT_ST_BLOCKS
SCM_SIMPLE_VECTOR_SET(ans, 12, scm_from_ulong (stat_temp->st_blocks)); SCM_SIMPLE_VECTOR_SET(ans, 12, scm_from_blkcnt_t_or_blkcnt64_t (stat_temp->st_blocks));
#else #else
SCM_SIMPLE_VECTOR_SET(ans, 12, SCM_BOOL_F); SCM_SIMPLE_VECTOR_SET(ans, 12, SCM_BOOL_F);
#endif #endif
@ -652,14 +653,14 @@ SCM_DEFINE (scm_stat, "stat", 1, 0, 0,
{ {
int rv; int rv;
int fdes; int fdes;
struct stat stat_temp; struct stat_or_stat64 stat_temp;
if (scm_is_integer (object)) if (scm_is_integer (object))
{ {
#ifdef __MINGW32__ #ifdef __MINGW32__
SCM_SYSCALL (rv = fstat_Win32 (scm_to_int (object), &stat_temp)); SCM_SYSCALL (rv = fstat_Win32 (scm_to_int (object), &stat_temp));
#else #else
SCM_SYSCALL (rv = fstat (scm_to_int (object), &stat_temp)); SCM_SYSCALL (rv = fstat_or_fstat64 (scm_to_int (object), &stat_temp));
#endif #endif
} }
else if (scm_is_string (object)) else if (scm_is_string (object))
@ -671,7 +672,7 @@ SCM_DEFINE (scm_stat, "stat", 1, 0, 0,
while (p > file && (*p == '/' || *p == '\\')) while (p > file && (*p == '/' || *p == '\\'))
*p-- = '\0'; *p-- = '\0';
#endif #endif
SCM_SYSCALL (rv = stat (file, &stat_temp)); SCM_SYSCALL (rv = stat_or_stat64 (file, &stat_temp));
free (file); free (file);
} }
else else
@ -682,7 +683,7 @@ SCM_DEFINE (scm_stat, "stat", 1, 0, 0,
#ifdef __MINGW32__ #ifdef __MINGW32__
SCM_SYSCALL (rv = fstat_Win32 (fdes, &stat_temp)); SCM_SYSCALL (rv = fstat_Win32 (fdes, &stat_temp));
#else #else
SCM_SYSCALL (rv = fstat (fdes, &stat_temp)); SCM_SYSCALL (rv = fstat_or_fstat64 (fdes, &stat_temp));
#endif #endif
} }
@ -868,7 +869,7 @@ SCM_DEFINE (scm_readdir, "readdir", 1, 0, 0,
"end of file object is returned.") "end of file object is returned.")
#define FUNC_NAME s_scm_readdir #define FUNC_NAME s_scm_readdir
{ {
struct dirent *rdent; struct dirent_or_dirent64 *rdent;
SCM_VALIDATE_DIR (1, port); SCM_VALIDATE_DIR (1, port);
if (!SCM_DIR_OPEN_P (port)) if (!SCM_DIR_OPEN_P (port))
@ -890,7 +891,7 @@ SCM_DEFINE (scm_readdir, "readdir", 1, 0, 0,
fdopendir(), if the latter is available. That'd let us hold the fd fdopendir(), if the latter is available. That'd let us hold the fd
somewhere in the smob, or just the dirent size calculated once. */ somewhere in the smob, or just the dirent size calculated once. */
{ {
struct dirent de; /* just for sizeof */ struct dirent_or_dirent64 de; /* just for sizeof */
DIR *ds = (DIR *) SCM_CELL_WORD_1 (port); DIR *ds = (DIR *) SCM_CELL_WORD_1 (port);
size_t namlen; size_t namlen;
#ifdef NAME_MAX #ifdef NAME_MAX
@ -906,7 +907,7 @@ SCM_DEFINE (scm_readdir, "readdir", 1, 0, 0,
#endif #endif
errno = 0; errno = 0;
SCM_SYSCALL (readdir_r (ds, (struct dirent *) buf, &rdent)); SCM_SYSCALL (readdir_r_or_readdir64_r (ds, (struct dirent_or_dirent64 *) buf, &rdent));
if (errno != 0) if (errno != 0)
SCM_SYSERROR; SCM_SYSERROR;
if (! rdent) if (! rdent)
@ -924,7 +925,7 @@ SCM_DEFINE (scm_readdir, "readdir", 1, 0, 0,
scm_i_dynwind_pthread_mutex_lock (&scm_i_misc_mutex); scm_i_dynwind_pthread_mutex_lock (&scm_i_misc_mutex);
errno = 0; errno = 0;
SCM_SYSCALL (rdent = readdir ((DIR *) SCM_CELL_WORD_1 (port))); SCM_SYSCALL (rdent = readdir_or_readdir64 ((DIR *) SCM_CELL_WORD_1 (port)));
if (errno != 0) if (errno != 0)
SCM_SYSERROR; SCM_SYSERROR;
@ -1486,9 +1487,9 @@ SCM_DEFINE (scm_lstat, "lstat", 1, 0, 0,
#define FUNC_NAME s_scm_lstat #define FUNC_NAME s_scm_lstat
{ {
int rv; int rv;
struct stat stat_temp; struct stat_or_stat64 stat_temp;
STRING_SYSCALL (str, c_str, rv = lstat (c_str, &stat_temp)); STRING_SYSCALL (str, c_str, rv = lstat_or_lstat64 (c_str, &stat_temp));
if (rv != 0) if (rv != 0)
{ {
int en = errno; int en = errno;
@ -1512,7 +1513,7 @@ SCM_DEFINE (scm_copy_file, "copy-file", 2, 0, 0,
int oldfd, newfd; int oldfd, newfd;
int n, rv; int n, rv;
char buf[BUFSIZ]; char buf[BUFSIZ];
struct stat oldstat; struct stat_or_stat64 oldstat;
scm_dynwind_begin (0); scm_dynwind_begin (0);
@ -1521,20 +1522,20 @@ SCM_DEFINE (scm_copy_file, "copy-file", 2, 0, 0,
c_newfile = scm_to_locale_string (newfile); c_newfile = scm_to_locale_string (newfile);
scm_dynwind_free (c_newfile); scm_dynwind_free (c_newfile);
oldfd = open (c_oldfile, O_RDONLY); oldfd = open_or_open64 (c_oldfile, O_RDONLY);
if (oldfd == -1) if (oldfd == -1)
SCM_SYSERROR; SCM_SYSERROR;
#ifdef __MINGW32__ #ifdef __MINGW32__
SCM_SYSCALL (rv = fstat_Win32 (oldfd, &oldstat)); SCM_SYSCALL (rv = fstat_Win32 (oldfd, &oldstat));
#else #else
SCM_SYSCALL (rv = fstat (oldfd, &oldstat)); SCM_SYSCALL (rv = fstat_or_fstat64 (oldfd, &oldstat));
#endif #endif
if (rv == -1) if (rv == -1)
goto err_close_oldfd; goto err_close_oldfd;
/* use POSIX flags instead of 07777?. */ /* use POSIX flags instead of 07777?. */
newfd = open (c_newfile, O_WRONLY | O_CREAT | O_TRUNC, newfd = open_or_open64 (c_newfile, O_WRONLY | O_CREAT | O_TRUNC,
oldstat.st_mode & 07777); oldstat.st_mode & 07777);
if (newfd == -1) if (newfd == -1)
{ {