/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
/*
 * stat definition for NOLIBC
 * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
 */

/* make sure to include all global symbols */
#include "../nolibc.h"

#ifndef _NOLIBC_SYS_STAT_H
#define _NOLIBC_SYS_STAT_H

#include "../arch.h"
#include "../types.h"
#include "../sys.h"
#include "../sys/sysmacros.h"

/*
 * int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf);
 * int stat(const char *path, struct stat *buf);
 * int fstatat(int fd, const char *path, struct stat *buf, int flag);
 * int fstat(int fildes, struct stat *buf);
 * int lstat(const char *path, struct stat *buf);
 */

static __attribute__((unused))
int _sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
{
#ifdef __NR_statx
	return __nolibc_syscall5(__NR_statx, fd, path, flags, mask, buf);
#else
	return __nolibc_enosys(__func__, fd, path, flags, mask, buf);
#endif
}

static __attribute__((unused))
int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
{
	return __sysret(_sys_statx(fd, path, flags, mask, buf));
}


static __attribute__((unused))
int fstatat(int fd, const char *path, struct stat *buf, int flag)
{
	struct statx statx;
	long ret;

	ret = __sysret(_sys_statx(fd, path, flag | AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx));
	if (ret == -1)
		return ret;

	buf->st_dev          = makedev(statx.stx_dev_major, statx.stx_dev_minor);
	buf->st_ino          = statx.stx_ino;
	buf->st_mode         = statx.stx_mode;
	buf->st_nlink        = statx.stx_nlink;
	buf->st_uid          = statx.stx_uid;
	buf->st_gid          = statx.stx_gid;
	buf->st_rdev         = makedev(statx.stx_rdev_major, statx.stx_rdev_minor);
	buf->st_size         = statx.stx_size;
	buf->st_blksize      = statx.stx_blksize;
	buf->st_blocks       = statx.stx_blocks;
	buf->st_atim.tv_sec  = statx.stx_atime.tv_sec;
	buf->st_atim.tv_nsec = statx.stx_atime.tv_nsec;
	buf->st_mtim.tv_sec  = statx.stx_mtime.tv_sec;
	buf->st_mtim.tv_nsec = statx.stx_mtime.tv_nsec;
	buf->st_ctim.tv_sec  = statx.stx_ctime.tv_sec;
	buf->st_ctim.tv_nsec = statx.stx_ctime.tv_nsec;

	return 0;
}

static __attribute__((unused))
int stat(const char *path, struct stat *buf)
{
	return fstatat(AT_FDCWD, path, buf, 0);
}

static __attribute__((unused))
int fstat(int fildes, struct stat *buf)
{
	return fstatat(fildes, "", buf, AT_EMPTY_PATH);
}

static __attribute__((unused))
int lstat(const char *path, struct stat *buf)
{
	return fstatat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW);
}

#endif /* _NOLIBC_SYS_STAT_H */
