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:
parent
1c64e87552
commit
c506a7fda5
1 changed files with 20 additions and 19 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue