root/usr/src/lib/libvolmgt/volmgt.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1993, by Sun Microsystems, Inc.
 */

#ifndef _VOLMGT_H
#define _VOLMGT_H

#ifdef  __cplusplus
extern "C" {
#endif

#include <sys/types.h>

/*
 * volmgt_check:
 *      have volume management look at its devices to check
 *      for media having arrived.  Since volume management can't
 *      automatically check all types of devices, this function is provided
 *      to allow applications to cause the check to happen automatically.
 *
 * arguments:
 *      path - the name of the device in /dev.  For example,
 *        /dev/rdiskette.  If path is NULL, all "checkable" devices are
 *        checked.
 *
 * return value(s):
 *      TRUE if media was found in the device, FALSE if not.
 */
int volmgt_check(char *path);

/*
 * volmgt_inuse:
 *      check to see if volume management is currently
 *      managing a particular device.
 *
 * arguments:
 *      path - the name of the device in /dev.  For example,
 *        "/dev/rdiskette".
 *
 * return value(s):
 *      TRUE if volume management is managing the device, FALSE if not.
 */
int volmgt_inuse(char *path);

/*
 * volmgt_running:
 *      check to see if volume management is running.
 *
 * arguments:
 *      none.
 *
 * return value(s):
 *      TRUE if volume management is running, FALSE if not.
 */
int volmgt_running(void);

/*
 * volmgt_symname:
 *      Returns the volume management symbolic name
 *      for a given device.  If an application wants to determine
 *      what the symbolic name (e.g. "floppy0") for the /dev/rdiskette
 *      device would be, this is the function to use.
 *
 * arguments:
 *      path - a string containing the /dev device name.  For example,
 *      "/dev/diskette" or "/dev/rdiskette".
 *
 * return value(s):
 *      pointer to a string containing the symbolic name.
 *
 *      NULL indicates that volume management isn't managing that device.
 *
 *      The string must be free(3)'d.
 */
char    *volmgt_symname(char *path);

/*
 * volmgt_symdev:
 *      Returns the device given the volume management
 *      symbolic name. If an application wants to determine
 *      what the device associated with a particular symbolic name
 *      might be, this is the function to use.
 *
 * arguments:
 *      path - a string containing the symbolic device name.  For example,
 *      "cdrom0" or "floppy0".
 *
 * return value(s):
 *      pointer to a string containing the /dev name.
 *
 *      NULL indicates that volume management isn't managing that device.
 *
 *      The string must be free(3)'d.
 */
char    *volmgt_symdev(char *symname);

/*
 * volmgt_ownspath:
 *      check to see if the given path is contained in
 *      the volume management name space.
 *
 * arguments:
 *      path - string containing the path.
 *
 * return value(s):
 *      TRUE if the path is owned by volume management, FALSE if not.
 *      Will return FALSE if volume management isn't running.
 *
 */
int     volmgt_ownspath(char *path);

/*
 * volmgt_root:
 *      return the root of where the volume management
 *      name space is mounted.
 *
 * arguments:
 *      none.
 *
 * return value(s):
 *      Returns a pointer to a string containing the path to the
 *      volume management root (e.g. "/vol").
 *      Will return NULL if volume management isn't running.
 */
const char      *volmgt_root(void);

/*
 * media_findname:
 *      try to come up with the character device when
 *      provided with a starting point.  This interface provides the
 *      application programmer to provide "user friendly" names and
 *      easily determine the "/vol" name.
 *
 * arguments:
 *      start - a string describing a device.  This string can be:
 *              - a full path name to a device (insures it's a
 *                character device by using getfullrawname()).
 *              - a full path name to a volume management media name
 *                with partitions (will return the lowest numbered
 *                raw partition.
 *              - the name of a piece of media (e.g. "fred").
 *              - a symbolic device name (e.g. floppy0, cdrom0, etc)
 *              - a name like "floppy" or "cdrom".  Will pick the lowest
 *                numbered device with media in it.
 *
 * return value(s):
 *      A pointer to a string that contains the character device
 *      most appropriate to the "start" argument.
 *
 *      NULL indicates that we were unable to find media based on "start".
 *
 *      The string must be free(3)'d.
 */
char    *media_findname(char *start);

/*
 * media_getattr:
 *      returns the value for an attribute for a piece of
 *      removable media.
 *
 * arguments:
 *      path - Path to the media in /vol.  Can be the block or character
 *              device.
 *
 *      attr - name of the attribute.
 *
 * return value(s):
 *      returns NULL or a pointer to a string that contains the value for
 *      the requested attribute.
 *
 *      NULL can mean:
 *       - the media doesn't exist
 *       - there is no more space for malloc(3)
 *       - the attribute doesn't exist for the named media
 *       - the attribute is a boolean and is FALSE
 *
 *      the pointer to the string must be free'd with free(3).
 */
char *media_getattr(char *path, char *attr);

/*
 * media_setattr:
 *      set an attribute for a piece of media to a
 *      particular value.
 *
 * arguments:
 *      path - Path to the media in /vol.  Can be the block or character
 *              device.
 *
 *      attr - name of the attribute.
 *
 *      value - value of the attribute.  If value == "", the flag is
 *          considered to be a boolean that is TRUE.  If value == 0, it
 *          is considered to be a FALSE boolean.
 *
 * return value(s):
 *      TRUE on success, FALSE for failure.
 *
 *      Can fail because:
 *              - don't have permission to set the attribute because caller
 *                is not the owner of the media and attribute is a "system"
 *                attribute.
 *
 *              - don't have permission to set the attribute because the
 *                attribute is a "system" attribute and is read-only.
 */
int     media_setattr(char *path, char *attr, char *value);

/*
 * media_getid:
 *      return the "id" of a piece of media.
 *
 * arguments:
 *      path - Path to the media in /vol.  Can be the block or character
 *              device.
 * return value(s):
 *      returns a u_longlong_t that is the "id" of the volume.
 *
 */
u_longlong_t    media_getid(char *path);

/*
 * volmgt_feature_enabled:
 *      check to see if a volume management feature is available
 *
 * arguments:
 *      feat_str - a string containing the feature to be checked for
 *
 * return value(s):
 *      returns non-zero if the specified feature is available
 *      in volume management, else return zero
 */
int     volmgt_feature_enabled(char *feat_str);

/*
 * volmgt_acquire
 *      try to acquire the volmgt advisory device reservation
 *      for a specific device. -- if volmgt isn't running then try to
 *      reserve the device specified
 *
 * arguments:
 *      dev - a device name to attempt reserving.  This string can be:
 *              - a full path name to a device in /vol if volmgt is running
 *              - a symbolic device name (e.g. floppy0) if volmgt is running
 *              - a /dev pathname if volmgt is not running
 *
 *      id  - a reservation string that hopefully describes the application
 *              making this reservation.
 *
 *      ovr - an override indicator.  If set to non-zero, the caller requests
 *              that this reservation be made unconditionally.
 *
 *      err - the address of a char ptr that will updated to point to the
 *              id argument used when the current device was reserved.  This
 *              is only used when the current reservation attempt fails due
 *              to an already existing reservation for this device.
 *
 *      pidp - a pointer to a pid_t type.  If this argument is not NULL
 *              and the requested device is already reserved, the process
 *              id of the reservation owner will be returned in this
 *              location.
 *
 *
 * return value(s):
 *      A non-zero indicator if successful.
 *
 *      A zero indicator if unsuccessful.  If errno is EBUSY, then the err
 *      argument will be set to point to the string that the process currently
 *      holding the reservation supplied when reserving the device.  It is up
 *      to the caller to release the storage occupied by the string via
 *      free(3C) when no longer needed.
 */
int     volmgt_acquire(char *dev, char *id, int ovr, char **err, pid_t *pidp);

/*
 * the max length for the "id" string in volmgt_acquire
 */
#define VOL_RSV_MAXIDLEN        256

/*
 * volmgt_release:
 *      try to release the volmgt advisory device reservation
 *      for a specific device.
 *
 * arguments:
 *      dev - a device name to attempt reserving.  This string can be:
 *              - a full path name to a device in /vol if volmgt is running
 *              - a symbolic device name (e.g. floppy0) if volmgt is running
 *              - a /dev pathname if volmgt is not running
 *
 * return value(s):
 *      A non-zero indicator if successful
 *      A zero indicator if unsuccessful
 *
 * preconditions:
 *      none
 */
int     volmgt_release(char *dev);

#ifdef  __cplusplus
}
#endif

#endif  /* _VOLMGT_H */