The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "perl_sysfs.h"

MODULE = Linux::Sysfs::Driver	PACKAGE = Linux::Sysfs::Driver

struct sysfs_driver*
open(class, bus_name, drv_name)
		const char* bus_name
		const char* drv_name
	CODE:
		RETVAL = sysfs_open_driver(bus_name, drv_name);
	OUTPUT:
		RETVAL

struct sysfs_driver*
open_path(class, path)
		const char* path
	CODE:
		RETVAL = sysfs_open_driver_path(path);
	OUTPUT:
		RETVAL

void
close(driver)
		struct sysfs_driver* driver
	CODE:
		sysfs_close_driver(driver);

struct sysfs_attribute*
get_attr(driver, name)
		struct sysfs_driver* driver
		const char* name
	ALIAS:
		get_attribute = 1
	CODE:
		PERL_UNUSED_VAR(ix);
		RETVAL = sysfs_get_driver_attr(driver, name);
	OUTPUT:
		RETVAL

void
get_attrs(driver)
		struct sysfs_driver* driver
	ALIAS:
		get_attributes = 1
	PREINIT:
		struct dlist* attr_list = NULL;
		struct sysfs_attribute* attr = NULL;
	PPCODE:
		PERL_UNUSED_VAR(ix);
		attr_list = sysfs_get_driver_attributes(driver);

		if (attr_list == NULL)
			XSRETURN_EMPTY;

		EXTEND(SP, attr_list->count);
		dlist_for_each_data(attr_list, attr, struct sysfs_attribute) {
			PUSHs(sv_2mortal( perl_sysfs_new_sv_from_ptr(attr, "Linux::Sysfs::Attribute") ));
		}

void
get_devices(driver)
		struct sysfs_driver* driver
	PREINIT:
		struct dlist* dev_list = NULL;
		struct sysfs_device* dev = NULL;
	PPCODE:
		dev_list = sysfs_get_driver_devices(driver);

		if (dev_list == NULL)
			XSRETURN_EMPTY;

		EXTEND(SP, dev_list->count);
		dlist_for_each_data(dev_list, dev, struct sysfs_device) {
			PUSHs(sv_2mortal( perl_sysfs_new_sv_from_ptr(dev, "Linux::Sysfs::Device") ));
		}

struct sysfs_module*
get_module(driver)
		struct sysfs_driver* driver
	CODE:
		RETVAL = sysfs_get_driver_module(driver);
	OUTPUT:
		RETVAL

char*
name(driver)
		struct sysfs_driver* driver
	CODE:
		RETVAL = driver->name;
	OUTPUT:
		RETVAL

char*
path(driver)
		struct sysfs_driver* driver
	CODE:
		RETVAL = driver->path;
	OUTPUT:
		RETVAL

char*
bus(driver)
		struct sysfs_driver* driver
	CODE:
		RETVAL = driver->bus;
	OUTPUT:
		RETVAL