
	System Utilities sysfs Library - libsysfs
	=========================================

Version: 2.1.0
August 22, 2006

Contents
--------
1. Introduction
2. Requirements
3. Definitions
4. Overview
5. Data Structures
   5.1 Attribute Data Structure
   5.2 Bus Data Structure
   5.3 Class Data Structures
   5.4 Device Data Structure
   5.5 Driver Data Structure
   5.6 Module Data Structure
6. Functions
   6.1 Calling Conventions in Libsysfs
   6.2 Utility Functions
   6.3 Attribute Functions
   6.4 Bus Functions
   6.5 Class Functions
   6.6 Device Functions
   6.7 Driver Functions
   6.8 Module functions
7. Dlists
   7.1 Navigating a dlist
   7.2 Custom sorting using dlist_sort_custom()
   7.3 Custom filtering and sorting using dlist_filter_sort()
8. Usage
9. Testsuite
10. Conclusion


1. Introduction
---------------

Libsysfs' purpose is to provide a consistent and stable interface for
querying system device information exposed through the sysfs filesystem.
The library implements functions for querying filesystem information,
such as reading directories and files. It also contains routines for
working with buses, classes, and the device tree.


2. Requirements
---------------

The library must satisfy the following requirements:

- It must provide a stable programming interfaces that applications can
  be built upon.

- It must provide functions to retrieve device Vital Product Data (VPD)
  information for Error Log Analysis (ELA) support. ELA will provide
  device driver and device bus address information.

- It must provide access to all system devices and information exposed
  by sysfs.

- It must provide a function to find sysfs' current mount point.

- It must provide a function for udev to retrieve a device's major and
  minor numbers.


3. Definitions
--------------

- sysfs: Sysfs is a virtual filesystem in 2.5+ Linux kernels that
  presents a hierarchical representation of all system physical and
  virtual devices. It presents system devices by bus, by class, and
  by topology. Callbacks to device drivers are exposed as files in
  device directories. Sysfs, for all purposes, is our tree of system
  devices. For more information, please see:

	http://www.kernel.org/pub/linux/kernel/people/mochel/doc/

- udev: Udev is Greg Kroah-Hartman's User Space implementation of devfs.
  Udev creates /dev nodes for devices upon Hotplug events. The Hotplug
  event provides udev with a sysfs directory location of the device. Udev
  must use that directory to grab device's major and minor number, which it
  will use to create the /dev node. For more information, please see:

	http://www.kernel.org/pub/linux/utils/kernel/hotplug/

  Udev provides persistent device naming based on a set of user specified
  rules. The rules a device name is based on could one or a combination of a
  number of parameters such as the bus the device is on, the serial number
  of the device (in case of USB), the vendor name (in case of SCSI) and so
  on. Udev uses Libsysfs to retrieve relevent information to appropriately
  name devices.


4. Overview
-----------

Libsysfs grew from a common need. There are several applications under
development that need access to sysfs and system devices. Udev, on a
hotplug event, must take a sysfs device path and create a /dev node. Our
diagnostic client needs to list all system devices. Finally, our Error
Log Analysis piece is required to retrieve VPD information for a
failing device. We divided to create a single library interface rather
than having these separate applications create their own accesses to
sysfs involving reading directories and files.

Libsysfs will also provide stability for applications to be built upon. Sysfs
currently doesn't enforce any standards for callback or file names. File
names change depending on bus or class. Sysfs is also changing, it is
currently being developed. Libsysfs will provide a stable interface to
applications while allowing sysfs to change underneath it.

Like sysfs, the library will provide devices to applications by bus, by
class, and by topology. The library will function similar to directories
and files that lie underneath it. To query a device on a PCI bus, one would
"open" the bus to scan or read devices and "close" the bus when
completed. Besides supplying functions to retrieve devices, the library
will also provide some utility functions like getting sysfs mount point.

A paper on Libsysfs was presented at Linux.Conf.Au 2004 (Adelaide, January
2004). The paper is available online at:

http://oss.software.ibm.com/linux/papers/libsysfs/libsysfs-linuxconfau2004.pdf


5. Data Structures
------------------

Libsysfs will classify system devices following sysfs' example, dividing
them by bus, class, and devices. The library presents this information
generically. It doesn't, for example, differentiate between PCI and USB
buses. Device attributes are presented with values as they are exposed
by sysfs, the values are not formatted.

The library will provide standard definitions for working with sysfs
and devices, here's some examples:

#define SYSFS_FSTYPE_NAME       "sysfs"
#define SYSFS_PROC_MNTS         "/proc/mounts"
#define SYSFS_BUS_NAME          "bus"
#define SYSFS_CLASS_NAME        "class"
#define SYSFS_BLOCK_NAME        "block"
#define SYSFS_DEVICES_NAME      "devices"
#define SYSFS_DRIVERS_NAME      "drivers"
#define SYSFS_NAME_ATTRIBUTE    "name"
#define SYSFS_MOD_PARM_NAME     "parameters"
#define SYSFS_MOD_SECT_NAME     "sections"
#define SYSFS_UNKNOWN           "unknown"
#define SYSFS_PATH_ENV          "SYSFS_PATH"

The library uses some definitions to mark maximum size of a sysfs name or
path length:

#define SYSFS_PATH_MAX          256
#define SYSFS_NAME_LEN          64
#define SYSFS_BUS_ID_SIZE       32


NOTE:
     a. As of release 0.4.0 of sysfsutils, a number of changes have been
	made so that the dlists and "directory" references in all libsysfs's
	structures are not populated until such time that it is absolutely
	necessary. Hence, these elements may not contain valid data at all
	times (as was the case before).
     b. As of release 1.0.0 of sysfsutils, all dlists in the library are
	sorted in alphabetical order. It is now a requirement that the
	"name" and "path" be the first two elements of all libsysfs
	structures.
     c. There has been a major overhaul with 2.0.0 release of sysfsutils.
	We now have a much leaner and meaner library without the overhead
	of the sysfs_directory and related structures. The API list has
	also been pruned to contain the most frequently used calls and
	the lists are not populated all at once. This has lead to enormous
	speed improvements as well as reduction in the number of system
	calls.


5.1 Attribute Data Structure
-------------------------------------------

The library implements structure to represent sysfs files.

A file in sysfs represents a device or driver attribute. Attributes can be
read only, write only, or read and write. File data can be ASCII and
binary. The library has the following structure to represent files:

struct sysfs_attribute {
        char name[SYSFS_NAME_LEN];
        char path[SYSFS_PATH_MAX];
        char *value;
        unsigned short len;             	/* value length */
        enum sysfs_attribute_method method;	/* show and store */
};

Path represents the file/attribute's full path. Value is used when reading
from or writing to an attribute. "len" is the length of data in "value".
Method is an enum for defining if the attribute supports show(read) and/or
store(write).


5.2 Bus Data Structure
----------------------

All buses look similar in sysfs including lists of devices and drivers,
therefore we use the following structure to represent all sysfs buses:

struct sysfs_bus {
        char name[SYSFS_NAME_LEN];
        char path[SYSFS_PATH_MAX];
	struct dlist *attrlist;

        /* Private: for internal use only */
        struct dlist *drivers;
        struct dlist *devices;
};

The sysfs_bus structure contains the bus "name", while the "path" to bus
directory is also stored. It also contains lists of devices on the bus
and drivers that are registered on it.


5.3 Class Data Structures
-------------------------

The library uses two data structures to represent classes in sysfs. Sysfs
classes contains a class directory like "net" or "scsi_host" and then
class devices like "eth0", "lo", or "eth1" for the "net" class.

struct sysfs_class {
        char name[SYSFS_NAME_LEN];
        char path[SYSFS_PATH_MAX];
	struct dlist *attrlist;

        /* Private: for internal use only */
        struct dlist *devices;
};

The sysfs_class represents device classes in sysfs like "net". It contains
the class "name", "path" to the class and a list of class devices

struct sysfs_class_device {
        char name[SYSFS_NAME_LEN];
        char path[SYSFS_PATH_MAX];
	struct dlist *attrlist;
        char classname[SYSFS_NAME_LEN];

        /* Private: for internal use only */
        struct sysfs_class_device *parent;
        struct sysfs_device *sysdevice;         /* NULL if virtual */
};

A class device isn't the same as a sysfs_device, it's specific to the class in
which it belongs. The class device structure contains the name of the class
the class device belongs to and its sysfs_device reference. It also contains
the name of the class device - like "eth0", its parent (if present).

5.4 Device Data Structure
-------------------------

The sysfs_device structure represents a system device that's exposed
in sysfs under the /sys/devices directory structure.

struct sysfs_device {
	char name[SYSFS_NAME_LEN];
	char path[SYSFS_PATH_MAX];
	struct dlist *attrlist;
	char bus_id[SYSFS_NAME_LEN];
	char bus[SYSFS_NAME_LEN];
	char driver_name[SYSFS_NAME_LEN];
	char subsystem[SYSFS_NAME_LEN];

	/* Private: for internal use only */
	struct sysfs_device *parent;
	struct dlist *children;
};

The sysfs_device structure contains a "parent" pointer, a list of child
devices, if any, device's directory, its bus id - which is the name of
device's directory, the bus name on which this device is registered and
its driver name. The device structure also contains the absolute path
to the device.


5.5 Driver Data Structure
-------------------------

The sysfs_driver structure represents a device driver.

struct sysfs_driver {
        char name[SYSFS_NAME_LEN];
        char path[SYSFS_PATH_MAX];
	struct dlist *attrlist;
	char bus[SYSFS_NAME_LEN];

        /* Private: for internal use only */
	struct sysfs_module *module;
        struct dlist *devices;
};

The sysfs_driver structure contains a list of devices that use this driver,
the name of the driver, the module it is using and a list of attributes
for the driver.


5.6 Module Data Structure
-------------------------
The sysfs_module structure represents the module loaded in the system.

struct sysfs_module {
        char name[SYSFS_NAME_LEN];
        char path[SYSFS_PATH_MAX];
        struct dlist *attrlist;
        struct dlist *parmlist;
        struct dlist *sections;
};

The sysfs_module structure contains a list of attributes, parameters and
sections used by the corresponding module. It also contains name of the
module, its path. The following functions can be used to retrive the
information related to the module.

struct dlist *sysfs_get_module_parms(struct sysfs_module *module)
struct dlist *sysfs_get_module_sections(struct sysfs_module *module)
struct dlist *sysfs_get_module_attributes(struct sysfs_module *module)

6. Functions
------------

Libsysfs will provide functions to access system devices by bus, by class,
and by device. Functions will act like accessing directories and files,
using "open" and "close". Open returns a structure and close is used
to clean that structure up.


6.1 Calling Conventions in Libsysfs
-----------------------------------

Libsysfs uses a simple API calling convention. APIs are classified to be
one of "open", "get", "close" types. The convention is as follows:

	a. All "open" APIs have a corresponding "close" API.
	b. References obtained using "get" calls should not be closed
		explicitly.
	c. All "opened" references have to be closed with a call to
		their corresponding "close" call. This takes care of
		freeing structure references obtained with "get" calls.


6.2 Utility Functions
---------------------

The library will provide a few utility functions for working with sysfs.

-------------------------------------------------------------------------------
Name:		sysfs_get_mnt_path

Description:	Function finds the mount path for filesystem type "sysfs".

Arguments:	char *mnt_path		Mount path buffer
		size_t len		Size of mount path buffer

Returns:	Zero with success.
		-1 with error. Errno will be set with error:
			- EINVAL for invalid argument, if buffer is NULL or
				if len is zero

Prototype:	sysfs_get_mnt_path(char *mnt_path, size_t len);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_name_from_path

Description:	Function returns the last directory or file name from the
		included path.

Arguments:	const char *path	Path to parse name from
		char *name		Buffer to put parsed name into
		size_t *len		Size of name buffer

Returns:	0 with success.
		-1 on Error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	int sysfs_get_name_from_path(const char *path,
					char *name, size_t *len)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_link

Description:	Sysfs readlink function, reads the link at supplied path
		and returns its target path.

Arguments:	const char *path	Link's path
		char *target		Buffer to place link's target
		size_t len		Size of target buffer

Returns:	0 with success
		-1 with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	int sysfs_get_link(const char *path, char *target, size_t len)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_list

Description:	Closes a given dlist. This can be used as a generic list close
		routine.

Arguments:	struct dlist *list	List to be closed

Prototype:	void sysfs_close_list(struct dlist *list)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_path_is_dir

Description:	Utility function to verify if a given path is to a directory.

Arguments:	const char *path	Path to verify

Returns:	0 on success, 1 on error
			- EINVAL for invalid arguments

Prototype:	int sysfs_path_is_dir(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_path_is_file

Description:	Utility function to verify if a given path is to a file.

Arguments:	const char *path	Path to verify

Returns:	0 on success, 1 on error
			- EINVAL for invalid arguments

Prototype:	int sysfs_path_is_file(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_path_is_link

Description:	Utility function to verify if a given path is to a link.

Arguments:	const char *path	Path to verify

Returns:	0 on success, 1 on error
			- EINVAL for invalid arguments

Prototype:	int sysfs_path_is_link(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_directory_list

Description:	Utility function to get list of all directories under path.

Arguments:	const char *path	Path to read

Returns:	Directory list on success, NULL on error

Prototype:	struct dlist *sysfs_open_directory_list(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_link_list

Description:	Utility function to get list of all links under path.

Arguments:	const char *path	Path to read

Returns:	Links list on success, NULL on error

Prototype:	struct dlist *sysfs_open_link_list(const char *path)
-------------------------------------------------------------------------------

6.3 Attribute Functions
------------------------

Libsysfs provides a set of functions to open, read, and close attributes in sysfs. These functions mirror their filesystem function counterparts.

Along with the usual open, read, and close functions, libsysfs provides
a couple other functions for accessing attribute values.

-------------------------------------------------------------------------------
Name:		sysfs_open_attribute

Description:	Opens up a file in sysfs and creates a sysfs_attribute
		structure. File isn't read with this function.

Arguments:	const char *path	File/Attribute's path

Returns:	struct sysfs_attribute * with success.
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_attribute *sysfs_open_attribute(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_attribute

Description:	Cleans up and closes sysfs_attribute structure.

Arguments:	struct sysfs_attribute *sysattr	Attribute to close

Prototype:	void sysfs_close_attribute(struct sysfs_attribute *sysattr)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_read_attribute

Description:	Reads the supplied attribute. Since the maximum transfer
		from a sysfs attribute is a pagesize, function reads in
		up to a page from the file and stores it in the "value"
		field in the attribute.

Arguments:	struct sysfs_attribute *sysattr		Attribute to read

Returns:	0 with success.
		-1 with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	int sysfs_read_attribute(struct sysfs_attribute *sysattr)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_write_attribute

Description:	Writes to the supplied attribute. Function validates if the
		given attribute is writable, and writes the new value to the
		attribute. Value to write as well as its length is user
		supplied. In case the length written is not equal to the
		length requested to be written, the original value is
		restored and an error is returned.

Arguments:	struct sysfs_attribute *sysattr		Attribute to write to
		const char *new_value			sysattr's new value
		size_t len				Length of "new_value"

Returns:	0 with success.
		-1 with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	int sysfs_write_attribute(struct sysfs_attribute *sysattr,
				const char *new_value, size_t len)
-------------------------------------------------------------------------------

6.4 Bus Functions
-----------------

The library provides a functions for viewing buses represented in sysfs.
The sysfs_open_bus opens a bus in the /sys/bus directory, such as "pci",
"usb", or "scsi". The open command returns a sysfs_bus structure that
contains a list of the bus' devices. The sysfs_close_bus function is
used to clean up the bus structure. Given a device or a driver,
functions are provided to determine what bus they are on.

-------------------------------------------------------------------------------
Name:		sysfs_open_bus

Description:	Function opens up one of the buses represented in sysfs in
		the /sys/bus directory. It returns a sysfs_bus structure
		that includes a list of bus devices and drivers.

Arguments:	const char *name	Bus name to open, like "pci"...

Returns:	struct sysfs_bus * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_bus *sysfs_open_bus(const char *name)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_bus

Description:	Function closes up the sysfs_bus structure including its
		devices, and drivers and the list of attributes.

Arguments:	sysfs_bus *bus		Bus structure to close

Prototype:	void sysfs_close_bus(struct sysfs_bus *bus)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_bus_devices

Description:	Function returns a list of devices that are registered with
		this bus.

Arguments:	struct sysfs_bus *bus	Bus whose devices list to return

Returns:	struct dlist * of sysfs_devices on success
		NULL with error. Errno will be sent with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_bus_devices(struct sysfs_bus *bus)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_bus_drivers

Description:	Function returns a list of drivers that are registered with
		this bus.

Arguments:	struct sysfs_bus *bus	Bus whose drivers list to return

Returns:	struct dlist * of sysfs_drivers on success
		NULL with error. Errno will be sent with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_bus_drivers(struct sysfs_bus *bus)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_bus_device

Description:	Function takes a sysfs_bus structure(obtained on a successful
		return from a sysfs_open_bus() call) and looks for the given
		device on this bus. On success, it returns a sysfs_device
		structure corresponding to the device.

Arguments:	struct sysfs_bus *bus	Bus structure on which to search
		char *id		Device to look for

Returns:	struct sysfs_device * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_device *sysfs_get_bus_device
				(struct sysfs_bus *bus, char *id)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_bus_driver

Description:	Function takes a sysfs_bus structure (obtained on a successful
		return from a sysfs_open_bus() call) and looks for the given
		driver on this bus. On success, it returns a sysfs_driver
		structure corresponding to the driver.

Arguments:	struct sysfs_bus *bus	Bus structure on which to search
		char *drvname		Driver to look for

Returns:	struct sysfs_driver * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_device *sysfs_get_bus_driver
				(struct sysfs_bus *bus, char *drvname)
-------------------------------------------------------------------------------

6.5 Class Functions
-------------------

Libsysfs provides functions to open sysfs classes and their class devices.
These functions too operate with open and close, close must be called to
clean up the class structures. Given a class device name, functions are
provided to determine what class they belong to. Once a class device
name and the class it belongs to is known, a function to open the
class device is provided. This method can be used when details of
a single class device is required.

-------------------------------------------------------------------------------
Name:		sysfs_open_class

Description:	Function opens up one of the classes represented in sysfs in
		the /sys/class directory. It returns a sysfs_class structure
		that includes a list of class devices.

Arguments:	const char *name	Class name to open, like "net"..

Returns:	struct sysfs_class * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_class *sysfs_open_class(const char *name)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_class

Description:	Function closes up the sysfs_class structure including its
		class devices.

Arguments:	sysfs_class *cls	Class structure to close

Prototype:	void sysfs_close_class(struct sysfs_class *cls);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_class_device_path

Description:	Function opens up one of the class devices represented in
		sysfs in sysfs/class/"class"/ directory. It returns a
		sysfs_class_device structure.

Arguments:	const char *path	Path to class device

Returns:	struct sysfs_class_device * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_class_device *sysfs_open_class_device_path
					(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_class_device

Description:	Function closes up the sysfs_class_device structure.

Arguments:	sysfs_class_device *dev	Class device structure to close

Prototype:	void sysfs_close_class_device(struct sysfs_class_device *dev)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_class_device

Description:	Function takes a sysfs_class structure(obtained on a successful
		return from a sysfs_open_class() call) and looks for the given
		device in this class. On success, it returns a
		sysfs_class_device structure corresponding to the class device.

Arguments:	struct sysfs_class *cls		Class on which to search
		char *name			Class device "name" to look for

Returns:	struct sysfs_class_device * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_class_device *sysfs_get_class_device
				(struct sysfs_class *cls, char *name)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_class_devices

Description:	Function returns a list of class devices for the given class.

Arguments:	struct sysfs_class *cls		Class whose class device list
						is required

Returns:	struct dlist * of sysfs_class_devices on success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_class_devices(struct sysfs_class *cls)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_class_device

Description:	Given the name of the class on which to look for, this function
		locates a given class device and returns a sysfs_class_device
		structure corresponding to the requested class device.

	NOTE:
		1. The sysfs_class_device structure obtained upon successful
		   return from this function has to be closed by calling
		   sysfs_close_class_device().
		2. Class this device belongs to must be known prior to calling
		   this function.

Arguments:	const char *classname	Class on which to search
		char *name		Class device "name" to open

Returns:	struct sysfs_class_device * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_class_device *sysfs_open_class_device
			(const char *classname, char *name)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_classdev_device

Description:	Function returns the sysfs_device reference (if present) for the
		given class device.

Arguments:	struct sysfs_class_device *clsdev	Class device whose
							sysfs_device reference
							is required

Returns:	struct sysfs_device * on success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_device *sysfs_get_classdev_device
					(struct sysfs_class_device *clsdev)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_classdev_parent

Description:	Function returns the sysfs_class_device reference for the
		parent (if present) of the given class device.

Arguments:	struct sysfs_class_device *clsdev	Class device whose
							parent reference
							is required

Returns:	struct sysfs_class_device * on success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_class_device *sysfs_get_classdev_parent
					(struct sysfs_class_device *clsdev)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_classdev_attributes

Description:	Function takes a sysfs_class_device structure and returns a
		list of attributes for the class device.

Arguments:	struct sysfs_class_device *cdev		Class device for which
							attributes are required

Returns:	struct dlist * of attributes with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_classdev_attributes
					(struct sysfs_class_device *cdev)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_classdev_attr

Description:	Searches supplied class device's attributes by name and returns
		the attribute.

Arguments:	struct sysfs_class_device *clsdev	Device to search
		const char *name			Attribute name to find

Returns:	struct sysfs_attribute * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_attribute *sysfs_get_classdev_attr
		(struct sysfs_class_device *clsdev, const char *name)
-------------------------------------------------------------------------------

6.6 Device Functions
--------------------

Devices represent everything in sysfs under /sys/devices, which is a
hierarchical view of system devices. Besides the expected open and
close functions, libsysfs provides open and close functions for
root devices. These functions recursively open or close a device
and all of its children.

-------------------------------------------------------------------------------
Name:		sysfs_open_device_path

Description:	Opens up a device at a specific path. It opens the device's
		directory, reads the directory, and returns a sysfs_device
		structure.

Arguments:	const char *path	Path to device

Returns:	struct sysfs_device * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_device *sysfs_open_device_path(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_device

Description:	Function closes up the sysfs_device structure.

Arguments:	sysfs_device *dev		Device structure to close

Prototype:	void sysfs_close_device(struct sysfs_device *dev)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_device_tree

Description:	Function opens up the device tree at the specified path.

Arguments:	const char *path	Path at which to open the device tree

Returns:	struct sysfs_device * with success
		NULL with error, Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_device *sysfs_open_device_tree(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_device_tree

Description:	Function closes the device tree originating at the given
		sysfs_device.

Arguments:	struct sysfs_device *devroot	Device from which the device
						tree has to be closed

Prototype:	void sysfs_close_device_tree(struct sysfs_device *devroot)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_device_parent

Description:	Function returns the sysfs_device reference for the parent
		(if present) of the given sysfs_device.

Arguments:	struct sysfs_device *dev	sysfs_device whose parent
						reference is required

Returns:	struct sysfs_device * on success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_device *sysfs_get_device_parent
						(struct sysfs_device *dev)
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
Name:		sysfs_get_device_attr

Description:	Searches supplied device's attributes by name and returns
		the attribute.

Arguments:	struct sysfs_device *dev	Device to search
		const char *name		Attribute name to find

Returns:	struct sysfs_attribute * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_attribute *sysfs_get_device_attr
			(struct sysfs_device *dev, const char *name)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_device_attributes

Description:	Function takes a sysfs_device structure and returns a list
		of attributes for the device.

Arguments:	struct sysfs_device *device	Device for which
						attributes are required

Returns:	struct dlist * of attributes with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_device_attributes
					(struct sysfs_device *device)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_device

Description:	Given the name of the bus on which to look for, this function
		locates a given device and returns a sysfs_device structure
		corresponding to the requested device.

Arguments:	const char *bus		Bus on which to search
		const char *bus_id	Device to look for

Returns:	struct sysfs_device * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_device *sysfs_open_device
			(const char *bus, const char *bus_id)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_device_bus

Description:	Given a sysfs_device, this function fills in the bus this
		device is on in the sysfs_device->bus field.

Arguments:	struct sysfs_device *dev	Device whose bus name to find

Returns:	0 with success.
		-1 with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	int sysfs_get_device_bus(struct sysfs_device *dev)
-------------------------------------------------------------------------------

6.7 Driver Functions
--------------------

Drivers are represented in sysfs under the /sys/bus/xxx/drivers (xxx being
the bus type, such as "pci", "usb, and so on). Functions are provided to
open and close drivers.

-------------------------------------------------------------------------------
Name:		sysfs_open_driver_path

Description:	Opens driver at specific path.

Arguments:	const char *path	Path to driver

Returns:	struct sysfs_driver * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_driver *sysfs_open_driver_path(const char *path)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_close_driver

Description:	Closes and cleans up sysfs_driver structure.

Arguments:	sysfs_driver *driver	Driver structure to close

Prototype:	void sysfs_close_driver(struct sysfs_driver *driver)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_driver_devices

Description:	Function returns a list of devices that use this driver.

Arguments:	struct sysfs_driver *driver	Driver whose devices list is
						required

Returns:	struct dlist * of sysfs_devices on success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_driver_devices
					(struct sysfs_driver *driver)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_driver_attr

Description:	Searches supplied driver's attributes by name and returns
		the attribute.

Arguments:	struct sysfs_driver *drv	Driver to search
		const char *name		Attribute name to find

Returns:	struct sysfs_attribute * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_attribute *sysfs_get_driver_attr
			(struct sysfs_driver *drv, const char *name)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_driver_attributes

Description:	Function takes a sysfs_driver structure and returns a list
		of attributes for the driver.

Arguments:	struct sysfs_driver *driver	Driver for which attributes
						are required

Returns:	struct dlist * of attributes with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_driver_attributes
					(struct sysfs_driver *driver)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_driver

Description:	Given the name of the bus on which to look for, this function
		locates a given driver and returns a sysfs_driver structure
		corresponding to the requested device.

	NOTE:
		1. The sysfs_driver structure obtained upon successful return
		   from this function has to be closed by calling
		   sysfs_close_driver_by_name().

Arguments:	const char *bus_name	Bus on which to search
		const char *drv_name	Driver name to look for

Returns:	struct sysfs_driver * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct sysfs_driver *sysfs_open_driver(const char *bus_name,
							const char *drv_name)
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_driver_module

Description:	Function takes a sysfs_driver structure and returns the module
		that the driver is using.

Arguments:	struct sysfs_driver *drv	Driver for which the module
						details are required

Returns:	struct sysfs_module * with success
		NULL with error. Errno will be set with error, returning
			- EINVAL for invalid arguments

Prototype:	struct dlist *sysfs_get_driver_module
					(struct sysfs_driver *drv)
-------------------------------------------------------------------------------


6.8 Module Functions
--------------------

Modules are represented in sysfs under the /sys/module. Functions are provided
to open and close modules.

-------------------------------------------------------------------------------
Name:		sysfs_close_module

Description:	Closes and cleans up the sysfs_module structure

Arguments:	struct sysfs_module *module	sysfs_module device to close

Prototype:	void sysfs_close_module(struct sysfs_module *module);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_module_path

Description:	Opens and populates the sysfs_module struct

Arguments:	const char *path		path to the module to open

Returns:	struct sysfs_module * with success and NULL if error

Prototype:	struct sysfs_module *sysfs_open_module_path(const char *path);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_open_module

Description:	Opens specific module on a system

Arguments:	const char *name		Name of the module to open

Returns:	struct sysfs_module * with success or NULL if error

Prototype:	struct sysfs_module *sysfs_open_module(const char *name);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_module_parms

Description:	Get modules list of parameters

Arguments:	sysfs_module whose parmameter list is required

Returns:	dlist of parameters on SUCCESS and NULL on error

Prototype:	struct dlist *sysfs_get_module_parms(struct sysfs_module *module);
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Name:		sysfs_get_module_sections

Description:	Get the set of sections for this module

Arguments:	sysfs_module whose list of sections is required

Returns:	dlist of sections on SUCCESS and NULL on error

Prototype:	struct dlist *sysfs_get_module_sections(struct sysfs_module *module);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_module_attributes

Description:	Get dlist of attributes for the requested sysfs_module

Arguments:	sysfs_module for which attributes are needed

Returns:	a dlist of attributes if exists, NULL otherwise

Prototype:	struct dlist *sysfs_get_module_attributes(struct sysfs_module *module);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_module_attr

Description:	searches module's attributes by name

Arguments:	module: to look through
		name: name of the attribute

Returns:	sysfs_attribute reference with success or NULL with error

Prototype:	struct sysfs_attribute *sysfs_get_module_attr
		(struct sysfs_module *module, const char *name);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_module_parm

Description:	searches module's parameters by name

Arguments:	sysfs_module: to look through
		parm: parameter name

Returns:	sysfs_attribute on SUCCESS and NULL on error

Prototype:	struct sysfs_attribute *sysfs_get_module_parm
			(struct sysfs_module *module, const char *parm);
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Name:		sysfs_get_module_section

Description:	searches module's sections by name

Arguments:	sysfs_module: to look through
		section: section name

Returns:	sysfs_attribute * on SUCCESS and NULL on error

Prototype:	struct sysfs_attribute *sysfs_get_module_section
			(struct sysfs_module *module, const char *section);
-------------------------------------------------------------------------------


7 Dlists
--------

Libsysfs uses (yet another) list implementation thanks to Eric J Bohm.


7.1 Navigating a dlist
----------------------

Some library functions return a dlist of devices/drivers/attributes, etc.
To navigate the list returned the macro "dlist_for_each_data" is to be used.

------------------------------------------------------------------------------
Function/Macro name:    dlist_for_each_data

Description:            Walk the given list, returning a known data type/
                        structure in each iteration.

Arguments:              struct dlist *list      List pointer
                        data_iterator           Data type/structure variable
			                        contained in the list
			datatype                Data type/structure contained
						in the list

Returns:                On each iteration, "data_iterator" will contain a list
			element of "datatype"

Usage example:          The function sysfs_get_classdev_attributes() returns a
			dlist of attributes. To navigate the list:

			struct sysfs_attribute *attr = NULL;
			struct dlist *attrlist = NULL;
			.
			.
			.
			attrlist = sysfs_get_classdev_attributes
					(struct sysfs_class_device *cdev)
			if (attrlist != NULL) {
				dlist_for_each_data(attrlist, attr,
						struct sysfs_attribute) {
				.
				.
				.
				}
			}
-------------------------------------------------------------------------------


7.2 Custom sorting using dlist_sort_custom()
--------------------------------------------

As of release 1.2.0, libsysfs provides a new interface for custom sorting
of dlists. The API dlist_sort_custom() has been added for this purpose.
Applications that would like to define their own sorter function can now
make use of this API.

The sorter function must conform to the following prototype:

	int compare(void *a, void*b)

dlist_sort_custom() expects that the compare function will:
	return >0 for a before b
	return <0 for b before a
	return  0 for a == b

7.3 Custom filtering and sorting using dlist_filter_sort()
----------------------------------------------------------

From release 2.0.0, libsysfs provides a new interface for custom filtering
and sorting of dlists. This API is similar to scandir() system call.
Applications can call this API with the following arguments: the list, pointer
to the filter function, pointer to the sorter function as in
dlist_sort_custom.

The filter function must conform to the following prototype:

	int filter(void *a)

dlist_filter_sort expects that the filter function will:
	return 0 for unwanted nodes
	return 1 for required nodes

8. Usage
--------

Accessing devices through libsysfs is supposed to mirror accessing devices
in the filesystem it represents. Here's a typical order of operation:

	- get sysfs mount point
	- "open" sysfs category, ie. bus, class, or device
	- work with category
	- "close" sysfs category


9. Testsuite
------------

From version 2.0.0 sysfsutils ships with a comprehensive testsuite. The
testsuite shipped as part of the "test" directory of the sysfsutils source
package, results in an executable "testlibsysfs". Some of the salient
features of the testsuite are:

a. Tests _every_ API exported by the library.
b. Tests are performed for all possible combinations of input parameters.
c. Detailed output is provided for the correct case.
d. Facility to redirect output of the tests to a normal file.
e. Number of iterations of tests can be specified.

The testsuite comes with its own configuration file "libsysfs.conf" in the
"test" directory. This file is used to generate a header file at the time
the tests are built.

To use the testsuite:

a. Modify the variables libsysfs.conf file to appropriate values for your
   system. (The libsysfs.conf file contains comments describing what each
   variable stands for and, in some cases, how to determine an appropriate
   value for the system under test).


b. Build testsuite.

c. Run the testsuite:

	testlibsysfs <number of iterations> <logfile>

The default logfile is stdout.

NOTE: If the libsysfs.conf file is changed, make sure to run "make clean" in
the test directory and then a "make" for the changes to take effect.


10. Conclusion
--------------

Libsysfs is meant to provide a stable application programming interface to
sysfs. Applications can depend upon the library to access system devices
and functions exposed through sysfs.
