NAME

Udev::FFI - Perl bindings for libudev using ffi.

SYNOPSIS

use Udev::FFI;

# get udev library version
my $udev_version = Udev::FFI::udev_version()
    or die "Can't get udev library version: $@";


# create Udev::FFI object
my $udev = Udev::FFI->new() or
    die "Can't create Udev::FFI object: $@";


# create udev monitor
my $monitor = $udev->new_monitor() or
    die "Can't create udev monitor: $@.\n";

# add filter to monitor
unless($monitor->filter_by_subsystem_devtype('block')) {
    warn "Ouch!";
}

# start monitor
if($monitor->start()) {
    for(;;) {
        # poll devices, now insert or remove your block device
        my $device = $monitor->poll(); #blocking read
        my $action = $device->get_action();

        print 'ACTION: '.$action, "\n";
        print 'SYSNAME: '.$device->get_sysname(), "\n";
        print 'DEVNODE: '.$device->get_devnode(), "\n";

        last; # for example
    }

    for(;;) {
        # poll devices, now insert or remove your block device
        if(defined(my $device = $monitor->poll(0))) { #non-blocking read like can_read in IO::Select
            my $action = $device->get_action();

            print 'ACTION: '.$action, "\n";
            print 'SYSNAME: '.$device->get_sysname(), "\n";
            print 'DEVNODE: '.$device->get_devnode(), "\n";
        }

        sleep 1;

        last; # for example
    }
}


# enumerate devices
my $enumerate = $udev->new_enumerate() or
    die "Can't create enumerate context\n";

$enumerate->add_match_subsystem('block');
$enumerate->scan_devices();

use Data::Dumper; # for dump values in $href and @a

# scalar context
my $href = $enumerate->get_list_entries();
print Dumper($href), "\n";

# list context
my @a = $enumerate->get_list_entries();
print Dumper(@a), "\n";

if(@a) { # get major and minor
    use Udev::FFI::Devnum qw(:all); # import major, minor and makedev

    my $device = $udev->new_device_from_syspath($a[0]);
    if(defined $device) {
        print "Device: ".$device->get_sysname(), "\n";

        my $devnum = $device->get_devnum();
        my ($ma, $mi) = (major($devnum), minor($devnum));

        print "Major: $ma\n";
        print "Minor: $mi\n";

        $devnum = undef;

        $devnum = makedev($ma, $mi);
        print "Devnum: $devnum\n";


        # scalar context
        $href = $device->get_properties_list_entries();
        print Dumper($href), "\n";

        # list context
        @a = $device->get_properties_list_entries();
        print Dumper(@a), "\n";
    }
}

DESCRIPTION

Udev::FFI exposes OO interface to libudev.

CONSTRUCTOR

METHODS

EXAMPLES

Examples are provided with the Udev::FFI distribution in the "examples" directory.

SEE ALSO

libudev

FFI::Platypus (Write Perl bindings to non-Perl libraries without C or XS)

FFI::CheckLib (Check that a library is available for FFI)

BUGS AND LIMITATIONS

Udev::FFI supports libudev 175 or newer. Older versions may work too, but it was not tested.

Please report any bugs through the web interface at https://github.com/Ilya33/udev-ffi/issues or via email to the author. Patches are always welcome.

AUTHOR

Ilya Pavlov, ilux@cpan.org

Contributors:

Mohammad S Anwar

COPYRIGHT AND LICENSE

Copyright (C) 2017 by Ilya Pavlov

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details.

You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.