NAME

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

SYNOPSIS

use Udev::FFI;

#get udev version
my $udev_version = Udev::FFI::udev_version();
if(defined $udev_version) {
    print $udev_version. "\n";
}
else {
    warn "Can't get udev version: $@";
}


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


#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
        if(defined(my $device = $monitor->poll())) {
            my $action = $device->get_action();

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

        sleep 1;
    }
}


#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 mkdev

    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 = mkdev($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.

EXAMPLES

See examples folder.

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)

AUTHOR

Ilya Pavlov, <ilux@cpan.org>

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.