#undef PACKAGE_TARNAME
#include <config.h>
-#include "bfd.h"
#include <sys/types.h>
#include <limits.h>
needs_relocations (0),
crc_computed (0)
{
- struct stat buf;
+ sys_stat buf;
if (bfd_stat (abfd, &buf) == 0)
{
return 0;
}
+/* Convert between a struct stat (potentially a gnulib replacement)
+ and a sys_stat (the system's struct stat). */
+
+static sys_stat
+to_sys_stat (struct stat *st)
+{
+ sys_stat sst {};
+
+#define COPY(FIELD) \
+ sst.FIELD = st->FIELD
+
+ COPY (st_dev);
+ COPY (st_ino);
+ COPY (st_mode);
+ COPY (st_nlink);
+ COPY (st_uid);
+ COPY (st_gid);
+ COPY (st_rdev);
+
+ /* Check for overflow? */
+ COPY (st_size);
+
+ // Should probably check _GL_WINDOWS_STAT_TIMESPEC and refer to
+ // st_atim, etc. instead.
+ COPY (st_atime);
+ COPY (st_mtime);
+ COPY (st_ctime);
+
+#undef COPY
+
+ return sst;
+}
+
/* Wrapper for target_fileio_fstat suitable for passing as the
STAT_FUNC argument to gdb_bfd_openr_iovec. */
static int
gdb_bfd_iovec_fileio_fstat (struct bfd *abfd, void *stream,
- struct stat *sb)
+ sys_stat *sb)
{
int fd = *(int *) stream;
int target_errno;
int result;
- result = target_fileio_fstat (fd, sb, &target_errno);
+ struct stat st;
+
+ result = target_fileio_fstat (fd, &st, &target_errno);
if (result == -1)
{
errno = fileio_errno_to_host (target_errno);
bfd_set_error (bfd_error_system_call);
}
+ *sb = to_sys_stat (&st);
+
return result;
}
void *stream),
int (*stat_func) (struct bfd *abfd,
void *stream,
- struct stat *sb))
+ sys_stat *sb))
{
bfd *result = bfd_openr_iovec (filename, target,
open_func, open_closure,
void *stream),
int (*stat_func) (struct bfd *abfd,
void *stream,
- struct stat *sb));
+ sys_stat *sb));
/* A wrapper for bfd_openr_next_archived_file that initializes the
gdb-specific reference count. */
/* For statting the file, we only support the st_size attribute. */
static int
-mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
+mem_bfd_iovec_stat (struct bfd *abfd, void *stream, sys_stat *sb)
{
struct target_buffer *buffer = (struct target_buffer*) stream;
- memset (sb, 0, sizeof (struct stat));
+ memset (sb, 0, sizeof (sys_stat));
sb->st_size = buffer->size;
return 0;
}
{
unsigned long file_crc;
int file_crc_p;
- struct stat parent_stat, abfd_stat;
+ sys_stat parent_stat, abfd_stat;
int verified_as_different;
/* Find a separate debug info file as if symbols would be present in
#else /* GDBSERVER */
+/* Gnulib may replace struct stat with its own version. Bfd does not
+ use gnulib, so when we call into bfd, we must use the system struct
+ stat. */
+#define __need_system_sys_stat_h 1
+
+#include <sys/stat.h>
+
#include "bfd.h"
+typedef struct stat sys_stat;
+
+#undef __need_system_sys_stat_h
+
+#include <sys/stat.h>
+
/* * A byte from the program being debugged. */
typedef bfd_byte gdb_byte;