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