summaryrefslogtreecommitdiffstats
path: root/rootdev.h
diff options
context:
space:
mode:
Diffstat (limited to 'rootdev.h')
-rw-r--r--rootdev.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/rootdev.h b/rootdev.h
new file mode 100644
index 0000000..03b8bd8
--- /dev/null
+++ b/rootdev.h
@@ -0,0 +1,104 @@
+/* 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.
+ *
+ * Returns 0 on success, non-zero on failure.
+ * It is safe for @device == @slave.
+ */
+int 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_ */