Esempio n. 1
0
/* Get information about the file NAME in BUF.  */
int
gfs_hook_syscall_xstat (int vers, const char *name, struct stat *buf)
{
  struct kernel_stat kbuf;
  int result;

  if (vers == _STAT_VER_KERNEL)
    return syscall (SYS_stat, name, (struct kernel_stat *) buf);

  result = syscall (SYS_stat, name, &kbuf);
  if (result == 0)
    result = xstat_conv (vers, &kbuf, buf);

  return result;
}
Esempio n. 2
0
/* Get information about the file FD in BUF.  */
int
gfs_hook_syscall_fxstat (int vers, int fd, struct stat *buf)
{
  struct kernel_stat kbuf;
  int result;

  if (vers == _STAT_VER_KERNEL)
    return syscall (SYS_fstat, fd, (struct kernel_stat *) buf);

  result = syscall (SYS_fstat, fd, &kbuf);
  if (result == 0)
    result = xstat_conv (vers, &kbuf, buf);

  return result;
}
Esempio n. 3
0
/* Get information about the file FD in BUF.  */
int
__fxstat (int vers, int fd, struct stat *buf)
{
    struct kernel_stat kbuf;
    int result;

    if (vers == _STAT_VER_KERNEL)
        return INLINE_SYSCALL (fstat, 2, fd, CHECK_1 ((struct kernel_stat *) buf));

    result = INLINE_SYSCALL (fstat, 2, fd, __ptrvalue (&kbuf));
    if (result == 0)
        result = xstat_conv (vers, &kbuf, buf);

    return result;
}
Esempio n. 4
0
int
__xstat64_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
{
#ifdef XSTAT_IS_XSTAT64
  return xstat_conv (vers, kbuf, ubuf);
#else
  switch (vers)
    {
    case _STAT_VER_LINUX:
      {
	struct stat64 *buf = ubuf;

	buf->st_dev = kbuf->st_dev;
	buf->st_pad1[0] = 0; buf->st_pad1[1] = 0; buf->st_pad1[2] = 0;
	buf->st_ino = kbuf->st_ino;
	buf->st_mode = kbuf->st_mode;
	buf->st_nlink = kbuf->st_nlink;
	buf->st_uid = kbuf->st_uid;
	buf->st_gid = kbuf->st_gid;
	buf->st_rdev = kbuf->st_rdev;
	buf->st_pad2[0] = 0; buf->st_pad2[1] = 0; buf->st_pad2[2] = 0;
	buf->st_pad3 = 0;
	buf->st_size = kbuf->st_size;
	buf->st_blksize = kbuf->st_blksize;
	buf->st_blocks = kbuf->st_blocks;

	buf->st_atime = kbuf->st_atime; buf->__reserved0 = 0;
	buf->st_mtime = kbuf->st_mtime; buf->__reserved1 = 0;
	buf->st_ctime = kbuf->st_ctime; buf->__reserved2 = 0;

	buf->st_pad4[0] = 0; buf->st_pad4[1] = 0;
	buf->st_pad4[2] = 0; buf->st_pad4[3] = 0;
	buf->st_pad4[4] = 0; buf->st_pad4[5] = 0;
	buf->st_pad4[6] = 0; buf->st_pad4[7] = 0;
      }
      break;

      /* If struct stat64 is different from struct stat then
	 _STAT_VER_KERNEL does not make sense.  */
    case _STAT_VER_KERNEL:
    default:
      __set_errno (EINVAL);
      return -1;
    }

  return 0;
#endif
}
int
__xstat64_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
{
#ifdef XSTAT_IS_XSTAT64
  return xstat_conv (vers, kbuf, ubuf);
#else
  switch (vers)
    {
    case _STAT_VER_LINUX:
      {
	struct stat64 *buf = ubuf;

	buf->st_dev = kbuf->st_dev;
	memset (&buf->st_pad1, 0, sizeof (buf->st_pad1));
	buf->st_ino = kbuf->st_ino;
	buf->st_mode = kbuf->st_mode;
	buf->st_nlink = kbuf->st_nlink;
	buf->st_uid = kbuf->st_uid;
	buf->st_gid = kbuf->st_gid;
	buf->st_rdev = kbuf->st_rdev;
	memset (&buf->st_pad2, 0, sizeof (buf->st_pad2));
	buf->st_pad3 = 0;
	buf->st_size = kbuf->st_size;
	buf->st_blksize = kbuf->st_blksize;
	buf->st_blocks = kbuf->st_blocks;

	buf->st_atim.tv_sec = kbuf->st_atime_sec;
	buf->st_atim.tv_nsec = kbuf->st_atime_nsec;
	buf->st_mtim.tv_sec = kbuf->st_mtime_sec;
	buf->st_mtim.tv_nsec = kbuf->st_mtime_nsec;
	buf->st_ctim.tv_sec = kbuf->st_ctime_sec;
	buf->st_ctim.tv_nsec = kbuf->st_ctime_nsec;

	memset (&buf->st_pad4, 0, sizeof (buf->st_pad4));
      }
      break;

      /* If struct stat64 is different from struct stat then
	 _STAT_VER_KERNEL does not make sense.  */
    case _STAT_VER_KERNEL:
    default:
      __set_errno (EINVAL);
      return -1;
    }

  return 0;
#endif
}
Esempio n. 6
0
/* Get information about the file FD in BUF.  */
int
gfs_hook_syscall_fxstat (int vers, int fd, struct stat *buf)
{
#ifdef NEEDS_XSTAT_CONV
  struct kernel_stat kbuf;
  int result;

  if (vers == _STAT_VER_KERNEL)
    return syscall (SYS_fstat, fd, (struct kernel_stat *) buf);

  result = syscall (SYS_fstat, fd, &kbuf);
  if (result == 0)
    result = xstat_conv (vers, &kbuf, buf);

  return result;
#else /* NEEDS_XSTAT_CONV */
  return syscall (SYS_fstat, fd, buf);
#endif
}
Esempio n. 7
0
static inline int
xstat64_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
{
#ifdef XSTAT_IS_XSTAT64
  return xstat_conv (vers, kbuf, ubuf);
#else
  switch (vers)
    {
    case _STAT_VER_LINUX:
      {
	struct stat64 *buf = ubuf;

	/* Convert to current kernel version of `struct stat64'.  */
	buf->st_dev = kbuf->st_dev;
#ifdef _HAVE_STAT64___PAD1
	buf->__pad1 = 0;
#endif
	buf->st_ino = kbuf->st_ino;
#ifdef _HAVE_STAT64___ST_INO
	buf->__st_ino = kbuf->st_ino;
#endif
	buf->st_mode = kbuf->st_mode;
	buf->st_nlink = kbuf->st_nlink;
	buf->st_uid = kbuf->st_uid;
	buf->st_gid = kbuf->st_gid;
	buf->st_rdev = kbuf->st_rdev;
#ifdef _HAVE_STAT64___PAD2
	buf->__pad2 = 0;
#endif
	buf->st_size = kbuf->st_size;
	buf->st_blksize = kbuf->st_blksize;
	buf->st_blocks = kbuf->st_blocks;
	buf->st_atime = kbuf->st_atime;
#ifdef _HAVE_STAT64___UNUSED1
	buf->__unused1 = 0;
#endif
	buf->st_mtime = kbuf->st_mtime;
#ifdef _HAVE_STAT64___UNUSED2
	buf->__unused2 = 0;
#endif
	buf->st_ctime = kbuf->st_ctime;
#ifdef _HAVE_STAT64___UNUSED3
	buf->__unused3 = 0;
#endif
#ifdef _HAVE_STAT64___UNUSED4
	buf->__unused4 = 0;
#endif
#ifdef _HAVE_STAT64___UNUSED5
	buf->__unused5 = 0;
#endif
      }
      break;

      /* If struct stat64 is different from struct stat then
	 _STAT_VER_KERNEL does not make sense.  */
    case _STAT_VER_KERNEL:
    default:
      __set_errno (EINVAL);
      return -1;
    }

  return 0;
#endif
}