libblkid - a library to handle device identification and token extraction

Basic usage is as follows - there are two normal usage patterns:

For cases where a program wants information about multiple devices, or
expects to be doing multiple token searches, the program should
directly initialize cache file via (second parameter is cache
filename, NULL = default):

	blkid_cache cache = NULL;
	if (blkid_get_cache(&cache, NULL) < 0)
		/* error reading the cache file, not really fatal */

Note that if no cache file exists, an empty cache struct is still
allocated.  Usage of libblkid functions will use the cache to avoid
needless device scans.

The model of the blkid cache is that each device has a number of
attributes that can be associated with it.  Currently the attributes
which are supported (and set) by blkid are:

	TYPE		filesystem type
	UUID		filesystem uuid
	LABEL		filesystem label


How to use libblkid?  Normally, you either want to find a device with
a specific NAME=value token, or you want to output token(s) from a
device.  To find a device that matches a following attribute, you
simply call the blkid_get_devname() function:

	if ((devname = blkid_get_devname(cache, attribute_name, value))) {
		/* do something with devname */
		string_free(devname);
	}

The cache parameter is optional; if it is NULL, then the blkid library
will load the default blkid.tab cache file, and then release the cache
before function call returns.  The return value is an allocated string
which holds the resulting device name (if it is found).  If the value
is NULL, then attribute_name is parsed as if it were
"<attribute_name>=<value>"; if it cannot be so parsed, then the
original attribute_name is returned in a copied allocated string.
This is a convenience to allow user programs to want to translate user
input, whether it is of the form: "/dev/hda1", "LABEL=root",
"UUID=082D-26E3", and get back a device name that it can use.

Alternatively, of course, the programmer can pass an attribute name of
"LABEL", and value of "root", if that is more convenient.

Another common usage is to retrieve the value of a specific attribute
for a particular device.  This can be used to determine the filesystem
type, or label, or uuid for a particular device:

	if ((value = blkid_get_tag_value(cache, attribute_name, devname))) {
		/* do something with value */
		string_free(value);
	}

If a program needs to call multiple blkid functions, then passing in a
cache value of NULL is not recommended, since the /etc/blkid.tab file
will be repeatedly parsed over and over again, with memory allocated
and deallocated.  To initialize the blkid cache, blkid_get_cache()
function is used:

	if (blkid_get_cache(&cache, NULL) < 0)
		goto errout;

The second parameter of blkid_get_cache (if non-zero) is the alternate
filename of the blkid cache file (where the default is
/etc/blkid.tab).  Normally, programs should just pass in NULL.

If you have called blkid_get_cache(), you should call blkid_put_cache()
when you are done using the blkid library functions.  This will save the
cache to the blkid.tab file, if you have write access to the file.  It
will also free all associated devices and tags:

	blkid_put_cache(cache);
