xref: /illumos-gate/usr/src/cmd/zpool/zpool_util.c (revision e7afc443cb8c2e0a379fe48b15a0c7fb61a4b2fc)
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 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #include <errno.h>
27 #include <libgen.h>
28 #include <libintl.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <strings.h>
32 #include <ctype.h>
33 #include <sys/sysmacros.h>
34 
35 #include "zpool_util.h"
36 
37 /*
38  * Utility function to guarantee malloc() success.
39  */
40 void *
41 safe_malloc(size_t size)
42 {
43 	void *data;
44 
45 	if ((data = calloc(1, size)) == NULL) {
46 		(void) fprintf(stderr, "internal error: out of memory\n");
47 		exit(1);
48 	}
49 
50 	return (data);
51 }
52 
53 /*
54  * Display an out of memory error message and abort the current program.
55  */
56 void
57 zpool_no_memory(void)
58 {
59 	assert(errno == ENOMEM);
60 	(void) fprintf(stderr,
61 	    gettext("internal error: out of memory\n"));
62 	exit(1);
63 }
64 
65 /*
66  * Return the number of logs in supplied nvlist
67  */
68 uint_t
69 num_logs(nvlist_t *nv)
70 {
71 	uint_t nlogs = 0;
72 	uint_t c, children;
73 	nvlist_t **child;
74 
75 	if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
76 	    &child, &children) != 0)
77 		return (0);
78 
79 	for (c = 0; c < children; c++) {
80 		uint64_t is_log = B_FALSE;
81 
82 		(void) nvlist_lookup_uint64(child[c], ZPOOL_CONFIG_IS_LOG,
83 		    &is_log);
84 		if (is_log)
85 			nlogs++;
86 	}
87 	return (nlogs);
88 }
89 
90 /* Find the max element in an array of uint64_t values */
91 uint64_t
92 array64_max(uint64_t array[], unsigned int len)
93 {
94 	uint64_t max = 0;
95 	int i;
96 	for (i = 0; i < len; i++)
97 		max = MAX(max, array[i]);
98 
99 	return (max);
100 }
101 
102 /*
103  * Return 1 if "str" is a number string, 0 otherwise.  Works for integer and
104  * floating point numbers.
105  */
106 int
107 isnumber(char *str)
108 {
109 	for (; *str; str++)
110 		if (!(isdigit(*str) || (*str == '.')))
111 			return (0);
112 
113 	return (1);
114 }
115