Go to the previous, next section.
int fstat(int fd, struct stat *buf);
int stat(char *path, struct stat *buf);
int lstat(char *path, struct stat *buf);
fd: [in] the file descriptor we want to get the information from.
path: [in] the file path we want to get the information from.
buf: [out] points to the buffer that will contain the information.
Those calls return a stat
structure in buf with the
following format:
struct stat { dev_t st_dev; /* device */ unsigned short __pad1; /* padding */ ino_t st_ino; /* inode umode_t st_mode; /* access mode */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* uid */ gid_t st_gid; /* gid */ dev_t st_rdev; /* device type */ unsigned short __pad2; /* padding */ off_t st_size; /* size (in bytes) */ unsigned long st_blksize; /* block size */ unsigned long st_blocks; /* number of allocated blocks */ time_t st_atime; /* last access time */ unsigned long __unused1; /* unused */ time_t st_mtime; /* last modification time */ unsigned long __unused2; /* unused */ time_t st_ctime; /* last change time */ unsigned long __unused3; /* unused */ unsigned long __unused4; /* unused */ unsigned long __unused5; /* unused */ };
The change time is for modifications to the inode, whereas the modification time is for modifications to the content of the file.
fstat
gets the information from a file descriptor. stat
and
lstat
get the information from a file path. However, lstat
used on a link will give get the information from the link itself
instead of the file pointed by the link.
Note: the kernel contains a older stats functions. However, it would seem they are no longer used. (Maybe only by very old binaries.)
On success zero is returned. On error, -1 is returned and errno
is
set to one of the following values:
for stat
or lstat
:
EFAULT
, ENAMETOOLONG
, ENOMEM
, ENOENT
,
ENOTDIR
, EACCESS
.
for fstat
:
EBADFS
, EFAULT
Go to the previous, next section.