]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libzfs/libzfs_util.c
Replace libzfs sharing _nfs() and _smb() APIs with protocol lists
[FreeBSD/FreeBSD.git] / lib / libzfs / libzfs_util.c
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 /*
23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright 2020 Joyent, Inc. All rights reserved.
25  * Copyright (c) 2011, 2020 by Delphix. All rights reserved.
26  * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
27  * Copyright (c) 2017 Datto Inc.
28  * Copyright (c) 2020 The FreeBSD Foundation
29  *
30  * Portions of this software were developed by Allan Jude
31  * under sponsorship from the FreeBSD Foundation.
32  */
33
34 /*
35  * Internal utility routines for the ZFS library.
36  */
37
38 #include <errno.h>
39 #include <fcntl.h>
40 #include <libintl.h>
41 #include <stdarg.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <strings.h>
45 #include <unistd.h>
46 #include <math.h>
47 #if LIBFETCH_DYNAMIC
48 #include <dlfcn.h>
49 #endif
50 #include <sys/stat.h>
51 #include <sys/mnttab.h>
52 #include <sys/mntent.h>
53 #include <sys/types.h>
54 #include <sys/wait.h>
55
56 #include <libzfs.h>
57 #include <libzfs_core.h>
58
59 #include "libzfs_impl.h"
60 #include "zfs_prop.h"
61 #include "zfeature_common.h"
62 #include <zfs_fletcher.h>
63 #include <libzutil.h>
64
65 /*
66  * We only care about the scheme in order to match the scheme
67  * with the handler. Each handler should validate the full URI
68  * as necessary.
69  */
70 #define URI_REGEX       "^\\([A-Za-z][A-Za-z0-9+.\\-]*\\):"
71
72 int
73 libzfs_errno(libzfs_handle_t *hdl)
74 {
75         return (hdl->libzfs_error);
76 }
77
78 const char *
79 libzfs_error_action(libzfs_handle_t *hdl)
80 {
81         return (hdl->libzfs_action);
82 }
83
84 const char *
85 libzfs_error_description(libzfs_handle_t *hdl)
86 {
87         if (hdl->libzfs_desc[0] != '\0')
88                 return (hdl->libzfs_desc);
89
90         switch (hdl->libzfs_error) {
91         case EZFS_NOMEM:
92                 return (dgettext(TEXT_DOMAIN, "out of memory"));
93         case EZFS_BADPROP:
94                 return (dgettext(TEXT_DOMAIN, "invalid property value"));
95         case EZFS_PROPREADONLY:
96                 return (dgettext(TEXT_DOMAIN, "read-only property"));
97         case EZFS_PROPTYPE:
98                 return (dgettext(TEXT_DOMAIN, "property doesn't apply to "
99                     "datasets of this type"));
100         case EZFS_PROPNONINHERIT:
101                 return (dgettext(TEXT_DOMAIN, "property cannot be inherited"));
102         case EZFS_PROPSPACE:
103                 return (dgettext(TEXT_DOMAIN, "invalid quota or reservation"));
104         case EZFS_BADTYPE:
105                 return (dgettext(TEXT_DOMAIN, "operation not applicable to "
106                     "datasets of this type"));
107         case EZFS_BUSY:
108                 return (dgettext(TEXT_DOMAIN, "pool or dataset is busy"));
109         case EZFS_EXISTS:
110                 return (dgettext(TEXT_DOMAIN, "pool or dataset exists"));
111         case EZFS_NOENT:
112                 return (dgettext(TEXT_DOMAIN, "no such pool or dataset"));
113         case EZFS_BADSTREAM:
114                 return (dgettext(TEXT_DOMAIN, "invalid backup stream"));
115         case EZFS_DSREADONLY:
116                 return (dgettext(TEXT_DOMAIN, "dataset is read-only"));
117         case EZFS_VOLTOOBIG:
118                 return (dgettext(TEXT_DOMAIN, "volume size exceeds limit for "
119                     "this system"));
120         case EZFS_INVALIDNAME:
121                 return (dgettext(TEXT_DOMAIN, "invalid name"));
122         case EZFS_BADRESTORE:
123                 return (dgettext(TEXT_DOMAIN, "unable to restore to "
124                     "destination"));
125         case EZFS_BADBACKUP:
126                 return (dgettext(TEXT_DOMAIN, "backup failed"));
127         case EZFS_BADTARGET:
128                 return (dgettext(TEXT_DOMAIN, "invalid target vdev"));
129         case EZFS_NODEVICE:
130                 return (dgettext(TEXT_DOMAIN, "no such device in pool"));
131         case EZFS_BADDEV:
132                 return (dgettext(TEXT_DOMAIN, "invalid device"));
133         case EZFS_NOREPLICAS:
134                 return (dgettext(TEXT_DOMAIN, "no valid replicas"));
135         case EZFS_RESILVERING:
136                 return (dgettext(TEXT_DOMAIN, "currently resilvering"));
137         case EZFS_BADVERSION:
138                 return (dgettext(TEXT_DOMAIN, "unsupported version or "
139                     "feature"));
140         case EZFS_POOLUNAVAIL:
141                 return (dgettext(TEXT_DOMAIN, "pool is unavailable"));
142         case EZFS_DEVOVERFLOW:
143                 return (dgettext(TEXT_DOMAIN, "too many devices in one vdev"));
144         case EZFS_BADPATH:
145                 return (dgettext(TEXT_DOMAIN, "must be an absolute path"));
146         case EZFS_CROSSTARGET:
147                 return (dgettext(TEXT_DOMAIN, "operation crosses datasets or "
148                     "pools"));
149         case EZFS_ZONED:
150                 return (dgettext(TEXT_DOMAIN, "dataset in use by local zone"));
151         case EZFS_MOUNTFAILED:
152                 return (dgettext(TEXT_DOMAIN, "mount failed"));
153         case EZFS_UMOUNTFAILED:
154                 return (dgettext(TEXT_DOMAIN, "unmount failed"));
155         case EZFS_UNSHARENFSFAILED:
156                 return (dgettext(TEXT_DOMAIN, "NFS share removal failed"));
157         case EZFS_SHARENFSFAILED:
158                 return (dgettext(TEXT_DOMAIN, "NFS share creation failed"));
159         case EZFS_UNSHARESMBFAILED:
160                 return (dgettext(TEXT_DOMAIN, "SMB share removal failed"));
161         case EZFS_SHARESMBFAILED:
162                 return (dgettext(TEXT_DOMAIN, "SMB share creation failed"));
163         case EZFS_PERM:
164                 return (dgettext(TEXT_DOMAIN, "permission denied"));
165         case EZFS_NOSPC:
166                 return (dgettext(TEXT_DOMAIN, "out of space"));
167         case EZFS_FAULT:
168                 return (dgettext(TEXT_DOMAIN, "bad address"));
169         case EZFS_IO:
170                 return (dgettext(TEXT_DOMAIN, "I/O error"));
171         case EZFS_INTR:
172                 return (dgettext(TEXT_DOMAIN, "signal received"));
173         case EZFS_ISSPARE:
174                 return (dgettext(TEXT_DOMAIN, "device is reserved as a hot "
175                     "spare"));
176         case EZFS_INVALCONFIG:
177                 return (dgettext(TEXT_DOMAIN, "invalid vdev configuration"));
178         case EZFS_RECURSIVE:
179                 return (dgettext(TEXT_DOMAIN, "recursive dataset dependency"));
180         case EZFS_NOHISTORY:
181                 return (dgettext(TEXT_DOMAIN, "no history available"));
182         case EZFS_POOLPROPS:
183                 return (dgettext(TEXT_DOMAIN, "failed to retrieve "
184                     "pool properties"));
185         case EZFS_POOL_NOTSUP:
186                 return (dgettext(TEXT_DOMAIN, "operation not supported "
187                     "on this type of pool"));
188         case EZFS_POOL_INVALARG:
189                 return (dgettext(TEXT_DOMAIN, "invalid argument for "
190                     "this pool operation"));
191         case EZFS_NAMETOOLONG:
192                 return (dgettext(TEXT_DOMAIN, "dataset name is too long"));
193         case EZFS_OPENFAILED:
194                 return (dgettext(TEXT_DOMAIN, "open failed"));
195         case EZFS_NOCAP:
196                 return (dgettext(TEXT_DOMAIN,
197                     "disk capacity information could not be retrieved"));
198         case EZFS_LABELFAILED:
199                 return (dgettext(TEXT_DOMAIN, "write of label failed"));
200         case EZFS_BADWHO:
201                 return (dgettext(TEXT_DOMAIN, "invalid user/group"));
202         case EZFS_BADPERM:
203                 return (dgettext(TEXT_DOMAIN, "invalid permission"));
204         case EZFS_BADPERMSET:
205                 return (dgettext(TEXT_DOMAIN, "invalid permission set name"));
206         case EZFS_NODELEGATION:
207                 return (dgettext(TEXT_DOMAIN, "delegated administration is "
208                     "disabled on pool"));
209         case EZFS_BADCACHE:
210                 return (dgettext(TEXT_DOMAIN, "invalid or missing cache file"));
211         case EZFS_ISL2CACHE:
212                 return (dgettext(TEXT_DOMAIN, "device is in use as a cache"));
213         case EZFS_VDEVNOTSUP:
214                 return (dgettext(TEXT_DOMAIN, "vdev specification is not "
215                     "supported"));
216         case EZFS_NOTSUP:
217                 return (dgettext(TEXT_DOMAIN, "operation not supported "
218                     "on this dataset"));
219         case EZFS_IOC_NOTSUPPORTED:
220                 return (dgettext(TEXT_DOMAIN, "operation not supported by "
221                     "zfs kernel module"));
222         case EZFS_ACTIVE_SPARE:
223                 return (dgettext(TEXT_DOMAIN, "pool has active shared spare "
224                     "device"));
225         case EZFS_UNPLAYED_LOGS:
226                 return (dgettext(TEXT_DOMAIN, "log device has unplayed intent "
227                     "logs"));
228         case EZFS_REFTAG_RELE:
229                 return (dgettext(TEXT_DOMAIN, "no such tag on this dataset"));
230         case EZFS_REFTAG_HOLD:
231                 return (dgettext(TEXT_DOMAIN, "tag already exists on this "
232                     "dataset"));
233         case EZFS_TAGTOOLONG:
234                 return (dgettext(TEXT_DOMAIN, "tag too long"));
235         case EZFS_PIPEFAILED:
236                 return (dgettext(TEXT_DOMAIN, "pipe create failed"));
237         case EZFS_THREADCREATEFAILED:
238                 return (dgettext(TEXT_DOMAIN, "thread create failed"));
239         case EZFS_POSTSPLIT_ONLINE:
240                 return (dgettext(TEXT_DOMAIN, "disk was split from this pool "
241                     "into a new one"));
242         case EZFS_SCRUB_PAUSED:
243                 return (dgettext(TEXT_DOMAIN, "scrub is paused; "
244                     "use 'zpool scrub' to resume"));
245         case EZFS_SCRUBBING:
246                 return (dgettext(TEXT_DOMAIN, "currently scrubbing; "
247                     "use 'zpool scrub -s' to cancel current scrub"));
248         case EZFS_NO_SCRUB:
249                 return (dgettext(TEXT_DOMAIN, "there is no active scrub"));
250         case EZFS_DIFF:
251                 return (dgettext(TEXT_DOMAIN, "unable to generate diffs"));
252         case EZFS_DIFFDATA:
253                 return (dgettext(TEXT_DOMAIN, "invalid diff data"));
254         case EZFS_POOLREADONLY:
255                 return (dgettext(TEXT_DOMAIN, "pool is read-only"));
256         case EZFS_NO_PENDING:
257                 return (dgettext(TEXT_DOMAIN, "operation is not "
258                     "in progress"));
259         case EZFS_CHECKPOINT_EXISTS:
260                 return (dgettext(TEXT_DOMAIN, "checkpoint exists"));
261         case EZFS_DISCARDING_CHECKPOINT:
262                 return (dgettext(TEXT_DOMAIN, "currently discarding "
263                     "checkpoint"));
264         case EZFS_NO_CHECKPOINT:
265                 return (dgettext(TEXT_DOMAIN, "checkpoint does not exist"));
266         case EZFS_DEVRM_IN_PROGRESS:
267                 return (dgettext(TEXT_DOMAIN, "device removal in progress"));
268         case EZFS_VDEV_TOO_BIG:
269                 return (dgettext(TEXT_DOMAIN, "device exceeds supported size"));
270         case EZFS_ACTIVE_POOL:
271                 return (dgettext(TEXT_DOMAIN, "pool is imported on a "
272                     "different host"));
273         case EZFS_CRYPTOFAILED:
274                 return (dgettext(TEXT_DOMAIN, "encryption failure"));
275         case EZFS_TOOMANY:
276                 return (dgettext(TEXT_DOMAIN, "argument list too long"));
277         case EZFS_INITIALIZING:
278                 return (dgettext(TEXT_DOMAIN, "currently initializing"));
279         case EZFS_NO_INITIALIZE:
280                 return (dgettext(TEXT_DOMAIN, "there is no active "
281                     "initialization"));
282         case EZFS_WRONG_PARENT:
283                 return (dgettext(TEXT_DOMAIN, "invalid parent dataset"));
284         case EZFS_TRIMMING:
285                 return (dgettext(TEXT_DOMAIN, "currently trimming"));
286         case EZFS_NO_TRIM:
287                 return (dgettext(TEXT_DOMAIN, "there is no active trim"));
288         case EZFS_TRIM_NOTSUP:
289                 return (dgettext(TEXT_DOMAIN, "trim operations are not "
290                     "supported by this device"));
291         case EZFS_NO_RESILVER_DEFER:
292                 return (dgettext(TEXT_DOMAIN, "this action requires the "
293                     "resilver_defer feature"));
294         case EZFS_EXPORT_IN_PROGRESS:
295                 return (dgettext(TEXT_DOMAIN, "pool export in progress"));
296         case EZFS_REBUILDING:
297                 return (dgettext(TEXT_DOMAIN, "currently sequentially "
298                     "resilvering"));
299         case EZFS_VDEV_NOTSUP:
300                 return (dgettext(TEXT_DOMAIN, "operation not supported "
301                     "on this type of vdev"));
302         case EZFS_UNKNOWN:
303                 return (dgettext(TEXT_DOMAIN, "unknown error"));
304         default:
305                 assert(hdl->libzfs_error == 0);
306                 return (dgettext(TEXT_DOMAIN, "no error"));
307         }
308 }
309
310 void
311 zfs_error_aux(libzfs_handle_t *hdl, const char *fmt, ...)
312 {
313         va_list ap;
314
315         va_start(ap, fmt);
316
317         (void) vsnprintf(hdl->libzfs_desc, sizeof (hdl->libzfs_desc),
318             fmt, ap);
319         hdl->libzfs_desc_active = 1;
320
321         va_end(ap);
322 }
323
324 static void
325 zfs_verror(libzfs_handle_t *hdl, int error, const char *fmt, va_list ap)
326 {
327         (void) vsnprintf(hdl->libzfs_action, sizeof (hdl->libzfs_action),
328             fmt, ap);
329         hdl->libzfs_error = error;
330
331         if (hdl->libzfs_desc_active)
332                 hdl->libzfs_desc_active = 0;
333         else
334                 hdl->libzfs_desc[0] = '\0';
335
336         if (hdl->libzfs_printerr) {
337                 if (error == EZFS_UNKNOWN) {
338                         (void) fprintf(stderr, dgettext(TEXT_DOMAIN, "internal "
339                             "error: %s: %s\n"), hdl->libzfs_action,
340                             libzfs_error_description(hdl));
341                         abort();
342                 }
343
344                 (void) fprintf(stderr, "%s: %s\n", hdl->libzfs_action,
345                     libzfs_error_description(hdl));
346                 if (error == EZFS_NOMEM)
347                         exit(1);
348         }
349 }
350
351 int
352 zfs_error(libzfs_handle_t *hdl, int error, const char *msg)
353 {
354         return (zfs_error_fmt(hdl, error, "%s", msg));
355 }
356
357 int
358 zfs_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
359 {
360         va_list ap;
361
362         va_start(ap, fmt);
363
364         zfs_verror(hdl, error, fmt, ap);
365
366         va_end(ap);
367
368         return (-1);
369 }
370
371 static int
372 zfs_common_error(libzfs_handle_t *hdl, int error, const char *fmt,
373     va_list ap)
374 {
375         switch (error) {
376         case EPERM:
377         case EACCES:
378                 zfs_verror(hdl, EZFS_PERM, fmt, ap);
379                 return (-1);
380
381         case ECANCELED:
382                 zfs_verror(hdl, EZFS_NODELEGATION, fmt, ap);
383                 return (-1);
384
385         case EIO:
386                 zfs_verror(hdl, EZFS_IO, fmt, ap);
387                 return (-1);
388
389         case EFAULT:
390                 zfs_verror(hdl, EZFS_FAULT, fmt, ap);
391                 return (-1);
392
393         case EINTR:
394                 zfs_verror(hdl, EZFS_INTR, fmt, ap);
395                 return (-1);
396         }
397
398         return (0);
399 }
400
401 int
402 zfs_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
403 {
404         return (zfs_standard_error_fmt(hdl, error, "%s", msg));
405 }
406
407 int
408 zfs_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
409 {
410         va_list ap;
411
412         va_start(ap, fmt);
413
414         if (zfs_common_error(hdl, error, fmt, ap) != 0) {
415                 va_end(ap);
416                 return (-1);
417         }
418
419         switch (error) {
420         case ENXIO:
421         case ENODEV:
422         case EPIPE:
423                 zfs_verror(hdl, EZFS_IO, fmt, ap);
424                 break;
425
426         case ENOENT:
427                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
428                     "dataset does not exist"));
429                 zfs_verror(hdl, EZFS_NOENT, fmt, ap);
430                 break;
431
432         case ENOSPC:
433         case EDQUOT:
434                 zfs_verror(hdl, EZFS_NOSPC, fmt, ap);
435                 break;
436
437         case EEXIST:
438                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
439                     "dataset already exists"));
440                 zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
441                 break;
442
443         case EBUSY:
444                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
445                     "dataset is busy"));
446                 zfs_verror(hdl, EZFS_BUSY, fmt, ap);
447                 break;
448         case EROFS:
449                 zfs_verror(hdl, EZFS_POOLREADONLY, fmt, ap);
450                 break;
451         case ENAMETOOLONG:
452                 zfs_verror(hdl, EZFS_NAMETOOLONG, fmt, ap);
453                 break;
454         case ENOTSUP:
455                 zfs_verror(hdl, EZFS_BADVERSION, fmt, ap);
456                 break;
457         case EAGAIN:
458                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
459                     "pool I/O is currently suspended"));
460                 zfs_verror(hdl, EZFS_POOLUNAVAIL, fmt, ap);
461                 break;
462         case EREMOTEIO:
463                 zfs_verror(hdl, EZFS_ACTIVE_POOL, fmt, ap);
464                 break;
465         case ZFS_ERR_UNKNOWN_SEND_STREAM_FEATURE:
466         case ZFS_ERR_IOC_CMD_UNAVAIL:
467                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs "
468                     "module does not support this operation. A reboot may "
469                     "be required to enable this operation."));
470                 zfs_verror(hdl, EZFS_IOC_NOTSUPPORTED, fmt, ap);
471                 break;
472         case ZFS_ERR_IOC_ARG_UNAVAIL:
473                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs "
474                     "module does not support an option for this operation. "
475                     "A reboot may be required to enable this option."));
476                 zfs_verror(hdl, EZFS_IOC_NOTSUPPORTED, fmt, ap);
477                 break;
478         case ZFS_ERR_IOC_ARG_REQUIRED:
479         case ZFS_ERR_IOC_ARG_BADTYPE:
480                 zfs_verror(hdl, EZFS_IOC_NOTSUPPORTED, fmt, ap);
481                 break;
482         case ZFS_ERR_WRONG_PARENT:
483                 zfs_verror(hdl, EZFS_WRONG_PARENT, fmt, ap);
484                 break;
485         case ZFS_ERR_BADPROP:
486                 zfs_verror(hdl, EZFS_BADPROP, fmt, ap);
487                 break;
488         default:
489                 zfs_error_aux(hdl, "%s", strerror(error));
490                 zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
491                 break;
492         }
493
494         va_end(ap);
495         return (-1);
496 }
497
498 void
499 zfs_setprop_error(libzfs_handle_t *hdl, zfs_prop_t prop, int err,
500     char *errbuf)
501 {
502         switch (err) {
503
504         case ENOSPC:
505                 /*
506                  * For quotas and reservations, ENOSPC indicates
507                  * something different; setting a quota or reservation
508                  * doesn't use any disk space.
509                  */
510                 switch (prop) {
511                 case ZFS_PROP_QUOTA:
512                 case ZFS_PROP_REFQUOTA:
513                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
514                             "size is less than current used or "
515                             "reserved space"));
516                         (void) zfs_error(hdl, EZFS_PROPSPACE, errbuf);
517                         break;
518
519                 case ZFS_PROP_RESERVATION:
520                 case ZFS_PROP_REFRESERVATION:
521                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
522                             "size is greater than available space"));
523                         (void) zfs_error(hdl, EZFS_PROPSPACE, errbuf);
524                         break;
525
526                 default:
527                         (void) zfs_standard_error(hdl, err, errbuf);
528                         break;
529                 }
530                 break;
531
532         case EBUSY:
533                 (void) zfs_standard_error(hdl, EBUSY, errbuf);
534                 break;
535
536         case EROFS:
537                 (void) zfs_error(hdl, EZFS_DSREADONLY, errbuf);
538                 break;
539
540         case E2BIG:
541                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
542                     "property value too long"));
543                 (void) zfs_error(hdl, EZFS_BADPROP, errbuf);
544                 break;
545
546         case ENOTSUP:
547                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
548                     "pool and or dataset must be upgraded to set this "
549                     "property or value"));
550                 (void) zfs_error(hdl, EZFS_BADVERSION, errbuf);
551                 break;
552
553         case ERANGE:
554                 if (prop == ZFS_PROP_COMPRESSION ||
555                     prop == ZFS_PROP_DNODESIZE ||
556                     prop == ZFS_PROP_RECORDSIZE) {
557                         (void) zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
558                             "property setting is not allowed on "
559                             "bootable datasets"));
560                         (void) zfs_error(hdl, EZFS_NOTSUP, errbuf);
561                 } else if (prop == ZFS_PROP_CHECKSUM ||
562                     prop == ZFS_PROP_DEDUP) {
563                         (void) zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
564                             "property setting is not allowed on "
565                             "root pools"));
566                         (void) zfs_error(hdl, EZFS_NOTSUP, errbuf);
567                 } else {
568                         (void) zfs_standard_error(hdl, err, errbuf);
569                 }
570                 break;
571
572         case EINVAL:
573                 if (prop == ZPROP_INVAL) {
574                         (void) zfs_error(hdl, EZFS_BADPROP, errbuf);
575                 } else {
576                         (void) zfs_standard_error(hdl, err, errbuf);
577                 }
578                 break;
579
580         case ZFS_ERR_BADPROP:
581                 (void) zfs_error(hdl, EZFS_BADPROP, errbuf);
582                 break;
583
584         case EACCES:
585                 if (prop == ZFS_PROP_KEYLOCATION) {
586                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
587                             "keylocation may only be set on encryption roots"));
588                         (void) zfs_error(hdl, EZFS_BADPROP, errbuf);
589                 } else {
590                         (void) zfs_standard_error(hdl, err, errbuf);
591                 }
592                 break;
593
594         case EOVERFLOW:
595                 /*
596                  * This platform can't address a volume this big.
597                  */
598 #ifdef _ILP32
599                 if (prop == ZFS_PROP_VOLSIZE) {
600                         (void) zfs_error(hdl, EZFS_VOLTOOBIG, errbuf);
601                         break;
602                 }
603                 zfs_fallthrough;
604 #endif
605         default:
606                 (void) zfs_standard_error(hdl, err, errbuf);
607         }
608 }
609
610 int
611 zpool_standard_error(libzfs_handle_t *hdl, int error, const char *msg)
612 {
613         return (zpool_standard_error_fmt(hdl, error, "%s", msg));
614 }
615
616 int
617 zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
618 {
619         va_list ap;
620
621         va_start(ap, fmt);
622
623         if (zfs_common_error(hdl, error, fmt, ap) != 0) {
624                 va_end(ap);
625                 return (-1);
626         }
627
628         switch (error) {
629         case ENODEV:
630                 zfs_verror(hdl, EZFS_NODEVICE, fmt, ap);
631                 break;
632
633         case ENOENT:
634                 zfs_error_aux(hdl,
635                     dgettext(TEXT_DOMAIN, "no such pool or dataset"));
636                 zfs_verror(hdl, EZFS_NOENT, fmt, ap);
637                 break;
638
639         case EEXIST:
640                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
641                     "pool already exists"));
642                 zfs_verror(hdl, EZFS_EXISTS, fmt, ap);
643                 break;
644
645         case EBUSY:
646                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "pool is busy"));
647                 zfs_verror(hdl, EZFS_BUSY, fmt, ap);
648                 break;
649
650         /* There is no pending operation to cancel */
651         case ENOTACTIVE:
652                 zfs_verror(hdl, EZFS_NO_PENDING, fmt, ap);
653                 break;
654
655         case ENXIO:
656                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
657                     "one or more devices is currently unavailable"));
658                 zfs_verror(hdl, EZFS_BADDEV, fmt, ap);
659                 break;
660
661         case ENAMETOOLONG:
662                 zfs_verror(hdl, EZFS_DEVOVERFLOW, fmt, ap);
663                 break;
664
665         case ENOTSUP:
666                 zfs_verror(hdl, EZFS_POOL_NOTSUP, fmt, ap);
667                 break;
668
669         case EINVAL:
670                 zfs_verror(hdl, EZFS_POOL_INVALARG, fmt, ap);
671                 break;
672
673         case ENOSPC:
674         case EDQUOT:
675                 zfs_verror(hdl, EZFS_NOSPC, fmt, ap);
676                 return (-1);
677
678         case EAGAIN:
679                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
680                     "pool I/O is currently suspended"));
681                 zfs_verror(hdl, EZFS_POOLUNAVAIL, fmt, ap);
682                 break;
683
684         case EROFS:
685                 zfs_verror(hdl, EZFS_POOLREADONLY, fmt, ap);
686                 break;
687         case EDOM:
688                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
689                     "block size out of range or does not match"));
690                 zfs_verror(hdl, EZFS_BADPROP, fmt, ap);
691                 break;
692         case EREMOTEIO:
693                 zfs_verror(hdl, EZFS_ACTIVE_POOL, fmt, ap);
694                 break;
695         case ZFS_ERR_CHECKPOINT_EXISTS:
696                 zfs_verror(hdl, EZFS_CHECKPOINT_EXISTS, fmt, ap);
697                 break;
698         case ZFS_ERR_DISCARDING_CHECKPOINT:
699                 zfs_verror(hdl, EZFS_DISCARDING_CHECKPOINT, fmt, ap);
700                 break;
701         case ZFS_ERR_NO_CHECKPOINT:
702                 zfs_verror(hdl, EZFS_NO_CHECKPOINT, fmt, ap);
703                 break;
704         case ZFS_ERR_DEVRM_IN_PROGRESS:
705                 zfs_verror(hdl, EZFS_DEVRM_IN_PROGRESS, fmt, ap);
706                 break;
707         case ZFS_ERR_VDEV_TOO_BIG:
708                 zfs_verror(hdl, EZFS_VDEV_TOO_BIG, fmt, ap);
709                 break;
710         case ZFS_ERR_EXPORT_IN_PROGRESS:
711                 zfs_verror(hdl, EZFS_EXPORT_IN_PROGRESS, fmt, ap);
712                 break;
713         case ZFS_ERR_RESILVER_IN_PROGRESS:
714                 zfs_verror(hdl, EZFS_RESILVERING, fmt, ap);
715                 break;
716         case ZFS_ERR_REBUILD_IN_PROGRESS:
717                 zfs_verror(hdl, EZFS_REBUILDING, fmt, ap);
718                 break;
719         case ZFS_ERR_BADPROP:
720                 zfs_verror(hdl, EZFS_BADPROP, fmt, ap);
721                 break;
722         case ZFS_ERR_VDEV_NOTSUP:
723                 zfs_verror(hdl, EZFS_VDEV_NOTSUP, fmt, ap);
724                 break;
725         case ZFS_ERR_IOC_CMD_UNAVAIL:
726                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs "
727                     "module does not support this operation. A reboot may "
728                     "be required to enable this operation."));
729                 zfs_verror(hdl, EZFS_IOC_NOTSUPPORTED, fmt, ap);
730                 break;
731         case ZFS_ERR_IOC_ARG_UNAVAIL:
732                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs "
733                     "module does not support an option for this operation. "
734                     "A reboot may be required to enable this option."));
735                 zfs_verror(hdl, EZFS_IOC_NOTSUPPORTED, fmt, ap);
736                 break;
737         case ZFS_ERR_IOC_ARG_REQUIRED:
738         case ZFS_ERR_IOC_ARG_BADTYPE:
739                 zfs_verror(hdl, EZFS_IOC_NOTSUPPORTED, fmt, ap);
740                 break;
741         default:
742                 zfs_error_aux(hdl, "%s", strerror(error));
743                 zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
744         }
745
746         va_end(ap);
747         return (-1);
748 }
749
750 /*
751  * Display an out of memory error message and abort the current program.
752  */
753 int
754 no_memory(libzfs_handle_t *hdl)
755 {
756         return (zfs_error(hdl, EZFS_NOMEM, "internal error"));
757 }
758
759 /*
760  * A safe form of malloc() which will die if the allocation fails.
761  */
762 void *
763 zfs_alloc(libzfs_handle_t *hdl, size_t size)
764 {
765         void *data;
766
767         if ((data = calloc(1, size)) == NULL)
768                 (void) no_memory(hdl);
769
770         return (data);
771 }
772
773 /*
774  * A safe form of asprintf() which will die if the allocation fails.
775  */
776 char *
777 zfs_asprintf(libzfs_handle_t *hdl, const char *fmt, ...)
778 {
779         va_list ap;
780         char *ret;
781         int err;
782
783         va_start(ap, fmt);
784
785         err = vasprintf(&ret, fmt, ap);
786
787         va_end(ap);
788
789         if (err < 0) {
790                 (void) no_memory(hdl);
791                 ret = NULL;
792         }
793
794         return (ret);
795 }
796
797 /*
798  * A safe form of realloc(), which also zeroes newly allocated space.
799  */
800 void *
801 zfs_realloc(libzfs_handle_t *hdl, void *ptr, size_t oldsize, size_t newsize)
802 {
803         void *ret;
804
805         if ((ret = realloc(ptr, newsize)) == NULL) {
806                 (void) no_memory(hdl);
807                 return (NULL);
808         }
809
810         memset((char *)ret + oldsize, 0, newsize - oldsize);
811         return (ret);
812 }
813
814 /*
815  * A safe form of strdup() which will die if the allocation fails.
816  */
817 char *
818 zfs_strdup(libzfs_handle_t *hdl, const char *str)
819 {
820         char *ret;
821
822         if ((ret = strdup(str)) == NULL)
823                 (void) no_memory(hdl);
824
825         return (ret);
826 }
827
828 void
829 libzfs_print_on_error(libzfs_handle_t *hdl, boolean_t printerr)
830 {
831         hdl->libzfs_printerr = printerr;
832 }
833
834 /*
835  * Read lines from an open file descriptor and store them in an array of
836  * strings until EOF.  lines[] will be allocated and populated with all the
837  * lines read.  All newlines are replaced with NULL terminators for
838  * convenience.  lines[] must be freed after use with libzfs_free_str_array().
839  *
840  * Returns the number of lines read.
841  */
842 static int
843 libzfs_read_stdout_from_fd(int fd, char **lines[])
844 {
845
846         FILE *fp;
847         int lines_cnt = 0;
848         size_t len = 0;
849         char *line = NULL;
850         char **tmp_lines = NULL, **tmp;
851
852         fp = fdopen(fd, "r");
853         if (fp == NULL) {
854                 close(fd);
855                 return (0);
856         }
857         while (getline(&line, &len, fp) != -1) {
858                 tmp = realloc(tmp_lines, sizeof (*tmp_lines) * (lines_cnt + 1));
859                 if (tmp == NULL) {
860                         /* Return the lines we were able to process */
861                         break;
862                 }
863                 tmp_lines = tmp;
864
865                 /* Remove newline if not EOF */
866                 if (line[strlen(line) - 1] == '\n')
867                         line[strlen(line) - 1] = '\0';
868
869                 tmp_lines[lines_cnt] = strdup(line);
870                 if (tmp_lines[lines_cnt] == NULL)
871                         break;
872                 ++lines_cnt;
873         }
874         free(line);
875         fclose(fp);
876         *lines = tmp_lines;
877         return (lines_cnt);
878 }
879
880 static int
881 libzfs_run_process_impl(const char *path, char *argv[], char *env[], int flags,
882     char **lines[], int *lines_cnt)
883 {
884         pid_t pid;
885         int error, devnull_fd;
886         int link[2];
887
888         /*
889          * Setup a pipe between our child and parent process if we're
890          * reading stdout.
891          */
892         if (lines != NULL && pipe2(link, O_NONBLOCK | O_CLOEXEC) == -1)
893                 return (-EPIPE);
894
895         pid = fork();
896         if (pid == 0) {
897                 /* Child process */
898                 devnull_fd = open("/dev/null", O_WRONLY | O_CLOEXEC);
899
900                 if (devnull_fd < 0)
901                         _exit(-1);
902
903                 if (!(flags & STDOUT_VERBOSE) && (lines == NULL))
904                         (void) dup2(devnull_fd, STDOUT_FILENO);
905                 else if (lines != NULL) {
906                         /* Save the output to lines[] */
907                         dup2(link[1], STDOUT_FILENO);
908                 }
909
910                 if (!(flags & STDERR_VERBOSE))
911                         (void) dup2(devnull_fd, STDERR_FILENO);
912
913                 if (flags & NO_DEFAULT_PATH) {
914                         if (env == NULL)
915                                 execv(path, argv);
916                         else
917                                 execve(path, argv, env);
918                 } else {
919                         if (env == NULL)
920                                 execvp(path, argv);
921                         else
922                                 execvpe(path, argv, env);
923                 }
924
925                 _exit(-1);
926         } else if (pid > 0) {
927                 /* Parent process */
928                 int status;
929
930                 while ((error = waitpid(pid, &status, 0)) == -1 &&
931                     errno == EINTR)
932                         ;
933                 if (error < 0 || !WIFEXITED(status))
934                         return (-1);
935
936                 if (lines != NULL) {
937                         close(link[1]);
938                         *lines_cnt = libzfs_read_stdout_from_fd(link[0], lines);
939                 }
940                 return (WEXITSTATUS(status));
941         }
942
943         return (-1);
944 }
945
946 int
947 libzfs_run_process(const char *path, char *argv[], int flags)
948 {
949         return (libzfs_run_process_impl(path, argv, NULL, flags, NULL, NULL));
950 }
951
952 /*
953  * Run a command and store its stdout lines in an array of strings (lines[]).
954  * lines[] is allocated and populated for you, and the number of lines is set in
955  * lines_cnt.  lines[] must be freed after use with libzfs_free_str_array().
956  * All newlines (\n) in lines[] are terminated for convenience.
957  */
958 int
959 libzfs_run_process_get_stdout(const char *path, char *argv[], char *env[],
960     char **lines[], int *lines_cnt)
961 {
962         return (libzfs_run_process_impl(path, argv, env, 0, lines, lines_cnt));
963 }
964
965 /*
966  * Same as libzfs_run_process_get_stdout(), but run without $PATH set.  This
967  * means that *path needs to be the full path to the executable.
968  */
969 int
970 libzfs_run_process_get_stdout_nopath(const char *path, char *argv[],
971     char *env[], char **lines[], int *lines_cnt)
972 {
973         return (libzfs_run_process_impl(path, argv, env, NO_DEFAULT_PATH,
974             lines, lines_cnt));
975 }
976
977 /*
978  * Free an array of strings.  Free both the strings contained in the array and
979  * the array itself.
980  */
981 void
982 libzfs_free_str_array(char **strs, int count)
983 {
984         while (--count >= 0)
985                 free(strs[count]);
986
987         free(strs);
988 }
989
990 /*
991  * Returns 1 if environment variable is set to "YES", "yes", "ON", "on", or
992  * a non-zero number.
993  *
994  * Returns 0 otherwise.
995  */
996 int
997 libzfs_envvar_is_set(char *envvar)
998 {
999         char *env = getenv(envvar);
1000         if (env && (strtoul(env, NULL, 0) > 0 ||
1001             (!strncasecmp(env, "YES", 3) && strnlen(env, 4) == 3) ||
1002             (!strncasecmp(env, "ON", 2) && strnlen(env, 3) == 2)))
1003                 return (1);
1004
1005         return (0);
1006 }
1007
1008 libzfs_handle_t *
1009 libzfs_init(void)
1010 {
1011         libzfs_handle_t *hdl;
1012         int error;
1013         char *env;
1014
1015         if ((error = libzfs_load_module()) != 0) {
1016                 errno = error;
1017                 return (NULL);
1018         }
1019
1020         if ((hdl = calloc(1, sizeof (libzfs_handle_t))) == NULL) {
1021                 return (NULL);
1022         }
1023
1024         if (regcomp(&hdl->libzfs_urire, URI_REGEX, 0) != 0) {
1025                 free(hdl);
1026                 return (NULL);
1027         }
1028
1029         if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR|O_EXCL|O_CLOEXEC)) < 0) {
1030                 free(hdl);
1031                 return (NULL);
1032         }
1033
1034         if (libzfs_core_init() != 0) {
1035                 (void) close(hdl->libzfs_fd);
1036                 free(hdl);
1037                 return (NULL);
1038         }
1039
1040         zfs_prop_init();
1041         zpool_prop_init();
1042         zpool_feature_init();
1043         vdev_prop_init();
1044         libzfs_mnttab_init(hdl);
1045         fletcher_4_init();
1046
1047         if (getenv("ZFS_PROP_DEBUG") != NULL) {
1048                 hdl->libzfs_prop_debug = B_TRUE;
1049         }
1050         if ((env = getenv("ZFS_SENDRECV_MAX_NVLIST")) != NULL) {
1051                 if ((error = zfs_nicestrtonum(hdl, env,
1052                     &hdl->libzfs_max_nvlist))) {
1053                         errno = error;
1054                         (void) close(hdl->libzfs_fd);
1055                         free(hdl);
1056                         return (NULL);
1057                 }
1058         } else {
1059                 hdl->libzfs_max_nvlist = (SPA_MAXBLOCKSIZE * 4);
1060         }
1061
1062         /*
1063          * For testing, remove some settable properties and features
1064          */
1065         if (libzfs_envvar_is_set("ZFS_SYSFS_PROP_SUPPORT_TEST")) {
1066                 zprop_desc_t *proptbl;
1067
1068                 proptbl = zpool_prop_get_table();
1069                 proptbl[ZPOOL_PROP_COMMENT].pd_zfs_mod_supported = B_FALSE;
1070
1071                 proptbl = zfs_prop_get_table();
1072                 proptbl[ZFS_PROP_DNODESIZE].pd_zfs_mod_supported = B_FALSE;
1073
1074                 zfeature_info_t *ftbl = spa_feature_table;
1075                 ftbl[SPA_FEATURE_LARGE_BLOCKS].fi_zfs_mod_supported = B_FALSE;
1076         }
1077
1078         return (hdl);
1079 }
1080
1081 void
1082 libzfs_fini(libzfs_handle_t *hdl)
1083 {
1084         (void) close(hdl->libzfs_fd);
1085         zpool_free_handles(hdl);
1086         namespace_clear(hdl);
1087         libzfs_mnttab_fini(hdl);
1088         libzfs_core_fini();
1089         regfree(&hdl->libzfs_urire);
1090         fletcher_4_fini();
1091 #if LIBFETCH_DYNAMIC
1092         if (hdl->libfetch != (void *)-1 && hdl->libfetch != NULL)
1093                 (void) dlclose(hdl->libfetch);
1094         free(hdl->libfetch_load_error);
1095 #endif
1096         free(hdl);
1097 }
1098
1099 libzfs_handle_t *
1100 zpool_get_handle(zpool_handle_t *zhp)
1101 {
1102         return (zhp->zpool_hdl);
1103 }
1104
1105 libzfs_handle_t *
1106 zfs_get_handle(zfs_handle_t *zhp)
1107 {
1108         return (zhp->zfs_hdl);
1109 }
1110
1111 zpool_handle_t *
1112 zfs_get_pool_handle(const zfs_handle_t *zhp)
1113 {
1114         return (zhp->zpool_hdl);
1115 }
1116
1117 /*
1118  * Given a name, determine whether or not it's a valid path
1119  * (starts with '/' or "./").  If so, walk the mnttab trying
1120  * to match the device number.  If not, treat the path as an
1121  * fs/vol/snap/bkmark name.
1122  */
1123 zfs_handle_t *
1124 zfs_path_to_zhandle(libzfs_handle_t *hdl, const char *path, zfs_type_t argtype)
1125 {
1126         struct stat64 statbuf;
1127         struct extmnttab entry;
1128
1129         if (path[0] != '/' && strncmp(path, "./", strlen("./")) != 0) {
1130                 /*
1131                  * It's not a valid path, assume it's a name of type 'argtype'.
1132                  */
1133                 return (zfs_open(hdl, path, argtype));
1134         }
1135
1136         if (getextmntent(path, &entry, &statbuf) != 0)
1137                 return (NULL);
1138
1139         if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) {
1140                 (void) fprintf(stderr, gettext("'%s': not a ZFS filesystem\n"),
1141                     path);
1142                 return (NULL);
1143         }
1144
1145         return (zfs_open(hdl, entry.mnt_special, ZFS_TYPE_FILESYSTEM));
1146 }
1147
1148 /*
1149  * Initialize the zc_nvlist_dst member to prepare for receiving an nvlist from
1150  * an ioctl().
1151  */
1152 void
1153 zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len)
1154 {
1155         if (len == 0)
1156                 len = 256 * 1024;
1157         zc->zc_nvlist_dst_size = len;
1158         zc->zc_nvlist_dst =
1159             (uint64_t)(uintptr_t)zfs_alloc(hdl, zc->zc_nvlist_dst_size);
1160 }
1161
1162 /*
1163  * Called when an ioctl() which returns an nvlist fails with ENOMEM.  This will
1164  * expand the nvlist to the size specified in 'zc_nvlist_dst_size', which was
1165  * filled in by the kernel to indicate the actual required size.
1166  */
1167 void
1168 zcmd_expand_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc)
1169 {
1170         free((void *)(uintptr_t)zc->zc_nvlist_dst);
1171         zc->zc_nvlist_dst =
1172             (uint64_t)(uintptr_t)zfs_alloc(hdl, zc->zc_nvlist_dst_size);
1173 }
1174
1175 /*
1176  * Called to free the src and dst nvlists stored in the command structure.
1177  */
1178 void
1179 zcmd_free_nvlists(zfs_cmd_t *zc)
1180 {
1181         free((void *)(uintptr_t)zc->zc_nvlist_conf);
1182         free((void *)(uintptr_t)zc->zc_nvlist_src);
1183         free((void *)(uintptr_t)zc->zc_nvlist_dst);
1184         zc->zc_nvlist_conf = 0;
1185         zc->zc_nvlist_src = 0;
1186         zc->zc_nvlist_dst = 0;
1187 }
1188
1189 static void
1190 zcmd_write_nvlist_com(libzfs_handle_t *hdl, uint64_t *outnv, uint64_t *outlen,
1191     nvlist_t *nvl)
1192 {
1193         char *packed;
1194
1195         size_t len = fnvlist_size(nvl);
1196         packed = zfs_alloc(hdl, len);
1197
1198         verify(nvlist_pack(nvl, &packed, &len, NV_ENCODE_NATIVE, 0) == 0);
1199
1200         *outnv = (uint64_t)(uintptr_t)packed;
1201         *outlen = len;
1202 }
1203
1204 void
1205 zcmd_write_conf_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl)
1206 {
1207         zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_conf,
1208             &zc->zc_nvlist_conf_size, nvl);
1209 }
1210
1211 void
1212 zcmd_write_src_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t *nvl)
1213 {
1214         zcmd_write_nvlist_com(hdl, &zc->zc_nvlist_src,
1215             &zc->zc_nvlist_src_size, nvl);
1216 }
1217
1218 /*
1219  * Unpacks an nvlist from the ZFS ioctl command structure.
1220  */
1221 int
1222 zcmd_read_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t **nvlp)
1223 {
1224         if (nvlist_unpack((void *)(uintptr_t)zc->zc_nvlist_dst,
1225             zc->zc_nvlist_dst_size, nvlp, 0) != 0)
1226                 return (no_memory(hdl));
1227
1228         return (0);
1229 }
1230
1231 /*
1232  * ================================================================
1233  * API shared by zfs and zpool property management
1234  * ================================================================
1235  */
1236
1237 static void
1238 zprop_print_headers(zprop_get_cbdata_t *cbp, zfs_type_t type)
1239 {
1240         zprop_list_t *pl = cbp->cb_proplist;
1241         int i;
1242         char *title;
1243         size_t len;
1244
1245         cbp->cb_first = B_FALSE;
1246         if (cbp->cb_scripted)
1247                 return;
1248
1249         /*
1250          * Start with the length of the column headers.
1251          */
1252         cbp->cb_colwidths[GET_COL_NAME] = strlen(dgettext(TEXT_DOMAIN, "NAME"));
1253         cbp->cb_colwidths[GET_COL_PROPERTY] = strlen(dgettext(TEXT_DOMAIN,
1254             "PROPERTY"));
1255         cbp->cb_colwidths[GET_COL_VALUE] = strlen(dgettext(TEXT_DOMAIN,
1256             "VALUE"));
1257         cbp->cb_colwidths[GET_COL_RECVD] = strlen(dgettext(TEXT_DOMAIN,
1258             "RECEIVED"));
1259         cbp->cb_colwidths[GET_COL_SOURCE] = strlen(dgettext(TEXT_DOMAIN,
1260             "SOURCE"));
1261
1262         /* first property is always NAME */
1263         assert(cbp->cb_proplist->pl_prop ==
1264             ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME :
1265             ((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME : ZFS_PROP_NAME)));
1266
1267         /*
1268          * Go through and calculate the widths for each column.  For the
1269          * 'source' column, we kludge it up by taking the worst-case scenario of
1270          * inheriting from the longest name.  This is acceptable because in the
1271          * majority of cases 'SOURCE' is the last column displayed, and we don't
1272          * use the width anyway.  Note that the 'VALUE' column can be oversized,
1273          * if the name of the property is much longer than any values we find.
1274          */
1275         for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
1276                 /*
1277                  * 'PROPERTY' column
1278                  */
1279                 if (pl->pl_prop != ZPROP_INVAL) {
1280                         const char *propname = (type == ZFS_TYPE_POOL) ?
1281                             zpool_prop_to_name(pl->pl_prop) :
1282                             ((type == ZFS_TYPE_VDEV) ?
1283                             vdev_prop_to_name(pl->pl_prop) :
1284                             zfs_prop_to_name(pl->pl_prop));
1285
1286                         assert(propname != NULL);
1287                         len = strlen(propname);
1288                         if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
1289                                 cbp->cb_colwidths[GET_COL_PROPERTY] = len;
1290                 } else {
1291                         assert(pl->pl_user_prop != NULL);
1292                         len = strlen(pl->pl_user_prop);
1293                         if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
1294                                 cbp->cb_colwidths[GET_COL_PROPERTY] = len;
1295                 }
1296
1297                 /*
1298                  * 'VALUE' column.  The first property is always the 'name'
1299                  * property that was tacked on either by /sbin/zfs's
1300                  * zfs_do_get() or when calling zprop_expand_list(), so we
1301                  * ignore its width.  If the user specified the name property
1302                  * to display, then it will be later in the list in any case.
1303                  */
1304                 if (pl != cbp->cb_proplist &&
1305                     pl->pl_width > cbp->cb_colwidths[GET_COL_VALUE])
1306                         cbp->cb_colwidths[GET_COL_VALUE] = pl->pl_width;
1307
1308                 /* 'RECEIVED' column. */
1309                 if (pl != cbp->cb_proplist &&
1310                     pl->pl_recvd_width > cbp->cb_colwidths[GET_COL_RECVD])
1311                         cbp->cb_colwidths[GET_COL_RECVD] = pl->pl_recvd_width;
1312
1313                 /*
1314                  * 'NAME' and 'SOURCE' columns
1315                  */
1316                 if (pl->pl_prop == ((type == ZFS_TYPE_POOL) ? ZPOOL_PROP_NAME :
1317                     ((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME :
1318                     ZFS_PROP_NAME)) && pl->pl_width >
1319                     cbp->cb_colwidths[GET_COL_NAME]) {
1320                         cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width;
1321                         cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width +
1322                             strlen(dgettext(TEXT_DOMAIN, "inherited from"));
1323                 }
1324         }
1325
1326         /*
1327          * Now go through and print the headers.
1328          */
1329         for (i = 0; i < ZFS_GET_NCOLS; i++) {
1330                 switch (cbp->cb_columns[i]) {
1331                 case GET_COL_NAME:
1332                         title = dgettext(TEXT_DOMAIN, "NAME");
1333                         break;
1334                 case GET_COL_PROPERTY:
1335                         title = dgettext(TEXT_DOMAIN, "PROPERTY");
1336                         break;
1337                 case GET_COL_VALUE:
1338                         title = dgettext(TEXT_DOMAIN, "VALUE");
1339                         break;
1340                 case GET_COL_RECVD:
1341                         title = dgettext(TEXT_DOMAIN, "RECEIVED");
1342                         break;
1343                 case GET_COL_SOURCE:
1344                         title = dgettext(TEXT_DOMAIN, "SOURCE");
1345                         break;
1346                 default:
1347                         title = NULL;
1348                 }
1349
1350                 if (title != NULL) {
1351                         if (i == (ZFS_GET_NCOLS - 1) ||
1352                             cbp->cb_columns[i + 1] == GET_COL_NONE)
1353                                 (void) printf("%s", title);
1354                         else
1355                                 (void) printf("%-*s  ",
1356                                     cbp->cb_colwidths[cbp->cb_columns[i]],
1357                                     title);
1358                 }
1359         }
1360         (void) printf("\n");
1361 }
1362
1363 /*
1364  * Display a single line of output, according to the settings in the callback
1365  * structure.
1366  */
1367 void
1368 zprop_print_one_property(const char *name, zprop_get_cbdata_t *cbp,
1369     const char *propname, const char *value, zprop_source_t sourcetype,
1370     const char *source, const char *recvd_value)
1371 {
1372         int i;
1373         const char *str = NULL;
1374         char buf[128];
1375
1376         /*
1377          * Ignore those source types that the user has chosen to ignore.
1378          */
1379         if ((sourcetype & cbp->cb_sources) == 0)
1380                 return;
1381
1382         if (cbp->cb_first)
1383                 zprop_print_headers(cbp, cbp->cb_type);
1384
1385         for (i = 0; i < ZFS_GET_NCOLS; i++) {
1386                 switch (cbp->cb_columns[i]) {
1387                 case GET_COL_NAME:
1388                         str = name;
1389                         break;
1390
1391                 case GET_COL_PROPERTY:
1392                         str = propname;
1393                         break;
1394
1395                 case GET_COL_VALUE:
1396                         str = value;
1397                         break;
1398
1399                 case GET_COL_SOURCE:
1400                         switch (sourcetype) {
1401                         case ZPROP_SRC_NONE:
1402                                 str = "-";
1403                                 break;
1404
1405                         case ZPROP_SRC_DEFAULT:
1406                                 str = "default";
1407                                 break;
1408
1409                         case ZPROP_SRC_LOCAL:
1410                                 str = "local";
1411                                 break;
1412
1413                         case ZPROP_SRC_TEMPORARY:
1414                                 str = "temporary";
1415                                 break;
1416
1417                         case ZPROP_SRC_INHERITED:
1418                                 (void) snprintf(buf, sizeof (buf),
1419                                     "inherited from %s", source);
1420                                 str = buf;
1421                                 break;
1422                         case ZPROP_SRC_RECEIVED:
1423                                 str = "received";
1424                                 break;
1425
1426                         default:
1427                                 str = NULL;
1428                                 assert(!"unhandled zprop_source_t");
1429                         }
1430                         break;
1431
1432                 case GET_COL_RECVD:
1433                         str = (recvd_value == NULL ? "-" : recvd_value);
1434                         break;
1435
1436                 default:
1437                         continue;
1438                 }
1439
1440                 if (i == (ZFS_GET_NCOLS - 1) ||
1441                     cbp->cb_columns[i + 1] == GET_COL_NONE)
1442                         (void) printf("%s", str);
1443                 else if (cbp->cb_scripted)
1444                         (void) printf("%s\t", str);
1445                 else
1446                         (void) printf("%-*s  ",
1447                             cbp->cb_colwidths[cbp->cb_columns[i]],
1448                             str);
1449         }
1450
1451         (void) printf("\n");
1452 }
1453
1454 /*
1455  * Given a numeric suffix, convert the value into a number of bits that the
1456  * resulting value must be shifted.
1457  */
1458 static int
1459 str2shift(libzfs_handle_t *hdl, const char *buf)
1460 {
1461         const char *ends = "BKMGTPEZ";
1462         int i;
1463
1464         if (buf[0] == '\0')
1465                 return (0);
1466         for (i = 0; i < strlen(ends); i++) {
1467                 if (toupper(buf[0]) == ends[i])
1468                         break;
1469         }
1470         if (i == strlen(ends)) {
1471                 if (hdl)
1472                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1473                             "invalid numeric suffix '%s'"), buf);
1474                 return (-1);
1475         }
1476
1477         /*
1478          * Allow 'G' = 'GB' = 'GiB', case-insensitively.
1479          * However, 'BB' and 'BiB' are disallowed.
1480          */
1481         if (buf[1] == '\0' ||
1482             (toupper(buf[0]) != 'B' &&
1483             ((toupper(buf[1]) == 'B' && buf[2] == '\0') ||
1484             (toupper(buf[1]) == 'I' && toupper(buf[2]) == 'B' &&
1485             buf[3] == '\0'))))
1486                 return (10 * i);
1487
1488         if (hdl)
1489                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1490                     "invalid numeric suffix '%s'"), buf);
1491         return (-1);
1492 }
1493
1494 /*
1495  * Convert a string of the form '100G' into a real number.  Used when setting
1496  * properties or creating a volume.  'buf' is used to place an extended error
1497  * message for the caller to use.
1498  */
1499 int
1500 zfs_nicestrtonum(libzfs_handle_t *hdl, const char *value, uint64_t *num)
1501 {
1502         char *end;
1503         int shift;
1504
1505         *num = 0;
1506
1507         /* Check to see if this looks like a number.  */
1508         if ((value[0] < '0' || value[0] > '9') && value[0] != '.') {
1509                 if (hdl)
1510                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1511                             "bad numeric value '%s'"), value);
1512                 return (-1);
1513         }
1514
1515         /* Rely on strtoull() to process the numeric portion.  */
1516         errno = 0;
1517         *num = strtoull(value, &end, 10);
1518
1519         /*
1520          * Check for ERANGE, which indicates that the value is too large to fit
1521          * in a 64-bit value.
1522          */
1523         if (errno == ERANGE) {
1524                 if (hdl)
1525                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1526                             "numeric value is too large"));
1527                 return (-1);
1528         }
1529
1530         /*
1531          * If we have a decimal value, then do the computation with floating
1532          * point arithmetic.  Otherwise, use standard arithmetic.
1533          */
1534         if (*end == '.') {
1535                 double fval = strtod(value, &end);
1536
1537                 if ((shift = str2shift(hdl, end)) == -1)
1538                         return (-1);
1539
1540                 fval *= pow(2, shift);
1541
1542                 /*
1543                  * UINT64_MAX is not exactly representable as a double.
1544                  * The closest representation is UINT64_MAX + 1, so we
1545                  * use a >= comparison instead of > for the bounds check.
1546                  */
1547                 if (fval >= (double)UINT64_MAX) {
1548                         if (hdl)
1549                                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1550                                     "numeric value is too large"));
1551                         return (-1);
1552                 }
1553
1554                 *num = (uint64_t)fval;
1555         } else {
1556                 if ((shift = str2shift(hdl, end)) == -1)
1557                         return (-1);
1558
1559                 /* Check for overflow */
1560                 if (shift >= 64 || (*num << shift) >> shift != *num) {
1561                         if (hdl)
1562                                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1563                                     "numeric value is too large"));
1564                         return (-1);
1565                 }
1566
1567                 *num <<= shift;
1568         }
1569
1570         return (0);
1571 }
1572
1573 /*
1574  * Given a propname=value nvpair to set, parse any numeric properties
1575  * (index, boolean, etc) if they are specified as strings and add the
1576  * resulting nvpair to the returned nvlist.
1577  *
1578  * At the DSL layer, all properties are either 64-bit numbers or strings.
1579  * We want the user to be able to ignore this fact and specify properties
1580  * as native values (numbers, for example) or as strings (to simplify
1581  * command line utilities).  This also handles converting index types
1582  * (compression, checksum, etc) from strings to their on-disk index.
1583  */
1584 int
1585 zprop_parse_value(libzfs_handle_t *hdl, nvpair_t *elem, int prop,
1586     zfs_type_t type, nvlist_t *ret, char **svalp, uint64_t *ivalp,
1587     const char *errbuf)
1588 {
1589         data_type_t datatype = nvpair_type(elem);
1590         zprop_type_t proptype;
1591         const char *propname;
1592         char *value;
1593         boolean_t isnone = B_FALSE;
1594         boolean_t isauto = B_FALSE;
1595         int err = 0;
1596
1597         if (type == ZFS_TYPE_POOL) {
1598                 proptype = zpool_prop_get_type(prop);
1599                 propname = zpool_prop_to_name(prop);
1600         } else if (type == ZFS_TYPE_VDEV) {
1601                 proptype = vdev_prop_get_type(prop);
1602                 propname = vdev_prop_to_name(prop);
1603         } else {
1604                 proptype = zfs_prop_get_type(prop);
1605                 propname = zfs_prop_to_name(prop);
1606         }
1607
1608         /*
1609          * Convert any properties to the internal DSL value types.
1610          */
1611         *svalp = NULL;
1612         *ivalp = 0;
1613
1614         switch (proptype) {
1615         case PROP_TYPE_STRING:
1616                 if (datatype != DATA_TYPE_STRING) {
1617                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1618                             "'%s' must be a string"), nvpair_name(elem));
1619                         goto error;
1620                 }
1621                 err = nvpair_value_string(elem, svalp);
1622                 if (err != 0) {
1623                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1624                             "'%s' is invalid"), nvpair_name(elem));
1625                         goto error;
1626                 }
1627                 if (strlen(*svalp) >= ZFS_MAXPROPLEN) {
1628                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1629                             "'%s' is too long"), nvpair_name(elem));
1630                         goto error;
1631                 }
1632                 break;
1633
1634         case PROP_TYPE_NUMBER:
1635                 if (datatype == DATA_TYPE_STRING) {
1636                         (void) nvpair_value_string(elem, &value);
1637                         if (strcmp(value, "none") == 0) {
1638                                 isnone = B_TRUE;
1639                         } else if (strcmp(value, "auto") == 0) {
1640                                 isauto = B_TRUE;
1641                         } else if (zfs_nicestrtonum(hdl, value, ivalp) != 0) {
1642                                 goto error;
1643                         }
1644                 } else if (datatype == DATA_TYPE_UINT64) {
1645                         (void) nvpair_value_uint64(elem, ivalp);
1646                 } else {
1647                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1648                             "'%s' must be a number"), nvpair_name(elem));
1649                         goto error;
1650                 }
1651
1652                 /*
1653                  * Quota special: force 'none' and don't allow 0.
1654                  */
1655                 if ((type & ZFS_TYPE_DATASET) && *ivalp == 0 && !isnone &&
1656                     (prop == ZFS_PROP_QUOTA || prop == ZFS_PROP_REFQUOTA)) {
1657                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1658                             "use 'none' to disable quota/refquota"));
1659                         goto error;
1660                 }
1661
1662                 /*
1663                  * Special handling for "*_limit=none". In this case it's not
1664                  * 0 but UINT64_MAX.
1665                  */
1666                 if ((type & ZFS_TYPE_DATASET) && isnone &&
1667                     (prop == ZFS_PROP_FILESYSTEM_LIMIT ||
1668                     prop == ZFS_PROP_SNAPSHOT_LIMIT)) {
1669                         *ivalp = UINT64_MAX;
1670                 }
1671
1672                 /*
1673                  * Special handling for setting 'refreservation' to 'auto'.  Use
1674                  * UINT64_MAX to tell the caller to use zfs_fix_auto_resv().
1675                  * 'auto' is only allowed on volumes.
1676                  */
1677                 if (isauto) {
1678                         switch (prop) {
1679                         case ZFS_PROP_REFRESERVATION:
1680                                 if ((type & ZFS_TYPE_VOLUME) == 0) {
1681                                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1682                                             "'%s=auto' only allowed on "
1683                                             "volumes"), nvpair_name(elem));
1684                                         goto error;
1685                                 }
1686                                 *ivalp = UINT64_MAX;
1687                                 break;
1688                         default:
1689                                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1690                                     "'auto' is invalid value for '%s'"),
1691                                     nvpair_name(elem));
1692                                 goto error;
1693                         }
1694                 }
1695
1696                 break;
1697
1698         case PROP_TYPE_INDEX:
1699                 if (datatype != DATA_TYPE_STRING) {
1700                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1701                             "'%s' must be a string"), nvpair_name(elem));
1702                         goto error;
1703                 }
1704
1705                 (void) nvpair_value_string(elem, &value);
1706
1707                 if (zprop_string_to_index(prop, value, ivalp, type) != 0) {
1708                         zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1709                             "'%s' must be one of '%s'"), propname,
1710                             zprop_values(prop, type));
1711                         goto error;
1712                 }
1713                 break;
1714
1715         default:
1716                 abort();
1717         }
1718
1719         /*
1720          * Add the result to our return set of properties.
1721          */
1722         if (*svalp != NULL) {
1723                 if (nvlist_add_string(ret, propname, *svalp) != 0) {
1724                         (void) no_memory(hdl);
1725                         return (-1);
1726                 }
1727         } else {
1728                 if (nvlist_add_uint64(ret, propname, *ivalp) != 0) {
1729                         (void) no_memory(hdl);
1730                         return (-1);
1731                 }
1732         }
1733
1734         return (0);
1735 error:
1736         (void) zfs_error(hdl, EZFS_BADPROP, errbuf);
1737         return (-1);
1738 }
1739
1740 static int
1741 addlist(libzfs_handle_t *hdl, const char *propname, zprop_list_t **listp,
1742     zfs_type_t type)
1743 {
1744         int prop = zprop_name_to_prop(propname, type);
1745         if (prop != ZPROP_INVAL && !zprop_valid_for_type(prop, type, B_FALSE))
1746                 prop = ZPROP_INVAL;
1747
1748         /*
1749          * Return failure if no property table entry was found and this isn't
1750          * a user-defined property.
1751          */
1752         if (prop == ZPROP_INVAL && ((type == ZFS_TYPE_POOL &&
1753             !zpool_prop_feature(propname) &&
1754             !zpool_prop_unsupported(propname)) ||
1755             ((type == ZFS_TYPE_DATASET) && !zfs_prop_user(propname) &&
1756             !zfs_prop_userquota(propname) && !zfs_prop_written(propname)) ||
1757             ((type == ZFS_TYPE_VDEV) && !vdev_prop_user(propname)))) {
1758                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1759                     "invalid property '%s'"), propname);
1760                 return (zfs_error(hdl, EZFS_BADPROP,
1761                     dgettext(TEXT_DOMAIN, "bad property list")));
1762         }
1763
1764         zprop_list_t *entry = zfs_alloc(hdl, sizeof (*entry));
1765
1766         entry->pl_prop = prop;
1767         if (prop == ZPROP_INVAL) {
1768                 entry->pl_user_prop = zfs_strdup(hdl, propname);
1769                 entry->pl_width = strlen(propname);
1770         } else {
1771                 entry->pl_width = zprop_width(prop, &entry->pl_fixed,
1772                     type);
1773         }
1774
1775         *listp = entry;
1776
1777         return (0);
1778 }
1779
1780 /*
1781  * Given a comma-separated list of properties, construct a property list
1782  * containing both user-defined and native properties.  This function will
1783  * return a NULL list if 'all' is specified, which can later be expanded
1784  * by zprop_expand_list().
1785  */
1786 int
1787 zprop_get_list(libzfs_handle_t *hdl, char *props, zprop_list_t **listp,
1788     zfs_type_t type)
1789 {
1790         *listp = NULL;
1791
1792         /*
1793          * If 'all' is specified, return a NULL list.
1794          */
1795         if (strcmp(props, "all") == 0)
1796                 return (0);
1797
1798         /*
1799          * If no props were specified, return an error.
1800          */
1801         if (props[0] == '\0') {
1802                 zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
1803                     "no properties specified"));
1804                 return (zfs_error(hdl, EZFS_BADPROP, dgettext(TEXT_DOMAIN,
1805                     "bad property list")));
1806         }
1807
1808         for (char *p; (p = strsep(&props, ",")); )
1809                 if (strcmp(p, "space") == 0) {
1810                         static const char *const spaceprops[] = {
1811                                 "name", "avail", "used", "usedbysnapshots",
1812                                 "usedbydataset", "usedbyrefreservation",
1813                                 "usedbychildren"
1814                         };
1815
1816                         for (int i = 0; i < ARRAY_SIZE(spaceprops); i++) {
1817                                 if (addlist(hdl, spaceprops[i], listp, type))
1818                                         return (-1);
1819                                 listp = &(*listp)->pl_next;
1820                         }
1821                 } else {
1822                         if (addlist(hdl, p, listp, type))
1823                                 return (-1);
1824                         listp = &(*listp)->pl_next;
1825                 }
1826
1827         return (0);
1828 }
1829
1830 void
1831 zprop_free_list(zprop_list_t *pl)
1832 {
1833         zprop_list_t *next;
1834
1835         while (pl != NULL) {
1836                 next = pl->pl_next;
1837                 free(pl->pl_user_prop);
1838                 free(pl);
1839                 pl = next;
1840         }
1841 }
1842
1843 typedef struct expand_data {
1844         zprop_list_t    **last;
1845         libzfs_handle_t *hdl;
1846         zfs_type_t type;
1847 } expand_data_t;
1848
1849 static int
1850 zprop_expand_list_cb(int prop, void *cb)
1851 {
1852         zprop_list_t *entry;
1853         expand_data_t *edp = cb;
1854
1855         entry = zfs_alloc(edp->hdl, sizeof (zprop_list_t));
1856
1857         entry->pl_prop = prop;
1858         entry->pl_width = zprop_width(prop, &entry->pl_fixed, edp->type);
1859         entry->pl_all = B_TRUE;
1860
1861         *(edp->last) = entry;
1862         edp->last = &entry->pl_next;
1863
1864         return (ZPROP_CONT);
1865 }
1866
1867 int
1868 zprop_expand_list(libzfs_handle_t *hdl, zprop_list_t **plp, zfs_type_t type)
1869 {
1870         zprop_list_t *entry;
1871         zprop_list_t **last;
1872         expand_data_t exp;
1873
1874         if (*plp == NULL) {
1875                 /*
1876                  * If this is the very first time we've been called for an 'all'
1877                  * specification, expand the list to include all native
1878                  * properties.
1879                  */
1880                 last = plp;
1881
1882                 exp.last = last;
1883                 exp.hdl = hdl;
1884                 exp.type = type;
1885
1886                 if (zprop_iter_common(zprop_expand_list_cb, &exp, B_FALSE,
1887                     B_FALSE, type) == ZPROP_INVAL)
1888                         return (-1);
1889
1890                 /*
1891                  * Add 'name' to the beginning of the list, which is handled
1892                  * specially.
1893                  */
1894                 entry = zfs_alloc(hdl, sizeof (zprop_list_t));
1895                 entry->pl_prop = ((type == ZFS_TYPE_POOL) ?  ZPOOL_PROP_NAME :
1896                     ((type == ZFS_TYPE_VDEV) ? VDEV_PROP_NAME : ZFS_PROP_NAME));
1897                 entry->pl_width = zprop_width(entry->pl_prop,
1898                     &entry->pl_fixed, type);
1899                 entry->pl_all = B_TRUE;
1900                 entry->pl_next = *plp;
1901                 *plp = entry;
1902         }
1903         return (0);
1904 }
1905
1906 int
1907 zprop_iter(zprop_func func, void *cb, boolean_t show_all, boolean_t ordered,
1908     zfs_type_t type)
1909 {
1910         return (zprop_iter_common(func, cb, show_all, ordered, type));
1911 }
1912
1913 /*
1914  * Fill given version buffer with zfs userland version
1915  */
1916 void
1917 zfs_version_userland(char *version, int len)
1918 {
1919         (void) strlcpy(version, ZFS_META_ALIAS, len);
1920 }
1921
1922 /*
1923  * Prints both zfs userland and kernel versions
1924  * Returns 0 on success, and -1 on error (with errno set)
1925  */
1926 int
1927 zfs_version_print(void)
1928 {
1929         char zver_userland[128];
1930         char zver_kernel[128];
1931
1932         zfs_version_userland(zver_userland, sizeof (zver_userland));
1933
1934         (void) printf("%s\n", zver_userland);
1935
1936         if (zfs_version_kernel(zver_kernel, sizeof (zver_kernel)) == -1) {
1937                 fprintf(stderr, "zfs_version_kernel() failed: %s\n",
1938                     strerror(errno));
1939                 return (-1);
1940         }
1941
1942         (void) printf("zfs-kmod-%s\n", zver_kernel);
1943
1944         return (0);
1945 }
1946
1947 /*
1948  * Return 1 if the user requested ANSI color output, and our terminal supports
1949  * it.  Return 0 for no color.
1950  */
1951 static int
1952 use_color(void)
1953 {
1954         static int use_color = -1;
1955         char *term;
1956
1957         /*
1958          * Optimization:
1959          *
1960          * For each zpool invocation, we do a single check to see if we should
1961          * be using color or not, and cache that value for the lifetime of the
1962          * the zpool command.  That makes it cheap to call use_color() when
1963          * we're printing with color.  We assume that the settings are not going
1964          * to change during the invocation of a zpool command (the user isn't
1965          * going to change the ZFS_COLOR value while zpool is running, for
1966          * example).
1967          */
1968         if (use_color != -1) {
1969                 /*
1970                  * We've already figured out if we should be using color or
1971                  * not.  Return the cached value.
1972                  */
1973                 return (use_color);
1974         }
1975
1976         term = getenv("TERM");
1977         /*
1978          * The user sets the ZFS_COLOR env var set to enable zpool ANSI color
1979          * output.  However if NO_COLOR is set (https://no-color.org/) then
1980          * don't use it.  Also, don't use color if terminal doesn't support
1981          * it.
1982          */
1983         if (libzfs_envvar_is_set("ZFS_COLOR") &&
1984             !libzfs_envvar_is_set("NO_COLOR") &&
1985             isatty(STDOUT_FILENO) && term && strcmp("dumb", term) != 0 &&
1986             strcmp("unknown", term) != 0) {
1987                 /* Color supported */
1988                 use_color = 1;
1989         } else {
1990                 use_color = 0;
1991         }
1992
1993         return (use_color);
1994 }
1995
1996 /*
1997  * color_start() and color_end() are used for when you want to colorize a block
1998  * of text.  For example:
1999  *
2000  * color_start(ANSI_RED_FG)
2001  * printf("hello");
2002  * printf("world");
2003  * color_end();
2004  */
2005 void
2006 color_start(char *color)
2007 {
2008         if (use_color())
2009                 printf("%s", color);
2010 }
2011
2012 void
2013 color_end(void)
2014 {
2015         if (use_color())
2016                 printf(ANSI_RESET);
2017 }
2018
2019 /* printf() with a color.  If color is NULL, then do a normal printf. */
2020 int
2021 printf_color(char *color, char *format, ...)
2022 {
2023         va_list aptr;
2024         int rc;
2025
2026         if (color)
2027                 color_start(color);
2028
2029         va_start(aptr, format);
2030         rc = vprintf(format, aptr);
2031         va_end(aptr);
2032
2033         if (color)
2034                 color_end();
2035
2036         return (rc);
2037 }