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