1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 * 5 * Interface for root device discovery via sysfs with optional 6 * bells and whistles. 7 */ 8 #ifndef ROOTDEV_ROOTDEV_H_ 9 #define ROOTDEV_ROOTDEV_H_ 10 11 #include <stdbool.h> 12 #include <sys/types.h> 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 17 18 /** 19 * rootdev: returns the path to the root device in @path 20 * @path: pre-allocated char array the result will be written to 21 * @size: size of @path 22 * @full: whether to try to do full resolution. E.g., device-mapper 23 * @strip: whether to remove the partition # or not. 24 * 25 * Returns 0 on success, non-zero on error. 26 */ 27 int rootdev(char *path, size_t size, bool full, bool strip); 28 29 /* All interface below this point will most definitely be C specific. If 30 * we rewrite this as a C++ class, only the above generic interface should 31 * still be provided. 32 */ 33 34 /** 35 * rootdev_wrapper: rootdev equivalent with paths can be substituted. 36 */ 37 int rootdev_wrapper(char *path, size_t size, 38 bool full, bool strip, 39 dev_t *dev, 40 const char *search, const char *dev_path); 41 /** 42 * rootdev_get_device: finds the /dev path for @dev 43 * @dst: destination char array 44 * @size: size of @dst 45 * @dev: dev_t specifying the known root device 46 * @search: path to search under. NULL for default. 47 * 48 * Returns 0 on success, non-zero on error. 49 * 50 * The name of the devices is placed in @dst. It will not 51 * be qualified with /dev/ by default. 52 */ 53 int rootdev_get_device(char *dst, size_t size, dev_t dev, 54 const char *search); 55 56 /** 57 * rootdev_get_device_slave: returns the first device under @device/slaves 58 * @slave: destination char array for storing the result 59 * @size: size of @slave 60 * @dev: pointer to a dev_t to populate 61 * @device: name of the device to probe, like "sdb" 62 * @search: path to search under. NULL for default. 63 * 64 * It is safe for @device == @slave. 65 */ 66 void rootdev_get_device_slave(char *slave, size_t size, dev_t *dev, 67 const char *device, const char *search); 68 69 /** 70 * rootdev_get_path: converts a device name to a path in the device tree 71 * @path: char array to store the path 72 * @size: size of @devpath 73 * @device: name of the device 74 * @dev_path: path to dev tree. NULL for default (/dev) 75 * 76 * A @dev of 0 is ignored. 77 * 78 * @path is populated for all return codes. 79 * Returns 0 on success and non-zero on error: 80 * -1 on unexpected errors (@path may be invalid) 81 * 82 * Nb, this function does NOT search /dev for a match. It performs a normal 83 * string concatenation. 84 * We can't check if the device actually exists as vendors may create an 85 * SELinux context we don't know about for it (in which case, this function 86 * would always fail). 87 */ 88 int rootdev_get_path(char *path, size_t size, const char *device, 89 const char *dev_path); 90 91 const char *rootdev_get_partition(const char *dst, size_t len); 92 void rootdev_strip_partition(char *dst, size_t len); 93 int rootdev_symlink_active(const char *path); 94 int rootdev_create_devices(const char *name, dev_t dev, bool symlink); 95 96 #ifdef __cplusplus 97 } /* extern "C" */ 98 #endif 99 100 #endif /* ROOTDEV_ROOTDEV_H_ */ 101