NAME
FFI::C::Stat - Object-oriented FFI interface to native stat and lstat
VERSION
version 0.03
SYNOPSIS
DESCRIPTION
Perl comes with perfectly good stat
, lstat
functions, however if you are writing FFI bindings for a library that use the C stat
structure, you are out of luck there. This module provides an FFI friendly interface to the C stat
function, which uses an object similar to File::stat, except the internals are a real C struct
that you can pass into C APIs that need it.
Supposing you have a C function:
void
my_cfunction(struct
stat
*s
)
{
...
}
You can bind my_cfunction
like this:
use
FFI::Platypus 1.00;
my
$ffi
= FFI::Platypus->new(
api
=> 1 );
$ffi
->type(
'object(FFI::C::Stat)'
=>
'stat'
);
$ffi
->attach(
my_cfunction
=> [
'stat'
] =>
'void'
);
CONSTRUCTORS
new
my
$stat
= FFI::C::Stat->new(
*HANDLE
,
%options
);
my
$stat
= FFI::C::Stat->new(
$filename
,
%options
);
my
$stat
= FFI::C::Stat->new;
You can create a new instance of this class by calling the new method and passing in either a file or directory handle, or by passing in the filename path. If you do not pass anything then an uninitialized stat will be returned.
Options:
- symlink
-
Use
lstat
instead ofstat
, that is if the filename is a symlink,stat
the symlink instead of the target.
clone
my
$stat
= FFI::C::Stat->clone(
$other_stat
);
Creates a clone of $stat
. The argument $stat
can be either a FFI::C::Stat instance, or an opaque pointer to a stat
structure. The latter case is helpful when writing bindings to a method that returns a stat
structure, since you won't be wanting to free the pointer that belongs to the callee.
C:
struct
stat
*
my_cfunction()
{
static struct
stat
stat
; /* definitely
do
not want to free static memory */
...
return
stat
;
}
Perl:
$ffi
->attach(
my_cfunction
=> [] =>
'opaque'
=>
sub
{
my
$xsub
=
shift
;
my
$ptr
=
$xsub
->();
return
FFI::C::Stat->clone(
$ptr
);
});
The behavior of passing in undef
prior to version 0.03 was undefined and could cause a crash. In version 0.03 and later passing in undef
will return a stat object with all of the bits set to zero (0).
PROPERTIES
dev
my
$id
=
$stat
->dev;
The ID of device containing file.
ino
my
$inode
=
$stat
->ino;
The inode number.
mode
my
$mode
=
$stat
->mode;
The file type and mode.
nlink
my
$n
=
$stat
->nlink;
The number of hard links.
uid
my
$uid
=
$stat
->uid;
The User ID owner.
gid
my
$gid
=
$stat
->gid;
The Group ID owner.
rdev
my
$id
=
$stat
->rdev;
The ID of device (if special file)
size
my
$size
=
$stat
->size;
Returns the size of the file in bytes.
atime
my
$time
=
$stat
->atime;
The time of last access.
mtime
my
$time
=
$stat
->mtime;
The time of last modification.
ctime
my
$time
=
$stat
->ctime;
The time of last status change.
blksize
my
$size
=
$stat
->blksize;
The filesystem-specific preferred I/O block size.
blocks
my
$count
=
$stat
->blocks;
Number of blocks allocated.
AUTHOR
Graham Ollis <plicease@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2021-2023 by Graham Ollis.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.