| /* 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 *mount_path, |
| 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: optional expected dev_t of the node. |
| * @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) |
| * 1 on no existing @path |
| * 2 @path exists but the dev_t value is mismatched. |
| * |
| * Nb, this function does NOT search /dev for a match. It performs a normal |
| * string concatenation and probes for the existence. If udev has moved, |
| * or otherwise renamed, the device, a positive value is returned. |
| * The caller may then use the dev_t and @path to create the node with |
| * mknod(2). |
| */ |
| int rootdev_get_path(char *path, size_t size, const char *device, dev_t dev, |
| 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_ */ |