1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2018 by Delphix. All rights reserved.
24 * Copyright 2020 Joyent, Inc.
25 */
26
27#ifndef	_LIBZUTIL_H
28#define	_LIBZUTIL_H
29
30#include <sys/nvpair.h>
31#include <sys/fs/zfs.h>
32
33#ifdef	__cplusplus
34extern "C" {
35#endif
36
37/*
38 * Default wait time for a device name to be created.
39 */
40#define	DISK_LABEL_WAIT		(30 * 1000)  /* 30 seconds */
41
42
43/*
44 * Pool Config Operations
45 *
46 * These are specific to the library libzfs or libzpool instance.
47 */
48typedef nvlist_t *refresh_config_func_t(void *, nvlist_t *);
49
50typedef int pool_active_func_t(void *, const char *, uint64_t, boolean_t *);
51
52typedef struct pool_config_ops {
53	refresh_config_func_t	*pco_refresh_config;
54	pool_active_func_t	*pco_pool_active;
55} pool_config_ops_t;
56
57/*
58 * An instance of pool_config_ops_t is expected in the caller's binary.
59 */
60extern const pool_config_ops_t libzfs_config_ops;
61extern const pool_config_ops_t libzpool_config_ops;
62
63typedef struct importargs {
64	char **path;		/* a list of paths to search		*/
65	int paths;		/* number of paths to search		*/
66	const char *poolname;	/* name of a pool to find		*/
67	uint64_t guid;		/* guid of a pool to find		*/
68	const char *cachefile;	/* cachefile to use for import		*/
69	boolean_t can_be_active; /* can the pool be active?		*/
70	boolean_t scan;		/* prefer scanning to libblkid cache    */
71	nvlist_t *policy;	/* load policy (max txg, rewind, etc.)	*/
72} importargs_t;
73
74extern nvlist_t *zpool_search_import(void *, importargs_t *,
75    const pool_config_ops_t *);
76extern int zpool_find_config(void *, const char *, nvlist_t **, importargs_t *,
77    const pool_config_ops_t *);
78
79extern int zpool_read_label(int, nvlist_t **, int *);
80
81extern boolean_t zfs_isnumber(const char *);
82
83/*
84 * Formats for iostat numbers.  Examples: "12K", "30ms", "4B", "2321234", "-".
85 *
86 * ZFS_NICENUM_1024:	Print kilo, mega, tera, peta, exa..
87 * ZFS_NICENUM_BYTES:	Print single bytes ("13B"), kilo, mega, tera...
88 * ZFS_NICENUM_TIME:	Print nanosecs, microsecs, millisecs, seconds...
89 * ZFS_NICENUM_RAW:	Print the raw number without any formatting
90 * ZFS_NICENUM_RAWTIME:	Same as RAW, but print dashes ('-') for zero.
91 */
92enum zfs_nicenum_format {
93	ZFS_NICENUM_1024 = 0,
94	ZFS_NICENUM_BYTES = 1,
95	ZFS_NICENUM_TIME = 2,
96	ZFS_NICENUM_RAW = 3,
97	ZFS_NICENUM_RAWTIME = 4
98};
99
100/*
101 * Convert a number to a human-readable form.
102 */
103extern void zfs_nicebytes(uint64_t, char *, size_t);
104extern void zfs_nicenum(uint64_t, char *, size_t);
105extern void zfs_nicenum_format(uint64_t, char *, size_t,
106    enum zfs_nicenum_format);
107extern void zfs_nicetime(uint64_t, char *, size_t);
108
109#define	nicenum(num, buf, size)	zfs_nicenum(num, buf, size)
110
111extern void zpool_dump_ddt(const ddt_stat_t *, const ddt_histogram_t *);
112extern int zpool_history_unpack(char *, uint64_t, uint64_t *, nvlist_t ***,
113    uint_t *);
114
115/* Part of SPL in OpenZFS */
116extern ulong_t get_system_hostid(void);
117
118#ifdef	__cplusplus
119}
120#endif
121
122#endif	/* _LIBZUTIL_H */
123