C++程序  |  101行  |  3.23 KB

/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Interface for root device discovery via sysfs with optional
 * bells and whistles.
 */
#ifndef ROOTDEV_ROOTDEV_H_
#define ROOTDEV_ROOTDEV_H_

#include <stdbool.h>
#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * rootdev: returns the path to the root device in @path
 * @path: pre-allocated char array the result will be written to
 * @size: size of @path
 * @full: whether to try to do full resolution. E.g., device-mapper
 * @strip: whether to remove the partition # or not.
 *
 * Returns 0 on success, non-zero on error.
 */
int rootdev(char *path, size_t size, bool full, bool strip);

/* All interface below this point will most definitely be C specific. If
 * we rewrite this as a C++ class, only the above generic interface should
 * still be provided.
 */

/**
 * rootdev_wrapper: rootdev equivalent with paths can be substituted.
 */
int rootdev_wrapper(char *path, size_t size,
                    bool full, bool strip,
                    dev_t *dev,
                    const char *search, const char *dev_path);
/**
 * rootdev_get_device: finds the /dev path for @dev
 * @dst: destination char array
 * @size: size of @dst
 * @dev: dev_t specifying the known root device
 * @search: path to search under. NULL for default.
 *
 * Returns 0 on success, non-zero on error.
 *
 * The name of the devices is placed in @dst. It will not
 * be qualified with /dev/ by default.
 */
int rootdev_get_device(char *dst, size_t size, dev_t dev,
                       const char *search);

/**
 * rootdev_get_device_slave: returns the first device under @device/slaves
 * @slave: destination char array for storing the result
 * @size: size of @slave
 * @dev: pointer to a dev_t to populate
 * @device: name of the device to probe, like "sdb"
 * @search: path to search under. NULL for default.
 *
 * It is safe for @device == @slave.
 */
void rootdev_get_device_slave(char *slave, size_t size, dev_t *dev,
                              const char *device, const char *search);

/**
 * rootdev_get_path: converts a device name to a path in the device tree
 * @path: char array to store the path
 * @size: size of @devpath
 * @device: name of the device
 * @dev_path: path to dev tree. NULL for default (/dev)
 *
 * A @dev of 0 is ignored.
 *
 * @path is populated for all return codes.
 * Returns 0 on success and non-zero on error:
 * -1 on unexpected errors (@path may be invalid)
 *
 * Nb, this function does NOT search /dev for a match.  It performs a normal
 *     string concatenation.
 *     We can't check if the device actually exists as vendors may create an
 *     SELinux context we don't know about for it (in which case, this function
 *     would always fail).
 */
int rootdev_get_path(char *path, size_t size, const char *device,
                     const char *dev_path);

const char *rootdev_get_partition(const char *dst, size_t len);
void rootdev_strip_partition(char *dst, size_t len);
int rootdev_symlink_active(const char *path);
int rootdev_create_devices(const char *name, dev_t dev, bool symlink);

#ifdef __cplusplus
}  /* extern "C" */
#endif

#endif  /* ROOTDEV_ROOTDEV_H_ */