| /* Copyright 2010 The ChromiumOS Authors | |
| * 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_ */ |